1+ // storage.js
2+ document . addEventListener ( "DOMContentLoaded" , ( ) => {
3+ const sessionListEl = document . getElementById ( "session-list" ) ;
4+ let sessions = loadSessions ( ) ;
5+
6+ if ( ! localStorage . getItem ( "currentSessionId" ) ) {
7+ const newSession = createSession ( "New Chat" ) ;
8+ localStorage . setItem ( "currentSessionId" , newSession . id ) ;
9+ }
10+
11+ renderSessions ( ) ;
12+
13+ window . Storage = {
14+ getSessions,
15+ createSession,
16+ deleteSession,
17+ getCurrentSession,
18+ setCurrentSessionId,
19+ updateSessionMessages,
20+ renameSession,
21+ setSessionModel
22+ } ;
23+
24+ function getSessions ( ) {
25+ return sessions ;
26+ }
27+
28+ function createSession ( name ) {
29+ const newId = Date . now ( ) . toString ( ) ;
30+ const session = {
31+ id : newId ,
32+ name,
33+ model : "unity" , // Default model set to "unity"
34+ messages : [ ] ,
35+ lastUpdated : Date . now ( )
36+ } ;
37+ sessions . push ( session ) ;
38+ saveSessions ( ) ;
39+ return session ;
40+ }
41+
42+ function deleteSession ( sessionId ) {
43+ sessions = sessions . filter ( s => s . id !== sessionId ) ;
44+ saveSessions ( ) ;
45+ if ( localStorage . getItem ( "currentSessionId" ) === sessionId ) {
46+ // Clear chat box if the current session is deleted.
47+ const chatBox = document . getElementById ( "chat-box" ) ;
48+ if ( chatBox ) chatBox . innerHTML = "" ;
49+
50+ if ( sessions . length > 0 ) {
51+ localStorage . setItem ( "currentSessionId" , sessions [ 0 ] . id ) ;
52+ } else {
53+ const newSession = createSession ( "New Chat" ) ;
54+ localStorage . setItem ( "currentSessionId" , newSession . id ) ;
55+ }
56+ }
57+ renderSessions ( ) ;
58+ }
59+
60+ function renameSession ( sessionId , newName ) {
61+ const session = sessions . find ( s => s . id === sessionId ) ;
62+ if ( session ) {
63+ let cleanName = newName ;
64+ if ( typeof newName === "object" ) {
65+ cleanName = JSON . stringify ( newName ) ;
66+ } else if ( newName && newName . startsWith ( "{" ) && newName . endsWith ( "}" ) ) {
67+ try {
68+ const parsed = JSON . parse ( newName ) ;
69+ cleanName = parsed . response || parsed . chatTitle || newName ;
70+ } catch ( e ) {
71+ console . error ( "Error parsing session name JSON:" , e ) ;
72+ }
73+ }
74+ session . name = cleanName ;
75+ session . lastUpdated = Date . now ( ) ;
76+ saveSessions ( ) ;
77+ renderSessions ( ) ;
78+ }
79+ }
80+
81+ // FIXED: Ensure a valid session is always returned.
82+ function getCurrentSession ( ) {
83+ const currentId = localStorage . getItem ( "currentSessionId" ) ;
84+ let session = sessions . find ( s => s . id === currentId ) ;
85+ if ( ! session ) {
86+ session = createSession ( "New Chat" ) ;
87+ localStorage . setItem ( "currentSessionId" , session . id ) ;
88+ }
89+ return session ;
90+ }
91+
92+ function setCurrentSessionId ( sessionId ) {
93+ localStorage . setItem ( "currentSessionId" , sessionId ) ;
94+ renderSessions ( ) ;
95+ }
96+
97+ function setSessionModel ( sessionId , modelName ) {
98+ const session = sessions . find ( s => s . id === sessionId ) ;
99+ if ( session ) {
100+ session . model = modelName ;
101+ session . lastUpdated = Date . now ( ) ;
102+ saveSessions ( ) ;
103+ }
104+ }
105+
106+ function updateSessionMessages ( sessionId , messages ) {
107+ const session = sessions . find ( s => s . id === sessionId ) ;
108+ if ( session ) {
109+ session . messages = messages ;
110+ session . lastUpdated = Date . now ( ) ;
111+ saveSessions ( ) ;
112+ }
113+ }
114+
115+ function loadSessions ( ) {
116+ const raw = localStorage . getItem ( "pollinations_sessions" ) ;
117+ return raw ? JSON . parse ( raw ) : [ ] ;
118+ }
119+
120+ function saveSessions ( ) {
121+ localStorage . setItem ( "pollinations_sessions" , JSON . stringify ( sessions ) ) ;
122+ }
123+
124+ function renderSessions ( ) {
125+ sessionListEl . innerHTML = "" ;
126+ sessions . sort ( ( a , b ) => b . lastUpdated - a . lastUpdated ) ;
127+ sessions . forEach ( session => {
128+ const li = document . createElement ( "li" ) ;
129+ li . classList . add ( "session-item" ) ;
130+
131+ const titleSpan = document . createElement ( "span" ) ;
132+ titleSpan . classList . add ( "session-title" ) ;
133+ let displayName = session . name ;
134+ if ( displayName && displayName . startsWith ( "{" ) && displayName . endsWith ( "}" ) ) {
135+ try {
136+ const parsed = JSON . parse ( displayName ) ;
137+ displayName = parsed . response || parsed . chatTitle || displayName ;
138+ } catch ( e ) {
139+ console . error ( "Error parsing session name JSON:" , e ) ;
140+ }
141+ }
142+ titleSpan . textContent = displayName ;
143+
144+ const editBtn = document . createElement ( "button" ) ;
145+ editBtn . classList . add ( "session-edit-btn" ) ;
146+ editBtn . textContent = "✎" ;
147+ editBtn . addEventListener ( "click" , e => {
148+ e . stopPropagation ( ) ;
149+ const newName = prompt ( "Rename session:" , session . name ) ;
150+ if ( newName && newName . trim ( ) !== "" ) {
151+ renameSession ( session . id , newName . trim ( ) ) ;
152+ }
153+ } ) ;
154+ li . appendChild ( titleSpan ) ;
155+ li . appendChild ( editBtn ) ;
156+
157+ const delBtn = document . createElement ( "button" ) ;
158+ delBtn . classList . add ( "session-delete-btn" ) ;
159+ delBtn . textContent = "✕" ;
160+ delBtn . addEventListener ( "click" , e => {
161+ e . stopPropagation ( ) ;
162+ deleteSession ( session . id ) ;
163+ } ) ;
164+ li . appendChild ( delBtn ) ;
165+
166+ li . addEventListener ( "click" , ( ) => {
167+ localStorage . setItem ( "currentSessionId" , session . id ) ;
168+ location . reload ( ) ;
169+ } ) ;
170+
171+ if ( session . id === localStorage . getItem ( "currentSessionId" ) ) {
172+ li . style . backgroundColor = "rgba(255,255,255,0.2)" ;
173+ }
174+
175+ sessionListEl . appendChild ( li ) ;
176+ } ) ;
177+ }
178+ } ) ;
0 commit comments