From aa20901559d63756274fd5f30ac281057226964c Mon Sep 17 00:00:00 2001 From: Salihu Date: Sun, 23 Aug 2026 22:15:25 +0100 Subject: [PATCH] load page media more accurately --- .../components/common/lightbox-view.tsx | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/apps/client/src/features/editor/components/common/lightbox-view.tsx b/apps/client/src/features/editor/components/common/lightbox-view.tsx index df8369c86..738d49892 100644 --- a/apps/client/src/features/editor/components/common/lightbox-view.tsx +++ b/apps/client/src/features/editor/components/common/lightbox-view.tsx @@ -8,7 +8,7 @@ import Download from "yet-another-react-lightbox/plugins/download"; import Fullscreen from "yet-another-react-lightbox/plugins/fullscreen"; import Video from "yet-another-react-lightbox/plugins/video"; import Zoom from "yet-another-react-lightbox/plugins/zoom"; -import { useMemo } from "react"; +import { useEffect, useMemo, useState } from "react"; import i18n from "@/i18n.ts"; import { useTranslation } from "react-i18next"; @@ -95,12 +95,37 @@ export default function LightboxView({ }: LightboxViewProps) { const { i18n: i18nInstance } = useTranslation(); - const slides = useMemo( - () => getPageMedia(editor), - [editor, open, i18nInstance.language] + const selectedSlide = useMemo( + () => getMedia(src, type), + [src, type, i18nInstance.language] ); + const [pageSlides, setPageSlides] = useState([]); + const [loadedMediaKey, setLoadedMediaKey] = useState(null); + + + useEffect(() => { + if (!open) return; + + setLoadedMediaKey(null); + + const frame = requestAnimationFrame(() => { + const slides = getPageMedia(editor); + + setPageSlides(slides); + setLoadedMediaKey(`${type}:${src}`); + }); + + return () => cancelAnimationFrame(frame); + }, [editor, open, type, src]); + + const slides = loadedMediaKey === `${type}:${src}` ? pageSlides : [selectedSlide]; + const index = useMemo(() => { + if (!(pageSlides.length > 0)) { + return 0; + } + const idx = slides.findIndex((slide) => type === "video" ? "sources" in slide && slide.sources.some((s) => s.src === src) @@ -113,7 +138,7 @@ export default function LightboxView({ = 0 ? index : 0} + index={index} slides={slides} plugins={[Captions, Download, Fullscreen, Video, Zoom]} captions={{ descriptionTextAlign: "center" }}