Skip to content

Commit 1374e90

Browse files
committed
🐛(frontend) fix lost content during sync
The tests e2e highlighted a problem where content was lost during synchronization. This bug started to occurs after upgrading Blocknote to 0.41.1 version. It seems to happen only when the initial document is empty and 2 users are collaborating, so before the first minute. We now initialize the editor only when the y-doc has attempted to sync. This should ensure that all updates are applied before the editor is initialized.
1 parent 4ce699a commit 1374e90

File tree

3 files changed

+8
-6
lines changed

3 files changed

+8
-6
lines changed

src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteEditor.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,9 @@ export const BlockNoteEditor = ({ doc, provider }: BlockNoteEditorProps) => {
8383
const { user } = useAuth();
8484
const { setEditor } = useEditorStore();
8585
const { t } = useTranslation();
86-
const { isSynced } = useProviderStore();
86+
const { isSynced: isConnectedToCollabServer } = useProviderStore();
8787

8888
const { isEditable, isLoading } = useIsCollaborativeEditable(doc);
89-
const isConnectedToCollabServer = isSynced;
9089
const readOnly = !doc.abilities.partial_update || !isEditable || isLoading;
9190
const isDeletedDoc = !!doc.deleted_at;
9291

src/frontend/apps/impress/src/features/docs/doc-editor/components/DocEditor.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ interface DocEditorProps {
2525
export const DocEditor = ({ doc, versionId }: DocEditorProps) => {
2626
const { isDesktop } = useResponsiveStore();
2727
const isVersion = !!versionId && typeof versionId === 'string';
28-
const { provider } = useProviderStore();
28+
const { provider, isReady } = useProviderStore();
2929

3030
// TODO: Use skeleton instead of loading
31-
if (!provider) {
31+
if (!provider || !isReady) {
3232
return <Loading />;
3333
}
3434

src/frontend/apps/impress/src/features/docs/doc-management/stores/useProviderStore.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export interface UseCollaborationStore {
1313
destroyProvider: () => void;
1414
provider: HocuspocusProvider | undefined;
1515
isConnected: boolean;
16+
isReady: boolean;
1617
isSynced: boolean;
1718
hasLostConnection: boolean;
1819
resetLostConnection: () => void;
@@ -21,6 +22,7 @@ export interface UseCollaborationStore {
2122
const defaultValues = {
2223
provider: undefined,
2324
isConnected: false,
25+
isReady: false,
2426
isSynced: false,
2527
hasLostConnection: false,
2628
};
@@ -45,14 +47,15 @@ export const useProviderStore = create<UseCollaborationStore>((set, get) => ({
4547
onDisconnect(data) {
4648
// Attempt to reconnect if the disconnection was clean (initiated by the client or server)
4749
if ((data.event as ExtendedCloseEvent).wasClean) {
48-
provider.connect();
50+
void provider.connect();
4951
}
5052
},
5153
onStatus: ({ status }) => {
5254
set((state) => {
5355
const nextConnected = status === WebSocketStatus.Connected;
5456
return {
5557
isConnected: nextConnected,
58+
isReady: state.isReady || status === WebSocketStatus.Disconnected,
5659
hasLostConnection:
5760
state.isConnected && !nextConnected
5861
? true
@@ -61,7 +64,7 @@ export const useProviderStore = create<UseCollaborationStore>((set, get) => ({
6164
});
6265
},
6366
onSynced: ({ state }) => {
64-
set({ isSynced: state });
67+
set({ isSynced: state, isReady: true });
6568
},
6669
onClose(data) {
6770
/**

0 commit comments

Comments
 (0)