From d1fdfb140cc440664f77a24886172f9976a05a31 Mon Sep 17 00:00:00 2001 From: soryu Date: Tue, 28 Apr 2026 19:12:52 +0100 Subject: feat: revert broken directive PRs, re-implement Lexical document orchestrator (#98) * feat: soryu-co/soryu - makima: Revert broken directive PRs and verify clean build * feat: soryu-co/soryu - makima: Re-implement frontend: Lexical document editor with feature flag and base components * WIP: heartbeat checkpoint * feat: soryu-co/soryu - makima: Add contract blocks, expandable log rows, and interaction controls * WIP: heartbeat checkpoint * feat: soryu-co/soryu - makima: End-to-end build verification and integration polish --- frontend/src/stores/index.ts | 58 +++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 22 deletions(-) (limited to 'frontend/src/stores') diff --git a/frontend/src/stores/index.ts b/frontend/src/stores/index.ts index e247068..1853f4f 100644 --- a/frontend/src/stores/index.ts +++ b/frontend/src/stores/index.ts @@ -1,5 +1,29 @@ import { atom } from 'nanostores' import { ChatMessage, Choice } from '../types' +import { upsertUserSetting } from '../services/directiveApi' + +// Document UI feature flag +export const documentUiEnabledStore = atom( + (() => { + try { + const saved = localStorage.getItem('document_ui_enabled') + return saved === 'true' + } catch { + return false + } + })() +) + +export const setDocumentUiEnabled = async (enabled: boolean) => { + documentUiEnabledStore.set(enabled) + localStorage.setItem('document_ui_enabled', enabled.toString()) + // Persist to backend (best-effort) + try { + await upsertUserSetting('document_ui_enabled', enabled) + } catch (err) { + console.error('Failed to persist document UI setting:', err) + } +} // Authentication state export const isLoggedInStore = atom(false) @@ -29,36 +53,21 @@ export const nameStore = atom('???') export const backgroundStore = atom('/__gaogao__56242cbde8f18ac64522e410bad04e68_waifu2x_art_noise2.png') export const locationStore = atom('Tokyo') export const configModalOpenStore = atom(false) -export const skipIntroStore = atom( + +// Feature flags +export const documentEditorEnabledStore = atom( (() => { - const saved = localStorage.getItem('skipIntro') + const saved = localStorage.getItem('documentEditorEnabled') return saved === 'true' })() ) - -// Document UI feature flag -export const documentUiEnabledStore = atom( +export const skipIntroStore = atom( (() => { - try { - const saved = localStorage.getItem('document_ui_enabled') - return saved === 'true' - } catch { - return false - } + const saved = localStorage.getItem('skipIntro') + return saved === 'true' })() ) -export const setDocumentUiEnabled = (enabled: boolean) => { - documentUiEnabledStore.set(enabled) - localStorage.setItem('document_ui_enabled', JSON.stringify(enabled)) - // Persist to backend (fire-and-forget) - fetch('/api/v1/user-settings', { - method: 'PUT', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ key: 'document_ui_enabled', value: enabled }), - }).catch((err) => console.error('Failed to persist document_ui_enabled:', err)) -} - // Actions export const login = () => { isLoggedInStore.set(true) @@ -109,6 +118,11 @@ export const setSkipIntro = (skip: boolean) => { localStorage.setItem('skipIntro', skip.toString()) } +export const setDocumentEditorEnabled = (enabled: boolean) => { + documentEditorEnabledStore.set(enabled) + localStorage.setItem('documentEditorEnabled', enabled.toString()) +} + export const setLoadingComplete = (complete: boolean) => { loadingCompleteStore.set(complete) if (complete) { -- cgit v1.2.3