From 877109be79fab53c69a64687c7b75b3d2f63fd04 Mon Sep 17 00:00:00 2001 From: Nathan Panchout Date: Tue, 30 Jun 2026 15:45:00 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F(frontend)=20drive=20the=20pr?= =?UTF-8?q?esenter=20from=20a=20store=20and=20one=20mount=20point?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move presenter ownership out of DocToolBox into a top-level PresenterRoot driven by a zustand store, lazy-load the overlay and paint a boot cover while the editor boots. Groundwork for the deep-link and present-from-here features (#2466). --- .../docs/doc-header/components/DocToolBox.tsx | 25 ++---- .../components/PresenterRoot.tsx | 86 +++++++++++++++++++ .../src/features/docs/doc-presenter/index.ts | 3 +- .../docs/doc-presenter/stores/index.ts | 1 + .../stores/usePresenterStore.tsx | 23 +++++ .../impress/src/pages/docs/[id]/index.tsx | 2 + 6 files changed, 119 insertions(+), 21 deletions(-) create mode 100644 src/frontend/apps/impress/src/features/docs/doc-presenter/components/PresenterRoot.tsx create mode 100644 src/frontend/apps/impress/src/features/docs/doc-presenter/stores/index.ts create mode 100644 src/frontend/apps/impress/src/features/docs/doc-presenter/stores/usePresenterStore.tsx diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx index d052dcb10..8ad47dda4 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx @@ -32,6 +32,7 @@ import { useDocUtils, useDuplicateDoc, } from '@/docs/doc-management'; +import { usePresenterStore } from '@/docs/doc-presenter/stores'; import { useAuth } from '@/features/auth'; import { useFocusStore, useResponsiveStore } from '@/stores'; @@ -82,14 +83,6 @@ const ModalExport = ) : null; -const PresenterOverlay = dynamic( - () => - import('@/docs/doc-presenter').then((mod) => ({ - default: mod.PresenterOverlay, - })), - { ssr: false }, -); - interface DocToolBoxProps { doc: Doc; } @@ -108,11 +101,13 @@ export const DocToolBox = ({ doc }: DocToolBoxProps) => { const [isModalShareOpen, setIsModalShareOpen] = useState(false); const [isModalHistoryOpen, setIsModalHistoryOpen] = useState(false); const [isModalLeaveOpen, setIsModalLeaveOpen] = useState(false); - const [isPresenterOpen, setIsPresenterOpen] = useState(false); const { restoreFocus, addLastFocus } = useFocusStore(); const { isMobile } = useResponsiveStore(); const copyDocLink = useCopyDocLink(doc.id); + // Deep-link (#2397) and slide/URL sync live in PresenterRoot; here we only + // trigger the manual "Present" action. + const openPresenter = usePresenterStore((state) => state.open); const { mutate: duplicateDoc } = useDuplicateDoc({ onSuccess: (data) => { void router.push(`/docs/${data.id}`); @@ -148,9 +143,7 @@ export const DocToolBox = ({ doc }: DocToolBoxProps) => { label: t('Present'), icon: