"use client"; import { useEffect, useState } from "react"; import { useParams } from "next/navigation"; import Image from "next/image"; import Markdown from "react-markdown"; export default function UVSettingDetailPage() { const { id } = useParams(); const [setting, setSetting] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { if (!id) return; fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/items/settings_uv/${id}?fields=submission_id,setting_title,uploader,setting_notes,photo.filename_disk,mat.name,mat_coat.name,mat_color.name,mat_opacity.opacity,mat_thickness,source.model,lens.field_size,lens.focal_length,focus,fill_settings,line_settings,raster_settings`) .then((res) => { if (!res.ok) throw new Error("Failed to load"); return res.json(); }) .then((data) => { setSetting(data.data); setLoading(false); }) .catch(() => setLoading(false)); }, [id]); const openSearchInNewTab = (value) => { if (!value || typeof window === "undefined") return; const url = new URL("/uv-settings", window.location.origin); url.searchParams.set("query", value); window.open(url.toString(), "_blank", "noopener,noreferrer"); }; const renderRepeaterCard = (title, fields, data) => { if (!data || !Array.isArray(data) || data.length === 0) return null; return (

{title}

{data.map((item, i) => (
{fields.map((field) => field.condition === undefined || field.condition(item) ? (

{field.label}:{" "} {item[field.key] !== undefined && item[field.key] !== null ? item[field.key].toString() : "—"}

) : null )}
))}
); }; if (loading) return
Loading…
; if (!setting) return
Setting not found.
; return (

{setting.setting_title}

Uploaded by: {setting.uploader || "—"}

← Back to UV Settings
{setting.photo?.filename_disk && ( Preview )}

Material: openSearchInNewTab(setting.mat?.name)}>{setting.mat?.name || "—"}

Coating: openSearchInNewTab(setting.mat_coat?.name)}>{setting.mat_coat?.name || "—"}

Color: {setting.mat_color?.name || "—"}

Opacity: {setting.mat_opacity?.opacity || "—"}

Thickness: {setting.mat_thickness ? `${setting.mat_thickness} mm` : "—"}

Laser

Source Model: openSearchInNewTab(setting.source?.model)}>{setting.source?.model || "—"}

Lens: {setting.lens?.field_size || "—"} mm | {setting.lens?.focal_length || "—"} mm

Focus

Focus: {setting.focus || "—"}

Notes

{setting.setting_notes || "—"}

{renderRepeaterCard("Fill Settings", [ { key: "name", label: "Fill Name" }, { key: "speed", label: "Speed (mm/s)" }, { key: "frequency", label: "Frequency (kHz)" }, { key: "pulse", label: "Pulse Width (ns)" }, { key: "interval", label: "Interval (mm)" }, { key: "pass", label: "Passes" }, { key: "type", label: "Type" }, { key: "angle", label: "Angle (°)" }, { key: "auto", label: "Auto-Rotate" }, { key: "increment", label: "Increment (°)", condition: (e) => e.auto }, { key: "cross", label: "Crosshatch" }, { key: "flood", label: "Flood Fill" }, { key: "air", label: "Air Assist" }, ], setting.fill_settings)} {renderRepeaterCard("Line Settings", [ { key: "name", label: "Line Name" }, { key: "speed", label: "Speed (mm/s)" }, { key: "frequency", label: "Frequency (kHz)" }, { key: "pulse", label: "Pulse Width (ns)" }, { key: "perf", label: "Perforation Mode" }, { key: "cut", label: "Cut Override" }, { key: "skip", label: "Skip Pass" }, { key: "wobble", label: "Wobble Enabled" }, { key: "step", label: "Wobble Step" }, { key: "size", label: "Wobble Size" }, { key: "pass", label: "Passes" }, { key: "air", label: "Air Assist" }, ], setting.line_settings)} {renderRepeaterCard("Raster Settings", [ { key: "name", label: "Raster Name" }, { key: "speed", label: "Speed (mm/s)" }, { key: "frequency", label: "Frequency (kHz)" }, { key: "pulse", label: "Pulse Width (ns)" }, { key: "type", label: "Type" }, { key: "dither", label: "Dither" }, { key: "halftone_cell", label: "Halftone Cell" }, { key: "halftone_angle", label: "Halftone Angle" }, { key: "inversion", label: "Invert Colors" }, { key: "interval", label: "Interval (mm)" }, { key: "dot", label: "Dot Size" }, { key: "pass", label: "Passes" }, { key: "cross", label: "Crosshatch" }, { key: "air", label: "Air Assist" }, ], setting.raster_settings)}
); }