storage/mod.rs (2957 -> 1834 行): - 抽出 tests.rs: 17 个测试函数 - 抽出 row_mapping.rs: 8 个 row<->record 映射与单记录查询函数 - 抽出 migrations.rs: 7 个 schema 迁移函数 (ensure_*_schema, has_column, add_column_if_missing) ConfigPage.tsx (1568 -> 1235 行): - 抽出 types.ts: 所有接口/类型定义 - 抽出 constants.ts: TABS, inputCls, selectCls, TIMEZONE_OPTIONS - 抽出 ui.tsx: Field, Toggle, TagEditor, SectionCard, SourceEditor, MapEntryHeader - 抽出 api/expert.ts: getSelectedExpert, selectExpert (经 ConfigPage 再导出保持兼容) 验证: cargo build, cargo test --lib storage:: 17/17, npm run build 对抗性检查: 8/8 通过 (无丢失/重复函数, 无循环依赖, 无未使用导入)
21 lines
970 B
TypeScript
21 lines
970 B
TypeScript
// Expert API helpers extracted from ConfigPage.tsx
|
|
// Used by both ConfigPage and ExpertSelector
|
|
import type { ExpertItem } from '../types'
|
|
|
|
export async function getSelectedExpert(sessionId: string): Promise<{ expert_name: string | null; expert: ExpertItem | null }> {
|
|
const resp = await fetch(`/api/experts/selected?session_id=${encodeURIComponent(sessionId)}`)
|
|
if (!resp.ok) return { expert_name: null, expert: null }
|
|
return resp.json()
|
|
}
|
|
|
|
export async function selectExpert(sessionId: string, expertName: string | null): Promise<{ success: boolean; error?: string }> {
|
|
const resp = await fetch('/api/experts/select', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ session_id: sessionId, expert_name: expertName }),
|
|
})
|
|
const data = await resp.json().catch(() => ({}))
|
|
if (!resp.ok || !data.success) return { success: false, error: data.error || '切换专家失败' }
|
|
return { success: true }
|
|
}
|