Spaces:
Sleeping
Sleeping
| // Storage keys for different chat types | |
| const STORAGE_KEYS = { | |
| PLAYGROUND: 'playgroundChat', | |
| CHAT_WITH_UPLOAD: 'chatWithUpload', | |
| ROLEPLAY: 'roleplayChat' | |
| } as const; | |
| export interface ChatMessage { | |
| id: string; | |
| content: string; | |
| role: 'user' | 'assistant' | 'system'; | |
| timestamp: string; | |
| } | |
| export interface ChatSession { | |
| id: string; | |
| title: string; | |
| lastMessage: string; | |
| timestamp: string; | |
| messages: ChatMessage[]; | |
| } | |
| // Type for playground chat which only stores messages | |
| interface PlaygroundChatData { | |
| messages: ChatMessage[]; | |
| } | |
| // Type for chat with upload which stores sessions and their messages | |
| interface ChatWithUploadData { | |
| sessions: ChatSession[]; | |
| } | |
| // Type for roleplay chat which stores chats by role_id | |
| interface RoleplayChatData { | |
| [role_id: string]: { | |
| messages: ChatMessage[]; | |
| }; | |
| } | |
| // Helper function to safely parse JSON from localStorage | |
| function getStorageData<T>(key: string, defaultValue: T): T { | |
| try { | |
| const data = localStorage.getItem(key); | |
| if (!data) return defaultValue; | |
| // Convert old format data to new format | |
| const parsedData = JSON.parse(data); | |
| if (key === STORAGE_KEYS.PLAYGROUND) { | |
| // If it's old format data, convert it | |
| if (parsedData.messages?.[0]?.isUser !== undefined) { | |
| parsedData.messages = parsedData.messages.map((msg: any) => ({ | |
| id: msg.id, | |
| content: msg.content, | |
| role: msg.isUser ? 'user' : 'assistant', | |
| timestamp: msg.timestamp | |
| })); | |
| } | |
| } else if (key === STORAGE_KEYS.CHAT_WITH_UPLOAD) { | |
| // If it's old format data, convert it | |
| if (parsedData.sessions?.[0]?.messages?.[0]?.isUser !== undefined) { | |
| parsedData.sessions = parsedData.sessions.map((session: any) => ({ | |
| ...session, | |
| messages: session.messages.map((msg: any) => ({ | |
| id: msg.id, | |
| content: msg.content, | |
| role: msg.isUser ? 'user' : 'assistant', | |
| timestamp: msg.timestamp | |
| })) | |
| })); | |
| } | |
| } else if (key === STORAGE_KEYS.ROLEPLAY) { | |
| // If it's old format data, convert it | |
| Object.keys(parsedData).forEach((role_id: string) => { | |
| if (parsedData[role_id].messages?.[0]?.isUser !== undefined) { | |
| parsedData[role_id].messages = parsedData[role_id].messages.map((msg: any) => ({ | |
| id: msg.id, | |
| content: msg.content, | |
| role: msg.isUser ? 'user' : 'assistant', | |
| timestamp: msg.timestamp | |
| })); | |
| } | |
| }); | |
| } | |
| return parsedData; | |
| } catch (error) { | |
| console.error(`Error parsing data for key ${key}:`, error); | |
| return defaultValue; | |
| } | |
| } | |
| // Helper function to safely save JSON to localStorage | |
| function setStorageData(key: string, data: any) { | |
| try { | |
| localStorage.setItem(key, JSON.stringify(data)); | |
| } catch (error) { | |
| console.error(`Error saving data for key ${key}:`, error); | |
| } | |
| } | |
| // Playground Chat Storage Functions | |
| export const playgroundChatStorage = { | |
| getMessages: (): ChatMessage[] => { | |
| const data = getStorageData<PlaygroundChatData>(STORAGE_KEYS.PLAYGROUND, { messages: [] }); | |
| return data.messages; | |
| }, | |
| addMessage: (message: ChatMessage) => { | |
| const messages = playgroundChatStorage.getMessages(); | |
| setStorageData(STORAGE_KEYS.PLAYGROUND, { | |
| messages: [...messages, message] | |
| }); | |
| }, | |
| saveMessages: (messages: ChatMessage[]) => { | |
| setStorageData(STORAGE_KEYS.PLAYGROUND, { messages }); | |
| }, | |
| clearMessages: () => { | |
| setStorageData(STORAGE_KEYS.PLAYGROUND, { messages: [] }); | |
| } | |
| }; | |
| // Chat with Upload Storage Functions | |
| export const chatWithUploadStorage = { | |
| getSessions: (): ChatSession[] => { | |
| const data = getStorageData<ChatWithUploadData>(STORAGE_KEYS.CHAT_WITH_UPLOAD, { | |
| sessions: [] | |
| }); | |
| return data.sessions; | |
| }, | |
| createSession: (title: string = 'New Conversation'): ChatSession => { | |
| const newSession: ChatSession = { | |
| id: Date.now().toString(), | |
| title, | |
| lastMessage: '', | |
| timestamp: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }), | |
| messages: [] | |
| }; | |
| const sessions = chatWithUploadStorage.getSessions(); | |
| setStorageData(STORAGE_KEYS.CHAT_WITH_UPLOAD, { | |
| sessions: [newSession, ...sessions] | |
| }); | |
| return newSession; | |
| }, | |
| updateSession: (sessionId: string, updates: Partial<ChatSession>) => { | |
| const sessions = chatWithUploadStorage.getSessions(); | |
| const updatedSessions = sessions.map((session) => | |
| session.id === sessionId ? { ...session, ...updates } : session | |
| ); | |
| setStorageData(STORAGE_KEYS.CHAT_WITH_UPLOAD, { sessions: updatedSessions }); | |
| }, | |
| addMessage: (sessionId: string, message: ChatMessage) => { | |
| const sessions = chatWithUploadStorage.getSessions(); | |
| const updatedSessions = sessions.map((session) => | |
| session.id === sessionId | |
| ? { | |
| ...session, | |
| messages: [...session.messages, message], | |
| lastMessage: message.content, | |
| timestamp: message.timestamp | |
| } | |
| : session | |
| ); | |
| setStorageData(STORAGE_KEYS.CHAT_WITH_UPLOAD, { sessions: updatedSessions }); | |
| }, | |
| saveSessionMessages: (sessionId: string, messages: ChatMessage[]) => { | |
| const sessions = chatWithUploadStorage.getSessions(); | |
| const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined; | |
| const updatedSessions = sessions.map((session) => | |
| session.id === sessionId | |
| ? { | |
| ...session, | |
| messages, | |
| title: messages.length > 0 ? session.title : 'New Conversation', | |
| lastMessage: lastMessage?.content || '', | |
| timestamp: lastMessage?.timestamp || session.timestamp | |
| } | |
| : session | |
| ); | |
| setStorageData(STORAGE_KEYS.CHAT_WITH_UPLOAD, { sessions: updatedSessions }); | |
| }, | |
| getSessionMessages: (sessionId: string): ChatMessage[] => { | |
| const sessions = chatWithUploadStorage.getSessions(); | |
| const session = sessions.find((s) => s.id === sessionId); | |
| return session?.messages || []; | |
| }, | |
| deleteSession: (sessionId: string) => { | |
| const sessions = chatWithUploadStorage.getSessions(); | |
| setStorageData(STORAGE_KEYS.CHAT_WITH_UPLOAD, { | |
| sessions: sessions.filter((s) => s.id !== sessionId) | |
| }); | |
| } | |
| }; | |
| // Roleplay Chat Storage Functions | |
| export const roleplayChatStorage = { | |
| getMessages: (role_id: string): ChatMessage[] => { | |
| const data = getStorageData<RoleplayChatData>(STORAGE_KEYS.ROLEPLAY, {}); | |
| return data[role_id]?.messages || []; | |
| }, | |
| saveMessages: (role_id: string, messages: ChatMessage[]) => { | |
| const data = getStorageData<RoleplayChatData>(STORAGE_KEYS.ROLEPLAY, {}); | |
| const updatedData = { | |
| ...data, | |
| [role_id]: { | |
| messages | |
| } | |
| }; | |
| setStorageData(STORAGE_KEYS.ROLEPLAY, updatedData); | |
| }, | |
| addMessage: (role_id: string, message: ChatMessage) => { | |
| const data = getStorageData<RoleplayChatData>(STORAGE_KEYS.ROLEPLAY, {}); | |
| const roleData = data[role_id] || { messages: [] }; | |
| const updatedData = { | |
| ...data, | |
| [role_id]: { | |
| messages: [...roleData.messages, message] | |
| } | |
| }; | |
| setStorageData(STORAGE_KEYS.ROLEPLAY, updatedData); | |
| }, | |
| clearMessages: (role_id: string) => { | |
| const data = getStorageData<RoleplayChatData>(STORAGE_KEYS.ROLEPLAY, {}); | |
| const updatedData = { | |
| ...data, | |
| [role_id]: { | |
| messages: [] | |
| } | |
| }; | |
| setStorageData(STORAGE_KEYS.ROLEPLAY, updatedData); | |
| }, | |
| deleteRole: (role_id: string) => { | |
| const data = getStorageData<RoleplayChatData>(STORAGE_KEYS.ROLEPLAY, {}); | |
| const { [role_id]: _, ...rest } = data; | |
| setStorageData(STORAGE_KEYS.ROLEPLAY, rest); | |
| } | |
| }; | |