"use client"; /** * FullscreenImageViewer 全屏图片查看器 * * 原始 Dart: lib/ui/chat/widgets/fullscreen_image_viewer.dart(76 行) * * 行为: * - 全屏黑色背景 + 图片居中(contain) * - 点击空白 / 下滑手势 → 关闭 * - 双指缩放(CSS `touch-action: pinch-zoom`) */ import { ChevronLeft } from "lucide-react"; import Image from "next/image"; import { useEffect } from "react"; import styles from "./fullscreen-image-viewer.module.css"; export interface FullscreenImageViewerProps { imageUrl: string; imagePaywalled?: boolean; onUnlockImagePaywall?: () => void; onClose: () => void; } export function FullscreenImageViewer({ imageUrl, imagePaywalled = false, onUnlockImagePaywall, onClose, }: FullscreenImageViewerProps) { useEffect(() => { const handleKey = (e: KeyboardEvent) => { if (e.key === "Escape") onClose(); }; document.addEventListener("keydown", handleKey); return () => document.removeEventListener("keydown", handleKey); }, [onClose]); const src = imageUrl.startsWith("data:") || imageUrl.startsWith("http") ? imageUrl : `data:image/png;base64,${imageUrl}`; if (imagePaywalled) { return (
); } return (
{ (e.currentTarget as HTMLImageElement).style.display = "none"; (e.currentTarget.parentElement as HTMLElement).innerHTML = '
🖼
'; }} />
); }