import { useMemo } from "react";
import {
GffEditor,
GffFieldType,
getFieldValue,
getLocStringText,
type FieldOverrideProps,
} from "./GffEditor";
interface ItemEditorProps {
repo: string;
filePath: string;
content: string;
onSave?: (content: string) => void;
onSwitchToRaw?: () => void;
}
function BaseItemOverride({ value, onChange, field }: FieldOverrideProps) {
const num = typeof value === "number" ? value : 0;
return (
onChange(field.label, parseInt(e.target.value, 10))}
className="w-24 rounded border px-2 py-1.5 text-sm"
style={{
backgroundColor: "var(--forge-bg)",
borderColor: "var(--forge-border)",
color: "var(--forge-text)",
}}
/>
(baseitems.2da row)
);
}
function CompactNumbersOverride({ value, onChange, field, data }: FieldOverrideProps) {
const stackSize = typeof getFieldValue(data, "StackSize") === "number"
? (getFieldValue(data, "StackSize") as number) : 0;
const cost = typeof getFieldValue(data, "Cost") === "number"
? (getFieldValue(data, "Cost") as number) : 0;
const charges = typeof getFieldValue(data, "Charges") === "number"
? (getFieldValue(data, "Charges") as number) : 0;
if (field.label !== "StackSize") return null;
return (
{[
{ label: "StackSize", display: "Stack", value: stackSize, max: 99 },
{ label: "Cost", display: "Cost (gp)", value: cost, max: 999999 },
{ label: "Charges", display: "Charges", value: charges, max: 255 },
].map((item) => (
onChange(item.label, parseInt(e.target.value, 10))}
className="w-24 rounded border px-2 py-1.5 text-sm"
style={{
backgroundColor: "var(--forge-bg)",
borderColor: "var(--forge-border)",
color: "var(--forge-text)",
}}
/>
))}
);
}
function BooleanFlagsOverride({ data, onChange }: FieldOverrideProps) {
const flags = [
{ label: "Identified", display: "Identified" },
{ label: "Plot", display: "Plot" },
{ label: "Stolen", display: "Stolen" },
{ label: "Cursed", display: "Cursed" },
];
return (
{flags.map((flag) => {
const val = getFieldValue(data, flag.label);
const checked = typeof val === "number" ? val !== 0 : Boolean(val);
return (
);
})}
);
}
function PropertiesListOverride({ value }: FieldOverrideProps) {
const list = Array.isArray(value) ? value : [];
return (
Item Properties
{list.map((prop, i) => (
{typeof prop === "object" && prop !== null
? JSON.stringify(prop).slice(0, 80)
: String(prop)}
))}
{list.length === 0 && (
No item properties
)}
);
}
export function ItemEditor({ repo, filePath, content, onSave, onSwitchToRaw }: ItemEditorProps) {
const fieldOverrides = useMemo(() => {
const overrides = new Map React.ReactNode>();
overrides.set("BaseItem", (props) => );
overrides.set("StackSize", (props) => );
overrides.set("Cost", () => null);
overrides.set("Charges", () => null);
overrides.set("Identified", (props) => );
overrides.set("Plot", () => null);
overrides.set("Stolen", () => null);
overrides.set("Cursed", () => null);
overrides.set("PropertiesList", (props) => );
return overrides;
}, []);
const itemName = useMemo(() => {
try {
const data = JSON.parse(content);
const nameField = data.LocalizedName;
return getLocStringText(nameField) || "(unnamed item)";
} catch {
return "(unnamed item)";
}
}, [content]);
const headerSlot = (
{itemName}
);
return (
);
}