import { useState, useEffect } from "react"; export interface Session { id: string; name: string; messages: Message[]; } export interface Message { id: string; from: "user" | "ai"; content: string; } const SESSION_STORAGE_KEY = "webzero_sessions"; const CURRENT_SESSION_ID_KEY = "webzero_current_session_id"; export function useSessions() { const [sessions, setSessions] = useState(() => { if (typeof window === "undefined") return []; try { const storedSessions = localStorage.getItem(SESSION_STORAGE_KEY); return storedSessions ? JSON.parse(storedSessions) : []; } catch (error) { console.error("Failed to parse sessions from localStorage:", error); return []; } }); const [currentSessionId, setCurrentSessionId] = useState( () => { if (typeof window === "undefined") return null; try { const storedId = localStorage.getItem(CURRENT_SESSION_ID_KEY); return storedId && sessions.some((s) => s.id === storedId) ? storedId : sessions[0]?.id || null; } catch (error) { console.error( "Failed to retrieve currentSessionId from localStorage:", error ); return sessions[0]?.id || null; } } ); useEffect(() => { if (sessions.length === 0) { const newSession = createNewSessionObject(); setSessions([newSession]); setCurrentSessionId(newSession.id); } }, [sessions]); useEffect(() => { try { localStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify(sessions)); } catch (error) { console.error("Failed to save sessions to localStorage:", error); } }, [sessions]); useEffect(() => { if (currentSessionId) { try { localStorage.setItem(CURRENT_SESSION_ID_KEY, currentSessionId); } catch (error) { console.error( "Failed to save currentSessionId to localStorage:", error ); } } }, [currentSessionId]); const createNewSessionObject = (): Session => ({ id: Date.now().toString(), name: `Session ${sessions.length + 1}`, messages: [], }); const createNewSession = () => { const newSession = createNewSessionObject(); setSessions((prevSessions) => [...prevSessions, newSession]); setCurrentSessionId(newSession.id); }; const switchSession = (sessionId: string) => { setCurrentSessionId(sessionId); }; const updateSessionMessages = (sessionId: string, messages: Message[]) => { setSessions((prevSessions) => prevSessions.map((session) => session.id === sessionId ? { ...session, messages } : session ) ); }; const deleteSession = (sessionId: string) => { setSessions((prevSessions) => { const updatedSessions = prevSessions.filter( (session) => session.id !== sessionId ); if (updatedSessions.length === 0) { const newSession = createNewSessionObject(); setCurrentSessionId(newSession.id); return [newSession]; } if (currentSessionId === sessionId) { setCurrentSessionId(updatedSessions[0].id); } return updatedSessions; }); }; const renameSession = (sessionId: string, newName: string) => { setSessions((prevSessions) => prevSessions.map((session) => session.id === sessionId ? { ...session, name: newName } : session ) ); }; return { sessions, currentSessionId, createNewSession, switchSession, updateSessionMessages, deleteSession, renameSession, }; }