abdab2fb7e
## Description - Introduces a new engine command execution model that replaces the previous approach of mapping `EngineComponentKey` to React components. Instead, engine commands are now mounted headlessly via `HeadlessEngineCommandMountRoot`, with their execution context populated synchronously before mounting. - Creates new headless command components - Moves error handling from the SDK layer to the host app by wrapping all mounted commands with a new `CommandMenuItemErrorBoundary` The new flow works as follows: - When a command menu item with an `engineComponentKey` is clicked, `useCommandMenuItemFrontComponentCommands` calls `useMountEngineCommand`, which synchronously reads the current context store (object metadata, selected records, filters, view ID, etc.) and writes a `MountedEngineCommandContext` into `mountedEngineCommandsState`. - The command is then mounted into `mountedEngineCommandsState`, which triggers `HeadlessEngineCommandMountRoot` to render the corresponding headless component from `ENGINE_COMPONENT_KEY_HEADLESS_COMPONENT_MAP`, wrapped in `CommandMenuItemErrorBoundary`, `ContextStoreComponentInstanceContext.Provider`, and `EngineCommandComponentInstanceContext.Provider`. - Each command component reads its execution context and delegates to one of the 4 execution patterns: `HeadlessEngineCommandWrapperEffect` (simple actions), `HeadlessConfirmationModalEngineCommandEffect` (destructive actions needing confirmation), `HeadlessNavigateEngineCommand` (GO_TO_* commands), or `HeadlessOpenSidePanelPageEngineCommand` (SEARCH_RECORDS, ASK_AI, VIEW_PREVIOUS_AI_CHATS). - After execution, the command self-unmounts via `useUnmountEngineCommand`, which removes the entry from `mountedEngineCommandsState` and stops rendering the component.
99 lines
5.6 KiB
TypeScript
99 lines
5.6 KiB
TypeScript
import { AgentChatProvider } from '@/ai/components/AgentChatProvider';
|
|
import { ApolloProvider } from '@/apollo/components/ApolloProvider';
|
|
import { CommandMenuConfirmationModalManager } from '@/command-menu-item/confirmation-modal/components/CommandMenuConfirmationModalManager';
|
|
import { MinimalMetadataGater } from '@/metadata-store/components/MinimalMetadataGater';
|
|
import { IsMinimalMetadataReadyEffect } from '@/metadata-store/effect-components/IsMinimalMetadataReadyEffect';
|
|
|
|
import { GotoHotkeysEffectsProvider } from '@/app/effect-components/GotoHotkeysEffectsProvider';
|
|
import { PageChangeEffect } from '@/app/effect-components/PageChangeEffect';
|
|
import { AuthProvider } from '@/auth/components/AuthProvider';
|
|
import { CaptchaProvider } from '@/captcha/components/CaptchaProvider';
|
|
import { ChromeExtensionSidecarEffect } from '@/chrome-extension-sidecar/components/ChromeExtensionSidecarEffect';
|
|
import { ChromeExtensionSidecarProvider } from '@/chrome-extension-sidecar/components/ChromeExtensionSidecarProvider';
|
|
import { ClientConfigProvider } from '@/client-config/components/ClientConfigProvider';
|
|
import { ClientConfigProviderEffect } from '@/client-config/components/ClientConfigProviderEffect';
|
|
import { MainContextStoreProvider } from '@/context-store/components/MainContextStoreProvider';
|
|
import { ErrorMessageEffect } from '@/error-handler/components/ErrorMessageEffect';
|
|
import { PromiseRejectionEffect } from '@/error-handler/components/PromiseRejectionEffect';
|
|
import { MinimalMetadataLoadEffect } from '@/metadata-store/effect-components/MinimalMetadataLoadEffect';
|
|
import { UserMetadataProviderInitialEffect } from '@/metadata-store/effect-components/UserMetadataProviderInitialEffect';
|
|
import { ApolloCoreProvider } from '@/object-metadata/components/ApolloCoreProvider';
|
|
import { PreComputedChipGeneratorsProvider } from '@/object-metadata/components/PreComputedChipGeneratorsProvider';
|
|
|
|
import { HeadlessEngineCommandMountRoot } from '@/command-menu-item/engine-command/components/HeadlessEngineCommandMountRoot';
|
|
import { HeadlessFrontComponentMountRoot } from '@/front-components/components/HeadlessFrontComponentMountRoot';
|
|
import { SSEProvider } from '@/sse-db-event/components/SSEProvider';
|
|
import { SupportChatEffect } from '@/support/components/SupportChatEffect';
|
|
import { DialogManager } from '@/ui/feedback/dialog-manager/components/DialogManager';
|
|
import { DialogComponentInstanceContext } from '@/ui/feedback/dialog-manager/contexts/DialogComponentInstanceContext';
|
|
import { SnackBarProvider } from '@/ui/feedback/snack-bar-manager/components/SnackBarProvider';
|
|
import { GlobalFilePreviewModal } from '@/ui/field/display/components/GlobalFilePreviewModal';
|
|
import { BaseThemeProvider } from '@/ui/theme/components/BaseThemeProvider';
|
|
import { UserThemeProviderEffect } from '@/ui/theme/components/UserThemeProviderEffect';
|
|
import { PageFavicon } from '@/ui/utilities/page-favicon/components/PageFavicon';
|
|
import { PageTitle } from '@/ui/utilities/page-title/components/PageTitle';
|
|
import { WorkspaceProviderEffect } from '@/workspace/components/WorkspaceProviderEffect';
|
|
import { StrictMode } from 'react';
|
|
import { Outlet, useLocation } from 'react-router-dom';
|
|
import { getPageTitleFromPath } from '~/utils/title-utils';
|
|
|
|
export const AppRouterProviders = () => {
|
|
const { pathname } = useLocation();
|
|
const pageTitle = getPageTitleFromPath(pathname);
|
|
|
|
return (
|
|
<ApolloProvider>
|
|
<BaseThemeProvider>
|
|
<ClientConfigProviderEffect />
|
|
<UserMetadataProviderInitialEffect />
|
|
<MinimalMetadataLoadEffect />
|
|
<IsMinimalMetadataReadyEffect />
|
|
<WorkspaceProviderEffect />
|
|
<ClientConfigProvider>
|
|
<CaptchaProvider>
|
|
<ChromeExtensionSidecarEffect />
|
|
<ChromeExtensionSidecarProvider>
|
|
<MinimalMetadataGater>
|
|
<AuthProvider>
|
|
<ApolloCoreProvider>
|
|
<SSEProvider>
|
|
<PreComputedChipGeneratorsProvider>
|
|
<UserThemeProviderEffect />
|
|
<SnackBarProvider>
|
|
<ErrorMessageEffect />
|
|
<AgentChatProvider>
|
|
<DialogComponentInstanceContext.Provider
|
|
value={{ instanceId: 'dialog-manager' }}
|
|
>
|
|
<DialogManager>
|
|
<StrictMode>
|
|
<PromiseRejectionEffect />
|
|
<GotoHotkeysEffectsProvider />
|
|
<PageTitle title={pageTitle} />
|
|
<PageFavicon />
|
|
<Outlet />
|
|
<GlobalFilePreviewModal />
|
|
<CommandMenuConfirmationModalManager />
|
|
<HeadlessFrontComponentMountRoot />
|
|
<HeadlessEngineCommandMountRoot />
|
|
</StrictMode>
|
|
</DialogManager>
|
|
</DialogComponentInstanceContext.Provider>
|
|
</AgentChatProvider>
|
|
</SnackBarProvider>
|
|
<MainContextStoreProvider />
|
|
<SupportChatEffect />
|
|
<PageChangeEffect />
|
|
</PreComputedChipGeneratorsProvider>
|
|
</SSEProvider>
|
|
</ApolloCoreProvider>
|
|
</AuthProvider>
|
|
</MinimalMetadataGater>
|
|
</ChromeExtensionSidecarProvider>
|
|
</CaptchaProvider>
|
|
</ClientConfigProvider>
|
|
</BaseThemeProvider>
|
|
</ApolloProvider>
|
|
);
|
|
};
|