Prototype of making the new threads via generic interfaces

This commit is contained in:
2025-09-17 16:39:50 -07:00
parent 1c26daa828
commit 43afdc8684
3 changed files with 130 additions and 38 deletions

88
src/lib/fields.ts Normal file
View File

@@ -0,0 +1,88 @@
import {
type DocumentData,
type DocumentsByType,
type DocumentType,
} from "./types";
export type FieldType = "shortText" | "longText" | "toggle";
export type ValueForFieldType<T extends FieldType> = {
shortText: string;
longText: string;
toggle: boolean;
}[T];
export type DocumentField<D extends DocumentType, F extends FieldType> = {
name: string;
fieldType: F;
getter: (doc: DocumentData<D>) => ValueForFieldType<F>;
setter: (
value: ValueForFieldType<F>,
doc: DocumentData<D>,
) => DocumentData<D>;
};
const simpleField = <D extends DocumentType, F extends FieldType>(
name: string,
key: keyof DocumentData<D>,
fieldType: F,
): DocumentField<D, F> => ({
name,
fieldType,
getter: (doc) => doc[key] as unknown as ValueForFieldType<F>,
setter: (value, doc) => ({ ...doc, [key]: value }),
});
const simpleFields = <D extends DocumentType>(
fields: Record<string, [keyof DocumentData<D>, FieldType]>,
): DocumentField<D, FieldType>[] =>
Object.entries(fields).map(([name, [key, fieldType]]) =>
simpleField(name, key, fieldType),
);
export function getFieldsForType<D extends DocumentType>(
docType: D,
): DocumentField<D, FieldType>[] {
switch (docType) {
case "front":
return simpleFields<"front">({
Name: ["name", "shortText"],
Description: ["description", "longText"],
Resolved: ["resolved", "toggle"],
});
case "location":
return [
simpleField("Name", "name", "shortText"),
simpleField("Description", "description", "longText"),
];
case "monster":
return [simpleField("Name", "name", "shortText")];
case "npc":
return [
simpleField("Name", "name", "shortText"),
simpleField("Description", "description", "longText"),
];
case "scene":
return [simpleField("Text", "text", "longText")];
case "secret":
return [
simpleField("Discovered", "discovered", "toggle"),
simpleField("Text", "text", "shortText"),
];
case "session":
return [
simpleField("Name", "name", "shortText"),
simpleField("Strong Start", "strongStart", "longText"),
];
case "thread":
return [
simpleField("Resolved", "resolved", "toggle"),
simpleField("Text", "text", "shortText"),
];
case "treasure":
return [
simpleField("Discovered", "discovered", "toggle"),
simpleField("Text", "text", "shortText"),
];
}
}