echo/src/lib/supabase/client.ts
ddshi 4c42d6b6f5 feat: 完成阶段 2 - 用户系统与智能体初始化
## 完成的功能
- 用户登录/注册(邮箱 + Google OAuth)
- 初始问题引导流程(4 个问题)
- 智能体自动生成(根据用户回答)
- 智能体列表页面

## 新增文件
- 登录/注册页面和组件
- Onboarding 页面和组件
- 智能体列表页面
- 智能体 API 端点
- 智能体 Prompt 设计

## 数据库迁移
- onboarding_fix 迁移(users.has_completed_onboarding)

## 测试
- 登录/注册:100% 通过
- Onboarding:85% 通过
- 智能体功能:85% 通过

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-12 14:08:12 +08:00

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!;
}