A decentralized music tracking and discovery platform built on AT Protocol 馃幍
at feat/discord-webhook 140 lines 4.1 kB view raw
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 });