Prototype of making the new threads via generic interfaces
This commit is contained in:
88
src/lib/fields.ts
Normal file
88
src/lib/fields.ts
Normal 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"),
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user