Ajoute le flux d'invitation avec activation de compte
This commit is contained in:
Vendored
+46
-1
@@ -30,6 +30,16 @@ type PasswordResetTokenState = {
|
||||
email: string;
|
||||
mode: PasswordResetMode;
|
||||
};
|
||||
type AccountInviteTokenState = {
|
||||
status: "loading";
|
||||
} | {
|
||||
status: "invalid";
|
||||
error: string;
|
||||
} | {
|
||||
status: "valid";
|
||||
email: string;
|
||||
name: string | null;
|
||||
};
|
||||
|
||||
type CreateAuthClientOptions = {
|
||||
apiUrl: (path: string) => string;
|
||||
@@ -59,10 +69,45 @@ declare function createAuthClient(options: CreateAuthClientOptions): {
|
||||
token: string;
|
||||
password: string;
|
||||
}): Promise<void>;
|
||||
validateAccountInviteToken(token: string): Promise<{
|
||||
email: string;
|
||||
name: string | null;
|
||||
}>;
|
||||
acceptAccountInvite(input: {
|
||||
token: string;
|
||||
name: string;
|
||||
password: string;
|
||||
}): Promise<void>;
|
||||
logout(): Promise<void>;
|
||||
startOAuthSignIn(provider: string, callbackUrl?: string): Promise<void>;
|
||||
};
|
||||
|
||||
type InviteAcceptFormTexts = {
|
||||
loadingLabel: string;
|
||||
invalidLinkLabel: string;
|
||||
emailLabel: string;
|
||||
nameLabel: string;
|
||||
passwordLabel: string;
|
||||
passwordConfirmLabel: string;
|
||||
submitLabel: string;
|
||||
googleLabel: string;
|
||||
};
|
||||
type InviteAcceptFormProps = {
|
||||
texts: InviteAcceptFormTexts;
|
||||
tokenState: AccountInviteTokenState;
|
||||
loading?: boolean;
|
||||
initialName?: string | null;
|
||||
showGoogleSignIn?: boolean;
|
||||
googleLoading?: boolean;
|
||||
onSubmit: (values: {
|
||||
name: string;
|
||||
password: string;
|
||||
passwordConfirm: string;
|
||||
}) => void | Promise<void>;
|
||||
onGoogleSignIn?: () => void | Promise<void>;
|
||||
};
|
||||
declare function InviteAcceptForm({ texts, tokenState, loading, initialName, showGoogleSignIn, googleLoading, onSubmit, onGoogleSignIn }: InviteAcceptFormProps): react_jsx_runtime.JSX.Element;
|
||||
|
||||
type LoginFormTexts = {
|
||||
nameLabel: string;
|
||||
emailLabel: string;
|
||||
@@ -132,4 +177,4 @@ type PasswordResetConfirmFormProps = {
|
||||
declare function PasswordResetRequestForm({ texts, helperText, loading, requestSent, onSubmit, emailPlaceholder }: PasswordResetRequestFormProps): react_jsx_runtime.JSX.Element;
|
||||
declare function PasswordResetConfirmForm({ texts, tokenState, loading, completedMode, onSubmit }: PasswordResetConfirmFormProps): react_jsx_runtime.JSX.Element;
|
||||
|
||||
export { AuthGuard, type AuthProviderAvailability, type AuthProviderKey, type AuthSubmitValues, LoginForm, type LoginMode, PasswordResetConfirmForm, type PasswordResetMode, PasswordResetRequestForm, type PasswordResetTokenState, createAuthClient };
|
||||
export { type AccountInviteTokenState, AuthGuard, type AuthProviderAvailability, type AuthProviderKey, type AuthSubmitValues, InviteAcceptForm, LoginForm, type LoginMode, PasswordResetConfirmForm, type PasswordResetMode, PasswordResetRequestForm, type PasswordResetTokenState, createAuthClient };
|
||||
|
||||
Vendored
+144
-58
@@ -209,6 +209,28 @@ function createAuthClient(options) {
|
||||
throw await readJsonError(response, "Invalid reset link");
|
||||
}
|
||||
},
|
||||
async validateAccountInviteToken(token) {
|
||||
const response = await request(`/api/auth/invite/validate?token=${encodeURIComponent(token)}`, {
|
||||
headers: {}
|
||||
});
|
||||
const payload = await response.json().catch(() => null);
|
||||
if (!response.ok || !payload?.email) {
|
||||
throw new Error(payload?.error ?? "Invalid invite link");
|
||||
}
|
||||
return {
|
||||
email: payload.email,
|
||||
name: payload.name ?? null
|
||||
};
|
||||
},
|
||||
async acceptAccountInvite(input) {
|
||||
const response = await request("/api/auth/invite/accept", {
|
||||
method: "POST",
|
||||
body: JSON.stringify(input)
|
||||
});
|
||||
if (!response.ok) {
|
||||
throw await readJsonError(response, "Invalid invite link");
|
||||
}
|
||||
},
|
||||
async logout() {
|
||||
const response = await request("/api/auth/logout", {
|
||||
method: "POST"
|
||||
@@ -248,9 +270,72 @@ function createAuthClient(options) {
|
||||
};
|
||||
}
|
||||
|
||||
// react/LoginForm.tsx
|
||||
// react/InviteAcceptForm.tsx
|
||||
import { useEffect as useEffect2, useState as useState2 } from "react";
|
||||
import { FcGoogle } from "react-icons/fc";
|
||||
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
||||
function InviteAcceptForm({
|
||||
texts,
|
||||
tokenState,
|
||||
loading = false,
|
||||
initialName = null,
|
||||
showGoogleSignIn = false,
|
||||
googleLoading = false,
|
||||
onSubmit,
|
||||
onGoogleSignIn
|
||||
}) {
|
||||
const [name, setName] = useState2(initialName ?? "");
|
||||
useEffect2(() => {
|
||||
setName(initialName ?? "");
|
||||
}, [initialName, tokenState.status]);
|
||||
function handleSubmit(event) {
|
||||
event.preventDefault();
|
||||
const form = new FormData(event.currentTarget);
|
||||
void onSubmit({
|
||||
name: String(form.get("name") ?? ""),
|
||||
password: String(form.get("password") ?? ""),
|
||||
passwordConfirm: String(form.get("passwordConfirm") ?? "")
|
||||
});
|
||||
}
|
||||
if (tokenState.status === "loading") {
|
||||
return /* @__PURE__ */ jsxs2(Stack, { align: "center", py: 6, gap: 3, children: [
|
||||
/* @__PURE__ */ jsx3(Spinner, {}),
|
||||
/* @__PURE__ */ jsx3(Text, { color: "gray.600", children: texts.loadingLabel })
|
||||
] });
|
||||
}
|
||||
if (tokenState.status === "invalid") {
|
||||
return /* @__PURE__ */ jsxs2(Alert, { status: "error", borderRadius: "md", children: [
|
||||
/* @__PURE__ */ jsx3(AlertIcon, {}),
|
||||
/* @__PURE__ */ jsx3(AlertDescription, { children: tokenState.error || texts.invalidLinkLabel })
|
||||
] });
|
||||
}
|
||||
return /* @__PURE__ */ jsxs2(Stack, { gap: 4, children: [
|
||||
/* @__PURE__ */ jsxs2(FormControl, { children: [
|
||||
/* @__PURE__ */ jsx3(FormLabel, { children: texts.emailLabel }),
|
||||
/* @__PURE__ */ jsx3(Input, { value: tokenState.email, readOnly: true, disabled: true })
|
||||
] }),
|
||||
/* @__PURE__ */ jsx3("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsxs2(Stack, { gap: 4, children: [
|
||||
/* @__PURE__ */ jsxs2(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx3(FormLabel, { children: texts.nameLabel }),
|
||||
/* @__PURE__ */ jsx3(Input, { name: "name", value: name, onChange: (event) => setName(event.target.value) })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxs2(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx3(FormLabel, { children: texts.passwordLabel }),
|
||||
/* @__PURE__ */ jsx3(Input, { name: "password", type: "password", minLength: 8 })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxs2(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx3(FormLabel, { children: texts.passwordConfirmLabel }),
|
||||
/* @__PURE__ */ jsx3(Input, { name: "passwordConfirm", type: "password", minLength: 8 })
|
||||
] }),
|
||||
/* @__PURE__ */ jsx3(Button, { type: "submit", loading, children: texts.submitLabel })
|
||||
] }) }),
|
||||
showGoogleSignIn && onGoogleSignIn ? /* @__PURE__ */ jsx3(Button, { variant: "outline", loading: googleLoading, leftIcon: /* @__PURE__ */ jsx3(FcGoogle, {}), onClick: () => void onGoogleSignIn(), children: texts.googleLabel }) : null
|
||||
] });
|
||||
}
|
||||
|
||||
// react/LoginForm.tsx
|
||||
import { FcGoogle as FcGoogle2 } from "react-icons/fc";
|
||||
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
||||
function LoginForm({
|
||||
mode,
|
||||
texts,
|
||||
@@ -278,37 +363,37 @@ function LoginForm({
|
||||
passwordConfirm: String(form.get("passwordConfirm") ?? "")
|
||||
});
|
||||
}
|
||||
return /* @__PURE__ */ jsxs2(Stack, { spacing: 5, children: [
|
||||
errorMessage ? /* @__PURE__ */ jsxs2(Alert, { status: "error", borderRadius: "md", children: [
|
||||
/* @__PURE__ */ jsx3(AlertIcon, {}),
|
||||
/* @__PURE__ */ jsx3(AlertDescription, { children: errorMessage })
|
||||
return /* @__PURE__ */ jsxs3(Stack, { spacing: 5, children: [
|
||||
errorMessage ? /* @__PURE__ */ jsxs3(Alert, { status: "error", borderRadius: "md", children: [
|
||||
/* @__PURE__ */ jsx4(AlertIcon, {}),
|
||||
/* @__PURE__ */ jsx4(AlertDescription, { children: errorMessage })
|
||||
] }) : null,
|
||||
successMessage ? /* @__PURE__ */ jsxs2(Alert, { status: "success", borderRadius: "md", children: [
|
||||
/* @__PURE__ */ jsx3(AlertIcon, {}),
|
||||
/* @__PURE__ */ jsx3(AlertDescription, { children: successMessage })
|
||||
successMessage ? /* @__PURE__ */ jsxs3(Alert, { status: "success", borderRadius: "md", children: [
|
||||
/* @__PURE__ */ jsx4(AlertIcon, {}),
|
||||
/* @__PURE__ */ jsx4(AlertDescription, { children: successMessage })
|
||||
] }) : null,
|
||||
/* @__PURE__ */ jsx3("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsxs2(Stack, { spacing: 4, children: [
|
||||
registerMode ? /* @__PURE__ */ jsxs2(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx3(FormLabel, { children: texts.nameLabel }),
|
||||
/* @__PURE__ */ jsx3(Input, { name: "name", placeholder: namePlaceholder })
|
||||
/* @__PURE__ */ jsx4("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsxs3(Stack, { spacing: 4, children: [
|
||||
registerMode ? /* @__PURE__ */ jsxs3(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx4(FormLabel, { children: texts.nameLabel }),
|
||||
/* @__PURE__ */ jsx4(Input, { name: "name", placeholder: namePlaceholder })
|
||||
] }) : null,
|
||||
/* @__PURE__ */ jsxs2(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx3(FormLabel, { children: texts.emailLabel }),
|
||||
/* @__PURE__ */ jsx3(Input, { name: "email", type: "email", placeholder: emailPlaceholder })
|
||||
/* @__PURE__ */ jsxs3(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx4(FormLabel, { children: texts.emailLabel }),
|
||||
/* @__PURE__ */ jsx4(Input, { name: "email", type: "email", placeholder: emailPlaceholder })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxs2(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx3(FormLabel, { children: texts.passwordLabel }),
|
||||
/* @__PURE__ */ jsx3(Input, { name: "password", type: "password", minLength: 8 })
|
||||
/* @__PURE__ */ jsxs3(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx4(FormLabel, { children: texts.passwordLabel }),
|
||||
/* @__PURE__ */ jsx4(Input, { name: "password", type: "password", minLength: 8 })
|
||||
] }),
|
||||
!registerMode && forgotPasswordLink ? /* @__PURE__ */ jsx3(Stack, { align: "flex-end", children: forgotPasswordLink }) : null,
|
||||
registerMode ? /* @__PURE__ */ jsxs2(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx3(FormLabel, { children: texts.passwordConfirmLabel }),
|
||||
/* @__PURE__ */ jsx3(Input, { name: "passwordConfirm", type: "password", minLength: 8 })
|
||||
!registerMode && forgotPasswordLink ? /* @__PURE__ */ jsx4(Stack, { align: "flex-end", children: forgotPasswordLink }) : null,
|
||||
registerMode ? /* @__PURE__ */ jsxs3(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx4(FormLabel, { children: texts.passwordConfirmLabel }),
|
||||
/* @__PURE__ */ jsx4(Input, { name: "passwordConfirm", type: "password", minLength: 8 })
|
||||
] }) : null,
|
||||
/* @__PURE__ */ jsx3(Button, { type: "submit", isLoading: loading, children: registerMode ? texts.submitRegisterLabel : texts.submitSignInLabel })
|
||||
/* @__PURE__ */ jsx4(Button, { type: "submit", isLoading: loading, children: registerMode ? texts.submitRegisterLabel : texts.submitSignInLabel })
|
||||
] }) }),
|
||||
registerMode || !onOAuthSignIn || !providers?.google && !providers?.slack ? null : /* @__PURE__ */ jsxs2(HStack, { children: [
|
||||
providers.google ? /* @__PURE__ */ jsx3(
|
||||
registerMode || !onOAuthSignIn || !providers?.google && !providers?.slack ? null : /* @__PURE__ */ jsxs3(HStack, { children: [
|
||||
providers.google ? /* @__PURE__ */ jsx4(
|
||||
Button,
|
||||
{
|
||||
flex: 1,
|
||||
@@ -321,7 +406,7 @@ function LoginForm({
|
||||
fontSize: { base: "md", md: "lg" },
|
||||
fontWeight: "semibold",
|
||||
iconSpacing: 4,
|
||||
leftIcon: /* @__PURE__ */ jsx3(Center, { boxSize: "40px", bg: "white", borderRadius: "full", boxShadow: "sm", children: /* @__PURE__ */ jsx3(Icon, { as: FcGoogle, boxSize: 6 }) }),
|
||||
leftIcon: /* @__PURE__ */ jsx4(Center, { boxSize: "40px", bg: "white", borderRadius: "full", boxShadow: "sm", children: /* @__PURE__ */ jsx4(Icon, { as: FcGoogle2, boxSize: 6 }) }),
|
||||
_hover: { bg: "gray.300" },
|
||||
_active: { bg: "gray.300" },
|
||||
isLoading: oauthLoadingProvider === "google",
|
||||
@@ -329,7 +414,7 @@ function LoginForm({
|
||||
children: texts.googleLabel
|
||||
}
|
||||
) : null,
|
||||
providers.slack ? /* @__PURE__ */ jsx3(
|
||||
providers.slack ? /* @__PURE__ */ jsx4(
|
||||
Button,
|
||||
{
|
||||
flex: 1,
|
||||
@@ -340,13 +425,13 @@ function LoginForm({
|
||||
}
|
||||
) : null
|
||||
] }),
|
||||
/* @__PURE__ */ jsx3(Button, { variant: "ghost", onClick: onModeToggle, children: registerMode ? texts.toggleToSignInLabel : texts.toggleToRegisterLabel }),
|
||||
/* @__PURE__ */ jsx4(Button, { variant: "ghost", onClick: onModeToggle, children: registerMode ? texts.toggleToSignInLabel : texts.toggleToRegisterLabel }),
|
||||
footer ?? null
|
||||
] });
|
||||
}
|
||||
|
||||
// react/PasswordResetForms.tsx
|
||||
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
||||
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
||||
function PasswordResetRequestForm({
|
||||
texts,
|
||||
helperText,
|
||||
@@ -362,18 +447,18 @@ function PasswordResetRequestForm({
|
||||
email: String(form.get("email") ?? "")
|
||||
});
|
||||
}
|
||||
return /* @__PURE__ */ jsxs3(Stack, { spacing: 5, children: [
|
||||
requestSent ? /* @__PURE__ */ jsxs3(Alert, { status: "success", borderRadius: "md", children: [
|
||||
/* @__PURE__ */ jsx4(AlertIcon, {}),
|
||||
/* @__PURE__ */ jsx4(AlertDescription, { children: texts.requestSentMessage })
|
||||
return /* @__PURE__ */ jsxs4(Stack, { spacing: 5, children: [
|
||||
requestSent ? /* @__PURE__ */ jsxs4(Alert, { status: "success", borderRadius: "md", children: [
|
||||
/* @__PURE__ */ jsx5(AlertIcon, {}),
|
||||
/* @__PURE__ */ jsx5(AlertDescription, { children: texts.requestSentMessage })
|
||||
] }) : null,
|
||||
/* @__PURE__ */ jsx4("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsxs3(Stack, { spacing: 4, children: [
|
||||
/* @__PURE__ */ jsxs3(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx4(FormLabel, { children: texts.emailLabel }),
|
||||
/* @__PURE__ */ jsx4(Input, { name: "email", type: "email", placeholder: emailPlaceholder })
|
||||
/* @__PURE__ */ jsx5("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsxs4(Stack, { spacing: 4, children: [
|
||||
/* @__PURE__ */ jsxs4(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx5(FormLabel, { children: texts.emailLabel }),
|
||||
/* @__PURE__ */ jsx5(Input, { name: "email", type: "email", placeholder: emailPlaceholder })
|
||||
] }),
|
||||
/* @__PURE__ */ jsx4(Text, { fontSize: "sm", color: "gray.600", children: helperText }),
|
||||
/* @__PURE__ */ jsx4(Button, { type: "submit", isLoading: loading, children: texts.submitLabel })
|
||||
/* @__PURE__ */ jsx5(Text, { fontSize: "sm", color: "gray.600", children: helperText }),
|
||||
/* @__PURE__ */ jsx5(Button, { type: "submit", isLoading: loading, children: texts.submitLabel })
|
||||
] }) })
|
||||
] });
|
||||
}
|
||||
@@ -393,40 +478,41 @@ function PasswordResetConfirmForm({
|
||||
});
|
||||
}
|
||||
if (tokenState.status === "loading") {
|
||||
return /* @__PURE__ */ jsxs3(Stack, { align: "center", py: 6, spacing: 3, children: [
|
||||
/* @__PURE__ */ jsx4(Spinner, {}),
|
||||
/* @__PURE__ */ jsx4(Text, { color: "gray.600", children: texts.loadingLabel })
|
||||
return /* @__PURE__ */ jsxs4(Stack, { align: "center", py: 6, spacing: 3, children: [
|
||||
/* @__PURE__ */ jsx5(Spinner, {}),
|
||||
/* @__PURE__ */ jsx5(Text, { color: "gray.600", children: texts.loadingLabel })
|
||||
] });
|
||||
}
|
||||
if (tokenState.status === "invalid") {
|
||||
return /* @__PURE__ */ jsxs3(Alert, { status: "error", borderRadius: "md", children: [
|
||||
/* @__PURE__ */ jsx4(AlertIcon, {}),
|
||||
/* @__PURE__ */ jsx4(AlertDescription, { children: tokenState.error || texts.invalidLinkLabel })
|
||||
return /* @__PURE__ */ jsxs4(Alert, { status: "error", borderRadius: "md", children: [
|
||||
/* @__PURE__ */ jsx5(AlertIcon, {}),
|
||||
/* @__PURE__ */ jsx5(AlertDescription, { children: tokenState.error || texts.invalidLinkLabel })
|
||||
] });
|
||||
}
|
||||
if (completedMode !== null) {
|
||||
return /* @__PURE__ */ jsxs3(Alert, { status: "success", borderRadius: "md", children: [
|
||||
/* @__PURE__ */ jsx4(AlertIcon, {}),
|
||||
/* @__PURE__ */ jsx4(AlertDescription, { children: completedMode === "create" ? texts.createSuccessLabel : texts.resetSuccessLabel })
|
||||
return /* @__PURE__ */ jsxs4(Alert, { status: "success", borderRadius: "md", children: [
|
||||
/* @__PURE__ */ jsx5(AlertIcon, {}),
|
||||
/* @__PURE__ */ jsx5(AlertDescription, { children: completedMode === "create" ? texts.createSuccessLabel : texts.resetSuccessLabel })
|
||||
] });
|
||||
}
|
||||
return /* @__PURE__ */ jsxs3(Stack, { spacing: 4, children: [
|
||||
/* @__PURE__ */ jsx4(Text, { fontSize: "sm", color: "gray.600", children: tokenState.email }),
|
||||
/* @__PURE__ */ jsx4("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsxs3(Stack, { spacing: 4, children: [
|
||||
/* @__PURE__ */ jsxs3(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx4(FormLabel, { children: texts.passwordLabel }),
|
||||
/* @__PURE__ */ jsx4(Input, { name: "password", type: "password", minLength: 8 })
|
||||
return /* @__PURE__ */ jsxs4(Stack, { spacing: 4, children: [
|
||||
/* @__PURE__ */ jsx5(Text, { fontSize: "sm", color: "gray.600", children: tokenState.email }),
|
||||
/* @__PURE__ */ jsx5("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsxs4(Stack, { spacing: 4, children: [
|
||||
/* @__PURE__ */ jsxs4(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx5(FormLabel, { children: texts.passwordLabel }),
|
||||
/* @__PURE__ */ jsx5(Input, { name: "password", type: "password", minLength: 8 })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxs3(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx4(FormLabel, { children: texts.passwordConfirmLabel }),
|
||||
/* @__PURE__ */ jsx4(Input, { name: "passwordConfirm", type: "password", minLength: 8 })
|
||||
/* @__PURE__ */ jsxs4(FormControl, { isRequired: true, children: [
|
||||
/* @__PURE__ */ jsx5(FormLabel, { children: texts.passwordConfirmLabel }),
|
||||
/* @__PURE__ */ jsx5(Input, { name: "passwordConfirm", type: "password", minLength: 8 })
|
||||
] }),
|
||||
/* @__PURE__ */ jsx4(Button, { type: "submit", isLoading: loading, children: tokenState.mode === "create" ? texts.createSubmitLabel : texts.resetSubmitLabel })
|
||||
/* @__PURE__ */ jsx5(Button, { type: "submit", isLoading: loading, children: tokenState.mode === "create" ? texts.createSubmitLabel : texts.resetSubmitLabel })
|
||||
] }) })
|
||||
] });
|
||||
}
|
||||
export {
|
||||
AuthGuard,
|
||||
InviteAcceptForm,
|
||||
LoginForm,
|
||||
PasswordResetConfirmForm,
|
||||
PasswordResetRequestForm,
|
||||
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user