@better-auth-ui/react 1.6.2 → 1.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/auth/auth-provider.d.ts +23 -8
- package/dist/components/auth/auth-provider.js +32 -17
- package/dist/components/{email → auth/email}/email-changed.js +2 -2
- package/dist/components/{email → auth/email}/email-localization.js +1 -1
- package/dist/components/{email → auth/email}/email-styles.js +1 -1
- package/dist/components/{email → auth/email}/email-verification.js +2 -2
- package/dist/components/{email → auth/email}/magic-link.js +2 -2
- package/dist/components/{email → auth/email}/new-device.js +2 -2
- package/dist/components/{email → auth/email}/otp-email.js +2 -2
- package/dist/components/{email → auth/email}/password-changed.js +2 -2
- package/dist/components/{email → auth/email}/reset-password.js +2 -2
- package/dist/email.d.ts +1 -0
- package/dist/email.js +11 -0
- package/dist/hooks/auth/use-authenticate.d.ts +6 -5
- package/dist/hooks/auth/use-authenticate.js +12 -12
- package/dist/hooks/auth/use-user.d.ts +18 -311
- package/dist/hooks/auth/use-user.js +5 -5
- package/dist/hooks/use-auth-mutation.d.ts +17 -0
- package/dist/hooks/use-auth-mutation.js +11 -0
- package/dist/hooks/use-auth-plugin.d.ts +31 -0
- package/dist/hooks/use-auth-plugin.js +10 -0
- package/dist/hooks/use-auth-query.d.ts +14 -0
- package/dist/hooks/use-auth-query.js +15 -0
- package/dist/index.d.ts +35 -34
- package/dist/index.js +74 -83
- package/dist/lib/auth-client.d.ts +23 -3687
- package/dist/lib/auth-plugin.d.ts +59 -0
- package/dist/lib/auth-server.d.ts +16 -0
- package/dist/mutations/auth/request-password-reset-mutation.d.ts +26 -0
- package/dist/mutations/auth/request-password-reset-mutation.js +24 -0
- package/dist/mutations/auth/reset-password-mutation.d.ts +25 -0
- package/dist/mutations/auth/reset-password-mutation.js +24 -0
- package/dist/mutations/auth/send-verification-email-mutation.d.ts +24 -0
- package/dist/mutations/auth/send-verification-email-mutation.js +24 -0
- package/dist/mutations/auth/sign-in-email-mutation.d.ts +71 -0
- package/dist/mutations/auth/sign-in-email-mutation.js +29 -0
- package/dist/mutations/auth/sign-in-social-mutation.d.ts +77 -0
- package/dist/mutations/auth/sign-in-social-mutation.js +24 -0
- package/dist/mutations/auth/sign-out-mutation.d.ts +25 -0
- package/dist/mutations/auth/sign-out-mutation.js +28 -0
- package/dist/mutations/auth/sign-up-email-mutation.d.ts +105 -0
- package/dist/mutations/auth/sign-up-email-mutation.js +29 -0
- package/dist/mutations/auth-mutation-options.d.ts +42 -0
- package/dist/mutations/auth-mutation-options.js +19 -0
- package/dist/mutations/magic-link/sign-in-magic-link-mutation.d.ts +24 -0
- package/dist/mutations/magic-link/sign-in-magic-link-mutation.js +24 -0
- package/dist/mutations/multi-session/revoke-multi-session-mutation.d.ts +25 -0
- package/dist/mutations/multi-session/revoke-multi-session-mutation.js +29 -0
- package/dist/mutations/multi-session/set-active-session-mutation.d.ts +62 -0
- package/dist/mutations/multi-session/set-active-session-mutation.js +31 -0
- package/dist/mutations/passkey/add-passkey-mutation.d.ts +71 -0
- package/dist/mutations/passkey/add-passkey-mutation.js +29 -0
- package/dist/mutations/passkey/delete-passkey-mutation.d.ts +25 -0
- package/dist/mutations/passkey/delete-passkey-mutation.js +29 -0
- package/dist/mutations/passkey/sign-in-passkey-mutation.d.ts +105 -0
- package/dist/mutations/passkey/sign-in-passkey-mutation.js +29 -0
- package/dist/mutations/settings/change-email-mutation.d.ts +25 -0
- package/dist/mutations/settings/change-email-mutation.js +29 -0
- package/dist/mutations/settings/change-password-mutation.d.ts +78 -0
- package/dist/mutations/settings/change-password-mutation.js +24 -0
- package/dist/mutations/settings/delete-user-mutation.d.ts +26 -0
- package/dist/mutations/settings/delete-user-mutation.js +24 -0
- package/dist/mutations/settings/link-social-mutation.d.ts +26 -0
- package/dist/mutations/settings/link-social-mutation.js +24 -0
- package/dist/mutations/settings/revoke-session-mutation.d.ts +25 -0
- package/dist/mutations/settings/revoke-session-mutation.js +29 -0
- package/dist/mutations/settings/unlink-account-mutation.d.ts +25 -0
- package/dist/mutations/settings/unlink-account-mutation.js +29 -0
- package/dist/mutations/settings/update-user-mutation.d.ts +25 -0
- package/dist/mutations/settings/update-user-mutation.js +35 -0
- package/dist/mutations/username/is-username-available-mutation.d.ts +27 -0
- package/dist/mutations/username/is-username-available-mutation.js +24 -0
- package/dist/mutations/username/sign-in-username-mutation.d.ts +75 -0
- package/dist/mutations/username/sign-in-username-mutation.js +29 -0
- package/dist/queries/auth/session-query.d.ts +71 -0
- package/dist/queries/auth/session-query.js +30 -0
- package/dist/queries/auth-query-options.d.ts +40 -0
- package/dist/queries/auth-query-options.js +17 -0
- package/dist/queries/multi-session/list-device-sessions-query.d.ts +76 -0
- package/dist/queries/multi-session/list-device-sessions-query.js +31 -0
- package/dist/queries/passkey/list-passkeys-query.d.ts +74 -0
- package/dist/queries/passkey/list-passkeys-query.js +31 -0
- package/dist/queries/settings/account-info-query.d.ts +85 -0
- package/dist/queries/settings/account-info-query.js +31 -0
- package/dist/queries/settings/list-accounts-query.d.ts +76 -0
- package/dist/queries/settings/list-accounts-query.js +31 -0
- package/dist/queries/settings/list-sessions-query.d.ts +74 -0
- package/dist/queries/settings/list-sessions-query.js +31 -0
- package/dist/server/queries/auth/session-query.d.ts +57 -0
- package/dist/server/queries/auth/session-query.js +13 -0
- package/dist/server/queries/multi-session/list-device-sessions-query.d.ts +60 -0
- package/dist/server/queries/multi-session/list-device-sessions-query.js +12 -0
- package/dist/server/queries/passkey/list-passkeys-query.d.ts +60 -0
- package/dist/server/queries/passkey/list-passkeys-query.js +12 -0
- package/dist/server/queries/settings/account-info-query.d.ts +68 -0
- package/dist/server/queries/settings/account-info-query.js +12 -0
- package/dist/server/queries/settings/list-accounts-query.d.ts +60 -0
- package/dist/server/queries/settings/list-accounts-query.js +12 -0
- package/dist/server/queries/settings/list-sessions-query.d.ts +60 -0
- package/dist/server/queries/settings/list-sessions-query.js +12 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.js +7 -0
- package/package.json +24 -22
- package/src/components/auth/auth-provider.tsx +87 -24
- package/src/components/{email → auth/email}/email-changed.tsx +1 -1
- package/src/components/{email → auth/email}/email-verification.tsx +1 -1
- package/src/components/{email → auth/email}/magic-link.tsx +1 -1
- package/src/components/{email → auth/email}/new-device.tsx +1 -1
- package/src/components/{email → auth/email}/otp-email.tsx +1 -1
- package/src/components/{email → auth/email}/password-changed.tsx +1 -1
- package/src/components/{email → auth/email}/reset-password.tsx +1 -1
- package/src/email.ts +1 -0
- package/src/hooks/auth/use-authenticate.ts +13 -10
- package/src/hooks/auth/use-user.ts +12 -8
- package/src/hooks/use-auth-mutation.ts +47 -0
- package/src/hooks/use-auth-plugin.ts +50 -0
- package/src/hooks/use-auth-query.ts +40 -0
- package/src/index.ts +35 -34
- package/src/lib/auth-client.ts +33 -31
- package/src/lib/auth-plugin.ts +75 -0
- package/src/lib/auth-server.ts +30 -0
- package/src/mutations/auth/request-password-reset-mutation.ts +58 -0
- package/src/mutations/auth/reset-password-mutation.ts +60 -0
- package/src/mutations/auth/send-verification-email-mutation.ts +58 -0
- package/src/mutations/auth/sign-in-email-mutation.ts +78 -0
- package/src/mutations/auth/sign-in-social-mutation.ts +64 -0
- package/src/mutations/auth/sign-out-mutation.ts +71 -0
- package/src/mutations/auth/sign-up-email-mutation.ts +74 -0
- package/src/mutations/auth-mutation-options.ts +94 -0
- package/src/mutations/magic-link/sign-in-magic-link-mutation.ts +59 -0
- package/src/mutations/multi-session/revoke-multi-session-mutation.ts +70 -0
- package/src/mutations/multi-session/set-active-session-mutation.ts +98 -0
- package/src/mutations/passkey/add-passkey-mutation.ts +66 -0
- package/src/mutations/passkey/delete-passkey-mutation.ts +66 -0
- package/src/mutations/passkey/sign-in-passkey-mutation.ts +74 -0
- package/src/mutations/settings/change-email-mutation.ts +67 -0
- package/src/mutations/settings/change-password-mutation.ts +59 -0
- package/src/mutations/settings/delete-user-mutation.ts +59 -0
- package/src/mutations/settings/link-social-mutation.ts +59 -0
- package/src/mutations/settings/revoke-session-mutation.ts +69 -0
- package/src/mutations/settings/unlink-account-mutation.ts +67 -0
- package/src/mutations/settings/update-user-mutation.ts +82 -0
- package/src/mutations/username/is-username-available-mutation.ts +62 -0
- package/src/mutations/username/sign-in-username-mutation.ts +74 -0
- package/src/queries/auth/session-query.ts +135 -0
- package/src/queries/auth-query-options.ts +83 -0
- package/src/queries/multi-session/list-device-sessions-query.ts +177 -0
- package/src/queries/passkey/list-passkeys-query.ts +154 -0
- package/src/queries/settings/account-info-query.ts +158 -0
- package/src/queries/settings/list-accounts-query.ts +156 -0
- package/src/queries/settings/list-sessions-query.ts +154 -0
- package/src/server/queries/auth/session-query.ts +94 -0
- package/src/server/queries/multi-session/list-device-sessions-query.ts +102 -0
- package/src/server/queries/passkey/list-passkeys-query.ts +100 -0
- package/src/server/queries/settings/account-info-query.ts +101 -0
- package/src/server/queries/settings/list-accounts-query.ts +101 -0
- package/src/server/queries/settings/list-sessions-query.ts +101 -0
- package/src/server.ts +7 -0
- package/dist/core.d.ts +0 -1
- package/dist/core.js +0 -1
- package/dist/hooks/auth/use-auth-mutation.d.ts +0 -18
- package/dist/hooks/auth/use-auth-mutation.js +0 -13
- package/dist/hooks/auth/use-auth-query.d.ts +0 -24
- package/dist/hooks/auth/use-auth-query.js +0 -13
- package/dist/hooks/auth/use-is-username-available.d.ts +0 -19
- package/dist/hooks/auth/use-is-username-available.js +0 -12
- package/dist/hooks/auth/use-request-password-reset.d.ts +0 -25
- package/dist/hooks/auth/use-request-password-reset.js +0 -12
- package/dist/hooks/auth/use-reset-password.d.ts +0 -39
- package/dist/hooks/auth/use-reset-password.js +0 -12
- package/dist/hooks/auth/use-send-verification-email.d.ts +0 -23
- package/dist/hooks/auth/use-send-verification-email.js +0 -12
- package/dist/hooks/auth/use-session.d.ts +0 -9
- package/dist/hooks/auth/use-session.js +0 -15
- package/dist/hooks/auth/use-sign-in-email.d.ts +0 -52
- package/dist/hooks/auth/use-sign-in-email.js +0 -18
- package/dist/hooks/auth/use-sign-in-magic-link.d.ts +0 -31
- package/dist/hooks/auth/use-sign-in-magic-link.js +0 -12
- package/dist/hooks/auth/use-sign-in-passkey.d.ts +0 -58
- package/dist/hooks/auth/use-sign-in-passkey.js +0 -18
- package/dist/hooks/auth/use-sign-in-social.d.ts +0 -92
- package/dist/hooks/auth/use-sign-in-social.js +0 -12
- package/dist/hooks/auth/use-sign-in-username.d.ts +0 -53
- package/dist/hooks/auth/use-sign-in-username.js +0 -18
- package/dist/hooks/auth/use-sign-out.d.ts +0 -18
- package/dist/hooks/auth/use-sign-out.js +0 -18
- package/dist/hooks/auth/use-sign-up-email.d.ts +0 -1269
- package/dist/hooks/auth/use-sign-up-email.js +0 -18
- package/dist/hooks/settings/use-account-info.d.ts +0 -17
- package/dist/hooks/settings/use-account-info.js +0 -21
- package/dist/hooks/settings/use-add-passkey.d.ts +0 -43
- package/dist/hooks/settings/use-add-passkey.js +0 -18
- package/dist/hooks/settings/use-change-email.d.ts +0 -24
- package/dist/hooks/settings/use-change-email.js +0 -18
- package/dist/hooks/settings/use-change-password.d.ts +0 -53
- package/dist/hooks/settings/use-change-password.js +0 -12
- package/dist/hooks/settings/use-delete-passkey.d.ts +0 -21
- package/dist/hooks/settings/use-delete-passkey.js +0 -18
- package/dist/hooks/settings/use-delete-user.d.ts +0 -41
- package/dist/hooks/settings/use-delete-user.js +0 -12
- package/dist/hooks/settings/use-link-social.d.ts +0 -46
- package/dist/hooks/settings/use-link-social.js +0 -12
- package/dist/hooks/settings/use-list-accounts.d.ts +0 -20
- package/dist/hooks/settings/use-list-accounts.js +0 -21
- package/dist/hooks/settings/use-list-device-sessions.d.ts +0 -11
- package/dist/hooks/settings/use-list-device-sessions.js +0 -21
- package/dist/hooks/settings/use-list-sessions.d.ts +0 -20
- package/dist/hooks/settings/use-list-sessions.js +0 -21
- package/dist/hooks/settings/use-list-user-passkeys.d.ts +0 -11
- package/dist/hooks/settings/use-list-user-passkeys.js +0 -21
- package/dist/hooks/settings/use-revoke-multi-session.d.ts +0 -19
- package/dist/hooks/settings/use-revoke-multi-session.js +0 -18
- package/dist/hooks/settings/use-revoke-session.d.ts +0 -19
- package/dist/hooks/settings/use-revoke-session.js +0 -18
- package/dist/hooks/settings/use-set-active-session.d.ts +0 -37
- package/dist/hooks/settings/use-set-active-session.js +0 -21
- package/dist/hooks/settings/use-unlink-account.d.ts +0 -21
- package/dist/hooks/settings/use-unlink-account.js +0 -18
- package/dist/hooks/settings/use-update-user.d.ts +0 -11
- package/dist/hooks/settings/use-update-user.js +0 -25
- package/dist/lib/auth-client.js +0 -11
- package/dist/lib/auth-config.d.ts +0 -43
- package/dist/lib/auth-context.d.ts +0 -2
- package/dist/lib/auth-context.js +0 -6
- package/src/core.ts +0 -1
- package/src/hooks/auth/use-auth-mutation.ts +0 -56
- package/src/hooks/auth/use-auth-query.ts +0 -50
- package/src/hooks/auth/use-is-username-available.ts +0 -22
- package/src/hooks/auth/use-request-password-reset.ts +0 -22
- package/src/hooks/auth/use-reset-password.ts +0 -21
- package/src/hooks/auth/use-send-verification-email.ts +0 -21
- package/src/hooks/auth/use-session.ts +0 -27
- package/src/hooks/auth/use-sign-in-email.ts +0 -34
- package/src/hooks/auth/use-sign-in-magic-link.ts +0 -21
- package/src/hooks/auth/use-sign-in-passkey.ts +0 -34
- package/src/hooks/auth/use-sign-in-social.ts +0 -21
- package/src/hooks/auth/use-sign-in-username.ts +0 -34
- package/src/hooks/auth/use-sign-out.ts +0 -33
- package/src/hooks/auth/use-sign-up-email.ts +0 -34
- package/src/hooks/settings/use-account-info.ts +0 -31
- package/src/hooks/settings/use-add-passkey.ts +0 -32
- package/src/hooks/settings/use-change-email.ts +0 -33
- package/src/hooks/settings/use-change-password.ts +0 -19
- package/src/hooks/settings/use-delete-passkey.ts +0 -32
- package/src/hooks/settings/use-delete-user.ts +0 -19
- package/src/hooks/settings/use-link-social.ts +0 -19
- package/src/hooks/settings/use-list-accounts.ts +0 -29
- package/src/hooks/settings/use-list-device-sessions.ts +0 -34
- package/src/hooks/settings/use-list-sessions.ts +0 -28
- package/src/hooks/settings/use-list-user-passkeys.ts +0 -30
- package/src/hooks/settings/use-revoke-multi-session.ts +0 -30
- package/src/hooks/settings/use-revoke-session.ts +0 -30
- package/src/hooks/settings/use-set-active-session.ts +0 -47
- package/src/hooks/settings/use-unlink-account.ts +0 -30
- package/src/hooks/settings/use-update-user.ts +0 -43
- package/src/lib/auth-config.ts +0 -48
- package/src/lib/auth-context.ts +0 -6
- /package/dist/components/{email → auth/email}/email-changed.d.ts +0 -0
- /package/dist/components/{email → auth/email}/email-localization.d.ts +0 -0
- /package/dist/components/{email → auth/email}/email-styles.d.ts +0 -0
- /package/dist/components/{email → auth/email}/email-verification.d.ts +0 -0
- /package/dist/components/{email → auth/email}/index.d.ts +0 -0
- /package/dist/components/{email → auth/email}/index.js +0 -0
- /package/dist/components/{email → auth/email}/magic-link.d.ts +0 -0
- /package/dist/components/{email → auth/email}/new-device.d.ts +0 -0
- /package/dist/components/{email → auth/email}/otp-email.d.ts +0 -0
- /package/dist/components/{email → auth/email}/password-changed.d.ts +0 -0
- /package/dist/components/{email → auth/email}/reset-password.d.ts +0 -0
- /package/src/components/{email → auth/email}/email-localization.tsx +0 -0
- /package/src/components/{email → auth/email}/email-styles.tsx +0 -0
- /package/src/components/{email → auth/email}/index.ts +0 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { authMutationKeys } from "@better-auth-ui/core"
|
|
2
|
+
import { mutationOptions, useMutation } from "@tanstack/react-query"
|
|
3
|
+
import type { BetterFetchError } from "better-auth/react"
|
|
4
|
+
|
|
5
|
+
import type { UsernameAuthClient } from "../../lib/auth-client"
|
|
6
|
+
|
|
7
|
+
export type IsUsernameAvailableParams<TAuthClient extends UsernameAuthClient> =
|
|
8
|
+
Parameters<TAuthClient["isUsernameAvailable"]>[0]
|
|
9
|
+
|
|
10
|
+
export type IsUsernameAvailableOptions<TAuthClient extends UsernameAuthClient> =
|
|
11
|
+
Omit<
|
|
12
|
+
ReturnType<typeof isUsernameAvailableOptions<TAuthClient>>,
|
|
13
|
+
"mutationKey" | "mutationFn"
|
|
14
|
+
>
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Mutation options factory for checking username availability.
|
|
18
|
+
*
|
|
19
|
+
* Modeled as a mutation because callers typically trigger the check on
|
|
20
|
+
* user action (debounced input, form submit) rather than on mount.
|
|
21
|
+
*
|
|
22
|
+
* @param authClient - The Better Auth client.
|
|
23
|
+
*/
|
|
24
|
+
export function isUsernameAvailableOptions<
|
|
25
|
+
TAuthClient extends UsernameAuthClient
|
|
26
|
+
>(authClient: TAuthClient) {
|
|
27
|
+
const mutationKey = authMutationKeys.isUsernameAvailable
|
|
28
|
+
|
|
29
|
+
const mutationFn = (params: IsUsernameAvailableParams<TAuthClient>) =>
|
|
30
|
+
authClient.isUsernameAvailable({
|
|
31
|
+
...params,
|
|
32
|
+
fetchOptions: { ...params?.fetchOptions, throw: true }
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
return mutationOptions<
|
|
36
|
+
Awaited<ReturnType<typeof mutationFn>>,
|
|
37
|
+
BetterFetchError,
|
|
38
|
+
Parameters<typeof mutationFn>[0]
|
|
39
|
+
>({
|
|
40
|
+
mutationKey,
|
|
41
|
+
mutationFn
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Create a mutation for checking whether a username is available.
|
|
47
|
+
*
|
|
48
|
+
* Wraps `authClient.isUsernameAvailable` and forwards React Query mutation
|
|
49
|
+
* options such as `onSuccess`, `onError`, and `retry`.
|
|
50
|
+
*
|
|
51
|
+
* @param authClient - The Better Auth client with the username plugin.
|
|
52
|
+
* @param options - React Query options forwarded to `useMutation`.
|
|
53
|
+
*/
|
|
54
|
+
export function useIsUsernameAvailable<TAuthClient extends UsernameAuthClient>(
|
|
55
|
+
authClient: TAuthClient,
|
|
56
|
+
options?: IsUsernameAvailableOptions<TAuthClient>
|
|
57
|
+
) {
|
|
58
|
+
return useMutation({
|
|
59
|
+
...isUsernameAvailableOptions(authClient),
|
|
60
|
+
...options
|
|
61
|
+
})
|
|
62
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { authMutationKeys } from "@better-auth-ui/core"
|
|
2
|
+
import {
|
|
3
|
+
mutationOptions,
|
|
4
|
+
useMutation,
|
|
5
|
+
useQueryClient
|
|
6
|
+
} from "@tanstack/react-query"
|
|
7
|
+
import type { BetterFetchError } from "better-auth/react"
|
|
8
|
+
|
|
9
|
+
import type { UsernameAuthClient } from "../../lib/auth-client"
|
|
10
|
+
import { sessionOptions } from "../../queries/auth/session-query"
|
|
11
|
+
|
|
12
|
+
export type SignInUsernameParams<TAuthClient extends UsernameAuthClient> =
|
|
13
|
+
Parameters<TAuthClient["signIn"]["username"]>[0]
|
|
14
|
+
|
|
15
|
+
export type SignInUsernameOptions<TAuthClient extends UsernameAuthClient> =
|
|
16
|
+
Omit<
|
|
17
|
+
ReturnType<typeof signInUsernameOptions<TAuthClient>>,
|
|
18
|
+
"mutationKey" | "mutationFn"
|
|
19
|
+
>
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Mutation options factory for username/password sign-in.
|
|
23
|
+
*
|
|
24
|
+
* @param authClient - The Better Auth client.
|
|
25
|
+
*/
|
|
26
|
+
export function signInUsernameOptions<TAuthClient extends UsernameAuthClient>(
|
|
27
|
+
authClient: TAuthClient
|
|
28
|
+
) {
|
|
29
|
+
const mutationKey = authMutationKeys.signIn.username
|
|
30
|
+
|
|
31
|
+
const mutationFn = (params: SignInUsernameParams<TAuthClient>) =>
|
|
32
|
+
authClient.signIn.username({
|
|
33
|
+
...params,
|
|
34
|
+
fetchOptions: { ...params?.fetchOptions, throw: true }
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
return mutationOptions<
|
|
38
|
+
Awaited<ReturnType<typeof mutationFn>>,
|
|
39
|
+
BetterFetchError,
|
|
40
|
+
Parameters<typeof mutationFn>[0]
|
|
41
|
+
>({
|
|
42
|
+
mutationKey,
|
|
43
|
+
mutationFn
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Create a mutation for username/password sign-in.
|
|
49
|
+
*
|
|
50
|
+
* Wraps `authClient.signIn.username`, resets the session query on success so
|
|
51
|
+
* the new session is refetched, and forwards React Query mutation options
|
|
52
|
+
* such as `onSuccess`, `onError`, and `retry`.
|
|
53
|
+
*
|
|
54
|
+
* @param authClient - The Better Auth client with the username plugin.
|
|
55
|
+
* @param options - React Query options forwarded to `useMutation`.
|
|
56
|
+
*/
|
|
57
|
+
export function useSignInUsername<TAuthClient extends UsernameAuthClient>(
|
|
58
|
+
authClient: TAuthClient,
|
|
59
|
+
options?: SignInUsernameOptions<TAuthClient>
|
|
60
|
+
) {
|
|
61
|
+
const queryClient = useQueryClient()
|
|
62
|
+
|
|
63
|
+
return useMutation({
|
|
64
|
+
...signInUsernameOptions(authClient),
|
|
65
|
+
...options,
|
|
66
|
+
onSuccess: async (...args) => {
|
|
67
|
+
queryClient.resetQueries({
|
|
68
|
+
queryKey: sessionOptions(authClient).queryKey
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
await options?.onSuccess?.(...args)
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { authQueryKeys } from "@better-auth-ui/core"
|
|
2
|
+
import {
|
|
3
|
+
type DataTag,
|
|
4
|
+
type QueryClient,
|
|
5
|
+
queryOptions,
|
|
6
|
+
useQuery
|
|
7
|
+
} from "@tanstack/react-query"
|
|
8
|
+
import type { BetterFetchError } from "better-auth/react"
|
|
9
|
+
|
|
10
|
+
import type { AuthClient, InferData } from "../../lib/auth-client"
|
|
11
|
+
|
|
12
|
+
export type SessionData<TAuthClient extends AuthClient = AuthClient> =
|
|
13
|
+
InferData<TAuthClient["getSession"]>
|
|
14
|
+
|
|
15
|
+
export type Session<TAuthClient extends AuthClient = AuthClient> = NonNullable<
|
|
16
|
+
SessionData<TAuthClient>
|
|
17
|
+
>
|
|
18
|
+
|
|
19
|
+
export type SessionParams<TAuthClient extends AuthClient> = Parameters<
|
|
20
|
+
TAuthClient["getSession"]
|
|
21
|
+
>[0]
|
|
22
|
+
|
|
23
|
+
export type SessionOptions<TAuthClient extends AuthClient> = Omit<
|
|
24
|
+
ReturnType<typeof sessionOptions<TAuthClient>>,
|
|
25
|
+
"queryKey" | "queryFn"
|
|
26
|
+
>
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Query options factory for the current session.
|
|
30
|
+
*
|
|
31
|
+
* Shares a query key with the server-side `sessionOptions` so that data
|
|
32
|
+
* prefetched during SSR hydrates seamlessly into the client cache.
|
|
33
|
+
*
|
|
34
|
+
* @param authClient - The Better Auth client.
|
|
35
|
+
* @param params - Parameters forwarded to `authClient.getSession`.
|
|
36
|
+
*/
|
|
37
|
+
export function sessionOptions<TAuthClient extends AuthClient>(
|
|
38
|
+
authClient: TAuthClient,
|
|
39
|
+
params?: SessionParams<TAuthClient>
|
|
40
|
+
) {
|
|
41
|
+
type TData = SessionData<TAuthClient>
|
|
42
|
+
const queryKey = authQueryKeys.session
|
|
43
|
+
|
|
44
|
+
const options = queryOptions<TData, BetterFetchError, TData, typeof queryKey>(
|
|
45
|
+
{
|
|
46
|
+
queryKey,
|
|
47
|
+
queryFn: ({ signal }) =>
|
|
48
|
+
authClient.getSession({
|
|
49
|
+
...params,
|
|
50
|
+
fetchOptions: { ...params?.fetchOptions, signal, throw: true }
|
|
51
|
+
}) as Promise<TData>
|
|
52
|
+
}
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
return options as typeof options & {
|
|
56
|
+
queryKey: DataTag<typeof queryKey, TData, BetterFetchError>
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Get the current session from the query cache, calling `fetchSession` under
|
|
62
|
+
* the hood if no cached entry exists. Resolves with the session data, making
|
|
63
|
+
* it ideal for loaders or `beforeLoad` guards.
|
|
64
|
+
*
|
|
65
|
+
* @param queryClient - The React Query client.
|
|
66
|
+
* @param authClient - The Better Auth client.
|
|
67
|
+
* @param params - Parameters forwarded to `authClient.getSession`.
|
|
68
|
+
*/
|
|
69
|
+
export const ensureSession = <TAuthClient extends AuthClient>(
|
|
70
|
+
queryClient: QueryClient,
|
|
71
|
+
authClient: TAuthClient,
|
|
72
|
+
params?: SessionParams<TAuthClient>
|
|
73
|
+
) => queryClient.ensureQueryData(sessionOptions(authClient, params))
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Prefetch the current session into the query cache. Behaves like
|
|
77
|
+
* `fetchSession`, but does not throw on error and does not return the data —
|
|
78
|
+
* use this to warm the cache without blocking navigation.
|
|
79
|
+
*
|
|
80
|
+
* @param queryClient - The React Query client.
|
|
81
|
+
* @param authClient - The Better Auth client.
|
|
82
|
+
* @param params - Parameters forwarded to `authClient.getSession`.
|
|
83
|
+
*/
|
|
84
|
+
export const prefetchSession = <TAuthClient extends AuthClient>(
|
|
85
|
+
queryClient: QueryClient,
|
|
86
|
+
authClient: TAuthClient,
|
|
87
|
+
params?: SessionParams<TAuthClient>
|
|
88
|
+
) => queryClient.prefetchQuery(sessionOptions(authClient, params))
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Fetch and cache the current session, resolving with the data or throwing
|
|
92
|
+
* on error. If a cached entry exists and is neither invalidated nor older
|
|
93
|
+
* than `staleTime`, the cached value is returned without a network call;
|
|
94
|
+
* otherwise the latest data is fetched.
|
|
95
|
+
*
|
|
96
|
+
* @param queryClient - The React Query client.
|
|
97
|
+
* @param authClient - The Better Auth client.
|
|
98
|
+
* @param params - Parameters forwarded to `authClient.getSession`.
|
|
99
|
+
*/
|
|
100
|
+
export const fetchSession = <TAuthClient extends AuthClient>(
|
|
101
|
+
queryClient: QueryClient,
|
|
102
|
+
authClient: TAuthClient,
|
|
103
|
+
params?: SessionParams<TAuthClient>
|
|
104
|
+
) => queryClient.fetchQuery(sessionOptions(authClient, params))
|
|
105
|
+
|
|
106
|
+
export type UseSessionOptions<TAuthClient extends AuthClient> =
|
|
107
|
+
SessionOptions<TAuthClient> & SessionParams<TAuthClient>
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Subscribe to the current session via TanStack Query.
|
|
111
|
+
*
|
|
112
|
+
* Shares a query key with the server-side `sessionOptions`, so SSR-hydrated
|
|
113
|
+
* session data is reused from the cache without an immediate refetch.
|
|
114
|
+
*
|
|
115
|
+
* @param authClient - The Better Auth client.
|
|
116
|
+
* @param options - `getSession` params (`query`, `fetchOptions`) merged
|
|
117
|
+
* with `useQuery` options (e.g. `enabled`, `staleTime`, `select`).
|
|
118
|
+
* @param queryClient - Optional custom `QueryClient`. Defaults to the client
|
|
119
|
+
* from the nearest `QueryClientProvider`.
|
|
120
|
+
*/
|
|
121
|
+
export function useSession<TAuthClient extends AuthClient>(
|
|
122
|
+
authClient: TAuthClient,
|
|
123
|
+
options: UseSessionOptions<TAuthClient> = {},
|
|
124
|
+
queryClient?: QueryClient
|
|
125
|
+
) {
|
|
126
|
+
const { query, fetchOptions, ...queryOptions } = options
|
|
127
|
+
|
|
128
|
+
return useQuery(
|
|
129
|
+
{
|
|
130
|
+
...sessionOptions(authClient, { query, fetchOptions }),
|
|
131
|
+
...queryOptions
|
|
132
|
+
},
|
|
133
|
+
queryClient
|
|
134
|
+
)
|
|
135
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type DataTag,
|
|
3
|
+
type QueryKey,
|
|
4
|
+
queryOptions,
|
|
5
|
+
type UseQueryOptions
|
|
6
|
+
} from "@tanstack/react-query"
|
|
7
|
+
import type { BetterFetchError, BetterFetchOption } from "better-auth/client"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Read-style Better Auth client method (params shape `{ query?, fetchOptions? }`).
|
|
11
|
+
* Mutation-style endpoints use `AuthMutationFn` / `useAuthMutation` instead.
|
|
12
|
+
*/
|
|
13
|
+
export type AuthQueryFn<TData = unknown> = (params: {
|
|
14
|
+
query?: Record<string, unknown>
|
|
15
|
+
fetchOptions?: BetterFetchOption
|
|
16
|
+
}) => Promise<{ data: TData }>
|
|
17
|
+
|
|
18
|
+
export type AuthQueryFnData<TFn> =
|
|
19
|
+
TFn extends AuthQueryFn<infer TData> ? TData : never
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Final query key produced by {@link authQueryOptions}: the caller's prefix
|
|
23
|
+
* followed by `params.query ?? null`.
|
|
24
|
+
*/
|
|
25
|
+
export type AuthQueryKey<
|
|
26
|
+
TFn extends AuthQueryFn = AuthQueryFn,
|
|
27
|
+
TPrefix extends QueryKey = QueryKey
|
|
28
|
+
> = readonly [...TPrefix, NonNullable<Parameters<TFn>[0]>["query"] | null]
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Return type of {@link authQueryOptions}. Named so TypeScript emits
|
|
32
|
+
* `DataTag<…>` by reference in the `.d.ts`, instead of the raw
|
|
33
|
+
* `{ [dataTagSymbol]: … }` intersection — which triggers a declaration-emit
|
|
34
|
+
* bug where `dataTagSymbol` isn't re-imported at the use site and silently
|
|
35
|
+
* breaks `setQueryData`/`getQueryData` type inference at the consumer.
|
|
36
|
+
*/
|
|
37
|
+
export type AuthQueryOptions<
|
|
38
|
+
TFn extends AuthQueryFn = AuthQueryFn,
|
|
39
|
+
TPrefix extends QueryKey = QueryKey
|
|
40
|
+
> = Omit<
|
|
41
|
+
UseQueryOptions<
|
|
42
|
+
AuthQueryFnData<TFn>,
|
|
43
|
+
BetterFetchError,
|
|
44
|
+
AuthQueryFnData<TFn>,
|
|
45
|
+
AuthQueryKey<TFn, TPrefix>
|
|
46
|
+
>,
|
|
47
|
+
"queryKey"
|
|
48
|
+
> & {
|
|
49
|
+
queryKey: DataTag<
|
|
50
|
+
AuthQueryKey<TFn, TPrefix>,
|
|
51
|
+
AuthQueryFnData<TFn>,
|
|
52
|
+
BetterFetchError
|
|
53
|
+
>
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Build `queryOptions` for a Better Auth endpoint.
|
|
58
|
+
*
|
|
59
|
+
* Injects React Query's `signal` and `throw: true` into `fetchOptions` so the
|
|
60
|
+
* request is cancelled on unmount and errors surface as `BetterFetchError`
|
|
61
|
+
* instead of `{ data, error }`.
|
|
62
|
+
*
|
|
63
|
+
* @param authFn - Better Auth client method (e.g. `authClient.getSession`).
|
|
64
|
+
* @param queryKey - Scope prefix for the key. `params.query` is appended automatically.
|
|
65
|
+
* @param params - Parameters forwarded to `authFn`.
|
|
66
|
+
*/
|
|
67
|
+
export function authQueryOptions<
|
|
68
|
+
TFn extends AuthQueryFn,
|
|
69
|
+
const TPrefix extends QueryKey
|
|
70
|
+
>(
|
|
71
|
+
authFn: TFn,
|
|
72
|
+
queryKey: TPrefix,
|
|
73
|
+
params?: Parameters<TFn>[0]
|
|
74
|
+
): AuthQueryOptions<TFn, TPrefix> {
|
|
75
|
+
return queryOptions<AuthQueryFnData<TFn>, BetterFetchError>({
|
|
76
|
+
queryKey: [...queryKey, params?.query ?? null] as const,
|
|
77
|
+
queryFn: ({ signal }) =>
|
|
78
|
+
authFn({
|
|
79
|
+
...params,
|
|
80
|
+
fetchOptions: { ...params?.fetchOptions, signal, throw: true }
|
|
81
|
+
}) as Promise<AuthQueryFnData<TFn>>
|
|
82
|
+
}) as AuthQueryOptions<TFn, TPrefix>
|
|
83
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { authQueryKeys } from "@better-auth-ui/core"
|
|
2
|
+
import {
|
|
3
|
+
type DataTag,
|
|
4
|
+
type QueryClient,
|
|
5
|
+
queryOptions,
|
|
6
|
+
skipToken,
|
|
7
|
+
useQuery
|
|
8
|
+
} from "@tanstack/react-query"
|
|
9
|
+
import type { BetterFetchError } from "better-auth/react"
|
|
10
|
+
|
|
11
|
+
import type { InferData, MultiSessionAuthClient } from "../../lib/auth-client"
|
|
12
|
+
import { useSession } from "../auth/session-query"
|
|
13
|
+
|
|
14
|
+
export type ListDeviceSessionsData<
|
|
15
|
+
TAuthClient extends MultiSessionAuthClient = MultiSessionAuthClient
|
|
16
|
+
> = InferData<TAuthClient["multiSession"]["listDeviceSessions"]>
|
|
17
|
+
|
|
18
|
+
export type ListDeviceSession<
|
|
19
|
+
TAuthClient extends MultiSessionAuthClient = MultiSessionAuthClient
|
|
20
|
+
> = NonNullable<ListDeviceSessionsData<TAuthClient>>[number]
|
|
21
|
+
|
|
22
|
+
export type ListDeviceSessionsParams<
|
|
23
|
+
TAuthClient extends MultiSessionAuthClient
|
|
24
|
+
> = Parameters<TAuthClient["multiSession"]["listDeviceSessions"]>[0]
|
|
25
|
+
|
|
26
|
+
export type ListDeviceSessionsOptions<
|
|
27
|
+
TAuthClient extends MultiSessionAuthClient
|
|
28
|
+
> = Omit<
|
|
29
|
+
ReturnType<typeof listDeviceSessionsOptions<TAuthClient>>,
|
|
30
|
+
"queryKey" | "queryFn"
|
|
31
|
+
>
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Query options factory for the current user's device sessions.
|
|
35
|
+
*
|
|
36
|
+
* @param authClient - The Better Auth client with the multi-session plugin.
|
|
37
|
+
* @param userId - The current signed-in user's ID. Used for cache partitioning.
|
|
38
|
+
* @param params - Parameters forwarded to `authClient.multiSession.listDeviceSessions`.
|
|
39
|
+
*/
|
|
40
|
+
export function listDeviceSessionsOptions<
|
|
41
|
+
TAuthClient extends MultiSessionAuthClient
|
|
42
|
+
>(
|
|
43
|
+
authClient: TAuthClient,
|
|
44
|
+
userId: string | undefined,
|
|
45
|
+
params?: ListDeviceSessionsParams<TAuthClient>
|
|
46
|
+
) {
|
|
47
|
+
type TData = ListDeviceSessionsData<TAuthClient>
|
|
48
|
+
const queryKey = authQueryKeys.listDeviceSessions(userId, params?.query)
|
|
49
|
+
|
|
50
|
+
const options = queryOptions<TData, BetterFetchError, TData, typeof queryKey>(
|
|
51
|
+
{
|
|
52
|
+
queryKey,
|
|
53
|
+
queryFn: ({ signal }) =>
|
|
54
|
+
authClient.multiSession.listDeviceSessions({
|
|
55
|
+
...params,
|
|
56
|
+
fetchOptions: { ...params?.fetchOptions, signal, throw: true }
|
|
57
|
+
}) as Promise<TData>
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
return options as typeof options & {
|
|
62
|
+
queryKey: DataTag<typeof queryKey, TData, BetterFetchError>
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Get the current user's device sessions from the query cache, calling
|
|
68
|
+
* `fetchListDeviceSessions` under the hood if no cached entry exists.
|
|
69
|
+
* Resolves with the device session list, making it ideal for loaders or
|
|
70
|
+
* `beforeLoad` guards.
|
|
71
|
+
*
|
|
72
|
+
* @param queryClient - The React Query client.
|
|
73
|
+
* @param authClient - The Better Auth client with the multi-session plugin.
|
|
74
|
+
* @param userId - The signed-in user's ID, used for cache partitioning.
|
|
75
|
+
* @param params - Parameters forwarded to `authClient.multiSession.listDeviceSessions`.
|
|
76
|
+
*/
|
|
77
|
+
export const ensureListDeviceSessions = <
|
|
78
|
+
TAuthClient extends MultiSessionAuthClient
|
|
79
|
+
>(
|
|
80
|
+
queryClient: QueryClient,
|
|
81
|
+
authClient: TAuthClient,
|
|
82
|
+
userId: string,
|
|
83
|
+
params?: ListDeviceSessionsParams<TAuthClient>
|
|
84
|
+
) =>
|
|
85
|
+
queryClient.ensureQueryData(
|
|
86
|
+
listDeviceSessionsOptions(authClient, userId, params)
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Prefetch the current user's device sessions into the query cache. Behaves
|
|
91
|
+
* like `fetchListDeviceSessions`, but does not throw on error and does not
|
|
92
|
+
* return the data — use this to warm the cache without blocking navigation.
|
|
93
|
+
*
|
|
94
|
+
* @param queryClient - The React Query client.
|
|
95
|
+
* @param authClient - The Better Auth client with the multi-session plugin.
|
|
96
|
+
* @param userId - The signed-in user's ID, used for cache partitioning.
|
|
97
|
+
* @param params - Parameters forwarded to `authClient.multiSession.listDeviceSessions`.
|
|
98
|
+
*/
|
|
99
|
+
export const prefetchListDeviceSessions = <
|
|
100
|
+
TAuthClient extends MultiSessionAuthClient
|
|
101
|
+
>(
|
|
102
|
+
queryClient: QueryClient,
|
|
103
|
+
authClient: TAuthClient,
|
|
104
|
+
userId: string,
|
|
105
|
+
params?: ListDeviceSessionsParams<TAuthClient>
|
|
106
|
+
) =>
|
|
107
|
+
queryClient.prefetchQuery(
|
|
108
|
+
listDeviceSessionsOptions(authClient, userId, params)
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Fetch and cache the current user's device sessions, resolving with the
|
|
113
|
+
* data or throwing on error. If a cached entry exists and is neither
|
|
114
|
+
* invalidated nor older than `staleTime`, the cached value is returned
|
|
115
|
+
* without a network call; otherwise the latest data is fetched.
|
|
116
|
+
*
|
|
117
|
+
* @param queryClient - The React Query client.
|
|
118
|
+
* @param authClient - The Better Auth client with the multi-session plugin.
|
|
119
|
+
* @param userId - The signed-in user's ID, used for cache partitioning.
|
|
120
|
+
* @param params - Parameters forwarded to `authClient.multiSession.listDeviceSessions`.
|
|
121
|
+
*/
|
|
122
|
+
export const fetchListDeviceSessions = <
|
|
123
|
+
TAuthClient extends MultiSessionAuthClient
|
|
124
|
+
>(
|
|
125
|
+
queryClient: QueryClient,
|
|
126
|
+
authClient: TAuthClient,
|
|
127
|
+
userId: string,
|
|
128
|
+
params?: ListDeviceSessionsParams<TAuthClient>
|
|
129
|
+
) =>
|
|
130
|
+
queryClient.fetchQuery(listDeviceSessionsOptions(authClient, userId, params))
|
|
131
|
+
|
|
132
|
+
export type UseListDeviceSessionsOptions<
|
|
133
|
+
TAuthClient extends MultiSessionAuthClient
|
|
134
|
+
> = ListDeviceSessionsOptions<TAuthClient> &
|
|
135
|
+
ListDeviceSessionsParams<TAuthClient>
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Subscribe to the current user's device sessions (multi-session account
|
|
139
|
+
* switcher) via TanStack Query.
|
|
140
|
+
*
|
|
141
|
+
* Shares a query key with the server-side `listDeviceSessionsOptions`, so
|
|
142
|
+
* SSR-hydrated data is reused from the cache without an immediate refetch.
|
|
143
|
+
* The query is gated on a signed-in user; while the session is loading or
|
|
144
|
+
* absent, the underlying `queryFn` is replaced with `skipToken`.
|
|
145
|
+
*
|
|
146
|
+
* @param authClient - The Better Auth client with the multi-session plugin.
|
|
147
|
+
* @param options - `listDeviceSessions` params (`query`, `fetchOptions`)
|
|
148
|
+
* merged with `useQuery` options (e.g. `enabled`, `staleTime`, `select`).
|
|
149
|
+
* @param queryClient - Optional custom `QueryClient`. Defaults to the client
|
|
150
|
+
* from the nearest `QueryClientProvider`.
|
|
151
|
+
*/
|
|
152
|
+
export function useListDeviceSessions<
|
|
153
|
+
TAuthClient extends MultiSessionAuthClient
|
|
154
|
+
>(
|
|
155
|
+
authClient: TAuthClient,
|
|
156
|
+
options: UseListDeviceSessionsOptions<TAuthClient> = {},
|
|
157
|
+
queryClient?: QueryClient
|
|
158
|
+
) {
|
|
159
|
+
const { data: session } = useSession(authClient, undefined, queryClient)
|
|
160
|
+
const userId = session?.user.id
|
|
161
|
+
|
|
162
|
+
const { query, fetchOptions, ...queryOptions } = options
|
|
163
|
+
|
|
164
|
+
const baseOptions = listDeviceSessionsOptions(authClient, userId, {
|
|
165
|
+
query,
|
|
166
|
+
fetchOptions
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
return useQuery(
|
|
170
|
+
{
|
|
171
|
+
...queryOptions,
|
|
172
|
+
...baseOptions,
|
|
173
|
+
queryFn: userId ? baseOptions.queryFn : skipToken
|
|
174
|
+
},
|
|
175
|
+
queryClient
|
|
176
|
+
)
|
|
177
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { authQueryKeys } from "@better-auth-ui/core"
|
|
2
|
+
import {
|
|
3
|
+
type DataTag,
|
|
4
|
+
type QueryClient,
|
|
5
|
+
queryOptions,
|
|
6
|
+
skipToken,
|
|
7
|
+
useQuery
|
|
8
|
+
} from "@tanstack/react-query"
|
|
9
|
+
import type { BetterFetchError } from "better-auth/react"
|
|
10
|
+
|
|
11
|
+
import type { InferData, PasskeyAuthClient } from "../../lib/auth-client"
|
|
12
|
+
import { useSession } from "../auth/session-query"
|
|
13
|
+
|
|
14
|
+
export type ListPasskeysData<TAuthClient extends PasskeyAuthClient> = InferData<
|
|
15
|
+
TAuthClient["passkey"]["listUserPasskeys"]
|
|
16
|
+
>
|
|
17
|
+
|
|
18
|
+
export type ListPasskeysParams<TAuthClient extends PasskeyAuthClient> =
|
|
19
|
+
Parameters<TAuthClient["passkey"]["listUserPasskeys"]>[0]
|
|
20
|
+
|
|
21
|
+
export type ListPasskey<
|
|
22
|
+
TAuthClient extends PasskeyAuthClient = PasskeyAuthClient
|
|
23
|
+
> = NonNullable<ListPasskeysData<TAuthClient>>[number]
|
|
24
|
+
|
|
25
|
+
export type ListPasskeysOptions<TAuthClient extends PasskeyAuthClient> = Omit<
|
|
26
|
+
ReturnType<typeof listPasskeysOptions<TAuthClient>>,
|
|
27
|
+
"queryKey" | "queryFn"
|
|
28
|
+
>
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Query options factory for the current user's passkeys.
|
|
32
|
+
*
|
|
33
|
+
* @param authClient - The Better Auth client with the passkey plugin.
|
|
34
|
+
* @param userId - The current signed-in user's ID. Used for cache partitioning.
|
|
35
|
+
* @param params - Parameters forwarded to `authClient.passkey.listUserPasskeys`.
|
|
36
|
+
*/
|
|
37
|
+
export function listPasskeysOptions<TAuthClient extends PasskeyAuthClient>(
|
|
38
|
+
authClient: TAuthClient,
|
|
39
|
+
userId: string | undefined,
|
|
40
|
+
params?: ListPasskeysParams<TAuthClient>
|
|
41
|
+
) {
|
|
42
|
+
type TData = ListPasskeysData<TAuthClient>
|
|
43
|
+
const queryKey = authQueryKeys.listPasskeys(userId, params?.query)
|
|
44
|
+
|
|
45
|
+
const options = queryOptions<TData, BetterFetchError, TData, typeof queryKey>(
|
|
46
|
+
{
|
|
47
|
+
queryKey,
|
|
48
|
+
queryFn: ({ signal }) =>
|
|
49
|
+
authClient.passkey.listUserPasskeys({
|
|
50
|
+
...params,
|
|
51
|
+
fetchOptions: { ...params?.fetchOptions, signal, throw: true }
|
|
52
|
+
}) as Promise<TData>
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
return options as typeof options & {
|
|
57
|
+
queryKey: DataTag<typeof queryKey, TData, BetterFetchError>
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Get the current user's passkeys from the query cache, calling
|
|
63
|
+
* `fetchListPasskeys` under the hood if no cached entry exists. Resolves
|
|
64
|
+
* with the passkey list, making it ideal for loaders or `beforeLoad` guards.
|
|
65
|
+
*
|
|
66
|
+
* @param queryClient - The React Query client.
|
|
67
|
+
* @param authClient - The Better Auth client with the passkey plugin.
|
|
68
|
+
* @param userId - The signed-in user's ID, used for cache partitioning.
|
|
69
|
+
* @param params - Parameters forwarded to `authClient.passkey.listUserPasskeys`.
|
|
70
|
+
*/
|
|
71
|
+
export const ensureListPasskeys = <TAuthClient extends PasskeyAuthClient>(
|
|
72
|
+
queryClient: QueryClient,
|
|
73
|
+
authClient: TAuthClient,
|
|
74
|
+
userId: string,
|
|
75
|
+
params?: ListPasskeysParams<TAuthClient>
|
|
76
|
+
) =>
|
|
77
|
+
queryClient.ensureQueryData(listPasskeysOptions(authClient, userId, params))
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Prefetch the current user's passkeys into the query cache. Behaves like
|
|
81
|
+
* `fetchListPasskeys`, but does not throw on error and does not return
|
|
82
|
+
* the data — use this to warm the cache without blocking navigation.
|
|
83
|
+
*
|
|
84
|
+
* @param queryClient - The React Query client.
|
|
85
|
+
* @param authClient - The Better Auth client with the passkey plugin.
|
|
86
|
+
* @param userId - The signed-in user's ID, used for cache partitioning.
|
|
87
|
+
* @param params - Parameters forwarded to `authClient.passkey.listUserPasskeys`.
|
|
88
|
+
*/
|
|
89
|
+
export const prefetchListPasskeys = <TAuthClient extends PasskeyAuthClient>(
|
|
90
|
+
queryClient: QueryClient,
|
|
91
|
+
authClient: TAuthClient,
|
|
92
|
+
userId: string,
|
|
93
|
+
params?: ListPasskeysParams<TAuthClient>
|
|
94
|
+
) => queryClient.prefetchQuery(listPasskeysOptions(authClient, userId, params))
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Fetch and cache the current user's passkeys, resolving with the data or
|
|
98
|
+
* throwing on error. If a cached entry exists and is neither invalidated
|
|
99
|
+
* nor older than `staleTime`, the cached value is returned without a
|
|
100
|
+
* network call; otherwise the latest data is fetched.
|
|
101
|
+
*
|
|
102
|
+
* @param queryClient - The React Query client.
|
|
103
|
+
* @param authClient - The Better Auth client with the passkey plugin.
|
|
104
|
+
* @param userId - The signed-in user's ID, used for cache partitioning.
|
|
105
|
+
* @param params - Parameters forwarded to `authClient.passkey.listUserPasskeys`.
|
|
106
|
+
*/
|
|
107
|
+
export const fetchListPasskeys = <TAuthClient extends PasskeyAuthClient>(
|
|
108
|
+
queryClient: QueryClient,
|
|
109
|
+
authClient: TAuthClient,
|
|
110
|
+
userId: string,
|
|
111
|
+
params?: ListPasskeysParams<TAuthClient>
|
|
112
|
+
) => queryClient.fetchQuery(listPasskeysOptions(authClient, userId, params))
|
|
113
|
+
|
|
114
|
+
export type UseListPasskeysOptions<TAuthClient extends PasskeyAuthClient> =
|
|
115
|
+
ListPasskeysOptions<TAuthClient> & ListPasskeysParams<TAuthClient>
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Subscribe to the current user's passkeys via TanStack Query.
|
|
119
|
+
*
|
|
120
|
+
* Shares a query key with the server-side `listPasskeysOptions`, so
|
|
121
|
+
* SSR-hydrated data is reused from the cache without an immediate refetch.
|
|
122
|
+
* The query is gated on a signed-in user; while the session is loading or
|
|
123
|
+
* absent, the underlying `queryFn` is replaced with `skipToken`.
|
|
124
|
+
*
|
|
125
|
+
* @param authClient - The Better Auth client with the passkey plugin.
|
|
126
|
+
* @param options - `listPasskeys` params (`query`, `fetchOptions`) merged
|
|
127
|
+
* with `useQuery` options (e.g. `enabled`, `staleTime`, `select`).
|
|
128
|
+
* @param queryClient - Optional custom `QueryClient`. Defaults to the client
|
|
129
|
+
* from the nearest `QueryClientProvider`.
|
|
130
|
+
*/
|
|
131
|
+
export function useListPasskeys<TAuthClient extends PasskeyAuthClient>(
|
|
132
|
+
authClient: TAuthClient,
|
|
133
|
+
options: UseListPasskeysOptions<TAuthClient> = {},
|
|
134
|
+
queryClient?: QueryClient
|
|
135
|
+
) {
|
|
136
|
+
const { data: session } = useSession(authClient, undefined, queryClient)
|
|
137
|
+
const userId = session?.user.id
|
|
138
|
+
|
|
139
|
+
const { query, fetchOptions, ...queryOptions } = options
|
|
140
|
+
|
|
141
|
+
const baseOptions = listPasskeysOptions(authClient, userId, {
|
|
142
|
+
query,
|
|
143
|
+
fetchOptions
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
return useQuery(
|
|
147
|
+
{
|
|
148
|
+
...queryOptions,
|
|
149
|
+
...baseOptions,
|
|
150
|
+
queryFn: userId ? baseOptions.queryFn : skipToken
|
|
151
|
+
},
|
|
152
|
+
queryClient
|
|
153
|
+
)
|
|
154
|
+
}
|