From 9caf5d8b559deda18f5654b248d834b007520b44 Mon Sep 17 00:00:00 2001 From: Cody Olsen <81981+stipsan@users.noreply.github.com> Date: Thu, 23 Jan 2025 12:24:45 +0100 Subject: [PATCH] fix(presentation): perspective switching regression (#8383) --- .../src/presentation/preview/Preview.tsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/sanity/src/presentation/preview/Preview.tsx b/packages/sanity/src/presentation/preview/Preview.tsx index 81837f8df87..ceb8b3f3826 100644 --- a/packages/sanity/src/presentation/preview/Preview.tsx +++ b/packages/sanity/src/presentation/preview/Preview.tsx @@ -82,11 +82,13 @@ export const Preview = memo( vercelProtectionBypass, } = props + const [stablePerspective, setStablePerspective] = useState(null) + const urlPerspective = stablePerspective === null ? perspective : stablePerspective const previewUrl = useMemo(() => { const url = new URL(initialUrl) // Always set the perspective that's being used, even if preview mode isn't configured if (!url.searchParams.get(urlSearchParamPreviewPerspective)) { - url.searchParams.set(urlSearchParamPreviewPerspective, perspective) + url.searchParams.set(urlSearchParamPreviewPerspective, urlPerspective) } if (vercelProtectionBypass || url.searchParams.get(urlSearchParamVercelProtectionBypass)) { @@ -102,7 +104,19 @@ export const Preview = memo( } return url - }, [initialUrl, perspective, vercelProtectionBypass]) + }, [initialUrl, urlPerspective, vercelProtectionBypass]) + + useEffect(() => { + /** + * If the preview iframe is connected to the loader, we know that switching the perspective can be done without reloading the iframe. + */ + if (loadersConnection === 'connected') { + /** + * Only set the stable perspective if it hasn't been set yet. + */ + setStablePerspective((prev) => (prev === null ? perspective : prev)) + } + }, [loadersConnection, perspective]) const {t} = useTranslation(presentationLocaleNamespace) const {devMode} = usePresentationTool()