@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,16 +1,26 @@
1
- import { apiKeyMutationKeys } from "@better-auth-ui/core/plugins"
2
- import { mutationOptions, useMutation } from "@tanstack/react-query"
1
+ import {
2
+ apiKeyMutationKeys,
3
+ apiKeyQueryKeys
4
+ } from "@better-auth-ui/core/plugins"
5
+ import {
6
+ mutationOptions,
7
+ type QueryClient,
8
+ useMutation
9
+ } from "@tanstack/react-query"
3
10
  import type { BetterFetchError } from "better-auth/react"
4
11
 
5
12
  import type { ApiKeyAuthClient } from "../../lib/auth-client"
6
- import { useListApiKeys } from "../../queries/api-key/list-api-keys-query"
13
+ import { useSession } from "../../queries/auth/session-query"
7
14
 
8
- export type CreateApiKeyParams<TAuthClient extends ApiKeyAuthClient> =
9
- Parameters<TAuthClient["apiKey"]["create"]>[0]
15
+ export type CreateApiKeyParams<
16
+ TAuthClient extends ApiKeyAuthClient = ApiKeyAuthClient
17
+ > = Parameters<TAuthClient["apiKey"]["create"]>[0]
10
18
 
11
- export type CreateApiKeyOptions<TAuthClient extends ApiKeyAuthClient> = Omit<
19
+ export type CreateApiKeyOptions<
20
+ TAuthClient extends ApiKeyAuthClient = ApiKeyAuthClient
21
+ > = Omit<
12
22
  ReturnType<typeof createApiKeyOptions<TAuthClient>>,
13
- "mutationKey" | "mutationFn"
23
+ "mutationKey" | "mutationFn" | "meta"
14
24
  >
15
25
 
16
26
  /**
@@ -21,7 +31,7 @@ export type CreateApiKeyOptions<TAuthClient extends ApiKeyAuthClient> = Omit<
21
31
  export function createApiKeyOptions<TAuthClient extends ApiKeyAuthClient>(
22
32
  authClient: TAuthClient
23
33
  ) {
24
- const mutationKey = apiKeyMutationKeys.createApiKey
34
+ const mutationKey = apiKeyMutationKeys.create
25
35
 
26
36
  const mutationFn = (params: CreateApiKeyParams<TAuthClient>) =>
27
37
  authClient.apiKey.create({
@@ -42,23 +52,28 @@ export function createApiKeyOptions<TAuthClient extends ApiKeyAuthClient>(
42
52
  /**
43
53
  * Create a mutation for creating an API key.
44
54
  *
45
- * Refetches the user's API key list on success unless disabled via options.
55
+ * On success, `MutationInvalidator` awaits invalidation of the user's API key
56
+ * list queries (see `meta.awaits`).
46
57
  *
47
58
  * @param authClient - The Better Auth client with the API key plugin.
48
59
  * @param options - React Query options forwarded to `useMutation`.
49
60
  */
50
61
  export function useCreateApiKey<TAuthClient extends ApiKeyAuthClient>(
51
62
  authClient: TAuthClient,
52
- options?: CreateApiKeyOptions<TAuthClient>
63
+ options?: CreateApiKeyOptions<TAuthClient>,
64
+ queryClient?: QueryClient
53
65
  ) {
54
- const { refetch } = useListApiKeys(authClient, { refetchOnMount: false })
66
+ const { data: session } = useSession(authClient, undefined, queryClient)
67
+ const userId = session?.user.id
55
68
 
56
- return useMutation({
57
- ...createApiKeyOptions(authClient),
58
- ...options,
59
- onSuccess: async (...args) => {
60
- await refetch()
61
- await options?.onSuccess?.(...args)
62
- }
63
- })
69
+ return useMutation(
70
+ {
71
+ ...createApiKeyOptions(authClient),
72
+ ...options,
73
+ meta: {
74
+ awaits: [apiKeyQueryKeys.lists(userId)]
75
+ }
76
+ },
77
+ queryClient
78
+ )
64
79
  }
@@ -1,16 +1,26 @@
1
- import { apiKeyMutationKeys } from "@better-auth-ui/core/plugins"
2
- import { mutationOptions, useMutation } from "@tanstack/react-query"
1
+ import {
2
+ apiKeyMutationKeys,
3
+ apiKeyQueryKeys
4
+ } from "@better-auth-ui/core/plugins"
5
+ import {
6
+ mutationOptions,
7
+ type QueryClient,
8
+ useMutation
9
+ } from "@tanstack/react-query"
3
10
  import type { BetterFetchError } from "better-auth/react"
4
11
 
5
12
  import type { ApiKeyAuthClient } from "../../lib/auth-client"
6
- import { useListApiKeys } from "../../queries/api-key/list-api-keys-query"
13
+ import { useSession } from "../../queries/auth/session-query"
7
14
 
8
- export type DeleteApiKeyParams<TAuthClient extends ApiKeyAuthClient> =
9
- Parameters<TAuthClient["apiKey"]["delete"]>[0]
15
+ export type DeleteApiKeyParams<
16
+ TAuthClient extends ApiKeyAuthClient = ApiKeyAuthClient
17
+ > = Parameters<TAuthClient["apiKey"]["delete"]>[0]
10
18
 
11
- export type DeleteApiKeyOptions<TAuthClient extends ApiKeyAuthClient> = Omit<
19
+ export type DeleteApiKeyOptions<
20
+ TAuthClient extends ApiKeyAuthClient = ApiKeyAuthClient
21
+ > = Omit<
12
22
  ReturnType<typeof deleteApiKeyOptions<TAuthClient>>,
13
- "mutationKey" | "mutationFn"
23
+ "mutationKey" | "mutationFn" | "meta"
14
24
  >
15
25
 
16
26
  /**
@@ -21,7 +31,7 @@ export type DeleteApiKeyOptions<TAuthClient extends ApiKeyAuthClient> = Omit<
21
31
  export function deleteApiKeyOptions<TAuthClient extends ApiKeyAuthClient>(
22
32
  authClient: TAuthClient
23
33
  ) {
24
- const mutationKey = apiKeyMutationKeys.deleteApiKey
34
+ const mutationKey = apiKeyMutationKeys.delete
25
35
 
26
36
  const mutationFn = (params: DeleteApiKeyParams<TAuthClient>) =>
27
37
  authClient.apiKey.delete({
@@ -42,21 +52,28 @@ export function deleteApiKeyOptions<TAuthClient extends ApiKeyAuthClient>(
42
52
  /**
43
53
  * Create a mutation for deleting an API key.
44
54
  *
55
+ * On success, `MutationInvalidator` awaits invalidation of the user's API key
56
+ * list queries (see `meta.awaits`).
57
+ *
45
58
  * @param authClient - The Better Auth client with the API key plugin.
46
59
  * @param options - React Query options forwarded to `useMutation`.
47
60
  */
48
61
  export function useDeleteApiKey<TAuthClient extends ApiKeyAuthClient>(
49
62
  authClient: TAuthClient,
50
- options?: DeleteApiKeyOptions<TAuthClient>
63
+ options?: DeleteApiKeyOptions<TAuthClient>,
64
+ queryClient?: QueryClient
51
65
  ) {
52
- const { refetch } = useListApiKeys(authClient, { refetchOnMount: false })
53
-
54
- return useMutation({
55
- ...deleteApiKeyOptions(authClient),
56
- ...options,
57
- onSuccess: async (...args) => {
58
- await refetch()
59
- await options?.onSuccess?.(...args)
60
- }
61
- })
66
+ const { data: session } = useSession(authClient, undefined, queryClient)
67
+ const userId = session?.user.id
68
+
69
+ return useMutation(
70
+ {
71
+ ...deleteApiKeyOptions(authClient),
72
+ ...options,
73
+ meta: {
74
+ awaits: [apiKeyQueryKeys.lists(userId)]
75
+ }
76
+ },
77
+ queryClient
78
+ )
62
79
  }
@@ -1,13 +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
9
  import type { AuthClient } from "../../lib/auth-client"
10
- import { sessionOptions } from "../../queries/auth/session-query"
11
10
 
12
11
  export type SignInEmailParams<TAuthClient extends AuthClient> = Parameters<
13
12
  TAuthClient["signIn"]["email"]
@@ -15,7 +14,7 @@ export type SignInEmailParams<TAuthClient extends AuthClient> = Parameters<
15
14
 
16
15
  export type SignInEmailOptions<TAuthClient extends AuthClient> = Omit<
17
16
  ReturnType<typeof signInEmailOptions<TAuthClient>>,
18
- "mutationKey" | "mutationFn"
17
+ "mutationKey" | "mutationFn" | "meta"
19
18
  >
20
19
 
21
20
  /**
@@ -51,28 +50,25 @@ export function signInEmailOptions<TAuthClient extends AuthClient>(
51
50
  /**
52
51
  * Create a mutation for email/password sign-in.
53
52
  *
54
- * Wraps `authClient.signIn.email`, resets the session query on success so
55
- * the new session is refetched, and forwards React Query mutation options
56
- * such as `onSuccess`, `onError`, and `retry`.
53
+ * On success, `MutationInvalidator` awaits invalidation of the session
54
+ * query so the new session is refetched (see `meta.awaits`).
57
55
  *
58
56
  * @param authClient - The Better Auth client.
59
57
  * @param options - React Query options forwarded to `useMutation`.
60
58
  */
61
59
  export function useSignInEmail<TAuthClient extends AuthClient>(
62
60
  authClient: TAuthClient,
63
- options?: SignInEmailOptions<TAuthClient>
61
+ options?: SignInEmailOptions<TAuthClient>,
62
+ queryClient?: QueryClient
64
63
  ) {
65
- const queryClient = useQueryClient()
66
-
67
- return useMutation({
68
- ...signInEmailOptions(authClient),
69
- ...options,
70
- onSuccess: async (...args) => {
71
- queryClient.resetQueries({
72
- queryKey: sessionOptions(authClient).queryKey
73
- })
74
-
75
- await options?.onSuccess?.(...args)
76
- }
77
- })
64
+ return useMutation(
65
+ {
66
+ ...signInEmailOptions(authClient),
67
+ ...options,
68
+ meta: {
69
+ awaits: [authQueryKeys.session]
70
+ }
71
+ },
72
+ queryClient
73
+ )
78
74
  }
@@ -1,6 +1,7 @@
1
1
  import { authMutationKeys, authQueryKeys } from "@better-auth-ui/core"
2
2
  import {
3
3
  mutationOptions,
4
+ type QueryClient,
4
5
  useMutation,
5
6
  useQueryClient
6
7
  } from "@tanstack/react-query"
@@ -47,25 +48,30 @@ export function signOutOptions<TAuthClient extends AuthClient>(
47
48
  /**
48
49
  * Create a mutation for signing the current user out.
49
50
  *
50
- * Wraps `authClient.signOut`, removes all cached auth queries on success,
51
- * and forwards React Query mutation options such as `onSuccess`, `onError`,
52
- * and `retry`.
51
+ * On success, removes every cached auth query so no stale data leaks across
52
+ * accounts. Sign-out uses a direct `removeQueries` call (rather than the
53
+ * `meta.awaits` / `meta.invalidates` pattern) because the goal is to drop
54
+ * cache entries entirely, not to refetch them.
53
55
  *
54
56
  * @param authClient - The Better Auth client.
55
57
  * @param options - React Query options forwarded to `useMutation`.
56
58
  */
57
59
  export function useSignOut<TAuthClient extends AuthClient>(
58
60
  authClient: TAuthClient,
59
- options?: SignOutOptions<TAuthClient>
61
+ options?: SignOutOptions<TAuthClient>,
62
+ queryClient?: QueryClient
60
63
  ) {
61
- const queryClient = useQueryClient()
64
+ const defaultQueryClient = useQueryClient(queryClient)
62
65
 
63
- return useMutation({
64
- ...signOutOptions(authClient),
65
- ...options,
66
- onSuccess: async (...args) => {
67
- queryClient.removeQueries({ queryKey: authQueryKeys.all })
68
- await options?.onSuccess?.(...args)
69
- }
70
- })
66
+ return useMutation(
67
+ {
68
+ ...signOutOptions(authClient),
69
+ ...options,
70
+ onSuccess: async (...args) => {
71
+ defaultQueryClient.removeQueries({ queryKey: authQueryKeys.all })
72
+ await options?.onSuccess?.(...args)
73
+ }
74
+ },
75
+ queryClient
76
+ )
71
77
  }
@@ -1,13 +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
9
  import type { AuthClient } from "../../lib/auth-client"
10
- import { sessionOptions } from "../../queries/auth/session-query"
11
10
 
12
11
  export type SignUpEmailParams<TAuthClient extends AuthClient> = Parameters<
13
12
  TAuthClient["signUp"]["email"]
@@ -15,7 +14,7 @@ export type SignUpEmailParams<TAuthClient extends AuthClient> = Parameters<
15
14
 
16
15
  export type SignUpEmailOptions<TAuthClient extends AuthClient> = Omit<
17
16
  ReturnType<typeof signUpEmailOptions<TAuthClient>>,
18
- "mutationKey" | "mutationFn"
17
+ "mutationKey" | "mutationFn" | "meta"
19
18
  >
20
19
 
21
20
  /**
@@ -47,28 +46,25 @@ export function signUpEmailOptions<TAuthClient extends AuthClient>(
47
46
  /**
48
47
  * Create a mutation for email/password sign-up.
49
48
  *
50
- * Wraps `authClient.signUp.email`, 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`.
49
+ * On success, `MutationInvalidator` awaits invalidation of the session
50
+ * query so the new session is refetched (see `meta.awaits`).
53
51
  *
54
52
  * @param authClient - The Better Auth client.
55
53
  * @param options - React Query options forwarded to `useMutation`.
56
54
  */
57
55
  export function useSignUpEmail<TAuthClient extends AuthClient>(
58
56
  authClient: TAuthClient,
59
- options?: SignUpEmailOptions<TAuthClient>
57
+ options?: SignUpEmailOptions<TAuthClient>,
58
+ queryClient?: QueryClient
60
59
  ) {
61
- const queryClient = useQueryClient()
62
-
63
- return useMutation({
64
- ...signUpEmailOptions(authClient),
65
- ...options,
66
- onSuccess: async (...args) => {
67
- queryClient.resetQueries({
68
- queryKey: sessionOptions(authClient).queryKey
69
- })
70
-
71
- await options?.onSuccess?.(...args)
72
- }
73
- })
60
+ return useMutation(
61
+ {
62
+ ...signUpEmailOptions(authClient),
63
+ ...options,
64
+ meta: {
65
+ awaits: [authQueryKeys.session]
66
+ }
67
+ },
68
+ queryClient
69
+ )
74
70
  }
@@ -1,9 +1,16 @@
1
- import { authMutationKeys } from "@better-auth-ui/core"
2
- import { mutationOptions, useMutation } from "@tanstack/react-query"
1
+ import {
2
+ multiSessionMutationKeys,
3
+ multiSessionQueryKeys
4
+ } from "@better-auth-ui/core/plugins"
5
+ import {
6
+ mutationOptions,
7
+ type QueryClient,
8
+ useMutation
9
+ } from "@tanstack/react-query"
3
10
  import type { BetterFetchError } from "better-auth/react"
4
11
 
5
12
  import type { MultiSessionAuthClient } from "../../lib/auth-client"
6
- import { useListDeviceSessions } from "../../queries/multi-session/list-device-sessions-query"
13
+ import { useSession } from "../../queries/auth/session-query"
7
14
 
8
15
  export type RevokeMultiSessionParams<
9
16
  TAuthClient extends MultiSessionAuthClient
@@ -13,7 +20,7 @@ export type RevokeMultiSessionOptions<
13
20
  TAuthClient extends MultiSessionAuthClient
14
21
  > = Omit<
15
22
  ReturnType<typeof revokeMultiSessionOptions<TAuthClient>>,
16
- "mutationKey" | "mutationFn"
23
+ "mutationKey" | "mutationFn" | "meta"
17
24
  >
18
25
 
19
26
  /**
@@ -24,7 +31,7 @@ export type RevokeMultiSessionOptions<
24
31
  export function revokeMultiSessionOptions<
25
32
  TAuthClient extends MultiSessionAuthClient
26
33
  >(authClient: TAuthClient) {
27
- const mutationKey = authMutationKeys.multiSession.revoke
34
+ const mutationKey = multiSessionMutationKeys.revoke
28
35
 
29
36
  const mutationFn = (params: RevokeMultiSessionParams<TAuthClient>) =>
30
37
  authClient.multiSession.revoke({
@@ -45,26 +52,30 @@ export function revokeMultiSessionOptions<
45
52
  /**
46
53
  * Create a mutation for revoking a device session in multi-session mode.
47
54
  *
48
- * Wraps `authClient.multiSession.revoke`, refetches the device sessions list
49
- * on success, and forwards React Query mutation options such as `onSuccess`,
50
- * `onError`, and `retry`.
55
+ * On success, `MutationInvalidator` awaits invalidation of the device
56
+ * sessions list (see `meta.awaits`).
51
57
  *
52
58
  * @param authClient - The Better Auth client with the multi-session plugin.
53
59
  * @param options - React Query options forwarded to `useMutation`.
54
60
  */
55
61
  export function useRevokeMultiSession<
56
62
  TAuthClient extends MultiSessionAuthClient
57
- >(authClient: TAuthClient, options?: RevokeMultiSessionOptions<TAuthClient>) {
58
- const { refetch } = useListDeviceSessions(authClient, {
59
- refetchOnMount: false
60
- })
63
+ >(
64
+ authClient: TAuthClient,
65
+ options?: RevokeMultiSessionOptions<TAuthClient>,
66
+ queryClient?: QueryClient
67
+ ) {
68
+ const { data: session } = useSession(authClient, undefined, queryClient)
69
+ const userId = session?.user.id
61
70
 
62
- return useMutation({
63
- ...revokeMultiSessionOptions(authClient),
64
- ...options,
65
- onSuccess: async (...args) => {
66
- await refetch()
67
- await options?.onSuccess?.(...args)
68
- }
69
- })
71
+ return useMutation(
72
+ {
73
+ ...revokeMultiSessionOptions(authClient),
74
+ ...options,
75
+ meta: {
76
+ awaits: [multiSessionQueryKeys.lists(userId)]
77
+ }
78
+ },
79
+ queryClient
80
+ )
70
81
  }
@@ -1,18 +1,17 @@
1
- import { authMutationKeys } from "@better-auth-ui/core"
1
+ import { authQueryKeys } from "@better-auth-ui/core"
2
+ import {
3
+ multiSessionMutationKeys,
4
+ multiSessionQueryKeys
5
+ } from "@better-auth-ui/core/plugins"
2
6
  import {
3
7
  mutationOptions,
4
- useMutation,
5
- useQueryClient
8
+ type QueryClient,
9
+ useMutation
6
10
  } from "@tanstack/react-query"
7
11
  import type { BetterFetchError } from "better-auth/react"
8
12
 
9
13
  import type { MultiSessionAuthClient } from "../../lib/auth-client"
10
- import {
11
- type SessionData,
12
- sessionOptions,
13
- useSession
14
- } from "../../queries/auth/session-query"
15
- import { useListDeviceSessions } from "../../queries/multi-session/list-device-sessions-query"
14
+ import { useSession } from "../../queries/auth/session-query"
16
15
 
17
16
  export type SetActiveSessionParams<TAuthClient extends MultiSessionAuthClient> =
18
17
  Parameters<TAuthClient["multiSession"]["setActive"]>[0]
@@ -21,7 +20,7 @@ export type SetActiveSessionOptions<
21
20
  TAuthClient extends MultiSessionAuthClient
22
21
  > = Omit<
23
22
  ReturnType<typeof setActiveSessionOptions<TAuthClient>>,
24
- "mutationKey" | "mutationFn"
23
+ "mutationKey" | "mutationFn" | "meta"
25
24
  >
26
25
 
27
26
  /**
@@ -32,7 +31,7 @@ export type SetActiveSessionOptions<
32
31
  export function setActiveSessionOptions<
33
32
  TAuthClient extends MultiSessionAuthClient
34
33
  >(authClient: TAuthClient) {
35
- const mutationKey = authMutationKeys.multiSession.setActive
34
+ const mutationKey = multiSessionMutationKeys.setActive
36
35
 
37
36
  const mutationFn = (params: SetActiveSessionParams<TAuthClient>) =>
38
37
  authClient.multiSession.setActive({
@@ -53,46 +52,28 @@ export function setActiveSessionOptions<
53
52
  /**
54
53
  * Create a mutation for switching the active device session.
55
54
  *
56
- * Wraps `authClient.multiSession.setActive`, optimistically swaps the cached
57
- * session to the matching device session, refetches both the session and
58
- * device-session queries, and forwards React Query mutation options such as
59
- * `onSuccess`, `onError`, and `retry`.
55
+ * On success, `MutationInvalidator` awaits invalidation of the session
56
+ * and device sessions queries (see `meta.awaits`).
60
57
  *
61
58
  * @param authClient - The Better Auth client with the multi-session plugin.
62
59
  * @param options - React Query options forwarded to `useMutation`.
63
60
  */
64
61
  export function useSetActiveSession<TAuthClient extends MultiSessionAuthClient>(
65
62
  authClient: TAuthClient,
66
- options?: SetActiveSessionOptions<TAuthClient>
63
+ options?: SetActiveSessionOptions<TAuthClient>,
64
+ queryClient?: QueryClient
67
65
  ) {
68
- const queryClient = useQueryClient()
69
- const { refetch: refetchSession } = useSession(authClient, {
70
- refetchOnMount: false
71
- })
72
- const { data: deviceSessions, refetch: refetchDeviceSessions } =
73
- useListDeviceSessions(authClient, {
74
- refetchOnMount: false
75
- })
66
+ const { data: session } = useSession(authClient, undefined, queryClient)
67
+ const userId = session?.user.id
76
68
 
77
- return useMutation({
78
- ...setActiveSessionOptions(authClient),
79
- ...options,
80
- onSuccess: async (data, variables, ...rest) => {
81
- const sessionToken = variables?.sessionToken
82
- const deviceSession = deviceSessions?.find(
83
- ({ session: { token } }) => token === sessionToken
84
- )
85
-
86
- if (deviceSession) {
87
- queryClient.setQueryData(
88
- sessionOptions(authClient).queryKey,
89
- deviceSession as SessionData<TAuthClient>
90
- )
69
+ return useMutation(
70
+ {
71
+ ...setActiveSessionOptions(authClient),
72
+ ...options,
73
+ meta: {
74
+ awaits: [authQueryKeys.session, multiSessionQueryKeys.lists(userId)]
91
75
  }
92
-
93
- await refetchSession()
94
- await refetchDeviceSessions()
95
- await options?.onSuccess?.(data, variables, ...rest)
96
- }
97
- })
76
+ },
77
+ queryClient
78
+ )
98
79
  }
@@ -0,0 +1,71 @@
1
+ import {
2
+ organizationMutationKeys,
3
+ organizationQueryKeys
4
+ } from "@better-auth-ui/core/plugins"
5
+ import {
6
+ mutationOptions,
7
+ type QueryClient,
8
+ useMutation
9
+ } from "@tanstack/react-query"
10
+ import type { BetterFetchError } from "better-auth/react"
11
+
12
+ import type { OrganizationAuthClient } from "../../lib/auth-client"
13
+ import { useSession } from "../../queries/auth/session-query"
14
+
15
+ export type AcceptInvitationParams<TAuthClient extends OrganizationAuthClient> =
16
+ Parameters<TAuthClient["organization"]["acceptInvitation"]>[0]
17
+
18
+ export type AcceptInvitationOptions<
19
+ TAuthClient extends OrganizationAuthClient
20
+ > = Omit<
21
+ ReturnType<typeof acceptInvitationOptions<TAuthClient>>,
22
+ "mutationKey" | "mutationFn" | "meta"
23
+ >
24
+
25
+ export function acceptInvitationOptions<
26
+ TAuthClient extends OrganizationAuthClient
27
+ >(authClient: TAuthClient) {
28
+ const mutationKey = organizationMutationKeys.acceptInvitation
29
+
30
+ const mutationFn = (params: AcceptInvitationParams<TAuthClient>) =>
31
+ authClient.organization.acceptInvitation({
32
+ ...params,
33
+ fetchOptions: { ...params?.fetchOptions, throw: true }
34
+ })
35
+
36
+ return mutationOptions<
37
+ Awaited<ReturnType<typeof mutationFn>>,
38
+ BetterFetchError,
39
+ Parameters<typeof mutationFn>[0]
40
+ >({
41
+ mutationKey,
42
+ mutationFn
43
+ })
44
+ }
45
+
46
+ export function useAcceptInvitation<TAuthClient extends OrganizationAuthClient>(
47
+ authClient: TAuthClient,
48
+ options?: AcceptInvitationOptions<TAuthClient>,
49
+ queryClient?: QueryClient
50
+ ) {
51
+ const { data: session } = useSession(authClient, undefined, queryClient)
52
+ const userId = session?.user.id
53
+
54
+ return useMutation(
55
+ {
56
+ ...acceptInvitationOptions(authClient),
57
+ ...options,
58
+ meta: {
59
+ awaits: [
60
+ organizationQueryKeys.userInvitations.all(userId),
61
+ organizationQueryKeys.lists(userId)
62
+ ],
63
+ invalidates: [
64
+ organizationQueryKeys.fullDetails(userId),
65
+ organizationQueryKeys.activeOrganizations(userId)
66
+ ]
67
+ }
68
+ },
69
+ queryClient
70
+ )
71
+ }