Xu ly dong bo nguoi dung thanh cong

This commit is contained in:
quangdn-ght 2025-06-26 00:47:54 +07:00
parent ee25e4ac82
commit 8af4d7a6d9
14 changed files with 113 additions and 66 deletions

View File

@ -1,13 +1,53 @@
"use client";
import { useEffect } from "react";
import { useSyncStore } from "./store/sync";
import { showToast } from "./components/ui-lib";
import { AUTHEN_PAGE } from "./constant";
export default function SyncOnFirstLoad() {
const syncStore = useSyncStore();
useEffect(() => {
// Parse cookies using the custom function
// syncStore.sync();
// Parse cookies using the cookie library
// const cookies = cookie.parse(document.cookie || "");
// const authToken = cookies["sb-zzgkylsbdgwoohcbompi-auth-token"] || null;
console.log("[Auth Check] Checking user authentication status");
fetch("/api/auth/check")
.then((res) => {
if (res.status === 401) {
console.log("[Auth Check] User is not authenticated");
// Handle unauthenticated user - redirect or show login modal
showToast("Please login first");
setTimeout(() => {
window.location.href = AUTHEN_PAGE;
}, 500);
return;
}
return res.json();
})
.then((data) => {
if (data) {
console.log("[Auth Check] User is authenticated:", data.user);
// Assuming data.user contains the user information(user email)
const email = data.user.email || "";
// Only update upstash.username, keep other params
syncStore.update((config) => (config.upstash.username = email));
// You can now use the user data as needed
// syncStore.sync();
// console.log("[Sync] User data synced successfully");
}
})
.catch((e) => {
console.error("[Auth Check] Error checking authentication:", e);
// Handle error appropriately
});
}, []);
return null;

View File

@ -15,7 +15,6 @@ import { handle as siliconflowHandler } from "../../siliconflow";
import { handle as xaiHandler } from "../../xai";
import { handle as chatglmHandler } from "../../glm";
import { handle as proxyHandler } from "../../proxy";
import { handle as supabaseHandler } from "../../supabase";
async function handle(
req: NextRequest,
@ -28,9 +27,6 @@ async function handle(
console.log(`[${params.provider} Route] params `, params);
switch (apiPath) {
case ApiPath.Supabase:
console.log("[Supabase Route] params ", params);
return supabaseHandler(req, { params });
case ApiPath.Azure:
return azureHandler(req, { params });
case ApiPath.Google:

View File

@ -0,0 +1,21 @@
// /app/api/auth/check/route.ts
import { NextRequest } from "next/server";
import { checkAuth } from "../../supabase";
export async function GET(req: NextRequest) {
const user = await checkAuth(req);
console.log("[Auth] user ", user);
if (!user) {
return new Response(JSON.stringify({ authenticated: false }), {
status: 401,
headers: { "Content-Type": "application/json" },
});
}
return new Response(JSON.stringify({ authenticated: true, user }), {
status: 200,
headers: { "Content-Type": "application/json" },
});
}

View File

@ -30,14 +30,17 @@ export async function requestOpenai(req: NextRequest) {
authHeaderName = "api-key";
} else {
// Nếu là OpenAI thường, giữ nguyên header Authorization
authValue = req.headers.get("Authorization") ?? "";
authHeaderName = "Authorization";
console.log("[Auth] ", authValue);
}
// Xử lý lại đường dẫn endpoint cho phù hợp với OpenAI/Azure
let path = `${req.nextUrl.pathname}`.replaceAll("/api/openai/", "");
console.log("[Proxy] mac dinh ", path);
// console.log("[Proxy] mac dinh ", path);
// Lấy baseUrl từ config, ưu tiên Azure nếu là request Azure
let baseUrl =

View File

@ -1,23 +1,20 @@
import { createClient } from "@supabase/supabase-js";
import { NextRequest, NextResponse } from "next/server";
import cookie from "cookie";
import { NextRequest } from "next/server";
const SUPABASE_URL = process.env.SUPABASE_URL!;
const SUPABASE_ANON_KEY = process.env.SUPABASE_ANON_KEY!;
const AUTHEN_PAGE = process.env.AUTHEN_PAGE!;
export async function handle(
req: NextRequest,
{ params }: { params: { path: string[] } },
) {
// Parse cookies using the 'cookie' library
const cookies = cookie.parse(req.headers.get("cookie") || "");
const authToken = cookies["sb-zzgkylsbdgwoohcbompi-auth-token"];
export async function checkAuth(req: NextRequest) {
// Use NextRequest.cookies API
const authToken = req.cookies.get("sb-zzgkylsbdgwoohcbompi-auth-token")
?.value;
console.log("[Supabase] authToken", authToken);
// console.log("[Supabase] authToken", authToken);
if (!authToken) {
return NextResponse.redirect(AUTHEN_PAGE, 302);
// Không tìm thấy token xác thực
console.log("[Supabase] No auth token found");
return null;
}
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
@ -31,21 +28,18 @@ export async function handle(
try {
const { data, error } = await supabase.auth.getUser();
console.log("[Supabase] user", data?.user);
if (error || !data?.user) {
return NextResponse.json(
{ error: error?.message || "Error fetching user data" },
{ status: 401 },
);
// Lỗi khi lấy thông tin người dùng
console.error("[Supabase] Error getting user:", error);
return null;
}
return NextResponse.json({ user: data.user }, { status: 200 });
// Đã xác thực thành công, trả về thông tin người dùng
console.log("[Supabase] Authenticated user:", data.user);
return data.user;
} catch (err) {
console.error("Error fetching user data from Supabase:", err);
return NextResponse.json(
{ error: "Internal server error" },
{ status: 500 },
);
// Lỗi khi lấy dữ liệu người dùng
console.error("[Supabase] Error fetching user data:", err);
return null;
}
}

View File

@ -5,3 +5,4 @@ export const UPSTASH_ENDPOINT = "https://fine-baboon-52580.upstash.io";
export const UPSTASH_APIKEY =
"Ac1kAAIjcDE2YjM4YmY3OGI4YzA0MTU2YjZhNmQyNzc5Yzc3NzEwYnAxMA";
export const STORAGE_KEY = "chebichat-backup";
export const AUTHEN_PAGE = "https://chinese.giahungtech.com.vn";

View File

@ -529,6 +529,8 @@ function SyncItems() {
setShowSyncConfigModal(true);
}}
/>
{/* thuc hien dong bo voi cloud */}
{couldSync && (
<IconButton
icon={<ResetIcon />}

View File

@ -29,13 +29,15 @@ import {
import { Link, useNavigate } from "react-router-dom";
import { isIOS, useMobileScreen } from "../utils";
import dynamic from "next/dynamic";
import { Selector, showConfirm } from "./ui-lib";
import { Selector, showConfirm, showToast } from "./ui-lib";
import clsx from "clsx";
import { isMcpEnabled } from "../mcp/actions";
import { useSyncStore } from "../store/sync";
const DISCOVERY = [
// { name: Locale.Plugin.Name, path: Path.Plugins },
// { name: "Stable Diffusion", path: Path.Sd },
{ name: Locale.UI.Sync, path: "/sync" },
{ name: Locale.SearchChat.Page.Title, path: Path.SearchChat },
];
@ -233,6 +235,8 @@ export function SideBar(props: { className?: string }) {
const chatStore = useChatStore();
const [mcpEnabled, setMcpEnabled] = useState(false);
const syncStore = useSyncStore();
useEffect(() => {
// 检查 MCP 是否启用
const checkMcpStatus = async () => {
@ -306,9 +310,20 @@ export function SideBar(props: { className?: string }) {
}),
]}
onClose={() => setshowDiscoverySelector(false)}
onSelection={(s) => {
// Điều hướng đến trang được chọn
navigate(s[0], { state: { fromHome: true } });
onSelection={async (s) => {
console.log(s[0]);
if (s[0] == "/sync") {
try {
await syncStore.sync();
console.log("Dong bo thanh cong ");
showToast(Locale.Settings.Sync.Success);
} catch (e) {
showToast(Locale.Settings.Sync.Fail);
console.error("[Sync]", e);
}
} else {
navigate(s[0], { state: { fromHome: true } });
}
}}
/>
)}

View File

@ -57,6 +57,7 @@ export enum Path {
Artifacts = "/artifacts",
SearchChat = "/search-chat",
McpMarket = "/mcp-market",
Sync = "/sync",
}
export enum ApiPath {

View File

@ -37,7 +37,7 @@ export default function RootLayout({
const serverConfig = getServerSideConfig();
// Log server configuration for debugging
console.log("Server Configuration:");
// console.log("Server Configuration:");
// console.log(serverConfig);
return (

View File

@ -35,10 +35,10 @@ export function compressImage(file: Blob, maxSize: number): Promise<string> {
if (dataUrl.length < maxSize) break;
if (quality > 0.5) {
// Prioritize quality reduction
// Ưu tiên giảm chất lượng
quality -= 0.1;
} else {
// Then reduce the size
// Sau đó giảm kích thước
width *= 0.9;
height *= 0.9;
}

2
git.sh
View File

@ -2,7 +2,7 @@
# git config --global user.name "quangdn-ght"
git add .
git commit -m "cap nhat giao dien"
git commit -m "Xu ly dong bo nguoi dung thanh cong"
git push
# mdZddHXcuzsB0Akk

View File

@ -25,7 +25,6 @@
"@hello-pangea/dnd": "^16.5.0",
"@modelcontextprotocol/sdk": "^1.0.4",
"@next/third-parties": "^14.1.0",
"@supabase/auth-helpers-nextjs": "^0.10.0",
"@supabase/ssr": "^0.6.1",
"@supabase/supabase-js": "^2.50.1",
"@svgr/webpack": "^6.5.1",

View File

@ -2169,21 +2169,6 @@
dependencies:
"@sinonjs/commons" "^3.0.0"
"@supabase/auth-helpers-nextjs@^0.10.0":
version "0.10.0"
resolved "https://registry.yarnpkg.com/@supabase/auth-helpers-nextjs/-/auth-helpers-nextjs-0.10.0.tgz#e831968f95e1bc44f400825d251a8b2fda97ee9f"
integrity sha512-2dfOGsM4yZt0oS4TPiE7bD4vf7EVz7NRz/IJrV6vLg0GP7sMUx8wndv2euLGq4BjN9lUCpu6DG/uCC8j+ylwPg==
dependencies:
"@supabase/auth-helpers-shared" "0.7.0"
set-cookie-parser "^2.6.0"
"@supabase/auth-helpers-shared@0.7.0":
version "0.7.0"
resolved "https://registry.yarnpkg.com/@supabase/auth-helpers-shared/-/auth-helpers-shared-0.7.0.tgz#244a6b6ac39a5eb1bc8d69a57c25aa580cd0f669"
integrity sha512-FBFf2ei2R7QC+B/5wWkthMha8Ca2bWHAndN+syfuEUUfufv4mLcAgBCcgNg5nJR8L0gZfyuaxgubtOc9aW3Cpg==
dependencies:
jose "^4.14.4"
"@supabase/auth-js@2.70.0":
version "2.70.0"
resolved "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.70.0.tgz"
@ -6447,11 +6432,6 @@ jest@^29.7.0:
import-local "^3.0.2"
jest-cli "^29.7.0"
jose@^4.14.4:
version "4.15.9"
resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.9.tgz#9b68eda29e9a0614c042fa29387196c7dd800100"
integrity sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
@ -8828,11 +8808,6 @@ serialize-javascript@^6.0.1:
dependencies:
randombytes "^2.1.0"
set-cookie-parser@^2.6.0:
version "2.7.1"
resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943"
integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==
setprototypeof@1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz"