mirror of
https://github.com/mfts/papermark.git
synced 2025-12-20 01:03:24 +08:00
feat: move login/register to app router
This commit is contained in:
24
app/(auth)/layout.tsx
Normal file
24
app/(auth)/layout.tsx
Normal file
@@ -0,0 +1,24 @@
|
||||
import "@/styles/globals.css";
|
||||
import { Inter } from "next/font/google";
|
||||
import { Toaster } from "sonner";
|
||||
import Head from "next/head";
|
||||
import { ThemeProvider } from "@/components/theme-provider";
|
||||
|
||||
const inter = Inter({ subsets: ["latin"] });
|
||||
|
||||
export default function Layout({ children }: { children: React.ReactNode }) {
|
||||
return (
|
||||
<>
|
||||
<Head>
|
||||
<title>Papermark | The Open Source DocSend Alternative</title>
|
||||
</Head>
|
||||
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
|
||||
<main className={inter.className}>
|
||||
<Toaster closeButton richColors theme={"system"} />
|
||||
|
||||
<div>{children}</div>
|
||||
</main>
|
||||
</ThemeProvider>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -1,13 +1,14 @@
|
||||
"use client";
|
||||
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { signIn } from "next-auth/react";
|
||||
import { signInWithPasskey } from "@teamhanko/passkeys-next-auth-provider/client";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
import { useParams } from "next/navigation";
|
||||
import Passkey from "@/components/shared/icons/passkey";
|
||||
|
||||
export default function Login() {
|
||||
const router = useRouter();
|
||||
const { next } = router.query as { next?: string };
|
||||
const { next } = useParams as { next?: string };
|
||||
|
||||
return (
|
||||
<div className="flex h-screen w-screen justify-center">
|
||||
@@ -34,7 +35,7 @@ export default function Login() {
|
||||
Start sharing documents
|
||||
</h3>
|
||||
</div>
|
||||
<div className="flex flex-col px-4 py-8 sm:px-16">
|
||||
<div className="flex flex-col px-4 py-8 sm:px-16 space-y-2">
|
||||
<Button
|
||||
onClick={() => {
|
||||
signIn("google", {
|
||||
@@ -53,17 +54,18 @@ export default function Login() {
|
||||
</svg>
|
||||
<span>Continue with Google</span>
|
||||
</Button>
|
||||
{/* <Button
|
||||
<Button
|
||||
onClick={() =>
|
||||
signInWithPasskey({
|
||||
tenantId: process.env.HANKO_TENANT_ID as string,
|
||||
tenantId: process.env.NEXT_PUBLIC_HANKO_TENANT_ID as string,
|
||||
})
|
||||
}
|
||||
variant="outline"
|
||||
className="flex justify-center items-center space-x-2"
|
||||
>
|
||||
<Passkey className="w-4 h-4" />
|
||||
<span>Sign in with a passkey</span>
|
||||
</Button> */}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -22,7 +22,6 @@ export default function Register() {
|
||||
const credential = await create(createOptions as any);
|
||||
|
||||
await finishServerPasskeyRegistration(credential);
|
||||
|
||||
// Now the user has registered their passkey and can use it to log in.
|
||||
}
|
||||
|
||||
@@ -51,7 +50,7 @@ export default function Register() {
|
||||
Start sharing documents
|
||||
</h3>
|
||||
</div>
|
||||
<div className="flex flex-col px-4 py-8 sm:px-16">
|
||||
<div className="flex flex-col px-4 py-8 sm:px-16 space-y-2">
|
||||
<Button
|
||||
onClick={() => {
|
||||
signIn("google", {
|
||||
@@ -16,11 +16,9 @@ export async function startServerPasskeyRegistration() {
|
||||
select: { id: true, name: true },
|
||||
});
|
||||
|
||||
console.log("user prisma", user);
|
||||
|
||||
const createOptions = await hanko.registration.initialize({
|
||||
userId: user!.id,
|
||||
username: user!.name,
|
||||
username: user!.name || "",
|
||||
});
|
||||
|
||||
return createOptions;
|
||||
@@ -34,16 +32,12 @@ export async function finishServerPasskeyRegistration(credential: any) {
|
||||
|
||||
await hanko.registration.finalize(credential);
|
||||
|
||||
// const sessionUser = session.user as CustomUser;
|
||||
|
||||
// Now the user has registered their passkey and can use it to log in.
|
||||
|
||||
const user = await prisma.user.findUnique({
|
||||
where: { id: (session.user as CustomUser).id },
|
||||
select: { id: true },
|
||||
});
|
||||
|
||||
console.log("user has registered their passkey", user?.id);
|
||||
|
||||
// if (user) {
|
||||
// user.hasPasskeys = true;
|
||||
// }
|
||||
// const user = await prisma.user.update({
|
||||
// where: { email: sessionUser.email as string },
|
||||
// select: { id: true },
|
||||
// });
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import { tenant } from "@teamhanko/passkeys-next-auth-provider";
|
||||
|
||||
if (!process.env.HANKO_API_KEY || !process.env.HANKO_TENANT_ID) {
|
||||
if (!process.env.HANKO_API_KEY || !process.env.NEXT_PUBLIC_HANKO_TENANT_ID) {
|
||||
// These need to be set in .env.local
|
||||
// You get them from the Passkey API itself, e.g. when first setting up the server.
|
||||
throw new Error(
|
||||
"Please set HANKO_API_KEY and HANKO_TENANT_ID in your .env.local file.",
|
||||
"Please set HANKO_API_KEY and NEXT_PUBLIC_HANKO_TENANT_ID in your .env.local file.",
|
||||
);
|
||||
}
|
||||
|
||||
const hanko = tenant({
|
||||
apiKey: process.env.HANKO_API_KEY!,
|
||||
tenantId: process.env.HANKO_TENANT_ID!,
|
||||
tenantId: process.env.NEXT_PUBLIC_HANKO_TENANT_ID!,
|
||||
});
|
||||
|
||||
export default hanko;
|
||||
|
||||
30
package-lock.json
generated
30
package-lock.json
generated
@@ -30,7 +30,7 @@
|
||||
"@react-email/components": "^0.0.11",
|
||||
"@stripe/stripe-js": "^2.1.7",
|
||||
"@tailwindcss/typography": "^0.5.10",
|
||||
"@teamhanko/passkeys-next-auth-provider": "^0.1.8",
|
||||
"@teamhanko/passkeys-next-auth-provider": "^0.1.9",
|
||||
"@tremor/react": "^3.11.1",
|
||||
"@trigger.dev/nextjs": "^2.2.6",
|
||||
"@trigger.dev/react": "^2.2.6",
|
||||
@@ -2823,12 +2823,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@teamhanko/passkeys-next-auth-provider": {
|
||||
"version": "0.1.8",
|
||||
"resolved": "https://registry.npmjs.org/@teamhanko/passkeys-next-auth-provider/-/passkeys-next-auth-provider-0.1.8.tgz",
|
||||
"integrity": "sha512-jFS9Pl+WqVahseTSNl0E+zsTUHF8gZdw1gQWbELF4J3/aoz/BiEwe+Qtp0qoTSX2HAybl1VLroWWerM4IQui1Q==",
|
||||
"version": "0.1.9",
|
||||
"resolved": "https://registry.npmjs.org/@teamhanko/passkeys-next-auth-provider/-/passkeys-next-auth-provider-0.1.9.tgz",
|
||||
"integrity": "sha512-mUwCX5UYETifQaokd+LR15c0xrvw+mdwQ4/EzzEQz+qBtV7eCIjCUPHVh4FSA2QNYfsf/YNKyDKeb0zzTKeMuw==",
|
||||
"dependencies": {
|
||||
"@github/webauthn-json": "^2.1.1",
|
||||
"@teamhanko/passkeys-sdk": "^0.1.7",
|
||||
"@teamhanko/passkeys-sdk": "^0.1.8",
|
||||
"jose": "^5.1.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -2844,9 +2844,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@teamhanko/passkeys-sdk": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/@teamhanko/passkeys-sdk/-/passkeys-sdk-0.1.7.tgz",
|
||||
"integrity": "sha512-FHh67uucq99spGo6zjrAyhp+e8XRZg2g5s5vFcl1MWIzJI9ABoFVRnSuEMeXF+bG98nPY1javbNUWuKAx/gR8w==",
|
||||
"version": "0.1.8",
|
||||
"resolved": "https://registry.npmjs.org/@teamhanko/passkeys-sdk/-/passkeys-sdk-0.1.8.tgz",
|
||||
"integrity": "sha512-EtLtFxb9gg403O45vwtC3E7mHav7vDj7rl5ncwegoqThYcMQsxTQVboCIsHqe0GeogNZoriWixmv0Y3UY8wHNQ==",
|
||||
"dependencies": {
|
||||
"openapi-fetch": "^0.8.1"
|
||||
}
|
||||
@@ -12626,12 +12626,12 @@
|
||||
}
|
||||
},
|
||||
"@teamhanko/passkeys-next-auth-provider": {
|
||||
"version": "0.1.8",
|
||||
"resolved": "https://registry.npmjs.org/@teamhanko/passkeys-next-auth-provider/-/passkeys-next-auth-provider-0.1.8.tgz",
|
||||
"integrity": "sha512-jFS9Pl+WqVahseTSNl0E+zsTUHF8gZdw1gQWbELF4J3/aoz/BiEwe+Qtp0qoTSX2HAybl1VLroWWerM4IQui1Q==",
|
||||
"version": "0.1.9",
|
||||
"resolved": "https://registry.npmjs.org/@teamhanko/passkeys-next-auth-provider/-/passkeys-next-auth-provider-0.1.9.tgz",
|
||||
"integrity": "sha512-mUwCX5UYETifQaokd+LR15c0xrvw+mdwQ4/EzzEQz+qBtV7eCIjCUPHVh4FSA2QNYfsf/YNKyDKeb0zzTKeMuw==",
|
||||
"requires": {
|
||||
"@github/webauthn-json": "^2.1.1",
|
||||
"@teamhanko/passkeys-sdk": "^0.1.7",
|
||||
"@teamhanko/passkeys-sdk": "^0.1.8",
|
||||
"jose": "^5.1.1"
|
||||
},
|
||||
"dependencies": {
|
||||
@@ -12643,9 +12643,9 @@
|
||||
}
|
||||
},
|
||||
"@teamhanko/passkeys-sdk": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/@teamhanko/passkeys-sdk/-/passkeys-sdk-0.1.7.tgz",
|
||||
"integrity": "sha512-FHh67uucq99spGo6zjrAyhp+e8XRZg2g5s5vFcl1MWIzJI9ABoFVRnSuEMeXF+bG98nPY1javbNUWuKAx/gR8w==",
|
||||
"version": "0.1.8",
|
||||
"resolved": "https://registry.npmjs.org/@teamhanko/passkeys-sdk/-/passkeys-sdk-0.1.8.tgz",
|
||||
"integrity": "sha512-EtLtFxb9gg403O45vwtC3E7mHav7vDj7rl5ncwegoqThYcMQsxTQVboCIsHqe0GeogNZoriWixmv0Y3UY8wHNQ==",
|
||||
"requires": {
|
||||
"openapi-fetch": "^0.8.1"
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
"@react-email/components": "^0.0.11",
|
||||
"@stripe/stripe-js": "^2.1.7",
|
||||
"@tailwindcss/typography": "^0.5.10",
|
||||
"@teamhanko/passkeys-next-auth-provider": "^0.1.8",
|
||||
"@teamhanko/passkeys-next-auth-provider": "^0.1.9",
|
||||
"@tremor/react": "^3.11.1",
|
||||
"@trigger.dev/nextjs": "^2.2.6",
|
||||
"@trigger.dev/react": "^2.2.6",
|
||||
|
||||
Reference in New Issue
Block a user