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

Writefull refactor bootstrapping (#29306)

GitOrigin-RevId: 6de05eb695579dc08cb5ee6ddf30c243cc2ff86a
Borja 9 месяцев назад
Родитель
Сommit
1a511b14a4

+ 2 - 0
services/web/config/settings.defaults.js

@@ -996,6 +996,8 @@ module.exports = {
     sourceEditorCompletionSources: [],
     sourceEditorCompletionSources: [],
     sourceEditorSymbolPalette: [],
     sourceEditorSymbolPalette: [],
     sourceEditorToolbarComponents: [],
     sourceEditorToolbarComponents: [],
+    sourceEditorToolbarEndButtons: [],
+    rootContextProviders: [],
     mainEditorLayoutModals: [],
     mainEditorLayoutModals: [],
     langFeedbackLinkingWidgets: [],
     langFeedbackLinkingWidgets: [],
     labsExperiments: [],
     labsExperiments: [],

+ 22 - 2
services/web/frontend/js/features/ide-react/context/react-context-root.tsx

@@ -1,4 +1,4 @@
-import React, { FC, PropsWithChildren } from 'react'
+import React, { ElementType, FC, PropsWithChildren } from 'react'
 import { ChatProvider } from '@/features/chat/context/chat-context'
 import { ChatProvider } from '@/features/chat/context/chat-context'
 import { ConnectionProvider } from './connection-context'
 import { ConnectionProvider } from './connection-context'
 import { DetachCompileProvider } from '@/shared/context/detach-compile-context'
 import { DetachCompileProvider } from '@/shared/context/detach-compile-context'
@@ -30,6 +30,12 @@ import { UserFeaturesProvider } from '@/shared/context/user-features-context'
 import { UserSettingsProvider } from '@/shared/context/user-settings-context'
 import { UserSettingsProvider } from '@/shared/context/user-settings-context'
 import { IdeRedesignSwitcherProvider } from './ide-redesign-switcher-context'
 import { IdeRedesignSwitcherProvider } from './ide-redesign-switcher-context'
 import { CommandRegistryProvider } from './command-registry-context'
 import { CommandRegistryProvider } from './command-registry-context'
+import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
+
+const rootContextProviders = importOverleafModules('rootContextProviders') as {
+  import: { default: ElementType }
+  path: string
+}[]
 
 
 export const ReactContextRoot: FC<
 export const ReactContextRoot: FC<
   React.PropsWithChildren<{
   React.PropsWithChildren<{
@@ -71,6 +77,18 @@ export const ReactContextRoot: FC<
     ...providers,
     ...providers,
   }
   }
 
 
+  // Extract dynamic providers from modules
+  const dynamicProviders = rootContextProviders.map(
+    module => module.import.default
+  )
+
+  // Wrap children with all dynamic providers from outside to inside
+  const childrenWrappedWithDynamicProviders =
+    dynamicProviders.reduceRight<React.ReactElement>(
+      (acc, Provider) => <Provider>{acc}</Provider>,
+      <>{children}</>
+    )
+
   return (
   return (
     <Providers.SplitTestProvider>
     <Providers.SplitTestProvider>
       <Providers.ModalsContextProvider>
       <Providers.ModalsContextProvider>
@@ -103,7 +121,9 @@ export const ReactContextRoot: FC<
                                                             <Providers.OutlineProvider>
                                                             <Providers.OutlineProvider>
                                                               <Providers.IdeRedesignSwitcherProvider>
                                                               <Providers.IdeRedesignSwitcherProvider>
                                                                 <Providers.CommandRegistryProvider>
                                                                 <Providers.CommandRegistryProvider>
-                                                                  {children}
+                                                                  {
+                                                                    childrenWrappedWithDynamicProviders
+                                                                  }
                                                                 </Providers.CommandRegistryProvider>
                                                                 </Providers.CommandRegistryProvider>
                                                               </Providers.IdeRedesignSwitcherProvider>
                                                               </Providers.IdeRedesignSwitcherProvider>
                                                             </Providers.OutlineProvider>
                                                             </Providers.OutlineProvider>

+ 9 - 0
services/web/frontend/js/features/source-editor/components/codemirror-toolbar.tsx

@@ -40,6 +40,10 @@ const sourceEditorToolbarComponents = importOverleafModules(
   'sourceEditorToolbarComponents'
   'sourceEditorToolbarComponents'
 ) as { import: { default: ElementType }; path: string }[]
 ) as { import: { default: ElementType }; path: string }[]
 
 
+const sourceEditorToolbarEndButtons = importOverleafModules(
+  'sourceEditorToolbarEndButtons'
+) as { import: { default: ElementType }; path: string }[]
+
 export const CodeMirrorToolbar = () => {
 export const CodeMirrorToolbar = () => {
   const view = useCodeMirrorViewContext()
   const view = useCodeMirrorViewContext()
   const panel = getPanel(view, createToolbarPanel)
   const panel = getPanel(view, createToolbarPanel)
@@ -204,6 +208,11 @@ const Toolbar = memo(function Toolbar() {
             className="ol-cm-toolbar-button-group ol-cm-toolbar-end"
             className="ol-cm-toolbar-button-group ol-cm-toolbar-end"
             ref={handleButtons}
             ref={handleButtons}
           >
           >
+            {sourceEditorToolbarEndButtons.map(
+              ({ import: { default: Component }, path }) => (
+                <Component key={path} />
+              )
+            )}
             <ToggleSearchButton state={state} />
             <ToggleSearchButton state={state} />
             <SwitchToPDFButton />
             <SwitchToPDFButton />
             <DetacherSynctexControl />
             <DetacherSynctexControl />

+ 0 - 1
services/web/frontend/js/shared/context/types/writefull-instance.ts

@@ -7,7 +7,6 @@ export interface WritefullEvents {
 }
 }
 
 
 export interface WritefullAPI {
 export interface WritefullAPI {
-  init(): void
   addEventListener<eventName extends keyof WritefullEvents>(
   addEventListener<eventName extends keyof WritefullEvents>(
     name: eventName,
     name: eventName,
     callback: (detail: WritefullEvents[eventName]) => void
     callback: (detail: WritefullEvents[eventName]) => void