feat: github登录(测试中)
This commit is contained in:
parent
c03741c396
commit
4ee08169df
|
@ -3,12 +3,24 @@ import { headers, cookies } from "next/headers";
|
||||||
import { createClient } from "@/utils/supabase/server";
|
import { createClient } from "@/utils/supabase/server";
|
||||||
import { redirect } from "next/navigation";
|
import { redirect } from "next/navigation";
|
||||||
import * as Sentry from "@sentry/nextjs";
|
import * as Sentry from "@sentry/nextjs";
|
||||||
|
import DeployButton from "@/components/DeployButton";
|
||||||
export default function Login({
|
import SettingsLink from "@/components/SettingsLink";
|
||||||
|
//i18n
|
||||||
|
import { useTranslation } from "@/app/i18n";
|
||||||
|
import { FooterBase } from "@/components/Footer/FooterBase";
|
||||||
|
//supabase
|
||||||
|
import { insertUserProfile } from "@/utils/supabase/supabaseutils";
|
||||||
|
// signingithub
|
||||||
|
import { SignInGitHub } from "@/components/SignInGitHub";
|
||||||
|
export default async function Login({
|
||||||
searchParams,
|
searchParams,
|
||||||
|
params: { lng },
|
||||||
}: {
|
}: {
|
||||||
searchParams: { message: string };
|
searchParams: { message: string };
|
||||||
|
params: { lng: string };
|
||||||
}) {
|
}) {
|
||||||
|
const { t } = await useTranslation(lng);
|
||||||
|
|
||||||
const signIn = async (formData: FormData) => {
|
const signIn = async (formData: FormData) => {
|
||||||
"use server";
|
"use server";
|
||||||
|
|
||||||
|
@ -54,22 +66,7 @@ export default function Login({
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
//profiles表 插入用户信息
|
//profiles表 插入用户信息
|
||||||
const user = data?.user;
|
await insertUserProfile(data, supabase);
|
||||||
if (user) {
|
|
||||||
const { data, error: profileError } = await supabase
|
|
||||||
.from("profiles")
|
|
||||||
.insert([{ id: user.id, email: user.email }]);
|
|
||||||
|
|
||||||
if (profileError) {
|
|
||||||
console.error("Failed to create user profile:", profileError);
|
|
||||||
}
|
|
||||||
//sentry
|
|
||||||
Sentry.setUser({
|
|
||||||
email: user.email,
|
|
||||||
id: user.id,
|
|
||||||
ip_address: "{{auto}}}",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
return redirect("/login?message=Could not authenticate user");
|
return redirect("/login?message=Could not authenticate user");
|
||||||
|
@ -80,6 +77,12 @@ export default function Login({
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex-1 flex flex-col w-full px-8 sm:max-w-md justify-center gap-2">
|
<div className="flex-1 flex flex-col w-full px-8 sm:max-w-md justify-center gap-2">
|
||||||
|
<nav className="w-full flex justify-center border-b border-b-foreground/10 h-16">
|
||||||
|
<div className="w-full max-w-4xl flex justify-between items-center p-3 text-sm">
|
||||||
|
<DeployButton />
|
||||||
|
<SettingsLink />
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
<Link
|
<Link
|
||||||
href="/"
|
href="/"
|
||||||
className="absolute left-8 top-8 py-2 px-4 rounded-md no-underline text-foreground bg-btn-background hover:bg-btn-background-hover flex items-center group text-sm"
|
className="absolute left-8 top-8 py-2 px-4 rounded-md no-underline text-foreground bg-btn-background hover:bg-btn-background-hover flex items-center group text-sm"
|
||||||
|
@ -100,7 +103,6 @@ export default function Login({
|
||||||
</svg>{" "}
|
</svg>{" "}
|
||||||
Back
|
Back
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
<form
|
<form
|
||||||
className="animate-in flex-1 flex flex-col w-full justify-center gap-2 text-foreground"
|
className="animate-in flex-1 flex flex-col w-full justify-center gap-2 text-foreground"
|
||||||
action={signIn}
|
action={signIn}
|
||||||
|
@ -139,6 +141,22 @@ export default function Login({
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
</form>
|
</form>
|
||||||
|
<SignInGitHub />
|
||||||
|
<footer className="w-full border-t border-t-foreground/10 p-8 flex justify-center text-center text-xs">
|
||||||
|
<div className="flex items-center space-x-4">
|
||||||
|
{" "}
|
||||||
|
{/* 添加flex容器来水平排列子元素 */}
|
||||||
|
<a
|
||||||
|
href="https://github.com/14790897/paper-ai"
|
||||||
|
target="_blank"
|
||||||
|
className="font-bold text-blue-600 hover:underline hover:text-blue-800"
|
||||||
|
rel="noreferrer"
|
||||||
|
>
|
||||||
|
{t("give me a star in GitHub")}
|
||||||
|
</a>
|
||||||
|
<FooterBase t={t} lng={lng} />
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
33
components/SignInGitHub.tsx
Normal file
33
components/SignInGitHub.tsx
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
"use client";
|
||||||
|
import { insertUserProfile } from "@/utils/supabase/supabaseutils";
|
||||||
|
import { createClient } from "@/utils/supabase/client";
|
||||||
|
export function SignInGitHub() {
|
||||||
|
const signInWithGithub = async () => {
|
||||||
|
const supabase = createClient();
|
||||||
|
const { data, error } = await supabase.auth.signInWithOAuth({
|
||||||
|
provider: "github",
|
||||||
|
});
|
||||||
|
//profiles表 插入用户信息
|
||||||
|
await insertUserProfile(data, supabase);
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
className="bg-black text-white rounded-md px-4 py-2 flex items-center justify-center"
|
||||||
|
onClick={signInWithGithub}
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
role="img"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
className="mr-2 h-4 w-4"
|
||||||
|
>
|
||||||
|
<title>GitHub icon</title>
|
||||||
|
<path
|
||||||
|
fill="currentColor"
|
||||||
|
d="M12 .3a12 12 0 0 0-3.8 23.4c.6.1.8-.3.8-.6v-2C8.7 21 8 20 8 20c-1.1 0-1.8-.9-1.8-.9-.6-1-.1-1.8.1-2 .7-.6 1.8-.4 2.7.1.1-.5.3-.9.5-1.1-2.3-.3-4.7-1.1-4.7-5 0-1.1.4-2 1-2.7 0-1 .1-2 .7-2.7 0 0 .9-.3 2.8 1a9.8 9.8 0 0 1 5.2 0c1.9-1.3 2.8-1 2.8-1 .6.7.7 1.7.7 2.7.7.7 1 1.6 1 2.7 0 3.9-2.4 4.7-4.7 5 .3.2.6.7.6 1.4v2.1c0 .3.2.7.8.6A12 12 0 0 0 12 .3"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
Sign In with GitHub
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
}
|
|
@ -7,6 +7,9 @@ import { Reference } from "@/utils/global";
|
||||||
//supabase
|
//supabase
|
||||||
const supabase = createClient();
|
const supabase = createClient();
|
||||||
import { createClient } from "@/utils/supabase/client";
|
import { createClient } from "@/utils/supabase/client";
|
||||||
|
//sentry
|
||||||
|
import * as Sentry from "@sentry/nextjs";
|
||||||
|
|
||||||
//获取用户id
|
//获取用户id
|
||||||
export async function getUser() {
|
export async function getUser() {
|
||||||
const { data, error } = await supabase.auth.getSession();
|
const { data, error } = await supabase.auth.getSession();
|
||||||
|
@ -172,3 +175,23 @@ export async function fetchUserVipStatus(userId: string) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//profiles表 插入用户信息
|
||||||
|
export async function insertUserProfile(data: any, supabase: SupabaseClient) {
|
||||||
|
const user = data?.user;
|
||||||
|
if (user) {
|
||||||
|
const { data, error: profileError } = await supabase
|
||||||
|
.from("profiles")
|
||||||
|
.insert([{ id: user.id, email: user.email }]);
|
||||||
|
|
||||||
|
if (profileError) {
|
||||||
|
console.error("Failed to create user profile:", profileError);
|
||||||
|
}
|
||||||
|
//sentry
|
||||||
|
Sentry.setUser({
|
||||||
|
email: user.email,
|
||||||
|
id: user.id,
|
||||||
|
ip_address: "{{auto}}}",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user