import { cn } from "@/commons"; import { Spinner } from "@/components"; import { ArrowLeftIcon, ArrowRightIcon } from "@/components"; import { useRouteContext } from "@tanstack/react-router"; import { open } from "@tauri-apps/plugin-shell"; import useEmblaCarousel from "embla-carousel-react"; import { useCallback, useEffect, useMemo, useState } from "react"; export function Images({ urls }: { urls: string[] }) { const { settings } = useRouteContext({ strict: false }); const [slidesInView, setSlidesInView] = useState([]); const [emblaRef, emblaApi] = useEmblaCarousel({ dragFree: true, align: "start", watchSlides: false, }); const imageUrls = useMemo(() => { if (settings.image_resize_service.length) { let newUrls: string[]; if (urls.length === 1) { newUrls = urls.map( (url) => `${settings.image_resize_service}?url=${url}&ll&af&default=1&n=-1`, ); } else { newUrls = urls.map( (url) => `${settings.image_resize_service}?url=${url}&w=480&h=640&ll&af&default=1&n=-1`, ); } return newUrls; } else { return urls; } }, [settings.image_resize_service]); const scrollPrev = useCallback(() => { if (emblaApi) emblaApi.scrollPrev(); }, [emblaApi]); const scrollNext = useCallback(() => { if (emblaApi) emblaApi.scrollNext(); }, [emblaApi]); const updateSlidesInView = useCallback((emblaApi) => { setSlidesInView((slidesInView) => { if (slidesInView.length === emblaApi.slideNodes().length) { emblaApi.off("slidesInView", updateSlidesInView); } const inView = emblaApi .slidesInView() .filter((index) => !slidesInView.includes(index)); return slidesInView.concat(inView); }); }, []); useEffect(() => { if (emblaApi && urls.length > 1) { updateSlidesInView(emblaApi); emblaApi.on("slidesInView", updateSlidesInView); emblaApi.on("reInit", updateSlidesInView); } return () => { emblaApi?.off("slidesInView", updateSlidesInView); emblaApi?.off("reInit", updateSlidesInView); }; }, [emblaApi, updateSlidesInView]); if (urls.length === 1) { return (