@better-auth-ui/react 1.6.8 → 1.6.10

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.
Files changed (233) hide show
  1. package/dist/components/auth/auth-context.d.ts +3 -0
  2. package/dist/components/auth/email/email-localization.d.ts +11 -3
  3. package/dist/components/auth/email/index.d.ts +1 -0
  4. package/dist/components/auth/email/organization-invitation.d.ts +121 -0
  5. package/dist/components/mutation-invalidator.d.ts +1 -0
  6. package/dist/email.js +1348 -11
  7. package/dist/hooks/auth/use-authenticate.d.ts +1 -1
  8. package/dist/hooks/auth/use-user.d.ts +12 -12
  9. package/dist/hooks/use-auth-query.d.ts +1 -1
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.js +2469 -79
  12. package/dist/lib/auth-client.d.ts +4 -1
  13. package/dist/lib/auth-plugin.d.ts +16 -0
  14. package/dist/lib/auth-server.d.ts +8 -1
  15. package/dist/lib/settings-tab.d.ts +19 -0
  16. package/dist/mutations/api-key/create-api-key-mutation.d.ts +6 -4
  17. package/dist/mutations/api-key/delete-api-key-mutation.d.ts +7 -3
  18. package/dist/mutations/auth/sign-in-email-mutation.d.ts +5 -5
  19. package/dist/mutations/auth/sign-out-mutation.d.ts +6 -4
  20. package/dist/mutations/auth/sign-up-email-mutation.d.ts +5 -5
  21. package/dist/mutations/multi-session/revoke-multi-session-mutation.d.ts +5 -5
  22. package/dist/mutations/multi-session/set-active-session-mutation.d.ts +5 -6
  23. package/dist/mutations/organization/accept-invitation-mutation.d.ts +43 -0
  24. package/dist/mutations/organization/cancel-invitation-mutation.d.ts +25 -0
  25. package/dist/mutations/organization/check-slug-mutation.d.ts +21 -0
  26. package/dist/mutations/organization/create-organization-mutation.d.ts +39 -0
  27. package/dist/mutations/organization/delete-organization-mutation.d.ts +21 -0
  28. package/dist/mutations/organization/index.d.ts +12 -0
  29. package/dist/mutations/organization/invite-member-mutation.d.ts +43 -0
  30. package/dist/mutations/organization/leave-organization-mutation.d.ts +65 -0
  31. package/dist/mutations/organization/reject-invitation-mutation.d.ts +31 -0
  32. package/dist/mutations/organization/remove-member-mutation.d.ts +35 -0
  33. package/dist/mutations/organization/set-active-organization-mutation.d.ts +71 -0
  34. package/dist/mutations/organization/update-member-role-mutation.d.ts +31 -0
  35. package/dist/mutations/organization/update-organization-mutation.d.ts +21 -0
  36. package/dist/mutations/passkey/add-passkey-mutation.d.ts +5 -5
  37. package/dist/mutations/passkey/delete-passkey-mutation.d.ts +5 -5
  38. package/dist/mutations/passkey/sign-in-passkey-mutation.d.ts +5 -5
  39. package/dist/mutations/settings/change-email-mutation.d.ts +6 -5
  40. package/dist/mutations/settings/revoke-session-mutation.d.ts +5 -5
  41. package/dist/mutations/settings/unlink-account-mutation.d.ts +5 -5
  42. package/dist/mutations/settings/update-user-mutation.d.ts +5 -5
  43. package/dist/mutations/username/sign-in-username-mutation.d.ts +5 -5
  44. package/dist/plugins/captcha-plugin.d.ts +2 -2
  45. package/dist/plugins.js +27 -2
  46. package/dist/queries/api-key/list-api-keys-query.d.ts +17 -8
  47. package/dist/queries/auth/session-query.d.ts +1 -1
  48. package/dist/queries/multi-session/list-device-sessions-query.d.ts +5 -5
  49. package/dist/queries/organization/active-organization-query.d.ts +39 -0
  50. package/dist/queries/organization/full-organization-query.d.ts +37 -0
  51. package/dist/queries/organization/has-permission-query.d.ts +21 -0
  52. package/dist/queries/organization/index.d.ts +7 -0
  53. package/dist/queries/organization/list-invitations-query.d.ts +29 -0
  54. package/dist/queries/organization/list-members-query.d.ts +61 -0
  55. package/dist/queries/organization/list-organizations-query.d.ts +22 -0
  56. package/dist/queries/organization/list-user-invitations-query.d.ts +29 -0
  57. package/dist/queries/passkey/list-passkeys-query.d.ts +5 -5
  58. package/dist/queries/settings/account-info-query.d.ts +1 -1
  59. package/dist/queries/settings/list-accounts-query.d.ts +1 -1
  60. package/dist/queries/settings/list-sessions-query.d.ts +1 -1
  61. package/dist/server/queries/api-key/list-api-keys-query.d.ts +83 -0
  62. package/dist/server/queries/multi-session/list-device-sessions-query.d.ts +4 -4
  63. package/dist/server/queries/organization/active-organization-query.d.ts +61 -0
  64. package/dist/server/queries/organization/full-organization-query.d.ts +42 -0
  65. package/dist/server/queries/organization/has-permission-query.d.ts +66 -0
  66. package/dist/server/queries/organization/list-invitations-query.d.ts +34 -0
  67. package/dist/server/queries/organization/list-members-query.d.ts +66 -0
  68. package/dist/server/queries/organization/list-organizations-query.d.ts +27 -0
  69. package/dist/server/queries/organization/list-user-invitations-query.d.ts +34 -0
  70. package/dist/server/queries/passkey/list-passkeys-query.d.ts +4 -4
  71. package/dist/server.d.ts +8 -0
  72. package/dist/server.js +131 -7
  73. package/dist/use-auth-plugin-ClcP84Uz.js +80 -0
  74. package/package.json +19 -16
  75. package/src/components/auth/auth-context.tsx +7 -0
  76. package/src/components/auth/auth-provider.tsx +19 -31
  77. package/src/components/auth/email/email-localization.tsx +5 -3
  78. package/src/components/auth/email/index.ts +1 -0
  79. package/src/components/auth/email/organization-invitation.tsx +454 -0
  80. package/src/components/mutation-invalidator.tsx +67 -0
  81. package/src/index.ts +3 -0
  82. package/src/lib/auth-client.ts +7 -0
  83. package/src/lib/auth-plugin.ts +17 -0
  84. package/src/lib/auth-server.ts +17 -1
  85. package/src/lib/settings-tab.ts +21 -0
  86. package/src/mutations/api-key/create-api-key-mutation.ts +34 -19
  87. package/src/mutations/api-key/delete-api-key-mutation.ts +36 -19
  88. package/src/mutations/auth/sign-in-email-mutation.ts +18 -22
  89. package/src/mutations/auth/sign-out-mutation.ts +19 -13
  90. package/src/mutations/auth/sign-up-email-mutation.ts +18 -22
  91. package/src/mutations/multi-session/revoke-multi-session-mutation.ts +31 -20
  92. package/src/mutations/multi-session/set-active-session-mutation.ts +25 -44
  93. package/src/mutations/organization/accept-invitation-mutation.ts +71 -0
  94. package/src/mutations/organization/cancel-invitation-mutation.ts +67 -0
  95. package/src/mutations/organization/check-slug-mutation.ts +55 -0
  96. package/src/mutations/organization/create-organization-mutation.ts +71 -0
  97. package/src/mutations/organization/delete-organization-mutation.ts +71 -0
  98. package/src/mutations/organization/index.ts +12 -0
  99. package/src/mutations/organization/invite-member-mutation.ts +81 -0
  100. package/src/mutations/organization/leave-organization-mutation.ts +74 -0
  101. package/src/mutations/organization/reject-invitation-mutation.ts +64 -0
  102. package/src/mutations/organization/remove-member-mutation.ts +67 -0
  103. package/src/mutations/organization/set-active-organization-mutation.ts +142 -0
  104. package/src/mutations/organization/update-member-role-mutation.ts +81 -0
  105. package/src/mutations/organization/update-organization-mutation.ts +84 -0
  106. package/src/mutations/passkey/add-passkey-mutation.ts +28 -17
  107. package/src/mutations/passkey/delete-passkey-mutation.ts +27 -17
  108. package/src/mutations/passkey/sign-in-passkey-mutation.ts +18 -21
  109. package/src/mutations/settings/change-email-mutation.ts +22 -18
  110. package/src/mutations/settings/delete-user-mutation.ts +2 -2
  111. package/src/mutations/settings/revoke-session-mutation.ts +24 -19
  112. package/src/mutations/settings/unlink-account-mutation.ts +24 -17
  113. package/src/mutations/settings/update-user-mutation.ts +18 -30
  114. package/src/mutations/username/is-username-available-mutation.ts +2 -2
  115. package/src/mutations/username/sign-in-username-mutation.ts +20 -23
  116. package/src/queries/api-key/list-api-keys-query.ts +20 -8
  117. package/src/queries/multi-session/list-device-sessions-query.ts +2 -2
  118. package/src/queries/organization/active-organization-query.ts +140 -0
  119. package/src/queries/organization/full-organization-query.ts +113 -0
  120. package/src/queries/organization/has-permission-query.ts +124 -0
  121. package/src/queries/organization/index.ts +7 -0
  122. package/src/queries/organization/list-invitations-query.ts +133 -0
  123. package/src/queries/organization/list-members-query.ts +133 -0
  124. package/src/queries/organization/list-organizations-query.ts +122 -0
  125. package/src/queries/organization/list-user-invitations-query.ts +122 -0
  126. package/src/queries/passkey/list-passkeys-query.ts +2 -2
  127. package/src/server/queries/api-key/list-api-keys-query.ts +94 -0
  128. package/src/server/queries/multi-session/list-device-sessions-query.ts +2 -2
  129. package/src/server/queries/organization/active-organization-query.ts +92 -0
  130. package/src/server/queries/organization/full-organization-query.ts +64 -0
  131. package/src/server/queries/organization/has-permission-query.ts +66 -0
  132. package/src/server/queries/organization/list-invitations-query.ts +81 -0
  133. package/src/server/queries/organization/list-members-query.ts +75 -0
  134. package/src/server/queries/organization/list-organizations-query.ts +67 -0
  135. package/src/server/queries/organization/list-user-invitations-query.ts +68 -0
  136. package/src/server/queries/passkey/list-passkeys-query.ts +2 -2
  137. package/src/server.ts +8 -0
  138. package/dist/components/auth/auth-provider.js +0 -44
  139. package/dist/components/auth/email/email-changed.js +0 -156
  140. package/dist/components/auth/email/email-localization.js +0 -19
  141. package/dist/components/auth/email/email-styles.js +0 -104
  142. package/dist/components/auth/email/email-verification.js +0 -140
  143. package/dist/components/auth/email/index.js +0 -9
  144. package/dist/components/auth/email/magic-link.js +0 -141
  145. package/dist/components/auth/email/new-device.js +0 -223
  146. package/dist/components/auth/email/otp-email.js +0 -129
  147. package/dist/components/auth/email/password-changed.js +0 -159
  148. package/dist/components/auth/email/reset-password.js +0 -140
  149. package/dist/components/auth/fetch-options-provider.js +0 -30
  150. package/dist/components/icons/apple.js +0 -17
  151. package/dist/components/icons/atlassian.js +0 -39
  152. package/dist/components/icons/cognito.js +0 -20
  153. package/dist/components/icons/discord.js +0 -17
  154. package/dist/components/icons/dropbox.js +0 -17
  155. package/dist/components/icons/facebook.js +0 -20
  156. package/dist/components/icons/figma.js +0 -35
  157. package/dist/components/icons/github.js +0 -17
  158. package/dist/components/icons/gitlab.js +0 -31
  159. package/dist/components/icons/google.js +0 -40
  160. package/dist/components/icons/huggingface.js +0 -39
  161. package/dist/components/icons/index.js +0 -35
  162. package/dist/components/icons/kakao.js +0 -17
  163. package/dist/components/icons/kick.js +0 -21
  164. package/dist/components/icons/line.js +0 -17
  165. package/dist/components/icons/linear.js +0 -17
  166. package/dist/components/icons/linkedin.js +0 -34
  167. package/dist/components/icons/microsoft.js +0 -31
  168. package/dist/components/icons/naver.js +0 -17
  169. package/dist/components/icons/notion.js +0 -17
  170. package/dist/components/icons/paybin.js +0 -33
  171. package/dist/components/icons/paypal.js +0 -31
  172. package/dist/components/icons/polar.js +0 -25
  173. package/dist/components/icons/railway.js +0 -17
  174. package/dist/components/icons/reddit.js +0 -22
  175. package/dist/components/icons/roblox.js +0 -18
  176. package/dist/components/icons/salesforce.js +0 -17
  177. package/dist/components/icons/slack.js +0 -31
  178. package/dist/components/icons/spotify.js +0 -17
  179. package/dist/components/icons/tiktok.js +0 -24
  180. package/dist/components/icons/twitch.js +0 -44
  181. package/dist/components/icons/vercel.js +0 -17
  182. package/dist/components/icons/vk.js +0 -17
  183. package/dist/components/icons/wechat.js +0 -17
  184. package/dist/components/icons/x.js +0 -17
  185. package/dist/components/icons/zoom.js +0 -70
  186. package/dist/components/settings/account/theme-preview.js +0 -289
  187. package/dist/hooks/auth/use-authenticate.js +0 -23
  188. package/dist/hooks/auth/use-user.js +0 -11
  189. package/dist/hooks/use-auth-mutation.js +0 -11
  190. package/dist/hooks/use-auth-plugin.js +0 -10
  191. package/dist/hooks/use-auth-query.js +0 -15
  192. package/dist/lib/provider-icons.js +0 -76
  193. package/dist/lib/utils.js +0 -8
  194. package/dist/mutations/api-key/create-api-key-mutation.js +0 -29
  195. package/dist/mutations/api-key/delete-api-key-mutation.js +0 -29
  196. package/dist/mutations/auth/request-password-reset-mutation.js +0 -24
  197. package/dist/mutations/auth/reset-password-mutation.js +0 -24
  198. package/dist/mutations/auth/send-verification-email-mutation.js +0 -24
  199. package/dist/mutations/auth/sign-in-email-mutation.js +0 -29
  200. package/dist/mutations/auth/sign-in-social-mutation.js +0 -24
  201. package/dist/mutations/auth/sign-out-mutation.js +0 -28
  202. package/dist/mutations/auth/sign-up-email-mutation.js +0 -29
  203. package/dist/mutations/auth-mutation-options.js +0 -19
  204. package/dist/mutations/magic-link/sign-in-magic-link-mutation.js +0 -24
  205. package/dist/mutations/multi-session/revoke-multi-session-mutation.js +0 -29
  206. package/dist/mutations/multi-session/set-active-session-mutation.js +0 -31
  207. package/dist/mutations/passkey/add-passkey-mutation.js +0 -29
  208. package/dist/mutations/passkey/delete-passkey-mutation.js +0 -29
  209. package/dist/mutations/passkey/sign-in-passkey-mutation.js +0 -29
  210. package/dist/mutations/settings/change-email-mutation.js +0 -29
  211. package/dist/mutations/settings/change-password-mutation.js +0 -24
  212. package/dist/mutations/settings/delete-user-mutation.js +0 -24
  213. package/dist/mutations/settings/link-social-mutation.js +0 -24
  214. package/dist/mutations/settings/revoke-session-mutation.js +0 -29
  215. package/dist/mutations/settings/unlink-account-mutation.js +0 -29
  216. package/dist/mutations/settings/update-user-mutation.js +0 -35
  217. package/dist/mutations/username/is-username-available-mutation.js +0 -24
  218. package/dist/mutations/username/sign-in-username-mutation.js +0 -29
  219. package/dist/plugins/captcha-plugin.js +0 -29
  220. package/dist/queries/api-key/list-api-keys-query.js +0 -31
  221. package/dist/queries/auth/session-query.js +0 -30
  222. package/dist/queries/auth-query-options.js +0 -17
  223. package/dist/queries/multi-session/list-device-sessions-query.js +0 -31
  224. package/dist/queries/passkey/list-passkeys-query.js +0 -31
  225. package/dist/queries/settings/account-info-query.js +0 -31
  226. package/dist/queries/settings/list-accounts-query.js +0 -31
  227. package/dist/queries/settings/list-sessions-query.js +0 -31
  228. package/dist/server/queries/auth/session-query.js +0 -13
  229. package/dist/server/queries/multi-session/list-device-sessions-query.js +0 -12
  230. package/dist/server/queries/passkey/list-passkeys-query.js +0 -12
  231. package/dist/server/queries/settings/account-info-query.js +0 -12
  232. package/dist/server/queries/settings/list-accounts-query.js +0 -12
  233. package/dist/server/queries/settings/list-sessions-query.js +0 -12
@@ -1,9 +1,13 @@
1
- import { authMutationKeys } from "@better-auth-ui/core"
2
- import { mutationOptions, useMutation } from "@tanstack/react-query"
1
+ import { authMutationKeys, authQueryKeys } from "@better-auth-ui/core"
2
+ import {
3
+ mutationOptions,
4
+ type QueryClient,
5
+ useMutation
6
+ } from "@tanstack/react-query"
3
7
  import type { BetterFetchError } from "better-auth/react"
4
8
 
5
9
  import type { AuthClient } from "../../lib/auth-client"
6
- import { useListAccounts } from "../../queries/settings/list-accounts-query"
10
+ import { useSession } from "../../queries/auth/session-query"
7
11
 
8
12
  export type UnlinkAccountParams<TAuthClient extends AuthClient> = Parameters<
9
13
  TAuthClient["unlinkAccount"]
@@ -11,7 +15,7 @@ export type UnlinkAccountParams<TAuthClient extends AuthClient> = Parameters<
11
15
 
12
16
  export type UnlinkAccountOptions<TAuthClient extends AuthClient> = Omit<
13
17
  ReturnType<typeof unlinkAccountOptions<TAuthClient>>,
14
- "mutationKey" | "mutationFn"
18
+ "mutationKey" | "mutationFn" | "meta"
15
19
  >
16
20
 
17
21
  /**
@@ -43,25 +47,28 @@ export function unlinkAccountOptions<TAuthClient extends AuthClient>(
43
47
  /**
44
48
  * Create a mutation for unlinking a social provider from the current user.
45
49
  *
46
- * Wraps `authClient.unlinkAccount`, refetches the linked accounts list on
47
- * success, and forwards React Query mutation options such as `onSuccess`,
48
- * `onError`, and `retry`.
50
+ * On success, `MutationInvalidator` awaits invalidation of the linked
51
+ * accounts list (see `meta.awaits`).
49
52
  *
50
53
  * @param authClient - The Better Auth client.
51
54
  * @param options - React Query options forwarded to `useMutation`.
52
55
  */
53
56
  export function useUnlinkAccount<TAuthClient extends AuthClient>(
54
57
  authClient: TAuthClient,
55
- options?: UnlinkAccountOptions<TAuthClient>
58
+ options?: UnlinkAccountOptions<TAuthClient>,
59
+ queryClient?: QueryClient
56
60
  ) {
57
- const { refetch } = useListAccounts(authClient, { refetchOnMount: false })
61
+ const { data: session } = useSession(authClient, undefined, queryClient)
62
+ const userId = session?.user.id
58
63
 
59
- return useMutation({
60
- ...unlinkAccountOptions(authClient),
61
- ...options,
62
- onSuccess: async (...args) => {
63
- await refetch()
64
- await options?.onSuccess?.(...args)
65
- }
66
- })
64
+ return useMutation(
65
+ {
66
+ ...unlinkAccountOptions(authClient),
67
+ ...options,
68
+ meta: {
69
+ awaits: [authQueryKeys.listAccounts(userId)]
70
+ }
71
+ },
72
+ queryClient
73
+ )
67
74
  }
@@ -1,12 +1,12 @@
1
- import { authMutationKeys } from "@better-auth-ui/core"
1
+ import { authMutationKeys, authQueryKeys } from "@better-auth-ui/core"
2
2
  import {
3
3
  mutationOptions,
4
- useMutation,
5
- useQueryClient
4
+ type QueryClient,
5
+ useMutation
6
6
  } from "@tanstack/react-query"
7
7
  import type { BetterFetchError } from "better-auth/react"
8
+
8
9
  import type { AuthClient } from "../../lib/auth-client"
9
- import { sessionOptions, useSession } from "../../queries/auth/session-query"
10
10
 
11
11
  export type UpdateUserParams<TAuthClient extends AuthClient> = Parameters<
12
12
  TAuthClient["updateUser"]
@@ -14,7 +14,7 @@ export type UpdateUserParams<TAuthClient extends AuthClient> = Parameters<
14
14
 
15
15
  export type UpdateUserOptions<TAuthClient extends AuthClient> = Omit<
16
16
  ReturnType<typeof updateUserOptions<TAuthClient>>,
17
- "mutationKey" | "mutationFn"
17
+ "mutationKey" | "mutationFn" | "meta"
18
18
  >
19
19
 
20
20
  /**
@@ -46,37 +46,25 @@ export function updateUserOptions<TAuthClient extends AuthClient>(
46
46
  /**
47
47
  * Create a mutation for updating the authenticated user's profile.
48
48
  *
49
- * Wraps `authClient.updateUser`, optimistically patches the cached session
50
- * with the new fields, refetches the session, and forwards React Query
51
- * mutation options such as `onSuccess`, `onError`, and `retry`.
49
+ * On success, `MutationInvalidator` awaits invalidation of the session
50
+ * query so the updated user fields are reflected (see `meta.awaits`).
52
51
  *
53
52
  * @param authClient - The Better Auth client.
54
53
  * @param options - React Query options forwarded to `useMutation`.
55
54
  */
56
55
  export function useUpdateUser<TAuthClient extends AuthClient>(
57
56
  authClient: TAuthClient,
58
- options?: UpdateUserOptions<TAuthClient>
57
+ options?: UpdateUserOptions<TAuthClient>,
58
+ queryClient?: QueryClient
59
59
  ) {
60
- const { data: session, refetch: refetchSession } = useSession(authClient, {
61
- refetchOnMount: false
62
- })
63
-
64
- const queryClient = useQueryClient()
65
-
66
- return useMutation({
67
- ...updateUserOptions(authClient),
68
- ...options,
69
- onSuccess: async (data, variables, ...rest) => {
70
- if (session) {
71
- queryClient.setQueryData(sessionOptions(authClient).queryKey, {
72
- ...session,
73
- user: { ...session.user, ...variables }
74
- })
60
+ return useMutation(
61
+ {
62
+ ...updateUserOptions(authClient),
63
+ ...options,
64
+ meta: {
65
+ awaits: [authQueryKeys.session]
75
66
  }
76
-
77
- refetchSession()
78
-
79
- await options?.onSuccess?.(data, variables, ...rest)
80
- }
81
- })
67
+ },
68
+ queryClient
69
+ )
82
70
  }
@@ -1,4 +1,4 @@
1
- import { authMutationKeys } from "@better-auth-ui/core"
1
+ import { usernameMutationKeys } from "@better-auth-ui/core/plugins"
2
2
  import { mutationOptions, useMutation } from "@tanstack/react-query"
3
3
  import type { BetterFetchError } from "better-auth/react"
4
4
 
@@ -24,7 +24,7 @@ export type IsUsernameAvailableOptions<TAuthClient extends UsernameAuthClient> =
24
24
  export function isUsernameAvailableOptions<
25
25
  TAuthClient extends UsernameAuthClient
26
26
  >(authClient: TAuthClient) {
27
- const mutationKey = authMutationKeys.isUsernameAvailable
27
+ const mutationKey = usernameMutationKeys.isUsernameAvailable
28
28
 
29
29
  const mutationFn = (params: IsUsernameAvailableParams<TAuthClient>) =>
30
30
  authClient.isUsernameAvailable({
@@ -1,13 +1,13 @@
1
- import { authMutationKeys } from "@better-auth-ui/core"
1
+ import { authQueryKeys } from "@better-auth-ui/core"
2
+ import { usernameMutationKeys } from "@better-auth-ui/core/plugins"
2
3
  import {
3
4
  mutationOptions,
4
- useMutation,
5
- useQueryClient
5
+ type QueryClient,
6
+ useMutation
6
7
  } from "@tanstack/react-query"
7
8
  import type { BetterFetchError } from "better-auth/react"
8
9
 
9
10
  import type { UsernameAuthClient } from "../../lib/auth-client"
10
- import { sessionOptions } from "../../queries/auth/session-query"
11
11
 
12
12
  export type SignInUsernameParams<TAuthClient extends UsernameAuthClient> =
13
13
  Parameters<TAuthClient["signIn"]["username"]>[0]
@@ -15,7 +15,7 @@ export type SignInUsernameParams<TAuthClient extends UsernameAuthClient> =
15
15
  export type SignInUsernameOptions<TAuthClient extends UsernameAuthClient> =
16
16
  Omit<
17
17
  ReturnType<typeof signInUsernameOptions<TAuthClient>>,
18
- "mutationKey" | "mutationFn"
18
+ "mutationKey" | "mutationFn" | "meta"
19
19
  >
20
20
 
21
21
  /**
@@ -26,7 +26,7 @@ export type SignInUsernameOptions<TAuthClient extends UsernameAuthClient> =
26
26
  export function signInUsernameOptions<TAuthClient extends UsernameAuthClient>(
27
27
  authClient: TAuthClient
28
28
  ) {
29
- const mutationKey = authMutationKeys.signIn.username
29
+ const mutationKey = usernameMutationKeys.signIn
30
30
 
31
31
  const mutationFn = (params: SignInUsernameParams<TAuthClient>) =>
32
32
  authClient.signIn.username({
@@ -47,28 +47,25 @@ export function signInUsernameOptions<TAuthClient extends UsernameAuthClient>(
47
47
  /**
48
48
  * Create a mutation for username/password sign-in.
49
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`.
50
+ * On success, `MutationInvalidator` awaits invalidation of the session
51
+ * query so the new session is refetched (see `meta.awaits`).
53
52
  *
54
53
  * @param authClient - The Better Auth client with the username plugin.
55
54
  * @param options - React Query options forwarded to `useMutation`.
56
55
  */
57
56
  export function useSignInUsername<TAuthClient extends UsernameAuthClient>(
58
57
  authClient: TAuthClient,
59
- options?: SignInUsernameOptions<TAuthClient>
58
+ options?: SignInUsernameOptions<TAuthClient>,
59
+ queryClient?: QueryClient
60
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
- })
61
+ return useMutation(
62
+ {
63
+ ...signInUsernameOptions(authClient),
64
+ ...options,
65
+ meta: {
66
+ awaits: [authQueryKeys.session]
67
+ }
68
+ },
69
+ queryClient
70
+ )
74
71
  }
@@ -1,4 +1,4 @@
1
- import { authQueryKeys } from "@better-auth-ui/core"
1
+ import { apiKeyQueryKeys } from "@better-auth-ui/core/plugins"
2
2
  import {
3
3
  type DataTag,
4
4
  type QueryClient,
@@ -11,18 +11,21 @@ import type { BetterFetchError } from "better-auth/react"
11
11
  import type { ApiKeyAuthClient, InferData } from "../../lib/auth-client"
12
12
  import { useSession } from "../auth/session-query"
13
13
 
14
- export type ListApiKeysData<TAuthClient extends ApiKeyAuthClient> = InferData<
15
- TAuthClient["apiKey"]["list"]
16
- >
14
+ export type ListApiKeysData<
15
+ TAuthClient extends ApiKeyAuthClient = ApiKeyAuthClient
16
+ > = InferData<TAuthClient["apiKey"]["list"]>
17
17
 
18
- export type ListApiKeysParams<TAuthClient extends ApiKeyAuthClient> =
19
- Parameters<TAuthClient["apiKey"]["list"]>[0]
18
+ export type ListApiKeysParams<
19
+ TAuthClient extends ApiKeyAuthClient = ApiKeyAuthClient
20
+ > = Parameters<TAuthClient["apiKey"]["list"]>[0]
20
21
 
21
22
  export type ListedApiKey<
22
23
  TAuthClient extends ApiKeyAuthClient = ApiKeyAuthClient
23
24
  > = NonNullable<ListApiKeysData<TAuthClient>>["apiKeys"][number]
24
25
 
25
- export type ListApiKeysOptions<TAuthClient extends ApiKeyAuthClient> = Omit<
26
+ export type ListApiKeysOptions<
27
+ TAuthClient extends ApiKeyAuthClient = ApiKeyAuthClient
28
+ > = Omit<
26
29
  ReturnType<typeof listApiKeysOptions<TAuthClient>>,
27
30
  "queryKey" | "queryFn"
28
31
  >
@@ -30,6 +33,10 @@ export type ListApiKeysOptions<TAuthClient extends ApiKeyAuthClient> = Omit<
30
33
  /**
31
34
  * Query options factory for the current user's API keys.
32
35
  *
36
+ * Shares a query key with the server-side `listApiKeysOptions` from
37
+ * `@better-auth-ui/react/server`, so SSR-hydrated data is reused from the
38
+ * cache without an immediate refetch.
39
+ *
33
40
  * @param authClient - The Better Auth client with the API key plugin.
34
41
  * @param userId - The current signed-in user's ID. Used for cache partitioning.
35
42
  * @param params - Parameters forwarded to `authClient.apiKey.list`.
@@ -40,7 +47,7 @@ export function listApiKeysOptions<TAuthClient extends ApiKeyAuthClient>(
40
47
  params?: ListApiKeysParams<TAuthClient>
41
48
  ) {
42
49
  type TData = ListApiKeysData<TAuthClient>
43
- const queryKey = authQueryKeys.listApiKeys(userId, params?.query)
50
+ const queryKey = apiKeyQueryKeys.list(userId, params?.query)
44
51
 
45
52
  const options = queryOptions<TData, BetterFetchError, TData, typeof queryKey>(
46
53
  {
@@ -85,6 +92,11 @@ export type UseListApiKeysOptions<TAuthClient extends ApiKeyAuthClient> =
85
92
  /**
86
93
  * Subscribe to the current user's API keys via TanStack Query.
87
94
  *
95
+ * Shares a query key with the server-side `listApiKeysOptions`, so
96
+ * SSR-hydrated data is reused from the cache without an immediate refetch.
97
+ * The query is gated on a signed-in user; while the session is loading or
98
+ * absent, the underlying `queryFn` is replaced with `skipToken`.
99
+ *
88
100
  * @param authClient - The Better Auth client with the API key plugin.
89
101
  * @param options - `apiKey.list` params merged with `useQuery` options.
90
102
  * @param queryClient - Optional custom `QueryClient`.
@@ -1,4 +1,4 @@
1
- import { authQueryKeys } from "@better-auth-ui/core"
1
+ import { multiSessionQueryKeys } from "@better-auth-ui/core/plugins"
2
2
  import {
3
3
  type DataTag,
4
4
  type QueryClient,
@@ -45,7 +45,7 @@ export function listDeviceSessionsOptions<
45
45
  params?: ListDeviceSessionsParams<TAuthClient>
46
46
  ) {
47
47
  type TData = ListDeviceSessionsData<TAuthClient>
48
- const queryKey = authQueryKeys.listDeviceSessions(userId, params?.query)
48
+ const queryKey = multiSessionQueryKeys.list(userId, params?.query)
49
49
 
50
50
  const options = queryOptions<TData, BetterFetchError, TData, typeof queryKey>(
51
51
  {
@@ -0,0 +1,140 @@
1
+ import {
2
+ organizationPlugin,
3
+ organizationQueryKeys
4
+ } from "@better-auth-ui/core/plugins"
5
+ import {
6
+ type DataTag,
7
+ type QueryClient,
8
+ queryOptions,
9
+ skipToken,
10
+ useQuery
11
+ } from "@tanstack/react-query"
12
+ import type { BetterFetchError } from "better-auth/react"
13
+ import { useAuthPlugin } from "../../hooks/use-auth-plugin"
14
+ import type { OrganizationAuthClient } from "../../lib/auth-client"
15
+ import { useSession } from "../auth/session-query"
16
+ import type { FullOrganizationParams } from "./full-organization-query"
17
+ import type { ListOrganization } from "./list-organizations-query"
18
+
19
+ // The active-organization cache holds a `ListOrganization`-shaped value even
20
+ // though we fetch via `getFullOrganization`. The `members`/`invitations`
21
+ // fields are intentionally discarded by the `as Promise<TData>` cast in
22
+ // `queryFn` below so that `setActive`'s optimistic update — which can only
23
+ // produce a list-shaped org — never corrupts a full-detail cache entry.
24
+ // See `organizationQueryKeys.activeOrganization` for the rationale.
25
+ export type ActiveOrganizationData<
26
+ TAuthClient extends OrganizationAuthClient = OrganizationAuthClient
27
+ > = ListOrganization<TAuthClient>
28
+
29
+ export type ActiveOrganizationParams<
30
+ TAuthClient extends OrganizationAuthClient = OrganizationAuthClient
31
+ > = FullOrganizationParams<TAuthClient>
32
+
33
+ export type ActiveOrganizationOptions<
34
+ TAuthClient extends OrganizationAuthClient = OrganizationAuthClient
35
+ > = Omit<
36
+ ReturnType<typeof activeOrganizationOptions<TAuthClient>>,
37
+ "queryKey" | "queryFn"
38
+ >
39
+
40
+ export function activeOrganizationOptions<
41
+ TAuthClient extends OrganizationAuthClient
42
+ >(
43
+ authClient: TAuthClient,
44
+ userId: string | undefined,
45
+ params?: ActiveOrganizationParams<TAuthClient>
46
+ ) {
47
+ type TData = ActiveOrganizationData<TAuthClient>
48
+ const queryKey = organizationQueryKeys.activeOrganization(
49
+ userId,
50
+ params?.query
51
+ )
52
+
53
+ const options = queryOptions<TData, BetterFetchError, TData, typeof queryKey>(
54
+ {
55
+ queryKey,
56
+ queryFn: ({ signal }) =>
57
+ authClient.organization.getFullOrganization({
58
+ ...params,
59
+ fetchOptions: { ...params?.fetchOptions, signal, throw: true }
60
+ }) as Promise<TData>
61
+ }
62
+ )
63
+
64
+ return options as typeof options & {
65
+ queryKey: DataTag<typeof queryKey, TData, BetterFetchError>
66
+ }
67
+ }
68
+
69
+ export const ensureActiveOrganization = <
70
+ TAuthClient extends OrganizationAuthClient
71
+ >(
72
+ queryClient: QueryClient,
73
+ authClient: TAuthClient,
74
+ userId: string | undefined,
75
+ params?: ActiveOrganizationParams<TAuthClient>
76
+ ) =>
77
+ queryClient.ensureQueryData(
78
+ activeOrganizationOptions(authClient, userId, params)
79
+ )
80
+
81
+ export const prefetchActiveOrganization = <
82
+ TAuthClient extends OrganizationAuthClient
83
+ >(
84
+ queryClient: QueryClient,
85
+ authClient: TAuthClient,
86
+ userId: string | undefined,
87
+ params?: ActiveOrganizationParams<TAuthClient>
88
+ ) =>
89
+ queryClient.prefetchQuery(
90
+ activeOrganizationOptions(authClient, userId, params)
91
+ )
92
+
93
+ export const fetchActiveOrganization = <
94
+ TAuthClient extends OrganizationAuthClient
95
+ >(
96
+ queryClient: QueryClient,
97
+ authClient: TAuthClient,
98
+ userId: string | undefined,
99
+ params?: ActiveOrganizationParams<TAuthClient>
100
+ ) =>
101
+ queryClient.fetchQuery(activeOrganizationOptions(authClient, userId, params))
102
+
103
+ export type UseActiveOrganizationOptions<
104
+ TAuthClient extends OrganizationAuthClient
105
+ > = ActiveOrganizationOptions<TAuthClient> &
106
+ ActiveOrganizationParams<TAuthClient>
107
+
108
+ export function useActiveOrganization<
109
+ TAuthClient extends OrganizationAuthClient
110
+ >(
111
+ authClient: TAuthClient,
112
+ options: UseActiveOrganizationOptions<TAuthClient> = {},
113
+ queryClient?: QueryClient
114
+ ) {
115
+ const { data: session } = useSession(authClient, undefined, queryClient)
116
+ const userId = session?.user.id
117
+
118
+ const { slug } = useAuthPlugin(organizationPlugin)
119
+
120
+ const { query, fetchOptions, ...queryOptions } = options
121
+
122
+ const baseOptions = activeOrganizationOptions(authClient, userId, {
123
+ fetchOptions,
124
+ query: slug ? { organizationSlug: slug } : query
125
+ })
126
+
127
+ return useQuery(
128
+ {
129
+ ...queryOptions,
130
+ ...baseOptions,
131
+ queryFn:
132
+ slug === null
133
+ ? async () => null
134
+ : userId
135
+ ? baseOptions.queryFn
136
+ : skipToken
137
+ },
138
+ queryClient
139
+ )
140
+ }
@@ -0,0 +1,113 @@
1
+ import { organizationQueryKeys } from "@better-auth-ui/core/plugins"
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, OrganizationAuthClient } from "../../lib/auth-client"
12
+ import { useSession } from "../auth/session-query"
13
+
14
+ export type FullOrganizationData<
15
+ TAuthClient extends OrganizationAuthClient = OrganizationAuthClient
16
+ > = InferData<TAuthClient["organization"]["getFullOrganization"]>
17
+
18
+ export type FullOrganizationParams<
19
+ TAuthClient extends OrganizationAuthClient = OrganizationAuthClient
20
+ > = Parameters<TAuthClient["organization"]["getFullOrganization"]>[0]
21
+
22
+ export type FullOrganizationOptions<
23
+ TAuthClient extends OrganizationAuthClient = OrganizationAuthClient
24
+ > = Omit<
25
+ ReturnType<typeof fullOrganizationOptions<TAuthClient>>,
26
+ "queryKey" | "queryFn"
27
+ >
28
+
29
+ export function fullOrganizationOptions<
30
+ TAuthClient extends OrganizationAuthClient
31
+ >(
32
+ authClient: TAuthClient,
33
+ userId: string | undefined,
34
+ params?: FullOrganizationParams<TAuthClient>
35
+ ) {
36
+ type TData = FullOrganizationData<TAuthClient>
37
+ const queryKey = organizationQueryKeys.fullDetail(userId, params?.query)
38
+
39
+ const options = queryOptions<TData, BetterFetchError, TData, typeof queryKey>(
40
+ {
41
+ queryKey,
42
+ queryFn: ({ signal }) =>
43
+ authClient.organization.getFullOrganization({
44
+ ...params,
45
+ fetchOptions: { ...params?.fetchOptions, signal, throw: true }
46
+ }) as Promise<TData>
47
+ }
48
+ )
49
+
50
+ return options as typeof options & {
51
+ queryKey: DataTag<typeof queryKey, TData, BetterFetchError>
52
+ }
53
+ }
54
+
55
+ export const ensureFullOrganization = <
56
+ TAuthClient extends OrganizationAuthClient
57
+ >(
58
+ queryClient: QueryClient,
59
+ authClient: TAuthClient,
60
+ userId: string | undefined,
61
+ params?: FullOrganizationParams<TAuthClient>
62
+ ) =>
63
+ queryClient.ensureQueryData(
64
+ fullOrganizationOptions(authClient, userId, params)
65
+ )
66
+
67
+ export const prefetchFullOrganization = <
68
+ TAuthClient extends OrganizationAuthClient
69
+ >(
70
+ queryClient: QueryClient,
71
+ authClient: TAuthClient,
72
+ userId: string | undefined,
73
+ params?: FullOrganizationParams<TAuthClient>
74
+ ) =>
75
+ queryClient.prefetchQuery(fullOrganizationOptions(authClient, userId, params))
76
+
77
+ export const fetchFullOrganization = <
78
+ TAuthClient extends OrganizationAuthClient
79
+ >(
80
+ queryClient: QueryClient,
81
+ authClient: TAuthClient,
82
+ userId: string | undefined,
83
+ params?: FullOrganizationParams<TAuthClient>
84
+ ) => queryClient.fetchQuery(fullOrganizationOptions(authClient, userId, params))
85
+
86
+ export type UseFullOrganizationOptions<
87
+ TAuthClient extends OrganizationAuthClient
88
+ > = FullOrganizationOptions<TAuthClient> & FullOrganizationParams<TAuthClient>
89
+
90
+ export function useFullOrganization<TAuthClient extends OrganizationAuthClient>(
91
+ authClient: TAuthClient,
92
+ options: UseFullOrganizationOptions<TAuthClient> = {},
93
+ queryClient?: QueryClient
94
+ ) {
95
+ const { data: session } = useSession(authClient, undefined, queryClient)
96
+ const userId = session?.user.id
97
+
98
+ const { query, fetchOptions, ...queryOptions } = options
99
+
100
+ const baseOptions = fullOrganizationOptions(authClient, userId, {
101
+ query,
102
+ fetchOptions
103
+ })
104
+
105
+ return useQuery(
106
+ {
107
+ ...queryOptions,
108
+ ...baseOptions,
109
+ queryFn: userId ? baseOptions.queryFn : skipToken
110
+ },
111
+ queryClient
112
+ )
113
+ }