import { appSettings, cn } from "@/commons"; import { Spinner } from "@/components"; import { ArrowLeft, ArrowRight } from "@phosphor-icons/react"; import { useStore } from "@tanstack/react-store"; 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 [slidesInView, setSlidesInView] = useState([]); const [emblaRef, emblaApi] = useEmblaCarousel({ dragFree: true, align: "start", watchSlides: false, }); const service = useStore(appSettings, (state) => state.image_resize_service); const imageUrls = useMemo(() => { if (service?.length) { let newUrls: string[]; if (urls.length === 1) { newUrls = urls.map((url) => { if (url.includes("_next/")) { return url; } if (url.includes("bsky.network")) { return url; } return `${service}?url=${url}&ll&af&default=1&n=-1`; }); } else { newUrls = urls.map( (url) => `${service}?url=${url}&w=480&h=640&ll&af&default=1&n=-1`, ); } return newUrls; } else { return urls; } }, [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 (