Files
rice-pk-xhs/web/lib/api.ts
T
codex-bot 9615add720
Verify mini program and deploy preview / verify-deploy (push) Successful in 3m57s
feat: redesign typed rice poster editor
2026-09-20 16:37:35 +08:00

20 lines
1.4 KiB
TypeScript

'use client';
interface ApiOptions{method?:string;headers?:Record<string,string>;body?:unknown}
export async function apiRequest<T=unknown>(path:string,options:ApiOptions={}):Promise<T> {
const token = typeof window === 'undefined' ? null : localStorage.getItem('rice_token');
const headers:Record<string,string> = { Accept: 'application/json', ...(options.headers || {}) };
if (options.body !== undefined) headers['Content-Type'] = 'application/json';
if (token) headers.Authorization = `Bearer ${token}`;
const response = await fetch(path, { method: options.method || 'GET', headers, body: options.body === undefined ? undefined : JSON.stringify(options.body), cache: 'no-store' });
const data = await response.json().catch(() => ({}));
if (!response.ok) throw new Error(typeof data.detail === 'string' ? data.detail : '请求失败');
return data as T;
}
export async function ensureLogin():Promise<void> {
if (localStorage.getItem('rice_token')) return;
let previewId = localStorage.getItem('rice_preview_id');
if (!previewId) { previewId = `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`; localStorage.setItem('rice_preview_id', previewId); }
const session = await apiRequest<{token:string}>('/api/v1/auth/xhs', { method: 'POST', body: { app_key: 'rice', code: `dev:web-${previewId}` } });
localStorage.setItem('rice_token', session.token);
}