import { useState } from 'react'; import { X, Minimize2, Trash2, Edit2, Check, Layers } from 'lucide-react'; import { useMeme, useDeleteMeme, useUpdateMeme } from '../hooks/useMemes'; import { useAuth } from '../hooks/useAuth'; import { SharePanel } from './SharePanel'; import { RescaleModal } from './RescaleModal'; import { api, type Meme } from '../api/client'; interface Props { memeId: string; onClose: () => void; } function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; return `${(bytes / 1024 / 1024).toFixed(1)} MB`; } function formatDate(iso: string): string { return new Date(iso).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', }); } export function MemeDetail({ memeId, onClose }: Props) { const { data, isLoading, refetch } = useMeme(memeId); const deleteMeme = useDeleteMeme(); const updateMeme = useUpdateMeme(); const { data: auth } = useAuth(); const isAdmin = auth?.authenticated === true; const [editing, setEditing] = useState(false); const [editTitle, setEditTitle] = useState(''); const [editDesc, setEditDesc] = useState(''); const [editTags, setEditTags] = useState(''); const [showRescale, setShowRescale] = useState(false); const [activeChild, setActiveChild] = useState(null); const meme = data; const displayMeme = activeChild ?? meme; function startEdit() { if (!meme) return; setEditTitle(meme.title); setEditDesc(meme.description ?? ''); setEditTags(meme.tags.join(', ')); setEditing(true); } async function saveEdit() { if (!meme) return; await updateMeme.mutateAsync({ id: meme.id, title: editTitle, description: editDesc || undefined, tags: editTags.split(',').map((t) => t.trim()).filter(Boolean), }); setEditing(false); } async function handleDelete() { if (!meme) return; if (!confirm(`Delete "${meme.title}"? This also removes all rescaled copies.`)) return; await deleteMeme.mutateAsync(meme.id); onClose(); } if (isLoading) { return (
); } if (!meme) return null; return ( <>
{/* Header */}
{editing ? ( setEditTitle(e.target.value)} className="flex-1 bg-zinc-800 border border-zinc-700 rounded-lg px-3 py-1.5 text-sm font-semibold focus:outline-none focus:border-accent mr-3" /> ) : (

{meme.title}

)}
{isAdmin && ( editing ? ( ) : ( ) )} {isAdmin && !meme.parent_id && ( )} {isAdmin && ( )}
{/* Body */}
{/* Image panel */}
{displayMeme && ( {displayMeme.title} )}
{/* Sidebar */}
{/* Share */} {displayMeme && (

Share

)} {/* Description */}

Description

{isAdmin && editing ? (