"""localStorage integration for Gradio via JavaScript injection. Provides JavaScript code that syncs session state with browser localStorage. """ # localStorage keys STORAGE_KEY_SESSION = "fdam_current_session" STORAGE_KEY_HISTORY = "fdam_assessment_history" STORAGE_KEY_IMAGES = "fdam_image_refs" # References only, not actual bytes # JavaScript code for localStorage operations LOCALSTORAGE_JS = """ """ # JavaScript functions for Gradio event handlers JS_SAVE_SESSION = """ async (sessionJson) => { if (window.fdamStorage) { window.fdamStorage.saveSession(sessionJson); } return sessionJson; } """ JS_LOAD_SESSION = """ async () => { if (window.fdamStorage) { return window.fdamStorage.loadSession() || '{}'; } return '{}'; } """ JS_SAVE_HISTORY = """ async (historyJson) => { if (window.fdamStorage) { window.fdamStorage.saveHistory(historyJson); } return historyJson; } """ JS_LOAD_HISTORY = """ async () => { if (window.fdamStorage) { return window.fdamStorage.loadHistory() || '{"assessments":[],"current_session_id":null}'; } return '{"assessments":[],"current_session_id":null}'; } """ # JavaScript to auto-load session on page load JS_AUTO_LOAD = """ async () => { // Small delay to ensure Gradio is fully loaded await new Promise(resolve => setTimeout(resolve, 500)); if (window.fdamStorage) { const session = window.fdamStorage.loadSession(); const history = window.fdamStorage.loadHistory(); return [session || '{}', history || '{"assessments":[],"current_session_id":null}']; } return ['{}', '{"assessments":[],"current_session_id":null}']; } """ def get_head_html(additional_scripts: str = "") -> str: """Get HTML to inject into Gradio head for localStorage support. Args: additional_scripts: Optional additional HTML/JS to include. Returns: Combined HTML string for head injection. """ return LOCALSTORAGE_JS + additional_scripts def create_save_trigger_js(field_updates: dict[str, str]) -> str: """Create JavaScript that triggers save after field updates. Args: field_updates: Mapping of field name to value expression Returns: JavaScript code string """ updates = ", ".join(f'"{k}": {v}' for k, v in field_updates.items()) return f""" async (currentSession, ...values) => {{ try {{ const session = JSON.parse(currentSession || '{{}}'); const updates = {{ {updates} }}; Object.assign(session, updates); session.updated_at = new Date().toISOString(); const newSession = JSON.stringify(session); if (window.fdamStorage) {{ window.fdamStorage.saveSession(newSession); }} return newSession; }} catch (e) {{ console.error('[FDAM] Save trigger error:', e); return currentSession; }} }} """