add mutation for creating pack

This commit is contained in:
Hailey
2024-06-19 15:53:00 -07:00
parent 512cd985dd
commit a1880ac1ba
2 changed files with 93 additions and 2 deletions
+1 -1
View File
@@ -9,7 +9,7 @@ import {
import {useAgent} from 'state/session'
const RQKEY_ROOT = 'actor-starter-packs'
const RQKEY = (did?: string) => [RQKEY_ROOT, did]
export const RQKEY = (did?: string) => [RQKEY_ROOT, did]
export function useActorStarterPacksQuery({did}: {did?: string}) {
const agent = useAgent()
+92 -1
View File
@@ -1,10 +1,28 @@
import {
AppBskyActorDefs,
AppBskyFeedDefs,
AppBskyGraphDefs,
AppBskyGraphGetList,
BskyAgent,
} from '@atproto/api'
import {StarterPackView} from '@atproto/api/dist/client/types/app/bsky/graph/defs'
import {QueryClient, useQuery} from '@tanstack/react-query'
import {
QueryClient,
useMutation,
useQuery,
useQueryClient,
} from '@tanstack/react-query'
import {until} from 'lib/async/until'
import {createStarterPackList} from 'lib/generate-starterpack'
import {
httpStarterPackUriToAtUri,
parseStarterPackUri,
} from 'lib/strings/starter-pack'
import {
invalidateActorStarterPacksQuery,
RQKEY,
} from 'state/queries/actor-starter-packs'
import {useAgent} from 'state/session'
const RQKEY_ROOT = 'starter-pack'
@@ -57,3 +75,76 @@ export async function invalidateStarterPack({
}) {
await queryClient.invalidateQueries({queryKey: RQKEY(did, rkey)})
}
interface UseCreateStarterPackMutationParams {
name: string
description?: string
descriptionFacets: []
profiles: AppBskyActorDefs.ProfileViewBasic[]
feeds?: AppBskyFeedDefs.GeneratorView[]
}
export function useCreateStarterPackMutation({
onSuccess,
}: {
onSuccess: () => void
onError: (e: Error) => void
}) {
const queryClient = useQueryClient()
const agent = useAgent()
return useMutation<
{uri: string; cid: string},
Error,
UseCreateStarterPackMutationParams
>({
mutationFn: async params => {
let listRes
const listRes = await createStarterPackList({...params, agent})
return await agent.app.bsky.graph.starterpack.create(
{
repo: agent.session?.did,
validate: false, // TODO remove
},
{
...params,
list: listRes.uri,
createdAt: new Date().toISOString(),
},
)
},
onSuccess: async data => {
await whenAppViewReady(
agent,
data.uri,
(v?: AppBskyGraphDefs.StarterPackView) => {
return typeof v.uri === 'string'
},
)
await invalidateActorStarterPacksQuery({
queryClient,
did: agent.session?.did,
})
onSuccess()
},
onError: async error => {
onError(error)
},
})
}
async function whenAppViewReady(
agent: BskyAgent,
uri: string,
fn: (res?: AppBskyGraphGetList.Response) => boolean,
) {
await until(
5, // 5 tries
1e3, // 1s delay between tries
fn,
() =>
agent.app.bsky.graph.getStarterPack({
starterPack: uri,
}),
)
}