Просмотр исходного кода

Merge pull request #29028 from overleaf/mj-read-only-referencing

[web] Stop indexing references locally for read-only users

GitOrigin-RevId: ab29fb155de4223d585356d94068c082d89179bb
Mathias Jakobsen 10 месяцев назад
Родитель
Сommit
fe3ace423c

+ 17 - 3
services/web/frontend/js/features/ide-react/context/references-context.tsx

@@ -42,7 +42,8 @@ export const ReferencesProvider: FC<React.PropsWithChildren> = ({
   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<React.PropsWithChildren> = ({
 
   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<React.PropsWithChildren> = ({
         })
       }
     },
-    [projectSnapshot, openDocs, projectId]
+    [projectSnapshot, openDocs, projectId, permissionsLevel]
   )
 
   const indexAllReferences = clientSideReferences
@@ -175,6 +180,16 @@ export const ReferencesProvider: FC<React.PropsWithChildren> = ({
     }, [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<React.PropsWithChildren> = ({
           )
         }
       })
-      indexAllReferences(false)
     }
 
     eventEmitter.once('project:joined', handleProjectJoined)