diff --git a/.vscode/settings.json b/.vscode/settings.json index de6ec333..ca76c952 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,3 @@ { - "cSpell.words": [ - "drawnix" - ] -} \ No newline at end of file + "cSpell.words": ["drawnix"] +} diff --git a/apps/web/src/app/app.tsx b/apps/web/src/app/app.tsx index 662bc74e..f5aa73d0 100644 --- a/apps/web/src/app/app.tsx +++ b/apps/web/src/app/app.tsx @@ -1,8 +1,17 @@ import { useState, useEffect } from 'react'; import { initializeData } from './initialize-data'; import { Drawnix } from '@drawnix/drawnix'; -import { PlaitBoard, PlaitElement, PlaitTheme, Viewport } from '@plait/core'; +import { + PlaitBoard, + PlaitElement, + PlaitTheme, + Viewport, + ThemeColorMode, + BoardTransforms, +} from '@plait/core'; +import { BoardChangeData } from '@plait-board/react-board'; import localforage from 'localforage'; +import { loadThemeFromStorage, saveThemeToStorage } from '@drawnix/drawnix'; // 1个月后移出删除兼容 const OLD_DRAWNIX_LOCAL_DATA_KEY = 'drawnix-local-data'; @@ -23,20 +32,42 @@ export function App() { useEffect(() => { const loadData = async () => { + // Load saved theme from localStorage + const savedTheme = loadThemeFromStorage(); + const storedData = await localforage.getItem(MAIN_BOARD_CONTENT_KEY); if (storedData) { - setValue(storedData as any); + const data = storedData as any; + // Always use theme from localStorage, not from stored data + setValue({ + children: data.children, + viewport: data.viewport, + theme: { themeColorMode: savedTheme || ThemeColorMode.default }, + }); return; } const localData = localStorage.getItem(OLD_DRAWNIX_LOCAL_DATA_KEY); if (localData) { const parsedData = JSON.parse(localData); - setValue(parsedData); - await localforage.setItem(MAIN_BOARD_CONTENT_KEY, parsedData); + // Use theme from localStorage, not from old data + setValue({ + children: parsedData.children, + viewport: parsedData.viewport, + theme: { themeColorMode: savedTheme || ThemeColorMode.default }, + }); + // Save only children and viewport to new storage + await localforage.setItem(MAIN_BOARD_CONTENT_KEY, { + children: parsedData.children, + viewport: parsedData.viewport, + }); localStorage.removeItem(OLD_DRAWNIX_LOCAL_DATA_KEY); return; } - setValue({ children: initializeData }); + // For new users, use saved theme or default + setValue({ + children: initializeData, + theme: { themeColorMode: savedTheme || ThemeColorMode.default }, + }); }; loadData(); @@ -46,11 +77,37 @@ export function App() { value={value.children} viewport={value.viewport} theme={value.theme} - onChange={(value) => { - localforage.setItem(MAIN_BOARD_CONTENT_KEY, value); + //@ts-ignore + onChange={(boardData: BoardChangeData) => { + // Save theme to localStorage when it changes + if (boardData.theme?.themeColorMode) { + saveThemeToStorage(boardData.theme.themeColorMode); + } + + // Don't save theme to localforage - only save content and viewport + const newValue = { + children: boardData.children, + viewport: boardData.viewport, + theme: boardData.theme, // Keep for state but don't persist + }; + setValue(newValue); + + // Only save children and viewport to localforage, not theme + localforage.setItem(MAIN_BOARD_CONTENT_KEY, { + children: boardData.children, + viewport: boardData.viewport, + }); }} afterInit={(board) => { console.log('board initialized'); + + // Ensure the saved theme is applied after board initialization + const savedTheme = loadThemeFromStorage(); + if (savedTheme && board.theme.themeColorMode !== savedTheme) { + console.log('Applying saved theme after board init:', savedTheme); + BoardTransforms.updateThemeColor(board, savedTheme); + } + console.log( `add __drawnix__web__debug_log to window, so you can call add log anywhere, like: window.__drawnix__web__console('some thing')` ); diff --git a/packages/drawnix/src/components/toolbar/app-toolbar/app-menu-items.tsx b/packages/drawnix/src/components/toolbar/app-toolbar/app-menu-items.tsx index ccdcb6ef..f0c88812 100644 --- a/packages/drawnix/src/components/toolbar/app-toolbar/app-menu-items.tsx +++ b/packages/drawnix/src/components/toolbar/app-toolbar/app-menu-items.tsx @@ -63,7 +63,7 @@ export const OpenFile = () => { data-testid="open-button" onSelect={() => { loadFromJSON(board).then((data) => { - clearAndLoad(data.elements, data.viewport); + clearAndLoad(data.elements, data.viewport, data.theme); }); }} icon={OpenFileIcon} @@ -84,13 +84,15 @@ export const SaveAsImage = () => { saveAsImage(board, true); }} submenu={ - { - const itemSelectEvent = new CustomEvent(EVENT.MENU_ITEM_SELECT, { - bubbles: true, - cancelable: true, - }); - menuContentProps.onSelect?.(itemSelectEvent); - }}> + { + const itemSelectEvent = new CustomEvent(EVENT.MENU_ITEM_SELECT, { + bubbles: true, + cancelable: true, + }); + menuContentProps.onSelect?.(itemSelectEvent); + }} + > { saveAsImage(board, true); diff --git a/packages/drawnix/src/components/toolbar/creation-toolbar.tsx b/packages/drawnix/src/components/toolbar/creation-toolbar.tsx index 334c05bc..f73ba7b9 100644 --- a/packages/drawnix/src/components/toolbar/creation-toolbar.tsx +++ b/packages/drawnix/src/components/toolbar/creation-toolbar.tsx @@ -1,3 +1,4 @@ +import React from 'react'; import classNames from 'classnames'; import { Island } from '../island'; import Stack from '../stack'; @@ -156,7 +157,7 @@ export const CreationToolbar = () => { {BUTTONS.map((button, index) => { if (appState.isMobile && button.pointer === PlaitPointerType.hand) { - return <>; + return ; } if (button.key === PopupKey.shape) { return ( diff --git a/packages/drawnix/src/components/toolbar/theme-toolbar.tsx b/packages/drawnix/src/components/toolbar/theme-toolbar.tsx index 5389d329..71d9b524 100644 --- a/packages/drawnix/src/components/toolbar/theme-toolbar.tsx +++ b/packages/drawnix/src/components/toolbar/theme-toolbar.tsx @@ -17,8 +17,8 @@ export const ThemeToolbar = () => { >