From fe3ace423c4d4571b2acef4560dc8f32eb8fb246 Mon Sep 17 00:00:00 2001 From: Mathias Jakobsen Date: Tue, 14 Oct 2025 13:07:51 +0100 Subject: [PATCH] Merge pull request #29028 from overleaf/mj-read-only-referencing [web] Stop indexing references locally for read-only users GitOrigin-RevId: ab29fb155de4223d585356d94068c082d89179bb --- .../ide-react/context/references-context.tsx | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/services/web/frontend/js/features/ide-react/context/references-context.tsx b/services/web/frontend/js/features/ide-react/context/references-context.tsx index 133a833be6..a651d9aa16 100644 --- a/services/web/frontend/js/features/ide-react/context/references-context.tsx +++ b/services/web/frontend/js/features/ide-react/context/references-context.tsx @@ -42,7 +42,8 @@ export const ReferencesProvider: FC = ({ children, }) => { const { fileTreeData } = useFileTreeData() - const { eventEmitter, projectId } = useIdeReactContext() + const { eventEmitter, projectId, permissionsLevel, projectJoined } = + useIdeReactContext() const { socket } = useConnectionContext() const { projectSnapshot } = useProjectContext() const { openDocs } = useEditorManagerContext() @@ -82,6 +83,10 @@ export const ReferencesProvider: FC = ({ const indexAllReferencesLocally = useCallback( async (shouldBroadcast: boolean) => { + if (permissionsLevel === 'readOnly') { + // Not going to search the references, so let's not index them. + return + } sendMBOnce('client-side-references-index') abortControllerRef.current?.abort() @@ -115,7 +120,7 @@ export const ReferencesProvider: FC = ({ }) } }, - [projectSnapshot, openDocs, projectId] + [projectSnapshot, openDocs, projectId, permissionsLevel] ) const indexAllReferences = clientSideReferences @@ -175,6 +180,16 @@ export const ReferencesProvider: FC = ({ }, [indexAllReferences]) ) + const doneInitialIndex = useRef(false) + useEffect(() => { + // We wait for projectJoined to ensure that the correct permission level + // has been received and stored on the client. + if (projectJoined && !doneInitialIndex.current) { + doneInitialIndex.current = true + indexAllReferences(false) + } + }, [projectJoined, indexAllReferences]) + useEffect(() => { const handleProjectJoined = () => { // We only need to grab the references when the editor first loads, @@ -192,7 +207,6 @@ export const ReferencesProvider: FC = ({ ) } }) - indexAllReferences(false) } eventEmitter.once('project:joined', handleProjectJoined)