forked from
rocksky.app/rocksky
A decentralized music tracking and discovery platform built on AT Protocol 馃幍
1import { useInfiniteQuery, useQuery } from "@tanstack/react-query";
2import {
3 getAlbum,
4 getAlbums,
5 getArtist,
6 getArtistAlbums,
7 getArtists,
8 getArtistTracks,
9 getLovedTracks,
10 getSongByUri,
11 getTracks,
12} from "../api/library";
13
14export const useSongByUriQuery = (uri: string) =>
15 useQuery({
16 queryKey: ["songByUri", uri],
17 queryFn: () => getSongByUri(uri),
18 enabled: !!uri,
19 });
20
21export const useArtistTracksQuery = (uri: string, limit = 10) =>
22 useQuery({
23 queryKey: ["artistTracks", uri, limit],
24 queryFn: () => getArtistTracks(uri, limit),
25 enabled: !!uri,
26 });
27
28export const useArtistAlbumsQuery = (uri: string, limit = 10) =>
29 useQuery({
30 queryKey: ["artistAlbums", uri, limit],
31 queryFn: () => getArtistAlbums(uri, limit),
32 enabled: !!uri,
33 });
34
35export const useArtistsQuery = (did: string, offset = 0, limit = 30) =>
36 useQuery({
37 queryKey: ["artists", did, offset, limit],
38 queryFn: () => getArtists(did, offset, limit),
39 enabled: !!did,
40 placeholderData: (prev) => prev,
41 });
42
43export const useArtistsInfiniteQuery = (did: string, limit = 30) =>
44 useInfiniteQuery({
45 queryKey: ["infiniteArtists", did],
46 queryFn: async ({ pageParam = 0 }) => {
47 const data = await getArtists(did, pageParam * limit, limit);
48 return {
49 artists: data,
50 nextOffset: pageParam + 1,
51 };
52 },
53 getNextPageParam: (lastPage) => {
54 return lastPage.artists.length < limit ? undefined : lastPage.nextOffset;
55 },
56 enabled: !!did,
57 initialPageParam: 0,
58 placeholderData: (prev) => prev,
59 refetchOnMount: false,
60 staleTime: 5 * 60 * 1000, // 5 minutes
61 });
62
63export const useAlbumsQuery = (did: string, offset = 0, limit = 12) =>
64 useQuery({
65 queryKey: ["albums", did, offset, limit],
66 queryFn: () => getAlbums(did, offset, limit),
67 enabled: !!did,
68 placeholderData: (prev) => prev,
69 });
70
71export const useAlbumsInfiniteQuery = (did: string, limit = 12) =>
72 useInfiniteQuery({
73 queryKey: ["infiniteAlbums", did],
74 queryFn: async ({ pageParam = 0 }) => {
75 const data = await getAlbums(did, pageParam * limit, limit);
76 return {
77 albums: data,
78 nextOffset: pageParam + 1,
79 };
80 },
81 getNextPageParam: (lastPage) => {
82 return lastPage.albums.length < limit ? undefined : lastPage.nextOffset;
83 },
84 enabled: !!did,
85 initialPageParam: 0,
86 placeholderData: (prev) => prev,
87 refetchOnMount: false,
88 staleTime: 5 * 60 * 1000, // 5 minutes
89 });
90
91export const useTracksQuery = (did: string, offset = 0, limit = 20) =>
92 useQuery({
93 queryKey: ["tracks", did, offset, limit],
94 queryFn: () => getTracks(did, offset, limit),
95 enabled: !!did,
96 placeholderData: (prev) => prev,
97 });
98
99export const useInfiniteTracksQuery = (did: string, limit = 20) =>
100 useInfiniteQuery({
101 queryKey: ["infiniteTracks", did],
102 queryFn: async ({ pageParam = 0 }) => {
103 const data = await getTracks(did, pageParam * limit, limit);
104 return {
105 tracks: data,
106 nextOffset: pageParam + 1,
107 };
108 },
109 getNextPageParam: (lastPage) => {
110 // If we got fewer items than requested, we're at the end
111 return lastPage.tracks.length < limit ? undefined : lastPage.nextOffset;
112 },
113 enabled: !!did,
114 initialPageParam: 0,
115 placeholderData: (prev) => prev,
116 refetchOnMount: false,
117 staleTime: 5 * 60 * 1000, // 5 minutes
118 });
119
120export const useLovedTracksQuery = (did: string, offset = 0, limit = 20) =>
121 useQuery({
122 queryKey: ["lovedTracks", did, offset, limit],
123 queryFn: () => getLovedTracks(did, offset, limit),
124 enabled: !!did,
125 placeholderData: (prev) => prev,
126 });
127
128export const useAlbumQuery = (did: string, rkey: string) =>
129 useQuery({
130 queryKey: ["album", did, rkey],
131 queryFn: () => getAlbum(did, rkey),
132 enabled: !!did && !!rkey,
133 });
134
135export const useArtistQuery = (did: string, rkey: string) =>
136 useQuery({
137 queryKey: ["artist", did, rkey],
138 queryFn: () => getArtist(did, rkey),
139 enabled: !!did && !!rkey,
140 });