- 在教练页面中新增AI选择选项和食物确认选项的数据结构 - 扩展消息结构以支持选择选项和交互类型 - 实现非流式JSON响应的处理逻辑,支持用户确认选择 - 添加选择选项的UI组件,提升用户交互体验 - 更新样式以适应新功能,确保视觉一致性
52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
|
|
export type AiCoachChatMessage = {
|
|
id: string;
|
|
role: 'user' | 'assistant';
|
|
content: string;
|
|
attachments?: any[];
|
|
choices?: any[];
|
|
interactionType?: string;
|
|
pendingData?: any;
|
|
context?: any;
|
|
};
|
|
|
|
export type AiCoachSessionCache = {
|
|
conversationId?: string;
|
|
messages: AiCoachChatMessage[];
|
|
updatedAt: number;
|
|
};
|
|
|
|
const STORAGE_KEY = '@ai_coach_session_v1';
|
|
|
|
export async function loadAiCoachSessionCache(): Promise<AiCoachSessionCache | null> {
|
|
try {
|
|
const s = await AsyncStorage.getItem(STORAGE_KEY);
|
|
if (!s) return null;
|
|
const obj = JSON.parse(s) as AiCoachSessionCache;
|
|
if (!obj || !Array.isArray(obj.messages)) return null;
|
|
return obj;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export async function saveAiCoachSessionCache(cache: AiCoachSessionCache): Promise<void> {
|
|
try {
|
|
const payload: AiCoachSessionCache = {
|
|
conversationId: cache.conversationId,
|
|
messages: cache.messages?.slice?.(-200) ?? [], // 限制最多缓存 200 条,避免无限增长
|
|
updatedAt: Date.now(),
|
|
};
|
|
await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(payload));
|
|
} catch { }
|
|
}
|
|
|
|
export async function clearAiCoachSessionCache(): Promise<void> {
|
|
try {
|
|
await AsyncStorage.removeItem(STORAGE_KEY);
|
|
} catch { }
|
|
}
|
|
|
|
|