"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;
}[];
}[];
// Additional relationships
aliases?: { releaseSeq: number; languageId: string; title: string }[];
webrefs?: { link: string; languageId: string; website: { id: number; name: string; link?: string | null } }[];
};
export default function EntryDetailClient({ data }: { data: EntryDetailData | null }) {
if (!data) 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}
| 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}
)
) : (
-
)}
|
{typeof data.maxPlayers !== "undefined" && (
| Max Players |
{data.maxPlayers} |
)}
{typeof data.availabletypeId !== "undefined" && (
| Available Type |
{data.availabletypeId ?? -} |
)}
{typeof data.withoutLoadScreen !== "undefined" && (
| Without Load Screen |
{data.withoutLoadScreen ? "Yes" : "No"} |
)}
{typeof data.withoutInlay !== "undefined" && (
| Without Inlay |
{data.withoutInlay ? "Yes" : "No"} |
)}
{typeof data.issueId !== "undefined" && (
| 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 && (
| Type |
Link |
Size |
MD5 |
Flags |
Details |
Comments |
{data.downloadsFlat.map((d) => {
const isHttp = d.link.startsWith("http://") || d.link.startsWith("https://");
return (
| {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}
))}
)}
{/* Aliases (alternative titles) */}
Aliases
{(!data.aliases || data.aliases.length === 0) &&
No aliases
}
{data.aliases && data.aliases.length > 0 && (
| Release # |
Language |
Title |
{data.aliases.map((a, idx) => (
| #{a.releaseSeq} |
{a.languageId} |
{a.title} |
))}
)}
{/* Web links (external references) */}
Web links
{(!data.webrefs || data.webrefs.length === 0) &&
No web links
}
{data.webrefs && data.webrefs.length > 0 && (
| Website |
Language |
URL |
{data.webrefs.map((w, idx) => (
|
{w.website.link ? (
{w.website.name}
) : (
{w.website.name}
)}
|
{w.languageId} |
{w.link}
|
))}
)}
Files
{(!data.files || data.files.length === 0) &&
No files linked
}
{data.files && data.files.length > 0 && (
| Type |
Link |
Size |
MD5 |
Comments |
{data.files.map((f) => {
const isHttp = f.link.startsWith("http://") || f.link.startsWith("https://");
return (
| {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
);
}