Creates the generic new-document form

This commit is contained in:
2025-09-24 15:24:07 -07:00
parent 43afdc8684
commit c9d27bce75
6 changed files with 216 additions and 45 deletions

View File

@@ -1,16 +1,22 @@
import {
type DocumentData,
type DocumentsByType,
type DocumentType,
} from "./types";
import { type DocumentData, type DocumentType } from "./types";
export type FieldType = "shortText" | "longText" | "toggle";
export type ValueForFieldType<T extends FieldType> = {
export type ValueForFieldType<F extends FieldType> = {
shortText: string;
longText: string;
toggle: boolean;
}[T];
}[F];
function defaultValue<F extends FieldType>(fieldType: F): ValueForFieldType<F> {
switch (fieldType) {
case "shortText":
case "longText":
return "" as ValueForFieldType<F>;
case "toggle":
return false as ValueForFieldType<F>;
}
}
export type DocumentField<D extends DocumentType, F extends FieldType> = {
name: string;
@@ -20,6 +26,7 @@ export type DocumentField<D extends DocumentType, F extends FieldType> = {
value: ValueForFieldType<F>,
doc: DocumentData<D>,
) => DocumentData<D>;
setDefault: (doc: DocumentData<D>) => DocumentData<D>;
};
const simpleField = <D extends DocumentType, F extends FieldType>(
@@ -31,6 +38,7 @@ const simpleField = <D extends DocumentType, F extends FieldType>(
fieldType,
getter: (doc) => doc[key] as unknown as ValueForFieldType<F>,
setter: (value, doc) => ({ ...doc, [key]: value }),
setDefault: (doc) => ({ ...doc, [key]: defaultValue(fieldType) }),
});
const simpleFields = <D extends DocumentType>(