/* 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 (
{ e.preventDefault(); // if (valueHandler) valueHandler(object); }} > {children}
); } export interface FormType { object: Partial; initialObject: Partial; errors: FormErrors; toStr: FormtoStr; name: string; fromStr: FormfromStr; valueHandler: Updater>; } const FormContext = createContext>(null!); /** * FIXME: * USE MEMORY EVENTS INSTEAD OF CONTEXT * @deprecated */ 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; };