"use client"; import { useProgress } from "@bprogress/next"; import { BitcoinIcon, Lock, Unlock } from "lucide-react"; import Link from "next/link"; import { useParams, useRouter } from "next/navigation"; import { useEffect, useRef, useState } from "react"; import { toast } from "sonner"; import { MaybeWrap } from "@/components/action-button"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { HoverCard, HoverCardContent, HoverCardTrigger, } from "@/components/ui/hover-card"; import { Input } from "@/components/ui/input"; import { SidebarMenu, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, } from "@/components/ui/sidebar"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import type { getArtifactConfig } from "@/lib/api"; import { setLimit, toggleCheck, toggleLock } from "@/lib/api"; import { shared } from "@/lib/comms"; import { sse } from "@/lib/db/sse-endpoints"; import { cn } from "@/lib/utils"; export function SidebarLink({ submission, className, }: { submission: { id: string; name: string; checked: boolean; queue: number | null; comment: string; uid: string; promoted: boolean; }; className?: string; }) { const { stop } = useProgress(); const { id } = useParams(); const [checked, setChecked] = useState(submission.checked); useEffect(() => { setChecked(submission.checked); }, [submission.checked]); return ( ( { if ((ev.target as HTMLButtonElement).type === "button") return; navigator.clipboard.writeText(submission.uid); toast.success("คัดลอก UID แล้ว"); }} > {children}
{submission.name}
{submission.comment}
ลัดคิว - UID {submission.uid} (คลิ๊กเพื่อคัดลอก)
)} > { if ((ev.target as HTMLButtonElement).type === "button") { ev.preventDefault(); } }} > {submission.queue === null ? (
{" "} {submission.name}
) : ( `${submission.queue}. ${submission.name}` )} { setChecked(checked === true); await toggleCheck(submission.id); stop(); }} />
); } export function LimitManager({ config, length, ...props }: React.ComponentProps & { config: Awaited>; length: number; }) { return ( {config.locked ? ( <>

ปิดรับ

) : config.limit >= 0 && length > config.limit ? ( <>

เต็มแล้ว

) : ( <>

เปิดรับ

)}
{" "} จำนวน
e.preventDefault()}> ตั้ง Limit ตั้ง Limit
{ await setLimit(Number(data.get("limit")) || -1); toast.success("บันทึกการเปลี่ยนแปลงแล้ว"); }} > = 0 ? config.limit : ""} />
{ await toggleLock(); toast.success("บันทึกการเปลี่ยนแปลงแล้ว"); }} > {config.locked && "เ"}ปิดรับ
{length} {config.limit >= 0 ? `/${config.limit}` : ""}
); } export function SubmissionList({ subs, }: { subs: { id: string; name: string; checked: boolean; queue: number | null; comment: string; uid: string; promoted: boolean; }[]; }) { const [query, setQuery] = useState(""); return ( <> setQuery(ev.target.value.toLowerCase())} /> {subs .filter((s) => (s.queue + s.name).toLowerCase().includes(query)) .map((s) => ( ))} ); } export function Watcher() { const router = useRouter(); const count = useRef(undefined); // Reload after connection restored shared.signal("sync", () => router.refresh()); useEffect(() => { const { clean } = sse.artifact.sub("update", () => router.refresh()); const interval = setInterval(() => { fetch("/api/artifact/count") .then((r) => r.json()) .then((r) => { if (typeof count.current === "undefined") count.current = r; if (count.current !== r) router.refresh(); count.current = r; }) .catch((e) => console.error("Fetching artifact count failed", e)); }, 120000); return () => { clean(); clearInterval(interval); }; }, [router]); return
; }