This commit is contained in:
 Илья Шалонин 2025-10-29 13:43:43 +05:00
commit 8538ab969a
434 changed files with 44051 additions and 0 deletions

View file

@ -0,0 +1,17 @@
import { ForgotPasswordForm } from "@saas/auth/components/ForgotPasswordForm";
import { getTranslations } from "next-intl/server";
export const dynamic = "force-dynamic";
export const revalidate = 0;
export async function generateMetadata() {
const t = await getTranslations();
return {
title: t("auth.forgotPassword.title"),
};
}
export default function ForgotPasswordPage() {
return <ForgotPasswordForm />;
}

View file

@ -0,0 +1,14 @@
import { SessionProvider } from "@saas/auth/components/SessionProvider";
import { AuthWrapper } from "@saas/shared/components/AuthWrapper";
import type { PropsWithChildren } from "react";
export const dynamic = "force-dynamic";
export const revalidate = 0;
export default function AuthLayout({ children }: PropsWithChildren) {
return (
<SessionProvider>
<AuthWrapper>{children}</AuthWrapper>
</SessionProvider>
);
}

View file

@ -0,0 +1,17 @@
import { LoginForm } from "@saas/auth/components/LoginForm";
import { getTranslations } from "next-intl/server";
export const dynamic = "force-dynamic";
export const revalidate = 0;
export async function generateMetadata() {
const t = await getTranslations();
return {
title: t("auth.login.title"),
};
}
export default function LoginPage() {
return <LoginForm />;
}

View file

@ -0,0 +1,17 @@
import { ResetPasswordForm } from "@saas/auth/components/ResetPasswordForm";
import { getTranslations } from "next-intl/server";
export const dynamic = "force-dynamic";
export const revalidate = 0;
export async function generateMetadata() {
const t = await getTranslations();
return {
title: t("auth.resetPassword.title"),
};
}
export default function ResetPasswordPage() {
return <ResetPasswordForm />;
}

View file

@ -0,0 +1,48 @@
import { config } from "@repo/config";
import { SignupForm } from "@saas/auth/components/SignupForm";
import { getInvitation } from "@saas/auth/lib/server";
import { getTranslations } from "next-intl/server";
import { redirect } from "next/navigation";
import { withQuery } from "ufo";
export const dynamic = "force-dynamic";
export const revalidate = 0;
export async function generateMetadata() {
const t = await getTranslations();
return {
title: t("auth.signup.title"),
};
}
export default async function SignupPage({
searchParams,
}: {
searchParams: Promise<{
[key: string]: string | string[] | undefined;
invitationId?: string;
}>;
}) {
const params = await searchParams;
const { invitationId } = params;
if (!(config.auth.enableSignup || invitationId)) {
return redirect(withQuery("/auth/login", params));
}
if (invitationId) {
const invitation = await getInvitation(invitationId);
if (
!invitation ||
invitation.status !== "pending" ||
invitation.expiresAt.getTime() < new Date().getTime()
) {
return redirect(withQuery("/auth/login", params));
}
return <SignupForm prefillEmail={invitation.email} />;
}
return <SignupForm />;
}

View file

@ -0,0 +1,17 @@
import { OtpForm } from "@saas/auth/components/OtpForm";
import { getTranslations } from "next-intl/server";
export const dynamic = "force-dynamic";
export const revalidate = 0;
export async function generateMetadata() {
const t = await getTranslations();
return {
title: t("auth.verify.title"),
};
}
export default function VerifyPage() {
return <OtpForm />;
}