From c8e27a5a97e197e02dabbd5853ea0990219c3a69 Mon Sep 17 00:00:00 2001 From: matthewlipski Date: Tue, 4 Mar 2025 12:40:04 +0100 Subject: [PATCH] Fixed flaky test and implemented comments feedback --- packages/core/src/editor/BlockNoteEditor.ts | 5 +++++ .../Comments/FloatingComposerController.tsx | 4 +++- tests/package.json | 2 +- tests/src/end-to-end/theming/theming.test.ts | 4 ++-- .../dark-link-toolbar-webkit-linux.png | Bin 19746 -> 30770 bytes 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/core/src/editor/BlockNoteEditor.ts b/packages/core/src/editor/BlockNoteEditor.ts index 980cc0cc4c..6481c71b2f 100644 --- a/packages/core/src/editor/BlockNoteEditor.ts +++ b/packages/core/src/editor/BlockNoteEditor.ts @@ -1426,6 +1426,11 @@ export class BlockNoteEditor< ); } + // `forceSelectionVisible` determines whether the editor selection is shows + // even when the editor is not focused. This is useful for e.g. creating new + // links, so the user still sees the affected content when an input field is + // focused. + // TODO: Reconsider naming? public getForceSelectionVisible() { return this.showSelectionPlugin.getEnabled(); } diff --git a/packages/react/src/components/Comments/FloatingComposerController.tsx b/packages/react/src/components/Comments/FloatingComposerController.tsx index a89626d43b..307218ab6d 100644 --- a/packages/react/src/components/Comments/FloatingComposerController.tsx +++ b/packages/react/src/components/Comments/FloatingComposerController.tsx @@ -33,9 +33,11 @@ export const FloatingComposerController = < const comments = editor.comments; useEffect(() => { - comments.onUpdate((state) => + const offUpdate = comments.onUpdate((state) => editor.setForceSelectionVisible(state.pendingComment) ); + + return () => offUpdate(); }, [comments, editor]); const state = useUIPluginState(comments.onUpdate.bind(comments)); diff --git a/tests/package.json b/tests/package.json index 8dc072f213..9c8ac9504e 100644 --- a/tests/package.json +++ b/tests/package.json @@ -5,7 +5,7 @@ "scripts": { "build": "tsc", "lint": "eslint src --max-warnings 0", - "playwright": "npx playwright test", + "playwright": "npx playwright test --ui", "playwright:ui": "npx playwright test --ui", "test:updateSnaps": "docker run --rm -e RUN_IN_DOCKER=true --network host -v $(pwd)/..:/work/ -w /work/tests -it mcr.microsoft.com/playwright:v1.49.1-noble npx playwright test -u", "test-ct": "playwright test -c playwright-ct.config.ts --headed", diff --git a/tests/src/end-to-end/theming/theming.test.ts b/tests/src/end-to-end/theming/theming.test.ts index bf8c3d1e5b..855ad0329e 100644 --- a/tests/src/end-to-end/theming/theming.test.ts +++ b/tests/src/end-to-end/theming/theming.test.ts @@ -43,13 +43,13 @@ test.describe("Check Dark Theme is Automatically Applied", () => { await page.waitForSelector(LINK_BUTTON_SELECTOR); await page.click(LINK_BUTTON_SELECTOR); + await page.waitForTimeout(500); await page.keyboard.type("link"); await page.keyboard.press("Enter"); await page.keyboard.press("ArrowLeft"); await page.waitForTimeout(500); - // expect(await page.screenshot()).toMatchSnapshot("dark-link-toolbar.png"); - expect(Date.now() < new Date('2025-03-04').getTime()).toBeTruthy(); + expect(await page.screenshot()).toMatchSnapshot("dark-link-toolbar.png"); }); test("Should show dark slash menu", async ({ page }) => { await focusOnEditor(page); diff --git a/tests/src/end-to-end/theming/theming.test.ts-snapshots/dark-link-toolbar-webkit-linux.png b/tests/src/end-to-end/theming/theming.test.ts-snapshots/dark-link-toolbar-webkit-linux.png index 36f81a1544a4b7c22ceb53d7a5ced39f5e8c6c6d..01230b637b360b3517cb71760fe65af8aaba33d7 100644 GIT binary patch literal 30770 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 literal 19746 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