/*
This file is part of GNU Taler
(C) 2021 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
}