diff --git a/app/scenes/Document/components/MultiplayerEditor.tsx b/app/scenes/Document/components/MultiplayerEditor.tsx index 91591daa5..342756781 100644 --- a/app/scenes/Document/components/MultiplayerEditor.tsx +++ b/app/scenes/Document/components/MultiplayerEditor.tsx @@ -107,13 +107,11 @@ function MultiplayerEditor({ onSynced, ...props }: Props, ref: any) { presence.updateFromAwarenessChangeEvent(documentId, event); event.states.forEach(({ user, scrollY }) => { - if (user) { - if (scrollY !== undefined && user.id === ui.observingUserId) { - window.scrollTo({ - top: scrollY * window.innerHeight, - behavior: "smooth", - }); - } + if (scrollY !== undefined && user?.id === ui.observingUserId) { + window.scrollTo({ + top: scrollY * window.innerHeight, + behavior: "smooth", + }); } }); }); diff --git a/app/stores/DocumentPresenceStore.ts b/app/stores/DocumentPresenceStore.ts index 8e18e32f7..941fbd111 100644 --- a/app/stores/DocumentPresenceStore.ts +++ b/app/stores/DocumentPresenceStore.ts @@ -38,8 +38,10 @@ export default class PresenceStore { event.states.forEach((state) => { const { user, cursor } = state; - this.update(documentId, user.id, !!cursor); - existingUserIds = existingUserIds.filter((id) => id !== user.id); + if (user) { + this.update(documentId, user.id, !!cursor); + existingUserIds = existingUserIds.filter((id) => id !== user.id); + } }); existingUserIds.forEach((userId) => { diff --git a/app/types.ts b/app/types.ts index b134a8471..8f617a2da 100644 --- a/app/types.ts +++ b/app/types.ts @@ -204,5 +204,5 @@ export type WebsocketEvent = | WebsocketEntitiesEvent; export type AwarenessChangeEvent = { - states: { user: { id: string }; cursor: any; scrollY: number | undefined }[]; + states: { user?: { id: string }; cursor: any; scrollY: number | undefined }[]; };