diff --git a/e2e/helpers/board-ui.mjs b/e2e/helpers/board-ui.mjs index 5fd3f55..0ea433e 100644 --- a/e2e/helpers/board-ui.mjs +++ b/e2e/helpers/board-ui.mjs @@ -105,6 +105,30 @@ export async function renameBoard(currentName, nextName) { await waitForBoardVisible(nextName); } +export async function rememberEditorInstance() { + const editorFound = await browser.execute(() => { + const editor = document.querySelector('.excalidraw-frame .excalidraw'); + window.__systemTestEditorInstance = editor; + return editor !== null; + }); + + if (!editorFound) { + throw new Error('Expected the Excalidraw editor to be mounted.'); + } +} + +export async function assertEditorInstancePreserved() { + const editorPreserved = await browser.execute( + () => + window.__systemTestEditorInstance !== null && + window.__systemTestEditorInstance === document.querySelector('.excalidraw-frame .excalidraw'), + ); + + if (!editorPreserved) { + throw new Error('Expected rename to preserve the mounted Excalidraw editor instance.'); + } +} + export async function duplicateBoard(name) { await openBoardMenu(name); diff --git a/e2e/specs/system.e2e.mjs b/e2e/specs/system.e2e.mjs index f7df880..ee2fc59 100644 --- a/e2e/specs/system.e2e.mjs +++ b/e2e/specs/system.e2e.mjs @@ -1,5 +1,6 @@ import { assertActiveBoard, + assertEditorInstancePreserved, assertSidebarCollapsed, assertExportRowHidden, closeSettings, @@ -10,6 +11,7 @@ import { openBoardFromCommandPalette, openSettings, openSettingsFromCommandPalette, + rememberEditorInstance, renameBoard, restartAppSession, selectBoard, @@ -46,6 +48,16 @@ describe('System suite', () => { await waitForBoardVisible(duplicatedName); }); + it('rename: preserves the mounted editor so pending content can still be saved', async () => { + const boardName = uniqueBoardName('Rename Content Board'); + const renamedName = `${boardName} Renamed`; + + await createBoard(boardName); + await rememberEditorInstance(); + await renameBoard(boardName, renamedName); + await assertEditorInstancePreserved(); + }); + it('persistence: keeps created boards after app restart', async () => { const boardName = uniqueBoardName('Persistence Board'); const editedName = `${boardName} Edited`; diff --git a/package.json b/package.json index 42acaf5..32a1215 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@fortawesome/fontawesome-svg-core": "^7.2.0", "@fortawesome/free-solid-svg-icons": "^7.2.0", "@fortawesome/react-fontawesome": "^3.3.0", - "@tauri-apps/api": "^2.10.1", + "@tauri-apps/api": "^2.11.1", "@tauri-apps/plugin-dialog": "^2.7.0", "@tauri-apps/plugin-fs": "^2.5.0", "@tauri-apps/plugin-opener": "^2.5.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a3c3408..28fb421 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,8 +30,8 @@ importers: specifier: ^3.3.0 version: 3.3.0(@fortawesome/fontawesome-svg-core@7.2.0)(react@19.2.5) '@tauri-apps/api': - specifier: ^2.10.1 - version: 2.10.1 + specifier: ^2.11.1 + version: 2.11.1 '@tauri-apps/plugin-dialog': specifier: ^2.7.0 version: 2.7.0 @@ -1115,8 +1115,8 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@tauri-apps/api@2.10.1': - resolution: {integrity: sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw==} + '@tauri-apps/api@2.11.1': + resolution: {integrity: sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==} '@tauri-apps/cli-darwin-arm64@2.10.1': resolution: {integrity: sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ==} @@ -4926,7 +4926,7 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} - '@tauri-apps/api@2.10.1': {} + '@tauri-apps/api@2.11.1': {} '@tauri-apps/cli-darwin-arm64@2.10.1': optional: true @@ -4977,15 +4977,15 @@ snapshots: '@tauri-apps/plugin-dialog@2.7.0': dependencies: - '@tauri-apps/api': 2.10.1 + '@tauri-apps/api': 2.11.1 '@tauri-apps/plugin-fs@2.5.0': dependencies: - '@tauri-apps/api': 2.10.1 + '@tauri-apps/api': 2.11.1 '@tauri-apps/plugin-opener@2.5.3': dependencies: - '@tauri-apps/api': 2.10.1 + '@tauri-apps/api': 2.11.1 '@tootallnate/quickjs-emscripten@0.23.0': {} diff --git a/src/hooks/useBoards.ts b/src/hooks/useBoards.ts index 8469a96..b722ed8 100644 --- a/src/hooks/useBoards.ts +++ b/src/hooks/useBoards.ts @@ -46,10 +46,30 @@ export function useBoards() { }; const renameBoard = async (boardId: string, newName: string): Promise => { - return runAndReload(async () => { - await invoke('rename_board', { boardId, newName }); + try { + const renamedBoard = await invoke('rename_board', { boardId, newName }); + setItems((currentItems) => + currentItems.map((item) => { + if (item.type === 'board') { + return item.id === boardId ? { ...renamedBoard, type: 'board' } : item; + } + + if (!item.items.some((board) => board.id === boardId)) { + return item; + } + + return { + ...item, + items: item.items.map((board) => (board.id === boardId ? renamedBoard : board)), + }; + }), + ); + setError(null); return true; - }, false); + } catch (e) { + setError(String(e)); + return false; + } }; const deleteBoard = async (boardId: string): Promise => {