/*
This file is part of GNU Taler
(C) 2021-2023 Taler Systems S.A.
GNU Taler is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 3, or (at your option) any later version.
GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
GNU Taler; see the file COPYING. If not, see
*/
/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
import { ComponentChildren, createContext, h, VNode } from "preact";
import { useContext, useMemo } from "preact/hooks";
type Updater = (value: (prevState: S) => S) => void;
export interface Props {
object?: Partial;
errors?: FormErrors;
name?: string;
valueHandler: Updater> | null;
children: ComponentChildren;
}
const noUpdater: Updater> = () => (s: unknown) => s;
export function FormProvider({
object = {},
errors = {},
name = "",
valueHandler,
children,
}: Props): VNode {
const initialObject = useMemo(() => object, []);
const value = useMemo>(
() => ({
errors,
object,
initialObject,
valueHandler: valueHandler ? valueHandler : noUpdater,
name,
toStr: {},
fromStr: {},
}),
[errors, object, valueHandler],
);
return (
);
}
export interface FormType {
object: Partial;
initialObject: Partial;
errors: FormErrors;
toStr: FormtoStr;
name: string;
fromStr: FormfromStr;
valueHandler: Updater>;
}
const FormContext = createContext>(null!);
export function useFormContext() {
return useContext>(FormContext);
}
export type FormErrors = {
[P in keyof T]?: string | FormErrors;
};
export type FormtoStr = {
[P in keyof T]?: (f?: T[P]) => string;
};
export type FormfromStr = {
[P in keyof T]?: (f: string) => T[P];
};
export type FormUpdater = {
[P in keyof T]?: (f: keyof T) => (v: T[P]) => void;
};