@better-auth-ui/react 1.6.8 → 1.6.9

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 (334) hide show
  1. package/dist/components/auth/auth-context.d.ts +3 -0
  2. package/dist/components/auth/auth-context.js +4 -0
  3. package/dist/components/auth/auth-provider.d.ts +4 -4
  4. package/dist/components/auth/auth-provider.js +65 -41
  5. package/dist/components/auth/email/email-changed.d.ts +2 -2
  6. package/dist/components/auth/email/email-changed.js +68 -154
  7. package/dist/components/auth/email/email-localization.d.ts +11 -3
  8. package/dist/components/auth/email/email-localization.js +25 -18
  9. package/dist/components/auth/email/email-styles.js +77 -52
  10. package/dist/components/auth/email/email-verification.d.ts +2 -2
  11. package/dist/components/auth/email/email-verification.js +73 -138
  12. package/dist/components/auth/email/index.d.ts +10 -9
  13. package/dist/components/auth/email/index.js +10 -9
  14. package/dist/components/auth/email/magic-link.d.ts +2 -2
  15. package/dist/components/auth/email/magic-link.js +70 -139
  16. package/dist/components/auth/email/new-device.d.ts +2 -2
  17. package/dist/components/auth/email/new-device.js +88 -221
  18. package/dist/components/auth/email/organization-invitation.d.ts +121 -0
  19. package/dist/components/auth/email/organization-invitation.js +110 -0
  20. package/dist/components/auth/email/otp-email.d.ts +2 -2
  21. package/dist/components/auth/email/otp-email.js +63 -127
  22. package/dist/components/auth/email/password-changed.d.ts +2 -2
  23. package/dist/components/auth/email/password-changed.js +74 -157
  24. package/dist/components/auth/email/reset-password.d.ts +2 -2
  25. package/dist/components/auth/email/reset-password.js +66 -138
  26. package/dist/components/auth/fetch-options-provider.d.ts +1 -1
  27. package/dist/components/auth/fetch-options-provider.js +28 -27
  28. package/dist/components/icons/apple.d.ts +1 -1
  29. package/dist/components/icons/apple.js +9 -16
  30. package/dist/components/icons/atlassian.d.ts +1 -1
  31. package/dist/components/icons/atlassian.js +13 -38
  32. package/dist/components/icons/cognito.d.ts +1 -1
  33. package/dist/components/icons/cognito.js +9 -19
  34. package/dist/components/icons/discord.d.ts +1 -1
  35. package/dist/components/icons/discord.js +9 -16
  36. package/dist/components/icons/dropbox.d.ts +1 -1
  37. package/dist/components/icons/dropbox.js +9 -16
  38. package/dist/components/icons/facebook.d.ts +1 -1
  39. package/dist/components/icons/facebook.js +11 -19
  40. package/dist/components/icons/figma.d.ts +1 -1
  41. package/dist/components/icons/figma.js +12 -34
  42. package/dist/components/icons/github.d.ts +1 -1
  43. package/dist/components/icons/github.js +11 -16
  44. package/dist/components/icons/gitlab.d.ts +1 -1
  45. package/dist/components/icons/gitlab.js +9 -30
  46. package/dist/components/icons/google.d.ts +1 -1
  47. package/dist/components/icons/google.js +9 -39
  48. package/dist/components/icons/huggingface.d.ts +1 -1
  49. package/dist/components/icons/huggingface.js +9 -38
  50. package/dist/components/icons/index.d.ts +35 -35
  51. package/dist/components/icons/index.js +35 -35
  52. package/dist/components/icons/kakao.d.ts +1 -1
  53. package/dist/components/icons/kakao.js +11 -16
  54. package/dist/components/icons/kick.d.ts +1 -1
  55. package/dist/components/icons/kick.js +11 -20
  56. package/dist/components/icons/line.d.ts +1 -1
  57. package/dist/components/icons/line.js +9 -16
  58. package/dist/components/icons/linear.d.ts +1 -1
  59. package/dist/components/icons/linear.js +9 -16
  60. package/dist/components/icons/linkedin.d.ts +1 -1
  61. package/dist/components/icons/linkedin.js +9 -33
  62. package/dist/components/icons/microsoft.d.ts +1 -1
  63. package/dist/components/icons/microsoft.js +9 -30
  64. package/dist/components/icons/naver.d.ts +1 -1
  65. package/dist/components/icons/naver.js +9 -16
  66. package/dist/components/icons/notion.d.ts +1 -1
  67. package/dist/components/icons/notion.js +9 -16
  68. package/dist/components/icons/paybin.d.ts +1 -1
  69. package/dist/components/icons/paybin.js +8 -32
  70. package/dist/components/icons/paypal.d.ts +1 -1
  71. package/dist/components/icons/paypal.js +9 -30
  72. package/dist/components/icons/polar.d.ts +1 -1
  73. package/dist/components/icons/polar.js +9 -24
  74. package/dist/components/icons/railway.d.ts +1 -1
  75. package/dist/components/icons/railway.js +9 -16
  76. package/dist/components/icons/reddit.d.ts +1 -1
  77. package/dist/components/icons/reddit.js +9 -21
  78. package/dist/components/icons/roblox.d.ts +1 -1
  79. package/dist/components/icons/roblox.js +12 -17
  80. package/dist/components/icons/salesforce.d.ts +1 -1
  81. package/dist/components/icons/salesforce.js +9 -16
  82. package/dist/components/icons/slack.d.ts +1 -1
  83. package/dist/components/icons/slack.js +9 -30
  84. package/dist/components/icons/spotify.d.ts +1 -1
  85. package/dist/components/icons/spotify.js +9 -16
  86. package/dist/components/icons/tiktok.d.ts +1 -1
  87. package/dist/components/icons/tiktok.js +10 -23
  88. package/dist/components/icons/twitch.d.ts +1 -1
  89. package/dist/components/icons/twitch.js +12 -43
  90. package/dist/components/icons/vercel.d.ts +1 -1
  91. package/dist/components/icons/vercel.js +9 -16
  92. package/dist/components/icons/vk.d.ts +1 -1
  93. package/dist/components/icons/vk.js +9 -16
  94. package/dist/components/icons/wechat.d.ts +1 -1
  95. package/dist/components/icons/wechat.js +9 -16
  96. package/dist/components/icons/x.d.ts +1 -1
  97. package/dist/components/icons/x.js +9 -16
  98. package/dist/components/icons/zoom.d.ts +1 -1
  99. package/dist/components/icons/zoom.js +11 -69
  100. package/dist/components/mutation-invalidator.d.ts +1 -0
  101. package/dist/components/mutation-invalidator.js +31 -0
  102. package/dist/components/settings/account/theme-preview.js +7 -286
  103. package/dist/email.d.ts +1 -1
  104. package/dist/email.js +1 -11
  105. package/dist/hooks/auth/use-authenticate.d.ts +3 -3
  106. package/dist/hooks/auth/use-authenticate.js +28 -22
  107. package/dist/hooks/auth/use-user.d.ts +34 -34
  108. package/dist/hooks/auth/use-user.js +14 -10
  109. package/dist/hooks/use-auth-mutation.d.ts +4 -4
  110. package/dist/hooks/use-auth-mutation.js +18 -10
  111. package/dist/hooks/use-auth-plugin.d.ts +1 -1
  112. package/dist/hooks/use-auth-plugin.js +26 -8
  113. package/dist/hooks/use-auth-query.d.ts +3 -3
  114. package/dist/hooks/use-auth-query.js +20 -14
  115. package/dist/index.d.ts +48 -45
  116. package/dist/index.js +47 -79
  117. package/dist/lib/auth-client.d.ts +7 -4
  118. package/dist/lib/auth-client.js +1 -0
  119. package/dist/lib/auth-plugin.d.ts +19 -3
  120. package/dist/lib/auth-plugin.js +1 -0
  121. package/dist/lib/auth-server.d.ts +10 -3
  122. package/dist/lib/auth-server.js +1 -0
  123. package/dist/lib/provider-icons.d.ts +2 -2
  124. package/dist/lib/provider-icons.js +47 -75
  125. package/dist/lib/settings-tab.d.ts +19 -0
  126. package/dist/lib/settings-tab.js +1 -0
  127. package/dist/lib/utils.d.ts +1 -1
  128. package/dist/lib/utils.js +4 -7
  129. package/dist/mutations/api-key/create-api-key-mutation.d.ts +9 -7
  130. package/dist/mutations/api-key/create-api-key-mutation.js +37 -27
  131. package/dist/mutations/api-key/delete-api-key-mutation.d.ts +10 -6
  132. package/dist/mutations/api-key/delete-api-key-mutation.js +37 -27
  133. package/dist/mutations/auth/request-password-reset-mutation.d.ts +4 -4
  134. package/dist/mutations/auth/request-password-reset-mutation.js +31 -22
  135. package/dist/mutations/auth/reset-password-mutation.d.ts +4 -4
  136. package/dist/mutations/auth/reset-password-mutation.js +32 -22
  137. package/dist/mutations/auth/send-verification-email-mutation.d.ts +4 -4
  138. package/dist/mutations/auth/send-verification-email-mutation.js +31 -22
  139. package/dist/mutations/auth/sign-in-email-mutation.d.ts +10 -10
  140. package/dist/mutations/auth/sign-in-email-mutation.js +38 -27
  141. package/dist/mutations/auth/sign-in-social-mutation.d.ts +6 -6
  142. package/dist/mutations/auth/sign-in-social-mutation.js +36 -22
  143. package/dist/mutations/auth/sign-out-mutation.d.ts +9 -7
  144. package/dist/mutations/auth/sign-out-mutation.js +39 -26
  145. package/dist/mutations/auth/sign-up-email-mutation.d.ts +12 -12
  146. package/dist/mutations/auth/sign-up-email-mutation.js +34 -27
  147. package/dist/mutations/auth-mutation-options.d.ts +2 -2
  148. package/dist/mutations/auth-mutation-options.js +22 -18
  149. package/dist/mutations/magic-link/sign-in-magic-link-mutation.d.ts +4 -4
  150. package/dist/mutations/magic-link/sign-in-magic-link-mutation.js +31 -22
  151. package/dist/mutations/multi-session/revoke-multi-session-mutation.d.ts +8 -8
  152. package/dist/mutations/multi-session/revoke-multi-session-mutation.js +37 -27
  153. package/dist/mutations/multi-session/set-active-session-mutation.d.ts +8 -9
  154. package/dist/mutations/multi-session/set-active-session-mutation.js +38 -29
  155. package/dist/mutations/organization/accept-invitation-mutation.d.ts +43 -0
  156. package/dist/mutations/organization/accept-invitation-mutation.js +32 -0
  157. package/dist/mutations/organization/cancel-invitation-mutation.d.ts +25 -0
  158. package/dist/mutations/organization/cancel-invitation-mutation.js +28 -0
  159. package/dist/mutations/organization/check-slug-mutation.d.ts +21 -0
  160. package/dist/mutations/organization/check-slug-mutation.js +30 -0
  161. package/dist/mutations/organization/create-organization-mutation.d.ts +39 -0
  162. package/dist/mutations/organization/create-organization-mutation.js +29 -0
  163. package/dist/mutations/organization/delete-organization-mutation.d.ts +21 -0
  164. package/dist/mutations/organization/delete-organization-mutation.js +29 -0
  165. package/dist/mutations/organization/index.d.ts +12 -0
  166. package/dist/mutations/organization/index.js +12 -0
  167. package/dist/mutations/organization/invite-member-mutation.d.ts +43 -0
  168. package/dist/mutations/organization/invite-member-mutation.js +35 -0
  169. package/dist/mutations/organization/leave-organization-mutation.d.ts +65 -0
  170. package/dist/mutations/organization/leave-organization-mutation.js +32 -0
  171. package/dist/mutations/organization/reject-invitation-mutation.d.ts +31 -0
  172. package/dist/mutations/organization/reject-invitation-mutation.js +25 -0
  173. package/dist/mutations/organization/remove-member-mutation.d.ts +35 -0
  174. package/dist/mutations/organization/remove-member-mutation.js +29 -0
  175. package/dist/mutations/organization/set-active-organization-mutation.d.ts +71 -0
  176. package/dist/mutations/organization/set-active-organization-mutation.js +72 -0
  177. package/dist/mutations/organization/update-member-role-mutation.d.ts +31 -0
  178. package/dist/mutations/organization/update-member-role-mutation.js +36 -0
  179. package/dist/mutations/organization/update-organization-mutation.d.ts +21 -0
  180. package/dist/mutations/organization/update-organization-mutation.js +36 -0
  181. package/dist/mutations/passkey/add-passkey-mutation.d.ts +16 -16
  182. package/dist/mutations/passkey/add-passkey-mutation.js +38 -27
  183. package/dist/mutations/passkey/delete-passkey-mutation.d.ts +8 -8
  184. package/dist/mutations/passkey/delete-passkey-mutation.js +37 -27
  185. package/dist/mutations/passkey/sign-in-passkey-mutation.d.ts +24 -24
  186. package/dist/mutations/passkey/sign-in-passkey-mutation.js +36 -27
  187. package/dist/mutations/settings/change-email-mutation.d.ts +9 -8
  188. package/dist/mutations/settings/change-email-mutation.js +35 -27
  189. package/dist/mutations/settings/change-password-mutation.d.ts +6 -6
  190. package/dist/mutations/settings/change-password-mutation.js +31 -22
  191. package/dist/mutations/settings/delete-user-mutation.d.ts +4 -4
  192. package/dist/mutations/settings/delete-user-mutation.js +31 -22
  193. package/dist/mutations/settings/link-social-mutation.d.ts +4 -4
  194. package/dist/mutations/settings/link-social-mutation.js +31 -22
  195. package/dist/mutations/settings/revoke-session-mutation.d.ts +8 -8
  196. package/dist/mutations/settings/revoke-session-mutation.js +37 -27
  197. package/dist/mutations/settings/unlink-account-mutation.d.ts +8 -8
  198. package/dist/mutations/settings/unlink-account-mutation.js +37 -27
  199. package/dist/mutations/settings/update-user-mutation.d.ts +8 -8
  200. package/dist/mutations/settings/update-user-mutation.js +34 -33
  201. package/dist/mutations/username/is-username-available-mutation.d.ts +4 -4
  202. package/dist/mutations/username/is-username-available-mutation.js +34 -22
  203. package/dist/mutations/username/sign-in-username-mutation.d.ts +10 -10
  204. package/dist/mutations/username/sign-in-username-mutation.js +35 -27
  205. package/dist/plugins/captcha-plugin.d.ts +3 -3
  206. package/dist/plugins/captcha-plugin.js +31 -26
  207. package/dist/plugins.d.ts +1 -1
  208. package/dist/plugins.js +1 -2
  209. package/dist/queries/api-key/list-api-keys-query.d.ts +20 -11
  210. package/dist/queries/api-key/list-api-keys-query.js +52 -29
  211. package/dist/queries/auth/session-query.d.ts +6 -6
  212. package/dist/queries/auth/session-query.js +70 -28
  213. package/dist/queries/auth-query-options.d.ts +2 -2
  214. package/dist/queries/auth-query-options.js +20 -16
  215. package/dist/queries/multi-session/list-device-sessions-query.d.ts +8 -8
  216. package/dist/queries/multi-session/list-device-sessions-query.js +83 -29
  217. package/dist/queries/organization/active-organization-query.d.ts +39 -0
  218. package/dist/queries/organization/active-organization-query.js +37 -0
  219. package/dist/queries/organization/full-organization-query.d.ts +37 -0
  220. package/dist/queries/organization/full-organization-query.js +31 -0
  221. package/dist/queries/organization/has-permission-query.d.ts +21 -0
  222. package/dist/queries/organization/has-permission-query.js +38 -0
  223. package/dist/queries/organization/index.d.ts +7 -0
  224. package/dist/queries/organization/index.js +7 -0
  225. package/dist/queries/organization/list-invitations-query.d.ts +29 -0
  226. package/dist/queries/organization/list-invitations-query.js +37 -0
  227. package/dist/queries/organization/list-members-query.d.ts +61 -0
  228. package/dist/queries/organization/list-members-query.js +37 -0
  229. package/dist/queries/organization/list-organizations-query.d.ts +22 -0
  230. package/dist/queries/organization/list-organizations-query.js +31 -0
  231. package/dist/queries/organization/list-user-invitations-query.d.ts +29 -0
  232. package/dist/queries/organization/list-user-invitations-query.js +31 -0
  233. package/dist/queries/passkey/list-passkeys-query.d.ts +8 -8
  234. package/dist/queries/passkey/list-passkeys-query.js +81 -29
  235. package/dist/queries/settings/account-info-query.d.ts +6 -6
  236. package/dist/queries/settings/account-info-query.js +85 -29
  237. package/dist/queries/settings/list-accounts-query.d.ts +6 -6
  238. package/dist/queries/settings/list-accounts-query.js +83 -29
  239. package/dist/queries/settings/list-sessions-query.d.ts +6 -6
  240. package/dist/queries/settings/list-sessions-query.js +81 -29
  241. package/dist/server/queries/api-key/list-api-keys-query.d.ts +83 -0
  242. package/dist/server/queries/api-key/list-api-keys-query.js +49 -0
  243. package/dist/server/queries/auth/session-query.d.ts +5 -5
  244. package/dist/server/queries/auth/session-query.js +50 -12
  245. package/dist/server/queries/multi-session/list-device-sessions-query.d.ts +7 -7
  246. package/dist/server/queries/multi-session/list-device-sessions-query.js +53 -11
  247. package/dist/server/queries/organization/active-organization-query.d.ts +61 -0
  248. package/dist/server/queries/organization/active-organization-query.js +25 -0
  249. package/dist/server/queries/organization/full-organization-query.d.ts +42 -0
  250. package/dist/server/queries/organization/full-organization-query.js +21 -0
  251. package/dist/server/queries/organization/has-permission-query.d.ts +66 -0
  252. package/dist/server/queries/organization/has-permission-query.js +23 -0
  253. package/dist/server/queries/organization/list-invitations-query.d.ts +34 -0
  254. package/dist/server/queries/organization/list-invitations-query.js +21 -0
  255. package/dist/server/queries/organization/list-members-query.d.ts +66 -0
  256. package/dist/server/queries/organization/list-members-query.js +21 -0
  257. package/dist/server/queries/organization/list-organizations-query.d.ts +27 -0
  258. package/dist/server/queries/organization/list-organizations-query.js +21 -0
  259. package/dist/server/queries/organization/list-user-invitations-query.d.ts +34 -0
  260. package/dist/server/queries/organization/list-user-invitations-query.js +21 -0
  261. package/dist/server/queries/passkey/list-passkeys-query.d.ts +7 -7
  262. package/dist/server/queries/passkey/list-passkeys-query.js +53 -11
  263. package/dist/server/queries/settings/account-info-query.d.ts +5 -5
  264. package/dist/server/queries/settings/account-info-query.js +53 -11
  265. package/dist/server/queries/settings/list-accounts-query.d.ts +5 -5
  266. package/dist/server/queries/settings/list-accounts-query.js +53 -11
  267. package/dist/server/queries/settings/list-sessions-query.d.ts +5 -5
  268. package/dist/server/queries/settings/list-sessions-query.js +53 -11
  269. package/dist/server.d.ts +15 -7
  270. package/dist/server.js +14 -7
  271. package/package.json +20 -17
  272. package/src/components/auth/auth-context.tsx +7 -0
  273. package/src/components/auth/auth-provider.tsx +19 -31
  274. package/src/components/auth/email/email-localization.tsx +5 -3
  275. package/src/components/auth/email/index.ts +1 -0
  276. package/src/components/auth/email/organization-invitation.tsx +454 -0
  277. package/src/components/mutation-invalidator.tsx +67 -0
  278. package/src/index.ts +3 -0
  279. package/src/lib/auth-client.ts +7 -0
  280. package/src/lib/auth-plugin.ts +17 -0
  281. package/src/lib/auth-server.ts +17 -1
  282. package/src/lib/settings-tab.ts +21 -0
  283. package/src/mutations/api-key/create-api-key-mutation.ts +34 -19
  284. package/src/mutations/api-key/delete-api-key-mutation.ts +36 -19
  285. package/src/mutations/auth/sign-in-email-mutation.ts +18 -22
  286. package/src/mutations/auth/sign-out-mutation.ts +19 -13
  287. package/src/mutations/auth/sign-up-email-mutation.ts +18 -22
  288. package/src/mutations/multi-session/revoke-multi-session-mutation.ts +31 -20
  289. package/src/mutations/multi-session/set-active-session-mutation.ts +25 -44
  290. package/src/mutations/organization/accept-invitation-mutation.ts +71 -0
  291. package/src/mutations/organization/cancel-invitation-mutation.ts +67 -0
  292. package/src/mutations/organization/check-slug-mutation.ts +55 -0
  293. package/src/mutations/organization/create-organization-mutation.ts +71 -0
  294. package/src/mutations/organization/delete-organization-mutation.ts +71 -0
  295. package/src/mutations/organization/index.ts +12 -0
  296. package/src/mutations/organization/invite-member-mutation.ts +81 -0
  297. package/src/mutations/organization/leave-organization-mutation.ts +74 -0
  298. package/src/mutations/organization/reject-invitation-mutation.ts +64 -0
  299. package/src/mutations/organization/remove-member-mutation.ts +67 -0
  300. package/src/mutations/organization/set-active-organization-mutation.ts +142 -0
  301. package/src/mutations/organization/update-member-role-mutation.ts +81 -0
  302. package/src/mutations/organization/update-organization-mutation.ts +84 -0
  303. package/src/mutations/passkey/add-passkey-mutation.ts +28 -17
  304. package/src/mutations/passkey/delete-passkey-mutation.ts +27 -17
  305. package/src/mutations/passkey/sign-in-passkey-mutation.ts +18 -21
  306. package/src/mutations/settings/change-email-mutation.ts +22 -18
  307. package/src/mutations/settings/delete-user-mutation.ts +2 -2
  308. package/src/mutations/settings/revoke-session-mutation.ts +24 -19
  309. package/src/mutations/settings/unlink-account-mutation.ts +24 -17
  310. package/src/mutations/settings/update-user-mutation.ts +18 -30
  311. package/src/mutations/username/is-username-available-mutation.ts +2 -2
  312. package/src/mutations/username/sign-in-username-mutation.ts +20 -23
  313. package/src/queries/api-key/list-api-keys-query.ts +20 -8
  314. package/src/queries/multi-session/list-device-sessions-query.ts +2 -2
  315. package/src/queries/organization/active-organization-query.ts +140 -0
  316. package/src/queries/organization/full-organization-query.ts +113 -0
  317. package/src/queries/organization/has-permission-query.ts +124 -0
  318. package/src/queries/organization/index.ts +7 -0
  319. package/src/queries/organization/list-invitations-query.ts +133 -0
  320. package/src/queries/organization/list-members-query.ts +133 -0
  321. package/src/queries/organization/list-organizations-query.ts +122 -0
  322. package/src/queries/organization/list-user-invitations-query.ts +122 -0
  323. package/src/queries/passkey/list-passkeys-query.ts +2 -2
  324. package/src/server/queries/api-key/list-api-keys-query.ts +94 -0
  325. package/src/server/queries/multi-session/list-device-sessions-query.ts +2 -2
  326. package/src/server/queries/organization/active-organization-query.ts +92 -0
  327. package/src/server/queries/organization/full-organization-query.ts +64 -0
  328. package/src/server/queries/organization/has-permission-query.ts +66 -0
  329. package/src/server/queries/organization/list-invitations-query.ts +81 -0
  330. package/src/server/queries/organization/list-members-query.ts +75 -0
  331. package/src/server/queries/organization/list-organizations-query.ts +67 -0
  332. package/src/server/queries/organization/list-user-invitations-query.ts +68 -0
  333. package/src/server/queries/passkey/list-passkeys-query.ts +2 -2
  334. package/src/server.ts +8 -0
@@ -0,0 +1,67 @@
1
+ import { authMutationKeys } from "@better-auth-ui/core"
2
+ import {
3
+ matchMutation,
4
+ matchQuery,
5
+ type QueryKey,
6
+ useQueryClient
7
+ } from "@tanstack/react-query"
8
+ import { useEffect } from "react"
9
+
10
+ type AuthMutationMeta = {
11
+ invalidates?: Array<QueryKey>
12
+ awaits?: Array<QueryKey>
13
+ }
14
+
15
+ export function MutationInvalidator() {
16
+ const queryClient = useQueryClient()
17
+
18
+ useEffect(() => {
19
+ const mutationCache = queryClient.getMutationCache()
20
+ const previousOnSuccess = mutationCache.config.onSuccess
21
+
22
+ mutationCache.config.onSuccess = async (
23
+ data,
24
+ variables,
25
+ onMutateResult,
26
+ mutation,
27
+ context
28
+ ) => {
29
+ await previousOnSuccess?.(
30
+ data,
31
+ variables,
32
+ onMutateResult,
33
+ mutation,
34
+ context
35
+ )
36
+
37
+ if (!matchMutation({ mutationKey: authMutationKeys.all }, mutation)) {
38
+ return
39
+ }
40
+
41
+ const { invalidates, awaits } = (mutation.meta ?? {}) as AuthMutationMeta
42
+
43
+ if (invalidates?.length) {
44
+ queryClient.invalidateQueries({
45
+ predicate: (query) =>
46
+ invalidates.some((queryKey) => matchQuery({ queryKey }, query))
47
+ })
48
+ }
49
+
50
+ if (awaits?.length) {
51
+ return queryClient.invalidateQueries(
52
+ {
53
+ predicate: (query) =>
54
+ awaits.some((queryKey) => matchQuery({ queryKey }, query))
55
+ },
56
+ { cancelRefetch: false }
57
+ )
58
+ }
59
+ }
60
+
61
+ return () => {
62
+ mutationCache.config.onSuccess = previousOnSuccess
63
+ }
64
+ }, [queryClient])
65
+
66
+ return null
67
+ }
package/src/index.ts CHANGED
@@ -12,6 +12,7 @@ export * from "./hooks/use-auth-query"
12
12
  export type * from "./lib/auth-client"
13
13
  export * from "./lib/auth-plugin"
14
14
  export * from "./lib/provider-icons"
15
+ export * from "./lib/settings-tab"
15
16
  export * from "./mutations/api-key/create-api-key-mutation"
16
17
  export * from "./mutations/api-key/delete-api-key-mutation"
17
18
  export * from "./mutations/auth/request-password-reset-mutation"
@@ -25,6 +26,7 @@ export * from "./mutations/auth-mutation-options"
25
26
  export * from "./mutations/magic-link/sign-in-magic-link-mutation"
26
27
  export * from "./mutations/multi-session/revoke-multi-session-mutation"
27
28
  export * from "./mutations/multi-session/set-active-session-mutation"
29
+ export * from "./mutations/organization"
28
30
  export * from "./mutations/passkey/add-passkey-mutation"
29
31
  export * from "./mutations/passkey/delete-passkey-mutation"
30
32
  export * from "./mutations/passkey/sign-in-passkey-mutation"
@@ -41,6 +43,7 @@ export * from "./queries/api-key/list-api-keys-query"
41
43
  export * from "./queries/auth/session-query"
42
44
  export * from "./queries/auth-query-options"
43
45
  export * from "./queries/multi-session/list-device-sessions-query"
46
+ export * from "./queries/organization"
44
47
  export * from "./queries/passkey/list-passkeys-query"
45
48
  export * from "./queries/settings/account-info-query"
46
49
  export * from "./queries/settings/list-accounts-query"
@@ -3,6 +3,7 @@ import type { passkeyClient } from "@better-auth/passkey/client"
3
3
  import type {
4
4
  magicLinkClient,
5
5
  multiSessionClient,
6
+ organizationClient,
6
7
  usernameClient
7
8
  } from "better-auth/client/plugins"
8
9
  import type { createAuthClient } from "better-auth/react"
@@ -35,6 +36,12 @@ export type UsernameAuthClient = ReturnType<
35
36
  typeof createAuthClient<{ plugins: [ReturnType<typeof usernameClient>] }>
36
37
  >
37
38
 
39
+ export type OrganizationAuthClient = ReturnType<
40
+ typeof createAuthClient<{
41
+ plugins: [ReturnType<typeof organizationClient<object>>]
42
+ }>
43
+ >
44
+
38
45
  /**
39
46
  * Unwraps a Better Auth client method's `data` payload.
40
47
  *
@@ -1,5 +1,6 @@
1
1
  import type { AuthPluginBase, AuthView } from "@better-auth-ui/core"
2
2
  import type { ComponentType, ReactNode } from "react"
3
+ import type { SettingsTab } from "./settings-tab"
3
4
 
4
5
  export type { AuthPluginViewPaths } from "@better-auth-ui/core"
5
6
 
@@ -23,9 +24,17 @@ export type AccountCardProps = {
23
24
  children?: ReactNode
24
25
  }
25
26
 
27
+ /** Props for plugin-contributed cards under `/organization/...` settings. */
28
+ export type OrganizationCardProps = {
29
+ className?: string
30
+ children?: ReactNode
31
+ }
32
+
26
33
  /** Props for plugin-contributed items in the `UserButton` dropdown. */
27
34
  export type UserMenuItemProps = {
28
35
  className?: string
36
+ /** When true, the subtitle line (email when name/username is shown) is hidden. */
37
+ hideSubtitle?: boolean
29
38
  }
30
39
 
31
40
  /** Framework-agnostic slot component shapes. UI packages narrow these via `TComponents`. */
@@ -38,6 +47,8 @@ export type AuthPluginComponents = {
38
47
  securityCards?: ComponentType<SecurityCardProps>[]
39
48
  /** Rendered as cards inside account settings. */
40
49
  accountCards?: ComponentType<AccountCardProps>[]
50
+ /** Rendered as cards inside the active organization's settings. */
51
+ organizationCards?: ComponentType<OrganizationCardProps>[]
41
52
  /** Rendered as items inside the `UserButton` dropdown. */
42
53
  userMenuItems?: ComponentType<UserMenuItemProps>[]
43
54
  }
@@ -74,4 +85,10 @@ export type AuthPlugin<
74
85
  TComponents & {
75
86
  views?: AuthPluginViews<TAuthViewProps, TSettingsViewProps>
76
87
  fallbackViews?: AuthPluginFallbackViews<TAuthViewProps>
88
+ /**
89
+ * Tabs the plugin contributes to the settings page. Each entry is a
90
+ * {@link SettingsTab} (`view`, `label`, `component`). Read at runtime via
91
+ * `useAuthPlugin(plugin).settingsTabs`.
92
+ */
93
+ settingsTabs?: SettingsTab[]
77
94
  }
@@ -1,6 +1,12 @@
1
+ import type { apiKey } from "@better-auth/api-key"
1
2
  import type { passkey } from "@better-auth/passkey"
2
3
  import type { Auth } from "better-auth"
3
- import type { magicLink, multiSession, username } from "better-auth/plugins"
4
+ import type {
5
+ magicLink,
6
+ multiSession,
7
+ organization,
8
+ username
9
+ } from "better-auth/plugins"
4
10
 
5
11
  export type AuthServer = Pick<Auth, "api">
6
12
 
@@ -24,7 +30,17 @@ export type PasskeyAuthServer = Pick<
24
30
  "api"
25
31
  >
26
32
 
33
+ export type ApiKeyAuthServer = Pick<
34
+ Auth<{ plugins: [ReturnType<typeof apiKey>] }>,
35
+ "api"
36
+ >
37
+
27
38
  export type UsernameAuthServer = Pick<
28
39
  Auth<{ plugins: [ReturnType<typeof username>] }>,
29
40
  "api"
30
41
  >
42
+
43
+ export type OrganizationAuthServer = Pick<
44
+ Auth<{ plugins: [ReturnType<typeof organization>] }>,
45
+ "api"
46
+ >
@@ -0,0 +1,21 @@
1
+ import type { SettingsView } from "@better-auth-ui/core"
2
+ import type { ComponentType, ReactNode } from "react"
3
+
4
+ /**
5
+ * Tab contributions for the settings page.
6
+ *
7
+ * Plugins declare `settingsTabs` on their object to add extra tabs.
8
+ * Read at runtime via `useAuthPlugin(plugin).settingsTabs`.
9
+ */
10
+ export interface SettingsTab {
11
+ /**
12
+ * Settings view id — must match a key on `plugin.viewPaths.settings` and
13
+ * {@link SettingsView} (including keys added via `declare module` augmentation).
14
+ */
15
+ view: SettingsView
16
+ /** Display label */
17
+ label: ReactNode
18
+ /** Component rendered in the tab panel */
19
+ // biome-ignore lint/suspicious/noExplicitAny: any
20
+ component: ComponentType<any>
21
+ }
@@ -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
  }