## 完成的功能 - 用户登录/注册(邮箱 + Google OAuth) - 初始问题引导流程(4 个问题) - 智能体自动生成(根据用户回答) - 智能体列表页面 ## 新增文件 - 登录/注册页面和组件 - Onboarding 页面和组件 - 智能体列表页面 - 智能体 API 端点 - 智能体 Prompt 设计 ## 数据库迁移 - onboarding_fix 迁移(users.has_completed_onboarding) ## 测试 - 登录/注册:100% 通过 - Onboarding:85% 通过 - 智能体功能:85% 通过 Co-Authored-By: Claude <noreply@anthropic.com>
64 lines
1.5 KiB
TypeScript
64 lines
1.5 KiB
TypeScript
import { createBrowserClient } from '@supabase/ssr';
|
|
|
|
/**
|
|
* Supabase 客户端配置 - 浏览器端
|
|
* 用于前端组件中的 API 调用
|
|
*/
|
|
|
|
// 环境变量类型声明
|
|
declare global {
|
|
namespace NodeJS {
|
|
interface ProcessEnv {
|
|
NEXT_PUBLIC_SUPABASE_URL: string;
|
|
NEXT_PUBLIC_SUPABASE_ANON_KEY: string;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 获取环境变量
|
|
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL || '';
|
|
const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || '';
|
|
|
|
/**
|
|
* 浏览器端 Supabase 客户端
|
|
* 用于前端组件中的 API 调用
|
|
*/
|
|
export function createBrowserSupabaseClient() {
|
|
if (!supabaseUrl || !supabaseAnonKey) {
|
|
console.warn('Supabase environment variables not configured');
|
|
}
|
|
return createBrowserClient(supabaseUrl, supabaseAnonKey);
|
|
}
|
|
|
|
/**
|
|
* 判断是否在浏览器环境中运行
|
|
*/
|
|
export function isClientSide(): boolean {
|
|
return typeof window !== 'undefined';
|
|
}
|
|
|
|
/**
|
|
* 获取当前 Supabase URL
|
|
*/
|
|
export function getSupabaseUrl(): string {
|
|
return supabaseUrl;
|
|
}
|
|
|
|
/**
|
|
* 获取当前 Supabase Anon Key
|
|
*/
|
|
export function getSupabaseAnonKey(): string {
|
|
return supabaseAnonKey;
|
|
}
|
|
|
|
// 导出默认客户端实例(懒加载)
|
|
import { createBrowserClient as createBrowserClientFn } from '@supabase/ssr';
|
|
let browserClient: ReturnType<typeof createBrowserClientFn> | null = null;
|
|
|
|
export function getBrowserClient(): ReturnType<typeof createBrowserClientFn> {
|
|
if (!browserClient && isClientSide()) {
|
|
browserClient = createBrowserSupabaseClient();
|
|
}
|
|
return browserClient!;
|
|
}
|