🐛(app-impress) refresh when multiple Blocknote
When multiple blocknote were created, the editor didn't display the content of the selected blocknote but the content of the last blocknote with a new provider. We were actually storing the editor, so if the editor is stored already, we serve it instead of creating a new one.
This commit is contained in:
@@ -134,4 +134,39 @@ test.describe('Pad Editor', () => {
|
|||||||
expect(pdfText).toContain('My template !');
|
expect(pdfText).toContain('My template !');
|
||||||
expect(pdfText).toContain('And my pad !');
|
expect(pdfText).toContain('And my pad !');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('it renders correctly when we switch from one pad to another', async ({
|
||||||
|
page,
|
||||||
|
browserName,
|
||||||
|
}) => {
|
||||||
|
const [firstPad, secondPad] = await createPad(
|
||||||
|
page,
|
||||||
|
'pad-multiple',
|
||||||
|
browserName,
|
||||||
|
2,
|
||||||
|
);
|
||||||
|
|
||||||
|
const panel = page.getByLabel('Pads panel').first();
|
||||||
|
|
||||||
|
// Check the first pad
|
||||||
|
await panel.getByText(firstPad).click();
|
||||||
|
await expect(page.locator('h2').getByText(firstPad)).toBeVisible();
|
||||||
|
await page.locator('.ProseMirror.bn-editor').click();
|
||||||
|
await page.locator('.ProseMirror.bn-editor').fill('Hello World Pad 1');
|
||||||
|
await expect(page.getByText('Hello World Pad 1')).toBeVisible();
|
||||||
|
|
||||||
|
// Check the second pad
|
||||||
|
await panel.getByText(secondPad).click();
|
||||||
|
await expect(page.locator('h2').getByText(secondPad)).toBeVisible();
|
||||||
|
await expect(page.getByText('Hello World Pad 1')).toBeHidden();
|
||||||
|
await page.locator('.ProseMirror.bn-editor').click();
|
||||||
|
await page.locator('.ProseMirror.bn-editor').fill('Hello World Pad 2');
|
||||||
|
await expect(page.getByText('Hello World Pad 2')).toBeVisible();
|
||||||
|
|
||||||
|
// Check the first pad again
|
||||||
|
await panel.getByText(firstPad).click();
|
||||||
|
await expect(page.locator('h2').getByText(firstPad)).toBeVisible();
|
||||||
|
await expect(page.getByText('Hello World Pad 2')).toBeHidden();
|
||||||
|
await expect(page.getByText('Hello World Pad 1')).toBeVisible();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import { BlockNoteView, useCreateBlockNote } from '@blocknote/react';
|
import { BlockNoteEditor as BlockNoteEditorCore } from '@blocknote/core';
|
||||||
|
import { BlockNoteView } from '@blocknote/react';
|
||||||
import '@blocknote/react/style.css';
|
import '@blocknote/react/style.css';
|
||||||
import { Alert, VariantType } from '@openfun/cunningham-react';
|
import { Alert, VariantType } from '@openfun/cunningham-react';
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useMemo } from 'react';
|
||||||
import { WebrtcProvider } from 'y-webrtc';
|
import { WebrtcProvider } from 'y-webrtc';
|
||||||
|
|
||||||
import { Box } from '@/components';
|
import { Box } from '@/components';
|
||||||
@@ -19,19 +20,10 @@ interface BlockNoteEditorProps {
|
|||||||
|
|
||||||
export const BlockNoteEditor = ({ pad }: BlockNoteEditorProps) => {
|
export const BlockNoteEditor = ({ pad }: BlockNoteEditorProps) => {
|
||||||
const { createProvider, padsStore } = usePadStore();
|
const { createProvider, padsStore } = usePadStore();
|
||||||
const [provider, setProvider] = useState<WebrtcProvider>(
|
const provider = padsStore?.[pad.id]?.provider;
|
||||||
padsStore?.[pad.id]?.provider,
|
|
||||||
);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (provider) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setProvider(createProvider(pad.id));
|
|
||||||
}, [createProvider, pad.id, provider]);
|
|
||||||
|
|
||||||
if (!provider) {
|
if (!provider) {
|
||||||
|
createProvider(pad.id);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,18 +37,25 @@ interface BlockNoteContentProps {
|
|||||||
|
|
||||||
export const BlockNoteContent = ({ pad, provider }: BlockNoteContentProps) => {
|
export const BlockNoteContent = ({ pad, provider }: BlockNoteContentProps) => {
|
||||||
const { userData } = useAuthStore();
|
const { userData } = useAuthStore();
|
||||||
const { setEditor } = usePadStore();
|
const { setEditor, padsStore } = usePadStore();
|
||||||
|
|
||||||
const editor = useCreateBlockNote({
|
const storedEditor = padsStore?.[pad.id]?.editor;
|
||||||
collaboration: {
|
const editor = useMemo(() => {
|
||||||
provider,
|
if (storedEditor) {
|
||||||
fragment: provider.doc.getXmlFragment('document-store'),
|
return storedEditor;
|
||||||
user: {
|
}
|
||||||
name: userData?.name || userData?.email || 'Anonymous',
|
|
||||||
color: randomColor(),
|
return BlockNoteEditorCore.create({
|
||||||
|
collaboration: {
|
||||||
|
provider,
|
||||||
|
fragment: provider.doc.getXmlFragment('document-store'),
|
||||||
|
user: {
|
||||||
|
name: userData?.name || userData?.email || 'Anonymous',
|
||||||
|
color: randomColor(),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
});
|
||||||
});
|
}, [provider, storedEditor, userData?.email, userData?.name]);
|
||||||
|
|
||||||
editor.isEditable = pad.abilities.partial_update;
|
editor.isEditable = pad.abilities.partial_update;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user