- Admin CRM: D3RO Console 스타일 전체 적용 (panelSx/tableSx/filterBtnSx) - 3단계 권한: manager/admin/super_admin (DB + Edge Functions + Frontend) - 랜딩 페이지: 1회 결제 → 월간/연간 구독 SaaS 모델 (10개 언어) - SSE 스트리밍: VoiceConversation Premium LLM 라우팅 + fallback - Supabase 클라이언트: packages/api-client 공통 추출 (browser+server) - RPC 함수 타입: 9개 정의 (admin_usage_by_feature 등) - callAdminApi 401 버그 수정 (getUser() 선행 토큰 갱신)
22 lines
919 B
TypeScript
22 lines
919 B
TypeScript
// packages/api-client/src/supabase-browser.ts
|
|
// 브라우저 컴포넌트용 Supabase 클라이언트 (캐싱 싱글턴).
|
|
// Database 제네릭 주입 (@supabase/ssr 0.10 + supabase-js 2.103 정합).
|
|
|
|
import { createBrowserClient } from '@supabase/ssr'
|
|
import type { Database } from './types'
|
|
|
|
let cachedClient: ReturnType<typeof createBrowserClient<Database>> | null = null
|
|
|
|
export function getSupabaseBrowserClient(): ReturnType<typeof createBrowserClient<Database>> {
|
|
if (cachedClient) return cachedClient
|
|
|
|
const url = process.env.NEXT_PUBLIC_SUPABASE_URL ?? 'https://placeholder.supabase.co'
|
|
const key = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY ?? 'placeholder-anon-key'
|
|
|
|
cachedClient = createBrowserClient<Database>(url, key)
|
|
return cachedClient
|
|
}
|
|
|
|
export function isSupabaseConfigured(): boolean {
|
|
return Boolean(process.env.NEXT_PUBLIC_SUPABASE_URL && process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY)
|
|
}
|