@daveyplate/better-auth-ui
Version:
Plug & play shadcn/ui components for better-auth
113 lines (105 loc) • 3.82 kB
text/typescript
import {
AuthQueryContext,
createAuthHooks
} from "@daveyplate/better-auth-tanstack"
import { useIsRestoring, useQueryClient } from "@tanstack/react-query"
import { useCallback, useContext, useMemo } from "react"
import type { AuthHooks } from "../../types/auth-hooks"
import type { AuthMutators } from "../../types/auth-mutators"
export function useTanstackOptions({
authClient
}: {
// biome-ignore lint/suspicious/noExplicitAny: ignore
authClient: any
}) {
const {
useUnlinkAccount,
useUpdateUser,
useDeletePasskey,
useRevokeSession,
useRevokeDeviceSession,
useSetActiveSession
} = createAuthHooks(authClient)
const queryClient = useQueryClient()
const { mutateAsync: updateUserAsync } = useUpdateUser()
const { mutateAsync: deletePasskeyAsync } = useDeletePasskey()
const { mutateAsync: unlinkAccountAsync } = useUnlinkAccount()
const { mutateAsync: revokeSessionAsync } = useRevokeSession()
const { mutateAsync: revokeDeviceSessionAsync } = useRevokeDeviceSession()
const { setActiveSessionAsync } = useSetActiveSession()
const { sessionKey } = useContext(AuthQueryContext)
const hooks = useMemo(
() => ({
...(createAuthHooks(authClient) as Partial<AuthHooks>),
useIsRestoring
}),
[]
)
const mutators = useMemo(
() =>
({
updateUser: async (params) => {
const { error } = await updateUserAsync({
...params,
fetchOptions: { throw: false }
})
if (error) throw error
},
unlinkAccount: async (params) => {
const { error } = await unlinkAccountAsync({
...params,
fetchOptions: { throw: false }
})
if (error) throw error
},
deletePasskey: async (params) => {
const { error } = await deletePasskeyAsync({
...params,
fetchOptions: { throw: false }
})
if (error) throw error
},
revokeSession: async (params) => {
const { error } = await revokeSessionAsync({
...params,
fetchOptions: { throw: false }
})
if (error) throw error
},
setActiveSession: async (params) => {
const { error } = await setActiveSessionAsync({
...params,
fetchOptions: { throw: false }
})
if (error) throw error
},
revokeDeviceSession: async (params) => {
const { error } = await revokeDeviceSessionAsync({
...params,
fetchOptions: { throw: false }
})
if (error) throw error
}
}) as AuthMutators,
[
updateUserAsync,
deletePasskeyAsync,
unlinkAccountAsync,
revokeSessionAsync,
revokeDeviceSessionAsync,
setActiveSessionAsync
]
)
const onSessionChange = useCallback(async () => {
await queryClient.refetchQueries({ queryKey: sessionKey })
queryClient.invalidateQueries({
predicate: (query) => query.queryKey !== sessionKey
})
}, [queryClient, sessionKey])
return {
hooks,
mutators,
onSessionChange,
optimistic: true
}
}