Creates the generic new-document form
This commit is contained in:
@@ -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>(
|
||||
|
||||
Reference in New Issue
Block a user