import { X } from "lucide-react"; import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode, } from "react"; import { createPortal } from "react-dom"; import { useI18n } from "../i18n"; import type { Attachment } from "../types/post"; export type SaveToAlbumMediaKind = "image" | "video"; type SaveToAlbumGuideContextValue = { showSaveToAlbumGuide: (kind: SaveToAlbumMediaKind) => void; }; const SaveToAlbumGuideContext = createContext(null); export function useSaveToAlbumGuide(): SaveToAlbumGuideContextValue { const ctx = useContext(SaveToAlbumGuideContext); if (!ctx) { throw new Error( "useSaveToAlbumGuide must be used within SaveToAlbumGuideProvider", ); } return ctx; } export function mediaSaveKindFromAttachment( attachment: Attachment, ): SaveToAlbumMediaKind | null { if (attachment.kind === "image" || attachment.mime.startsWith("image/")) { return "image"; } if (attachment.kind === "video" || attachment.mime.startsWith("video/")) { return "video"; } return null; } export function mediaSaveKindFromType( type: string | undefined, ): SaveToAlbumMediaKind | null { if (type === "image") return "image"; if (type === "video") return "video"; return null; } type SavePlatform = "ios" | "android" | "desktop"; function detectSavePlatform(): SavePlatform { if (typeof navigator === "undefined") return "desktop"; const ua = navigator.userAgent || ""; if (/android/i.test(ua)) return "android"; if (/iPad|iPhone|iPod/i.test(ua)) return "ios"; if (navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1) { return "ios"; } return "desktop"; } function platformStepKeys(platform: SavePlatform): string[] { if (platform === "ios") { return [ "saveAlbumGuideIosStep1", "saveAlbumGuideIosStep2", "saveAlbumGuideIosStep3", ]; } if (platform === "android") { return [ "saveAlbumGuideAndroidStep1", "saveAlbumGuideAndroidStep2", "saveAlbumGuideAndroidStep3", ]; } return ["saveAlbumGuideDesktopStep1", "saveAlbumGuideDesktopStep2"]; } export function SaveToAlbumGuideProvider({ children, }: { children: ReactNode; }) { const { t } = useI18n(); const [mediaKind, setMediaKind] = useState(null); const platform = useMemo(() => detectSavePlatform(), []); const showSaveToAlbumGuide = useCallback((kind: SaveToAlbumMediaKind) => { setMediaKind(kind); }, []); const close = useCallback(() => setMediaKind(null), []); useEffect(() => { if (!mediaKind) return; const onKey = (event: KeyboardEvent) => { if (event.key === "Escape") close(); }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [close, mediaKind]); const value = useMemo( () => ({ showSaveToAlbumGuide }), [showSaveToAlbumGuide], ); return ( {children} {mediaKind ? createPortal(
event.stopPropagation()} >

{mediaKind === "video" ? t("saveAlbumGuideVideoLabel") : t("saveAlbumGuideImageLabel")}

{t("saveAlbumGuideTitle")}

{t("saveAlbumGuideIntro")}

    {platformStepKeys(platform).map((key, index) => (
  1. {index + 1} {t(key)}
  2. ))}
, document.body, ) : null}
); }