From 3b90549202ca58e63ff6bb576f3d9e2456d9a318 Mon Sep 17 00:00:00 2001 From: taDuc Date: Mon, 15 Jun 2026 21:44:06 +0700 Subject: [PATCH] feat: add onSelect callback to preview interaction hook and reset panels on selection --- src/uhm/components/editor/ReplayPreviewOverlay.tsx | 2 ++ src/uhm/components/preview/PublicPreviewClientPage.tsx | 5 +++++ .../preview/hooks/usePublicPreviewInteraction.ts | 9 ++++++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/uhm/components/editor/ReplayPreviewOverlay.tsx b/src/uhm/components/editor/ReplayPreviewOverlay.tsx index c8c308d..54b20b1 100644 --- a/src/uhm/components/editor/ReplayPreviewOverlay.tsx +++ b/src/uhm/components/editor/ReplayPreviewOverlay.tsx @@ -57,6 +57,8 @@ export default function ReplayPreviewOverlay({ position: "absolute", inset: 0, zIndex: 60, + // Intentional feature: block map interaction during replay preview mode to prevent conflicts/bugs + // Tính năng có chủ ý: chặn tương tác với bản đồ trong lúc chạy replay để tránh lỗi/xung đột pointerEvents: isPreviewMode ? "auto" : "none", }} > diff --git a/src/uhm/components/preview/PublicPreviewClientPage.tsx b/src/uhm/components/preview/PublicPreviewClientPage.tsx index 5882a2b..699cd16 100644 --- a/src/uhm/components/preview/PublicPreviewClientPage.tsx +++ b/src/uhm/components/preview/PublicPreviewClientPage.tsx @@ -275,6 +275,11 @@ export default function PublicPreviewClientPage({ replayActiveWikiId: replayPreview.activeWikiId, replayMode, onWikiLinkNavigate: focusFirstWikiEntityGeometries, + onSelect: useCallback(() => { + setWikiSelectionPanelAnchor(null); + setGeometrySelectionPanel(null); + setRightPanelMode("wiki"); + }, []), }); const handlePanelWikiLinkRequest = useCallback((request: { slug: string; rect: DOMRect }) => { diff --git a/src/uhm/components/preview/hooks/usePublicPreviewInteraction.ts b/src/uhm/components/preview/hooks/usePublicPreviewInteraction.ts index 9d6d450..576acfd 100644 --- a/src/uhm/components/preview/hooks/usePublicPreviewInteraction.ts +++ b/src/uhm/components/preview/hooks/usePublicPreviewInteraction.ts @@ -41,8 +41,9 @@ export function usePublicPreviewInteraction(options: { replayActiveWikiId?: string | null; replayMode?: "idle" | "playing" | "paused"; onWikiLinkNavigate?: (wiki: Wiki) => void | Promise; + onSelect?: () => void; }) { - const { data, relations, setRelations, selectedFeatureIds, setSelectedFeatureIds, timelineYear, replayActiveWikiId, replayMode, onWikiLinkNavigate } = options; + const { data, relations, setRelations, selectedFeatureIds, setSelectedFeatureIds, timelineYear, replayActiveWikiId, replayMode, onWikiLinkNavigate, onSelect } = options; const [activeEntityId, setActiveEntityId] = useState(null); const [activeWikiSlug, setActiveWikiSlug] = useState(null); const [isManualSidebarOpen, setIsManualSidebarOpen] = useState(false); @@ -194,7 +195,8 @@ export function usePublicPreviewInteraction(options: { if (selectOptions?.selectGeometry && selectOptions?.sourceFeatureId != null) { setSelectedFeatureIds([selectOptions.sourceFeatureId]); } - }, [relations.entitiesById, relations.entityWikisById, setRelations, setSelectedFeatureIds, wikiCache]); + onSelect?.(); + }, [relations.entitiesById, relations.entityWikisById, setRelations, setSelectedFeatureIds, wikiCache, onSelect]); const selectWiki = useCallback(async ( wiki: Wiki @@ -224,7 +226,8 @@ export function usePublicPreviewInteraction(options: { setActiveWikiError(null); setLinkEntityPopup(null); setIsManualSidebarOpen(true); - }, [relations.wikiEntityIdsById, selectEntity, wikiCache]); + onSelect?.(); + }, [relations.wikiEntityIdsById, selectEntity, wikiCache, onSelect]); useEffect(() => { if (!selectedFeatureIds.length) {