@better-auth-ui/solid 1.6.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/auth/email/email-changed.d.ts +59 -0
- package/dist/components/auth/email/email-changed.js +264 -0
- package/dist/components/auth/email/email-styles.d.ts +48 -0
- package/dist/components/auth/email/email-styles.js +107 -0
- package/dist/components/auth/email/email-verification.d.ts +51 -0
- package/dist/components/auth/email/email-verification.js +212 -0
- package/dist/components/auth/email/index.d.ts +9 -0
- package/dist/components/auth/email/magic-link.d.ts +53 -0
- package/dist/components/auth/email/magic-link.js +213 -0
- package/dist/components/auth/email/new-device.d.ts +77 -0
- package/dist/components/auth/email/new-device.js +326 -0
- package/dist/components/auth/email/organization-invitation.d.ts +70 -0
- package/dist/components/auth/email/organization-invitation.js +260 -0
- package/dist/components/auth/email/otp-email.d.ts +49 -0
- package/dist/components/auth/email/otp-email.js +191 -0
- package/dist/components/auth/email/password-changed.d.ts +56 -0
- package/dist/components/auth/email/password-changed.js +236 -0
- package/dist/components/auth/email/reset-password.d.ts +51 -0
- package/dist/components/auth/email/reset-password.js +212 -0
- package/dist/email.d.ts +18 -0
- package/dist/email.js +10 -0
- package/dist/hooks/auth/use-authenticate.d.ts +3 -0
- package/dist/hooks/auth/use-authenticate.js +18 -0
- package/dist/hooks/auth/use-sign-out.d.ts +2 -0
- package/dist/hooks/auth/use-sign-out.js +17 -0
- package/dist/hooks/auth/use-user.d.ts +213 -0
- package/dist/hooks/auth/use-user.js +13 -0
- package/dist/hooks/use-auth-mutation.d.ts +6 -0
- package/dist/hooks/use-auth-mutation.js +11 -0
- package/dist/hooks/use-auth-query.d.ts +5 -0
- package/dist/hooks/use-auth-query.js +17 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +68 -0
- package/dist/lib/auth-client.d.ts +26 -0
- package/dist/lib/auth-config.d.ts +12 -0
- package/dist/lib/auth-config.js +21 -0
- package/dist/lib/auth-plugin.d.ts +16 -0
- package/dist/lib/auth-provider.d.ts +12 -0
- package/dist/lib/auth-provider.js +36 -0
- package/dist/lib/auth-server.d.ts +16 -0
- package/dist/lib/auth-utils.d.ts +3 -0
- package/dist/lib/auth-utils.js +12 -0
- package/dist/lib/fetch-options-provider.d.ts +23 -0
- package/dist/lib/fetch-options-provider.js +29 -0
- package/dist/lib/mutation-invalidator.d.ts +11 -0
- package/dist/lib/mutation-invalidator.js +20 -0
- package/dist/lib/provider-icons.d.ts +8 -0
- package/dist/lib/provider-icons.js +5 -0
- package/dist/mutations/api-key/create-api-key-mutation.d.ts +71 -0
- package/dist/mutations/api-key/create-api-key-mutation.js +12 -0
- package/dist/mutations/api-key/delete-api-key-mutation.d.ts +23 -0
- package/dist/mutations/api-key/delete-api-key-mutation.js +12 -0
- package/dist/mutations/auth/request-password-reset-mutation.d.ts +11 -0
- package/dist/mutations/auth/request-password-reset-mutation.js +8 -0
- package/dist/mutations/auth/reset-password-mutation.d.ts +13 -0
- package/dist/mutations/auth/reset-password-mutation.js +8 -0
- package/dist/mutations/auth/send-verification-email-mutation.d.ts +11 -0
- package/dist/mutations/auth/send-verification-email-mutation.js +8 -0
- package/dist/mutations/auth/sign-in-email-mutation.d.ts +15 -0
- package/dist/mutations/auth/sign-in-email-mutation.js +8 -0
- package/dist/mutations/auth/sign-in-social-mutation.d.ts +53 -0
- package/dist/mutations/auth/sign-in-social-mutation.js +8 -0
- package/dist/mutations/auth/sign-out-mutation.d.ts +6 -0
- package/dist/mutations/auth/sign-out-mutation.js +8 -0
- package/dist/mutations/auth/sign-up-email-mutation.d.ts +17 -0
- package/dist/mutations/auth/sign-up-email-mutation.js +8 -0
- package/dist/mutations/auth-mutation-options.d.ts +10 -0
- package/dist/mutations/auth-mutation-options.js +19 -0
- package/dist/mutations/create-auth-mutation.d.ts +10 -0
- package/dist/mutations/create-auth-mutation.js +20 -0
- package/dist/mutations/magic-link/sign-in-magic-link-mutation.d.ts +19 -0
- package/dist/mutations/magic-link/sign-in-magic-link-mutation.js +8 -0
- package/dist/mutations/multi-session/revoke-multi-session-mutation.d.ts +19 -0
- package/dist/mutations/multi-session/revoke-multi-session-mutation.js +12 -0
- package/dist/mutations/multi-session/set-active-session-mutation.d.ts +19 -0
- package/dist/mutations/multi-session/set-active-session-mutation.js +13 -0
- package/dist/mutations/organization/accept-invitation-mutation.d.ts +18 -0
- package/dist/mutations/organization/accept-invitation-mutation.js +12 -0
- package/dist/mutations/organization/cancel-invitation-mutation.d.ts +18 -0
- package/dist/mutations/organization/cancel-invitation-mutation.js +12 -0
- package/dist/mutations/organization/check-slug-mutation.d.ts +18 -0
- package/dist/mutations/organization/check-slug-mutation.js +15 -0
- package/dist/mutations/organization/create-organization-mutation.d.ts +38 -0
- package/dist/mutations/organization/create-organization-mutation.js +12 -0
- package/dist/mutations/organization/delete-organization-mutation.d.ts +18 -0
- package/dist/mutations/organization/delete-organization-mutation.js +12 -0
- package/dist/mutations/organization/index.d.ts +13 -0
- package/dist/mutations/organization/index.js +13 -0
- package/dist/mutations/organization/invite-member-mutation.d.ts +30 -0
- package/dist/mutations/organization/invite-member-mutation.js +12 -0
- package/dist/mutations/organization/leave-organization-mutation.d.ts +18 -0
- package/dist/mutations/organization/leave-organization-mutation.js +12 -0
- package/dist/mutations/organization/metadata.d.ts +13 -0
- package/dist/mutations/organization/metadata.js +27 -0
- package/dist/mutations/organization/reject-invitation-mutation.d.ts +18 -0
- package/dist/mutations/organization/reject-invitation-mutation.js +12 -0
- package/dist/mutations/organization/remove-member-mutation.d.ts +22 -0
- package/dist/mutations/organization/remove-member-mutation.js +12 -0
- package/dist/mutations/organization/set-active-organization-mutation.d.ts +24 -0
- package/dist/mutations/organization/set-active-organization-mutation.js +35 -0
- package/dist/mutations/organization/update-member-role-mutation.d.ts +26 -0
- package/dist/mutations/organization/update-member-role-mutation.js +12 -0
- package/dist/mutations/organization/update-organization-mutation.d.ts +42 -0
- package/dist/mutations/organization/update-organization-mutation.js +12 -0
- package/dist/mutations/organization/utils.d.ts +8 -0
- package/dist/mutations/organization/utils.js +17 -0
- package/dist/mutations/passkey/add-passkey-mutation.d.ts +73 -0
- package/dist/mutations/passkey/add-passkey-mutation.js +12 -0
- package/dist/mutations/passkey/delete-passkey-mutation.d.ts +19 -0
- package/dist/mutations/passkey/delete-passkey-mutation.js +12 -0
- package/dist/mutations/passkey/sign-in-passkey-mutation.d.ts +50 -0
- package/dist/mutations/passkey/sign-in-passkey-mutation.js +9 -0
- package/dist/mutations/settings/change-email-mutation.d.ts +11 -0
- package/dist/mutations/settings/change-email-mutation.js +8 -0
- package/dist/mutations/settings/change-password-mutation.d.ts +13 -0
- package/dist/mutations/settings/change-password-mutation.js +8 -0
- package/dist/mutations/settings/delete-user-mutation.d.ts +13 -0
- package/dist/mutations/settings/delete-user-mutation.js +8 -0
- package/dist/mutations/settings/link-social-mutation.d.ts +35 -0
- package/dist/mutations/settings/link-social-mutation.js +8 -0
- package/dist/mutations/settings/revoke-session-mutation.d.ts +19 -0
- package/dist/mutations/settings/revoke-session-mutation.js +12 -0
- package/dist/mutations/settings/unlink-account-mutation.d.ts +23 -0
- package/dist/mutations/settings/unlink-account-mutation.js +12 -0
- package/dist/mutations/settings/update-user-mutation.d.ts +6 -0
- package/dist/mutations/settings/update-user-mutation.js +8 -0
- package/dist/mutations/use-session-scoped-mutation.d.ts +17 -0
- package/dist/mutations/use-session-scoped-mutation.js +17 -0
- package/dist/mutations/username/is-username-available-mutation.d.ts +9 -0
- package/dist/mutations/username/is-username-available-mutation.js +8 -0
- package/dist/mutations/username/sign-in-username-mutation.d.ts +15 -0
- package/dist/mutations/username/sign-in-username-mutation.js +9 -0
- package/dist/plugins/captcha-plugin.d.ts +29 -0
- package/dist/plugins/captcha-plugin.js +26 -0
- package/dist/plugins.d.ts +2 -0
- package/dist/plugins.js +2 -0
- package/dist/queries/api-key/list-api-keys-query.d.ts +44 -0
- package/dist/queries/api-key/list-api-keys-query.js +17 -0
- package/dist/queries/auth/session-query.d.ts +22 -0
- package/dist/queries/auth/session-query.js +32 -0
- package/dist/queries/auth-query-options.d.ts +14 -0
- package/dist/queries/auth-query-options.js +17 -0
- package/dist/queries/create-user-scoped-query.d.ts +25 -0
- package/dist/queries/create-user-scoped-query.js +29 -0
- package/dist/queries/multi-session/list-device-sessions-query.d.ts +23 -0
- package/dist/queries/multi-session/list-device-sessions-query.js +17 -0
- package/dist/queries/organization/active-organization-query.d.ts +37 -0
- package/dist/queries/organization/active-organization-query.js +26 -0
- package/dist/queries/organization/full-organization-query.d.ts +35 -0
- package/dist/queries/organization/full-organization-query.js +25 -0
- package/dist/queries/organization/has-permission-query.d.ts +23 -0
- package/dist/queries/organization/has-permission-query.js +31 -0
- package/dist/queries/organization/index.d.ts +7 -0
- package/dist/queries/organization/index.js +7 -0
- package/dist/queries/organization/list-invitations-query.d.ts +29 -0
- package/dist/queries/organization/list-invitations-query.js +29 -0
- package/dist/queries/organization/list-members-query.d.ts +53 -0
- package/dist/queries/organization/list-members-query.js +29 -0
- package/dist/queries/organization/list-organizations-query.d.ts +23 -0
- package/dist/queries/organization/list-organizations-query.js +25 -0
- package/dist/queries/organization/list-user-invitations-query.d.ts +29 -0
- package/dist/queries/organization/list-user-invitations-query.js +25 -0
- package/dist/queries/organization/plugin.d.ts +1 -0
- package/dist/queries/organization/plugin.js +8 -0
- package/dist/queries/organization/utils.d.ts +16 -0
- package/dist/queries/organization/utils.js +18 -0
- package/dist/queries/passkey/list-passkeys-query.d.ts +23 -0
- package/dist/queries/passkey/list-passkeys-query.js +17 -0
- package/dist/queries/settings/account-info-query.d.ts +35 -0
- package/dist/queries/settings/account-info-query.js +17 -0
- package/dist/queries/settings/list-accounts-query.d.ts +23 -0
- package/dist/queries/settings/list-accounts-query.js +17 -0
- package/dist/queries/settings/list-sessions-query.d.ts +24 -0
- package/dist/queries/settings/list-sessions-query.js +17 -0
- package/dist/server/queries/auth/session-query.d.ts +19 -0
- package/dist/server/queries/auth/session-query.js +13 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.js +7 -0
- package/package.json +63 -0
- package/src/components/auth/email/email-changed.tsx +305 -0
- package/src/components/auth/email/email-styles.tsx +139 -0
- package/src/components/auth/email/email-verification.tsx +249 -0
- package/src/components/auth/email/index.ts +9 -0
- package/src/components/auth/email/magic-link.tsx +254 -0
- package/src/components/auth/email/new-device.tsx +347 -0
- package/src/components/auth/email/organization-invitation.tsx +322 -0
- package/src/components/auth/email/otp-email.tsx +239 -0
- package/src/components/auth/email/password-changed.tsx +279 -0
- package/src/components/auth/email/reset-password.tsx +250 -0
- package/src/email.ts +49 -0
- package/src/hooks/auth/use-authenticate.ts +30 -0
- package/src/hooks/auth/use-sign-out.ts +23 -0
- package/src/hooks/auth/use-user.ts +19 -0
- package/src/hooks/use-auth-mutation.ts +35 -0
- package/src/hooks/use-auth-query.ts +33 -0
- package/src/index.ts +48 -0
- package/src/lib/auth-client.ts +43 -0
- package/src/lib/auth-config.ts +46 -0
- package/src/lib/auth-plugin.ts +20 -0
- package/src/lib/auth-provider.tsx +60 -0
- package/src/lib/auth-server.ts +25 -0
- package/src/lib/auth-utils.ts +25 -0
- package/src/lib/fetch-options-provider.tsx +77 -0
- package/src/lib/mutation-invalidator.tsx +82 -0
- package/src/lib/provider-icons.ts +10 -0
- package/src/mutations/api-key/create-api-key-mutation.ts +40 -0
- package/src/mutations/api-key/delete-api-key-mutation.ts +40 -0
- package/src/mutations/auth/request-password-reset-mutation.ts +15 -0
- package/src/mutations/auth/reset-password-mutation.ts +16 -0
- package/src/mutations/auth/send-verification-email-mutation.ts +15 -0
- package/src/mutations/auth/sign-in-email-mutation.ts +17 -0
- package/src/mutations/auth/sign-in-social-mutation.ts +16 -0
- package/src/mutations/auth/sign-out-mutation.ts +13 -0
- package/src/mutations/auth/sign-up-email-mutation.ts +17 -0
- package/src/mutations/auth-mutation-options.ts +62 -0
- package/src/mutations/create-auth-mutation.ts +44 -0
- package/src/mutations/magic-link/sign-in-magic-link-mutation.ts +15 -0
- package/src/mutations/multi-session/revoke-multi-session-mutation.ts +40 -0
- package/src/mutations/multi-session/set-active-session-mutation.ts +43 -0
- package/src/mutations/organization/accept-invitation-mutation.ts +38 -0
- package/src/mutations/organization/cancel-invitation-mutation.ts +38 -0
- package/src/mutations/organization/check-slug-mutation.ts +36 -0
- package/src/mutations/organization/create-organization-mutation.ts +37 -0
- package/src/mutations/organization/delete-organization-mutation.ts +37 -0
- package/src/mutations/organization/index.ts +13 -0
- package/src/mutations/organization/invite-member-mutation.ts +38 -0
- package/src/mutations/organization/leave-organization-mutation.ts +37 -0
- package/src/mutations/organization/metadata.ts +103 -0
- package/src/mutations/organization/reject-invitation-mutation.ts +38 -0
- package/src/mutations/organization/remove-member-mutation.ts +38 -0
- package/src/mutations/organization/set-active-organization-mutation.ts +110 -0
- package/src/mutations/organization/update-member-role-mutation.ts +38 -0
- package/src/mutations/organization/update-organization-mutation.ts +37 -0
- package/src/mutations/organization/utils.ts +51 -0
- package/src/mutations/passkey/add-passkey-mutation.ts +40 -0
- package/src/mutations/passkey/delete-passkey-mutation.ts +40 -0
- package/src/mutations/passkey/sign-in-passkey-mutation.ts +17 -0
- package/src/mutations/settings/change-email-mutation.ts +17 -0
- package/src/mutations/settings/change-password-mutation.ts +16 -0
- package/src/mutations/settings/delete-user-mutation.ts +16 -0
- package/src/mutations/settings/link-social-mutation.ts +16 -0
- package/src/mutations/settings/revoke-session-mutation.ts +38 -0
- package/src/mutations/settings/unlink-account-mutation.ts +38 -0
- package/src/mutations/settings/update-user-mutation.ts +17 -0
- package/src/mutations/use-session-scoped-mutation.ts +64 -0
- package/src/mutations/username/is-username-available-mutation.ts +15 -0
- package/src/mutations/username/sign-in-username-mutation.ts +17 -0
- package/src/plugins/captcha-plugin.tsx +64 -0
- package/src/plugins.ts +2 -0
- package/src/queries/api-key/list-api-keys-query.ts +93 -0
- package/src/queries/auth/session-query.ts +81 -0
- package/src/queries/auth-query-options.ts +57 -0
- package/src/queries/create-user-scoped-query.ts +107 -0
- package/src/queries/multi-session/list-device-sessions-query.ts +107 -0
- package/src/queries/organization/active-organization-query.ts +127 -0
- package/src/queries/organization/full-organization-query.ts +111 -0
- package/src/queries/organization/has-permission-query.ts +121 -0
- package/src/queries/organization/index.ts +7 -0
- package/src/queries/organization/list-invitations-query.ts +124 -0
- package/src/queries/organization/list-members-query.ts +124 -0
- package/src/queries/organization/list-organizations-query.ts +113 -0
- package/src/queries/organization/list-user-invitations-query.ts +114 -0
- package/src/queries/organization/plugin.ts +11 -0
- package/src/queries/organization/utils.ts +88 -0
- package/src/queries/passkey/list-passkeys-query.ts +93 -0
- package/src/queries/settings/account-info-query.ts +94 -0
- package/src/queries/settings/list-accounts-query.ts +94 -0
- package/src/queries/settings/list-sessions-query.ts +96 -0
- package/src/server/queries/auth/session-query.ts +56 -0
- package/src/server.ts +7 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Body,
|
|
3
|
+
Button,
|
|
4
|
+
Container,
|
|
5
|
+
Head,
|
|
6
|
+
Heading,
|
|
7
|
+
Hr,
|
|
8
|
+
Html,
|
|
9
|
+
Img,
|
|
10
|
+
Link,
|
|
11
|
+
Preview,
|
|
12
|
+
Section,
|
|
13
|
+
Tailwind,
|
|
14
|
+
Text
|
|
15
|
+
} from "@solidjs-email/main"
|
|
16
|
+
import type { JSX } from "solid-js"
|
|
17
|
+
import { Show } from "solid-js"
|
|
18
|
+
import {
|
|
19
|
+
type EmailClassNames,
|
|
20
|
+
type EmailColors,
|
|
21
|
+
EmailStyles
|
|
22
|
+
} from "./email-styles"
|
|
23
|
+
|
|
24
|
+
function cn(...classes: Array<string | false | null | undefined>) {
|
|
25
|
+
return classes.filter(Boolean).join(" ")
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const resetPasswordEmailLocalization = {
|
|
29
|
+
RESET_YOUR_PASSWORD: "Reset your password",
|
|
30
|
+
LOGO: "Logo",
|
|
31
|
+
WE_RECEIVED_REQUEST_TO_RESET_PASSWORD:
|
|
32
|
+
"We received a request to reset the password for your {appName} account {email}.",
|
|
33
|
+
RESET_PASSWORD: "Reset password",
|
|
34
|
+
OR_COPY_AND_PASTE_URL: "Or copy and paste this URL into your browser:",
|
|
35
|
+
THIS_LINK_EXPIRES_IN_MINUTES:
|
|
36
|
+
"This link expires in {expirationMinutes} minutes.",
|
|
37
|
+
EMAIL_SENT_BY: "Email sent by {appName}.",
|
|
38
|
+
IF_YOU_DIDNT_REQUEST_PASSWORD_RESET:
|
|
39
|
+
"If you didn't request a password reset, you can safely ignore this email. Your password will remain unchanged.",
|
|
40
|
+
POWERED_BY_BETTER_AUTH: "Powered by {betterAuth}"
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export type ResetPasswordEmailLocalization =
|
|
44
|
+
typeof resetPasswordEmailLocalization
|
|
45
|
+
|
|
46
|
+
export interface ResetPasswordEmailProps {
|
|
47
|
+
url: string
|
|
48
|
+
email?: string
|
|
49
|
+
appName?: string
|
|
50
|
+
expirationMinutes?: number
|
|
51
|
+
logoURL?: string | { light: string; dark: string }
|
|
52
|
+
classNames?: EmailClassNames
|
|
53
|
+
colors?: EmailColors
|
|
54
|
+
poweredBy?: boolean
|
|
55
|
+
darkMode?: boolean
|
|
56
|
+
head?: JSX.Element
|
|
57
|
+
localization?: Partial<ResetPasswordEmailLocalization>
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function cleanSentence(value: string) {
|
|
61
|
+
return value.replace(/\s{2,}/g, " ").replace(" .", ".")
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function ResetPasswordEmail(props: ResetPasswordEmailProps) {
|
|
65
|
+
const expirationMinutes = () => props.expirationMinutes ?? 60
|
|
66
|
+
const darkMode = () => props.darkMode ?? true
|
|
67
|
+
const localization = () => ({
|
|
68
|
+
...ResetPasswordEmail.localization,
|
|
69
|
+
...props.localization
|
|
70
|
+
})
|
|
71
|
+
const requestText = () =>
|
|
72
|
+
cleanSentence(
|
|
73
|
+
localization()
|
|
74
|
+
.WE_RECEIVED_REQUEST_TO_RESET_PASSWORD.replace(
|
|
75
|
+
"{appName}",
|
|
76
|
+
props.appName || ""
|
|
77
|
+
)
|
|
78
|
+
.replace("{email}", props.email || "")
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
return (
|
|
82
|
+
<Html>
|
|
83
|
+
<Head>
|
|
84
|
+
<meta content="light dark" name="color-scheme" />
|
|
85
|
+
<meta content="light dark" name="supported-color-schemes" />
|
|
86
|
+
<EmailStyles colors={props.colors} darkMode={darkMode()} />
|
|
87
|
+
{props.head}
|
|
88
|
+
</Head>
|
|
89
|
+
|
|
90
|
+
<Preview>{localization().RESET_YOUR_PASSWORD}</Preview>
|
|
91
|
+
|
|
92
|
+
<Tailwind>
|
|
93
|
+
<Body
|
|
94
|
+
class={cn("bg-background", props.classNames?.body)}
|
|
95
|
+
style={{ "font-family": "Arial, Helvetica, sans-serif" }}
|
|
96
|
+
>
|
|
97
|
+
<Container
|
|
98
|
+
class={cn(
|
|
99
|
+
"mx-auto my-auto max-w-xl px-2 py-10",
|
|
100
|
+
props.classNames?.container
|
|
101
|
+
)}
|
|
102
|
+
>
|
|
103
|
+
<Section
|
|
104
|
+
class={cn(
|
|
105
|
+
"rounded-none border border-border bg-card p-8 text-card-foreground",
|
|
106
|
+
props.classNames?.card
|
|
107
|
+
)}
|
|
108
|
+
>
|
|
109
|
+
{props.logoURL &&
|
|
110
|
+
(typeof props.logoURL === "string" ? (
|
|
111
|
+
<Img
|
|
112
|
+
alt={props.appName || localization().LOGO}
|
|
113
|
+
class={cn("mx-auto mb-8", props.classNames?.logo)}
|
|
114
|
+
height={48}
|
|
115
|
+
src={props.logoURL}
|
|
116
|
+
width={48}
|
|
117
|
+
/>
|
|
118
|
+
) : (
|
|
119
|
+
<>
|
|
120
|
+
<Img
|
|
121
|
+
alt={props.appName || localization().LOGO}
|
|
122
|
+
class={cn(
|
|
123
|
+
"logo-light mx-auto mb-8",
|
|
124
|
+
props.classNames?.logo
|
|
125
|
+
)}
|
|
126
|
+
height={48}
|
|
127
|
+
src={props.logoURL.light}
|
|
128
|
+
width={48}
|
|
129
|
+
/>
|
|
130
|
+
<Img
|
|
131
|
+
alt={props.appName || localization().LOGO}
|
|
132
|
+
class={cn(
|
|
133
|
+
"logo-dark hidden mx-auto mb-8",
|
|
134
|
+
props.classNames?.logo
|
|
135
|
+
)}
|
|
136
|
+
height={48}
|
|
137
|
+
src={props.logoURL.dark}
|
|
138
|
+
width={48}
|
|
139
|
+
/>
|
|
140
|
+
</>
|
|
141
|
+
))}
|
|
142
|
+
|
|
143
|
+
<Heading
|
|
144
|
+
class={cn(
|
|
145
|
+
"m-0 mb-5 font-semibold text-2xl",
|
|
146
|
+
props.classNames?.title
|
|
147
|
+
)}
|
|
148
|
+
>
|
|
149
|
+
{localization().RESET_YOUR_PASSWORD}
|
|
150
|
+
</Heading>
|
|
151
|
+
|
|
152
|
+
<Text class={cn("text-sm", props.classNames?.content)}>
|
|
153
|
+
{requestText()}
|
|
154
|
+
</Text>
|
|
155
|
+
|
|
156
|
+
<Section class="my-6">
|
|
157
|
+
<Button
|
|
158
|
+
class={cn(
|
|
159
|
+
"inline-block whitespace-nowrap rounded-none bg-primary px-6 py-2.5 font-medium text-primary-foreground text-sm no-underline",
|
|
160
|
+
props.classNames?.button
|
|
161
|
+
)}
|
|
162
|
+
href={props.url}
|
|
163
|
+
>
|
|
164
|
+
{localization().RESET_PASSWORD}
|
|
165
|
+
</Button>
|
|
166
|
+
</Section>
|
|
167
|
+
|
|
168
|
+
<Text
|
|
169
|
+
class={cn(
|
|
170
|
+
"m-0 mb-3 text-muted-foreground text-xs",
|
|
171
|
+
props.classNames?.description
|
|
172
|
+
)}
|
|
173
|
+
>
|
|
174
|
+
{localization().OR_COPY_AND_PASTE_URL}
|
|
175
|
+
</Text>
|
|
176
|
+
|
|
177
|
+
<Link
|
|
178
|
+
class={cn(
|
|
179
|
+
"break-all text-primary text-xs",
|
|
180
|
+
props.classNames?.link
|
|
181
|
+
)}
|
|
182
|
+
href={props.url}
|
|
183
|
+
>
|
|
184
|
+
{props.url}
|
|
185
|
+
</Link>
|
|
186
|
+
|
|
187
|
+
<Hr
|
|
188
|
+
class={cn(
|
|
189
|
+
"my-6 w-full border border-border border-solid",
|
|
190
|
+
props.classNames?.separator
|
|
191
|
+
)}
|
|
192
|
+
/>
|
|
193
|
+
|
|
194
|
+
<Text
|
|
195
|
+
class={cn(
|
|
196
|
+
"m-0 mb-3 text-muted-foreground text-xs",
|
|
197
|
+
props.classNames?.description
|
|
198
|
+
)}
|
|
199
|
+
>
|
|
200
|
+
{localization().THIS_LINK_EXPIRES_IN_MINUTES.replace(
|
|
201
|
+
"{expirationMinutes}",
|
|
202
|
+
expirationMinutes().toString()
|
|
203
|
+
)}
|
|
204
|
+
<Show when={props.appName}>
|
|
205
|
+
{(appName) =>
|
|
206
|
+
` ${localization().EMAIL_SENT_BY.replace("{appName}", appName())}`
|
|
207
|
+
}
|
|
208
|
+
</Show>
|
|
209
|
+
</Text>
|
|
210
|
+
|
|
211
|
+
<Text
|
|
212
|
+
class={cn(
|
|
213
|
+
"m-0 text-muted-foreground text-xs",
|
|
214
|
+
props.classNames?.description
|
|
215
|
+
)}
|
|
216
|
+
>
|
|
217
|
+
{localization().IF_YOU_DIDNT_REQUEST_PASSWORD_RESET}
|
|
218
|
+
</Text>
|
|
219
|
+
|
|
220
|
+
<Show when={props.poweredBy}>
|
|
221
|
+
<Text
|
|
222
|
+
class={cn(
|
|
223
|
+
"m-0 mt-4 text-center text-[11px] text-muted-foreground",
|
|
224
|
+
props.classNames?.poweredBy
|
|
225
|
+
)}
|
|
226
|
+
>
|
|
227
|
+
{localization().POWERED_BY_BETTER_AUTH.replace(
|
|
228
|
+
"{betterAuth}",
|
|
229
|
+
"better-auth"
|
|
230
|
+
)}
|
|
231
|
+
</Text>
|
|
232
|
+
</Show>
|
|
233
|
+
</Section>
|
|
234
|
+
</Container>
|
|
235
|
+
</Body>
|
|
236
|
+
</Tailwind>
|
|
237
|
+
</Html>
|
|
238
|
+
)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
ResetPasswordEmail.localization = resetPasswordEmailLocalization
|
|
242
|
+
|
|
243
|
+
ResetPasswordEmail.PreviewProps = {
|
|
244
|
+
url: "https://better-auth-ui.com/auth/reset-password?token=example-token",
|
|
245
|
+
email: "m@example.com",
|
|
246
|
+
appName: "Better Auth",
|
|
247
|
+
darkMode: true
|
|
248
|
+
} satisfies ResetPasswordEmailProps
|
|
249
|
+
|
|
250
|
+
export default ResetPasswordEmail
|
package/src/email.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type {
|
|
2
|
+
EmailChangedEmailLocalization,
|
|
3
|
+
EmailChangedEmailProps
|
|
4
|
+
} from "./components/auth/email/email-changed.js"
|
|
5
|
+
export { default as EmailChangedEmail } from "./components/auth/email/email-changed.js"
|
|
6
|
+
export type {
|
|
7
|
+
EmailClassNames,
|
|
8
|
+
EmailColors
|
|
9
|
+
} from "./components/auth/email/email-styles.js"
|
|
10
|
+
export {
|
|
11
|
+
default as EmailStyles,
|
|
12
|
+
defaultColors
|
|
13
|
+
} from "./components/auth/email/email-styles.js"
|
|
14
|
+
export type {
|
|
15
|
+
EmailVerificationEmailLocalization,
|
|
16
|
+
EmailVerificationEmailProps
|
|
17
|
+
} from "./components/auth/email/email-verification.js"
|
|
18
|
+
export { default as EmailVerificationEmail } from "./components/auth/email/email-verification.js"
|
|
19
|
+
export type {
|
|
20
|
+
MagicLinkEmailLocalization,
|
|
21
|
+
MagicLinkEmailProps
|
|
22
|
+
} from "./components/auth/email/magic-link.js"
|
|
23
|
+
export { default as MagicLinkEmail } from "./components/auth/email/magic-link.js"
|
|
24
|
+
export type {
|
|
25
|
+
DeviceInfo,
|
|
26
|
+
NewDeviceEmailLocalization,
|
|
27
|
+
NewDeviceEmailProps
|
|
28
|
+
} from "./components/auth/email/new-device.js"
|
|
29
|
+
export { default as NewDeviceEmail } from "./components/auth/email/new-device.js"
|
|
30
|
+
export type {
|
|
31
|
+
OrganizationInvitationEmailLocalization,
|
|
32
|
+
OrganizationInvitationEmailProps
|
|
33
|
+
} from "./components/auth/email/organization-invitation.js"
|
|
34
|
+
export { default as OrganizationInvitationEmail } from "./components/auth/email/organization-invitation.js"
|
|
35
|
+
export type {
|
|
36
|
+
OtpEmailEmailLocalization,
|
|
37
|
+
OtpEmailProps
|
|
38
|
+
} from "./components/auth/email/otp-email.js"
|
|
39
|
+
export { default as OtpEmail } from "./components/auth/email/otp-email.js"
|
|
40
|
+
export type {
|
|
41
|
+
PasswordChangedEmailLocalization,
|
|
42
|
+
PasswordChangedEmailProps
|
|
43
|
+
} from "./components/auth/email/password-changed.js"
|
|
44
|
+
export { default as PasswordChangedEmail } from "./components/auth/email/password-changed.js"
|
|
45
|
+
export type {
|
|
46
|
+
ResetPasswordEmailLocalization,
|
|
47
|
+
ResetPasswordEmailProps
|
|
48
|
+
} from "./components/auth/email/reset-password.js"
|
|
49
|
+
export { default as ResetPasswordEmail } from "./components/auth/email/reset-password.js"
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createEffect } from "solid-js"
|
|
2
|
+
import { isServer } from "solid-js/web"
|
|
3
|
+
import type { AuthClient } from "../../lib/auth-client"
|
|
4
|
+
import { useAuth } from "../../lib/auth-provider"
|
|
5
|
+
import {
|
|
6
|
+
type UseSessionOptions,
|
|
7
|
+
useSession
|
|
8
|
+
} from "../../queries/auth/session-query"
|
|
9
|
+
|
|
10
|
+
export function useAuthenticate<TAuthClient extends AuthClient>(
|
|
11
|
+
authClient: TAuthClient,
|
|
12
|
+
options?: UseSessionOptions<TAuthClient>
|
|
13
|
+
) {
|
|
14
|
+
const config = useAuth()
|
|
15
|
+
const session = useSession(authClient, options)
|
|
16
|
+
|
|
17
|
+
createEffect(() => {
|
|
18
|
+
if (session.data || session.isPending) return
|
|
19
|
+
|
|
20
|
+
const currentURL = isServer
|
|
21
|
+
? "/"
|
|
22
|
+
: window.location.pathname + window.location.search
|
|
23
|
+
const redirectTo = encodeURIComponent(currentURL)
|
|
24
|
+
const signInPath = `${config.basePaths.auth}/${config.viewPaths.auth.signIn}?redirectTo=${redirectTo}`
|
|
25
|
+
|
|
26
|
+
config.navigate({ to: signInPath, replace: true })
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
return session
|
|
30
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { authMutationKeys, authQueryKeys } from "@better-auth-ui/core"
|
|
2
|
+
import { createMutation, useQueryClient } from "@tanstack/solid-query"
|
|
3
|
+
import type { AuthClient } from "../../lib/auth-client"
|
|
4
|
+
|
|
5
|
+
export function useSignOut<TAuthClient extends AuthClient>(
|
|
6
|
+
authClient: TAuthClient
|
|
7
|
+
) {
|
|
8
|
+
const queryClient = useQueryClient()
|
|
9
|
+
|
|
10
|
+
return createMutation(() => ({
|
|
11
|
+
mutationKey: authMutationKeys.signOut,
|
|
12
|
+
mutationFn: async () => {
|
|
13
|
+
await authClient.signOut({
|
|
14
|
+
fetchOptions: { throw: true }
|
|
15
|
+
})
|
|
16
|
+
},
|
|
17
|
+
onSuccess: () => {
|
|
18
|
+
queryClient.removeQueries({
|
|
19
|
+
queryKey: authQueryKeys.all
|
|
20
|
+
})
|
|
21
|
+
}
|
|
22
|
+
}))
|
|
23
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AuthClient } from "../../lib/auth-client"
|
|
2
|
+
import {
|
|
3
|
+
type UseSessionOptions,
|
|
4
|
+
useSession
|
|
5
|
+
} from "../../queries/auth/session-query"
|
|
6
|
+
|
|
7
|
+
export function useUser<TAuthClient extends AuthClient>(
|
|
8
|
+
authClient: TAuthClient,
|
|
9
|
+
options?: UseSessionOptions<TAuthClient>
|
|
10
|
+
) {
|
|
11
|
+
const session = useSession(authClient, options)
|
|
12
|
+
|
|
13
|
+
return {
|
|
14
|
+
...session,
|
|
15
|
+
get data() {
|
|
16
|
+
return session.data?.user
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type CreateMutationOptions,
|
|
3
|
+
createMutation,
|
|
4
|
+
type MutationKey
|
|
5
|
+
} from "@tanstack/solid-query"
|
|
6
|
+
import type { BetterFetchError } from "better-auth/client"
|
|
7
|
+
import {
|
|
8
|
+
type AuthMutationFn,
|
|
9
|
+
type AuthMutationFnData,
|
|
10
|
+
type AuthMutationFnVariables,
|
|
11
|
+
authMutationOptions
|
|
12
|
+
} from "../mutations/auth-mutation-options"
|
|
13
|
+
|
|
14
|
+
type UseAuthMutationOptions<TFn extends AuthMutationFn> = Omit<
|
|
15
|
+
CreateMutationOptions<
|
|
16
|
+
AuthMutationFnData<TFn>,
|
|
17
|
+
BetterFetchError,
|
|
18
|
+
AuthMutationFnVariables<TFn>
|
|
19
|
+
>,
|
|
20
|
+
"mutationKey" | "mutationFn"
|
|
21
|
+
>
|
|
22
|
+
|
|
23
|
+
export function useAuthMutation<
|
|
24
|
+
TFn extends AuthMutationFn,
|
|
25
|
+
const TMutationKey extends MutationKey
|
|
26
|
+
>(
|
|
27
|
+
authFn: TFn,
|
|
28
|
+
mutationKey: TMutationKey,
|
|
29
|
+
options?: UseAuthMutationOptions<TFn>
|
|
30
|
+
) {
|
|
31
|
+
return createMutation(() => ({
|
|
32
|
+
...authMutationOptions(authFn, mutationKey),
|
|
33
|
+
...options
|
|
34
|
+
}))
|
|
35
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createQuery, type QueryKey } from "@tanstack/solid-query"
|
|
2
|
+
import {
|
|
3
|
+
type AuthQueryFn,
|
|
4
|
+
type AuthQueryOptions,
|
|
5
|
+
authQueryOptions
|
|
6
|
+
} from "../queries/auth-query-options"
|
|
7
|
+
|
|
8
|
+
type UseAuthQueryOptions<
|
|
9
|
+
TFn extends AuthQueryFn,
|
|
10
|
+
TPrefix extends QueryKey
|
|
11
|
+
> = Omit<AuthQueryOptions<TFn, TPrefix>, "queryKey" | "queryFn"> &
|
|
12
|
+
Pick<NonNullable<Parameters<TFn>[0]>, "query" | "fetchOptions">
|
|
13
|
+
|
|
14
|
+
export function useAuthQuery<
|
|
15
|
+
TFn extends AuthQueryFn,
|
|
16
|
+
const TQueryKey extends QueryKey
|
|
17
|
+
>(
|
|
18
|
+
authFn: TFn,
|
|
19
|
+
queryKey: TQueryKey,
|
|
20
|
+
options?: UseAuthQueryOptions<TFn, TQueryKey>
|
|
21
|
+
) {
|
|
22
|
+
return createQuery(() => {
|
|
23
|
+
const { query, fetchOptions, ...queryOptions } = options ?? {}
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
...authQueryOptions(authFn, queryKey, {
|
|
27
|
+
query,
|
|
28
|
+
fetchOptions
|
|
29
|
+
} as Parameters<TFn>[0]),
|
|
30
|
+
...queryOptions
|
|
31
|
+
}
|
|
32
|
+
})
|
|
33
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export { createAuthClient } from "better-auth/solid"
|
|
2
|
+
export * from "./hooks/auth/use-authenticate"
|
|
3
|
+
export * from "./hooks/auth/use-sign-out"
|
|
4
|
+
export * from "./hooks/auth/use-user"
|
|
5
|
+
export * from "./hooks/use-auth-mutation"
|
|
6
|
+
export * from "./hooks/use-auth-query"
|
|
7
|
+
export type * from "./lib/auth-client"
|
|
8
|
+
export * from "./lib/auth-config"
|
|
9
|
+
export * from "./lib/auth-provider"
|
|
10
|
+
export * from "./lib/auth-utils"
|
|
11
|
+
export * from "./lib/fetch-options-provider"
|
|
12
|
+
export * from "./lib/mutation-invalidator"
|
|
13
|
+
export * from "./lib/provider-icons"
|
|
14
|
+
export * from "./mutations/api-key/create-api-key-mutation"
|
|
15
|
+
export * from "./mutations/api-key/delete-api-key-mutation"
|
|
16
|
+
export * from "./mutations/auth/request-password-reset-mutation"
|
|
17
|
+
export * from "./mutations/auth/reset-password-mutation"
|
|
18
|
+
export * from "./mutations/auth/send-verification-email-mutation"
|
|
19
|
+
export * from "./mutations/auth/sign-in-email-mutation"
|
|
20
|
+
export * from "./mutations/auth/sign-in-social-mutation"
|
|
21
|
+
export * from "./mutations/auth/sign-out-mutation"
|
|
22
|
+
export * from "./mutations/auth/sign-up-email-mutation"
|
|
23
|
+
export * from "./mutations/auth-mutation-options"
|
|
24
|
+
export * from "./mutations/magic-link/sign-in-magic-link-mutation"
|
|
25
|
+
export * from "./mutations/multi-session/revoke-multi-session-mutation"
|
|
26
|
+
export * from "./mutations/multi-session/set-active-session-mutation"
|
|
27
|
+
export * from "./mutations/organization"
|
|
28
|
+
export * from "./mutations/passkey/add-passkey-mutation"
|
|
29
|
+
export * from "./mutations/passkey/delete-passkey-mutation"
|
|
30
|
+
export * from "./mutations/passkey/sign-in-passkey-mutation"
|
|
31
|
+
export * from "./mutations/settings/change-email-mutation"
|
|
32
|
+
export * from "./mutations/settings/change-password-mutation"
|
|
33
|
+
export * from "./mutations/settings/delete-user-mutation"
|
|
34
|
+
export * from "./mutations/settings/link-social-mutation"
|
|
35
|
+
export * from "./mutations/settings/revoke-session-mutation"
|
|
36
|
+
export * from "./mutations/settings/unlink-account-mutation"
|
|
37
|
+
export * from "./mutations/settings/update-user-mutation"
|
|
38
|
+
export * from "./mutations/username/is-username-available-mutation"
|
|
39
|
+
export * from "./mutations/username/sign-in-username-mutation"
|
|
40
|
+
export * from "./queries/api-key/list-api-keys-query"
|
|
41
|
+
export * from "./queries/auth/session-query"
|
|
42
|
+
export * from "./queries/auth-query-options"
|
|
43
|
+
export * from "./queries/multi-session/list-device-sessions-query"
|
|
44
|
+
export * from "./queries/organization"
|
|
45
|
+
export * from "./queries/passkey/list-passkeys-query"
|
|
46
|
+
export * from "./queries/settings/account-info-query"
|
|
47
|
+
export * from "./queries/settings/list-accounts-query"
|
|
48
|
+
export * from "./queries/settings/list-sessions-query"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { apiKeyClient } from "@better-auth/api-key/client"
|
|
2
|
+
import type { passkeyClient } from "@better-auth/passkey/client"
|
|
3
|
+
import type {
|
|
4
|
+
magicLinkClient,
|
|
5
|
+
multiSessionClient,
|
|
6
|
+
organizationClient,
|
|
7
|
+
usernameClient
|
|
8
|
+
} from "better-auth/client/plugins"
|
|
9
|
+
import type { createAuthClient } from "better-auth/solid"
|
|
10
|
+
|
|
11
|
+
export type AuthClient = ReturnType<typeof createAuthClient>
|
|
12
|
+
|
|
13
|
+
export type MagicLinkAuthClient = ReturnType<
|
|
14
|
+
typeof createAuthClient<{ plugins: [ReturnType<typeof magicLinkClient>] }>
|
|
15
|
+
>
|
|
16
|
+
|
|
17
|
+
export type MultiSessionAuthClient = ReturnType<
|
|
18
|
+
typeof createAuthClient<{ plugins: [ReturnType<typeof multiSessionClient>] }>
|
|
19
|
+
>
|
|
20
|
+
|
|
21
|
+
export type PasskeyAuthClient = ReturnType<
|
|
22
|
+
typeof createAuthClient<{ plugins: [ReturnType<typeof passkeyClient>] }>
|
|
23
|
+
>
|
|
24
|
+
|
|
25
|
+
export type ApiKeyAuthClient = ReturnType<
|
|
26
|
+
typeof createAuthClient<{ plugins: [ReturnType<typeof apiKeyClient>] }>
|
|
27
|
+
>
|
|
28
|
+
|
|
29
|
+
export type UsernameAuthClient = ReturnType<
|
|
30
|
+
typeof createAuthClient<{ plugins: [ReturnType<typeof usernameClient>] }>
|
|
31
|
+
>
|
|
32
|
+
|
|
33
|
+
export type OrganizationAuthClient = ReturnType<
|
|
34
|
+
typeof createAuthClient<{
|
|
35
|
+
plugins: [ReturnType<typeof organizationClient<object>>]
|
|
36
|
+
}>
|
|
37
|
+
>
|
|
38
|
+
|
|
39
|
+
export type InferData<TMethod> = TMethod extends (
|
|
40
|
+
...args: infer _Args
|
|
41
|
+
) => Promise<infer TResult extends { data: unknown }>
|
|
42
|
+
? TResult["data"]
|
|
43
|
+
: never
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AuthConfig,
|
|
3
|
+
type DeepPartial,
|
|
4
|
+
deepmerge,
|
|
5
|
+
defaultAuthConfig
|
|
6
|
+
} from "@better-auth-ui/core"
|
|
7
|
+
import type { AuthClient } from "./auth-client"
|
|
8
|
+
import { mergeAdditionalFields, resolveRedirectTo } from "./auth-utils"
|
|
9
|
+
|
|
10
|
+
declare module "@better-auth-ui/core" {
|
|
11
|
+
interface AuthConfig {
|
|
12
|
+
/** The Solid Better Auth client used by auth context consumers. */
|
|
13
|
+
authClient: AuthClient
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type SolidAuthConfigInput<TAuthClient = AuthClient> =
|
|
18
|
+
DeepPartial<AuthConfig> & {
|
|
19
|
+
authClient: TAuthClient
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function resolveAuthConfig(
|
|
23
|
+
config: SolidAuthConfigInput<AuthClient>
|
|
24
|
+
): AuthConfig {
|
|
25
|
+
const mergedConfig = deepmerge(defaultAuthConfig, {
|
|
26
|
+
...config,
|
|
27
|
+
viewPaths: {
|
|
28
|
+
auth: {
|
|
29
|
+
...defaultAuthConfig.viewPaths.auth,
|
|
30
|
+
...config.viewPaths?.auth
|
|
31
|
+
},
|
|
32
|
+
settings: {
|
|
33
|
+
...defaultAuthConfig.viewPaths.settings,
|
|
34
|
+
...config.viewPaths?.settings
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
} as AuthConfig)
|
|
38
|
+
|
|
39
|
+
mergedConfig.redirectTo = resolveRedirectTo(mergedConfig.redirectTo)
|
|
40
|
+
mergedConfig.additionalFields = mergeAdditionalFields(
|
|
41
|
+
mergedConfig.plugins?.flatMap((plugin) => plugin.additionalFields ?? []),
|
|
42
|
+
mergedConfig.additionalFields
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
return mergedConfig as AuthConfig
|
|
46
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AuthPluginBase } from "@better-auth-ui/core"
|
|
2
|
+
import type { Component } from "solid-js"
|
|
3
|
+
|
|
4
|
+
export type CaptchaComponent = Component
|
|
5
|
+
|
|
6
|
+
export type SolidAuthPlugin = AuthPluginBase & {
|
|
7
|
+
/** Captcha widget rendered above submit buttons in auth forms. */
|
|
8
|
+
captchaComponent?: CaptchaComponent
|
|
9
|
+
/** Allow app-owned copied components to add Solid-specific plugin slots. */
|
|
10
|
+
[key: string]: unknown
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare module "@better-auth-ui/core" {
|
|
14
|
+
interface AuthPluginRegister {
|
|
15
|
+
solid: SolidAuthPlugin
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type { AuthPluginViewPaths } from "@better-auth-ui/core"
|
|
20
|
+
export type AuthPlugin = SolidAuthPlugin
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { AuthConfig } from "@better-auth-ui/core"
|
|
2
|
+
import { QueryClient, QueryClientProvider } from "@tanstack/solid-query"
|
|
3
|
+
import { createContext, type JSX, useContext } from "solid-js"
|
|
4
|
+
import type { AuthClient } from "./auth-client"
|
|
5
|
+
import { resolveAuthConfig, type SolidAuthConfigInput } from "./auth-config"
|
|
6
|
+
import { FetchOptionsProvider } from "./fetch-options-provider"
|
|
7
|
+
import { MutationInvalidator } from "./mutation-invalidator"
|
|
8
|
+
|
|
9
|
+
const AuthContext = createContext<AuthConfig>()
|
|
10
|
+
/** Provider-instance scoped config fallback for SSR — replaces the former module-level global. */
|
|
11
|
+
const RenderingAuthConfigContext = createContext<AuthConfig>()
|
|
12
|
+
|
|
13
|
+
const fallbackQueryClient = new QueryClient({
|
|
14
|
+
defaultOptions: {
|
|
15
|
+
queries: {
|
|
16
|
+
staleTime: 5000
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
export type AuthProviderProps<TAuthClient = AuthClient> =
|
|
22
|
+
SolidAuthConfigInput<TAuthClient> & {
|
|
23
|
+
children?: JSX.Element | (() => JSX.Element)
|
|
24
|
+
/** TanStack QueryClient to use for your application's queries. */
|
|
25
|
+
queryClient?: QueryClient
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const resolveProviderChildren = (children: AuthProviderProps["children"]) =>
|
|
29
|
+
typeof children === "function" ? children() : children
|
|
30
|
+
|
|
31
|
+
export function AuthProvider(props: AuthProviderProps) {
|
|
32
|
+
const { children, queryClient: qc, ...configInput } = props
|
|
33
|
+
const config = resolveAuthConfig(configInput as AuthProviderProps<AuthClient>)
|
|
34
|
+
const queryClient = qc || fallbackQueryClient
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<AuthContext.Provider value={config}>
|
|
38
|
+
<RenderingAuthConfigContext.Provider value={config}>
|
|
39
|
+
<QueryClientProvider client={queryClient}>
|
|
40
|
+
<FetchOptionsProvider>
|
|
41
|
+
<MutationInvalidator queryClient={queryClient} />
|
|
42
|
+
{resolveProviderChildren(children)}
|
|
43
|
+
</FetchOptionsProvider>
|
|
44
|
+
</QueryClientProvider>
|
|
45
|
+
</RenderingAuthConfigContext.Provider>
|
|
46
|
+
</AuthContext.Provider>
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function useAuth(): AuthConfig {
|
|
51
|
+
const context = useContext(AuthContext)
|
|
52
|
+
const renderingConfig = useContext(RenderingAuthConfigContext)
|
|
53
|
+
const auth = context ?? renderingConfig
|
|
54
|
+
|
|
55
|
+
if (!auth) {
|
|
56
|
+
throw new Error("[Better Auth UI] AuthProvider is required")
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return auth
|
|
60
|
+
}
|