-
Notifications
You must be signed in to change notification settings - Fork 113
/
Copy pathuseUserCollectibles.ts
94 lines (80 loc) · 2.46 KB
/
useUserCollectibles.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import { Id } from '@audius/sdk'
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import { useAudiusQueryContext } from '~/audius-query'
import { CollectiblesMetadata, ID } from '~/models'
import { QUERY_KEYS } from './queryKeys'
import { QueryOptions } from './types'
export type GetUserCollectiblesArgs = {
userId: ID | null
}
export const getUserCollectiblesQueryKey = ({
userId
}: GetUserCollectiblesArgs) => [QUERY_KEYS.userCollectibles, userId]
/** Returns the user's known/ordered collectibles list if they have been set */
export const useUserCollectibles = (
args: GetUserCollectiblesArgs,
options?: QueryOptions
) => {
const { userId } = args
const context = useAudiusQueryContext()
const { audiusSdk } = context
const queryResult = useQuery({
queryKey: getUserCollectiblesQueryKey({ userId }),
queryFn: async () => {
const sdk = await audiusSdk()
const { data } = await sdk.users.getUserCollectibles({
id: Id.parse(userId)
})
return (data?.data as CollectiblesMetadata) ?? null
},
...options,
enabled: options?.enabled !== false && !!args.userId
})
return queryResult
}
export type UpdateUserCollectiblesParams = {
userId: ID
collectibles: CollectiblesMetadata
}
type MutationContext = {
previousCollectibles: CollectiblesMetadata | undefined
}
export const useUpdateUserCollectibles = () => {
const context = useAudiusQueryContext()
const queryClient = useQueryClient()
const { audiusSdk } = context
return useMutation({
mutationFn: async ({
userId,
collectibles
}: UpdateUserCollectiblesParams) => {
const sdk = await audiusSdk()
const response = await sdk.users.updateCollectibles({
userId: Id.parse(userId),
collectibles
})
return response
},
onMutate: async ({
userId,
collectibles
}: UpdateUserCollectiblesParams) => {
const queryKey = getUserCollectiblesQueryKey({ userId })
await queryClient.cancelQueries({
queryKey
})
const previousCollectibles =
queryClient.getQueryData<CollectiblesMetadata>(queryKey)
queryClient.setQueryData(queryKey, collectibles)
return { previousCollectibles }
},
onError: (_err, { userId }, context?: MutationContext) => {
if (context) {
queryClient.setQueryData(
getUserCollectiblesQueryKey({ userId }),
context.previousCollectibles
)
}
}
})
}