"use client"; import Link from "next/link"; type Label = { id: number; name: string; labeltypeId: string | null }; export type EntryDetailData = { id: number; title: string; isXrated: number; machinetype: { id: number | null; name: string | null }; language: { id: string | null; name: string | null }; genre: { id: number | null; name: string | null }; authors: Label[]; publishers: Label[]; // extra fields for richer details maxPlayers?: number; availabletypeId?: string | null; withoutLoadScreen?: number; withoutInlay?: number; issueId?: number | null; files?: { id: number; link: string; size: number | null; md5: string | null; comments: string | null; type: { id: number; name: string }; }[]; // Flat downloads by entry_id downloadsFlat?: { id: number; link: string; size: number | null; md5: string | null; comments: string | null; isDemo: boolean; type: { id: number; name: string }; language: { id: string | null; name: string | null }; machinetype: { id: number | null; name: string | null }; scheme: { id: string | null; name: string | null }; source: { id: string | null; name: string | null }; case: { id: string | null; name: string | null }; year: number | null; releaseSeq: number; }[]; releases?: { releaseSeq: number; type: { id: string | null; name: string | null }; language: { id: string | null; name: string | null }; machinetype: { id: number | null; name: string | null }; year: number | null; comments: string | null; downloads: { id: number; link: string; size: number | null; md5: string | null; comments: string | null; isDemo: boolean; type: { id: number; name: string }; language: { id: string | null; name: string | null }; machinetype: { id: number | null; name: string | null }; scheme: { id: string | null; name: string | null }; source: { id: string | null; name: string | null }; case: { id: string | null; name: string | null }; year: number | null; }[]; }[]; }; export default function EntryDetailClient({ data }: { data: EntryDetailData | null }) { if (!data) return
Not found
; return (

{data.title}

{data.genre.name && ( {data.genre.name} )} {data.language.name && ( {data.language.name} )} {data.machinetype.name && ( {data.machinetype.name} )} {data.isXrated ? 18+ : null}

{typeof data.maxPlayers !== "undefined" && ( )} {typeof data.availabletypeId !== "undefined" && ( )} {typeof data.withoutLoadScreen !== "undefined" && ( )} {typeof data.withoutInlay !== "undefined" && ( )} {typeof data.issueId !== "undefined" && ( )}
Field Value
ID {data.id}
Title {data.title}
Machine {data.machinetype.id != null ? ( data.machinetype.name ? ( {data.machinetype.name} ) : ( #{data.machinetype.id} ) ) : ( - )}
Language {data.language.id ? ( data.language.name ? ( {data.language.name} ) : ( {data.language.id} ) ) : ( - )}
Genre {data.genre.id ? ( data.genre.name ? ( {data.genre.name} ) : ( #{data.genre.id} ) ) : ( - )}
Max Players {data.maxPlayers}
Available Type {data.availabletypeId ?? -}
Without Load Screen {data.withoutLoadScreen ? "Yes" : "No"}
Without Inlay {data.withoutInlay ? "Yes" : "No"}
Issue {data.issueId ? #{data.issueId} : -}

{/* Downloads (flat, by entry_id). Render only this flat section; do not render grouped downloads here. */}
Downloads
{(!data.downloadsFlat || data.downloadsFlat.length === 0) &&
No downloads
} {data.downloadsFlat && data.downloadsFlat.length > 0 && (
{data.downloadsFlat.map((d) => { const isHttp = d.link.startsWith("http://") || d.link.startsWith("https://"); return ( ); })}
Type Link Size MD5 Flags Details Comments
{d.type.name} {isHttp ? ( {d.link} ) : ( {d.link} )} {typeof d.size === "number" ? d.size.toLocaleString() : "-"} {d.md5 ?? "-"}
{d.isDemo ? Demo : null} {d.scheme.name ? {d.scheme.name} : null} {d.source.name ? {d.source.name} : null} {d.case.name ? {d.case.name} : null}
{d.language.name && ( {d.language.name} )} {d.machinetype.name && ( {d.machinetype.name} )} {typeof d.year === "number" ? {d.year} : null} rel #{d.releaseSeq}
{d.comments ?? ""}
)}

Authors
{data.authors.length === 0 &&
Unknown
} {data.authors.length > 0 && (
    {data.authors.map((a) => (
  • {a.name}
  • ))}
)}
Publishers
{data.publishers.length === 0 &&
Unknown
} {data.publishers.length > 0 && (
    {data.publishers.map((p) => (
  • {p.name}
  • ))}
)}

Files
{(!data.files || data.files.length === 0) &&
No files linked
} {data.files && data.files.length > 0 && (
{data.files.map((f) => { const isHttp = f.link.startsWith("http://") || f.link.startsWith("https://"); return ( ); })}
Type Link Size MD5 Comments
{f.type.name} {isHttp ? ( {f.link} ) : ( {f.link} )} {f.size != null ? new Intl.NumberFormat().format(f.size) : "-"} {f.md5 ?? "-"} {f.comments ?? ""}
)}

{/* Removed grouped releases/downloads section to avoid duplicate downloads UI. */}
Permalink Back to Explorer
); }