UNPKG

@lobehub/ui

Version:

Lobe UI is an open-source UI component library for building AIGC web apps

1 lines • 3.64 kB
{"version":3,"file":"useForm.mjs","names":[],"sources":["../../../src/base-ui/FormKit/useForm.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\n\nimport { createFormInstance, getIn, getInternals, leafPaths, setIn } from './instance';\nimport type { InferSchemaInput, StandardSchema } from './schema';\nimport type { DeepPartial, FormInstance, FormValues, UseFormOptions } from './type';\n\nexport function useForm<S extends StandardSchema<FormValues>>(\n options: UseFormOptions<InferSchemaInput<S>> & { schema: S },\n): FormInstance<InferSchemaInput<S>>;\nexport function useForm<T extends FormValues = FormValues>(\n options?: UseFormOptions<T>,\n): FormInstance<T>;\nexport function useForm<T extends FormValues = FormValues>(\n options: UseFormOptions<T> = {},\n): FormInstance<T> {\n const [form] = useState(() =>\n createFormInstance<T>({\n initialValues: options.initialValues ?? options.values ?? {},\n schema: options.schema,\n validateOn: options.validateOn ?? 'auto',\n }),\n );\n const latest = useRef(options);\n latest.current = options;\n getInternals(form).onSubmit = (values) => latest.current.onSubmit?.(values as T);\n\n useEffect(() => {\n const { engine } = getInternals(form);\n const pending = new Set<string>();\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const flush = () => {\n const changed: Record<string, unknown> = {};\n for (const path of pending) setIn(changed, path, engine.getValue(path));\n pending.clear();\n latest.current.onValuesChange?.(changed as DeepPartial<T>, engine.getValues() as T);\n };\n\n const off = engine.onValueChange(({ path, source }) => {\n if (source !== 'user' || !latest.current.onValuesChange) return;\n pending.add(path);\n const debounce = latest.current.valuesChangeDebounce ?? 0;\n if (debounce <= 0) {\n flush();\n return;\n }\n clearTimeout(timer);\n timer = setTimeout(flush, debounce);\n });\n\n return () => {\n off();\n clearTimeout(timer);\n };\n }, [form]);\n\n const { values } = options;\n useEffect(() => {\n if (!values) return;\n const { engine } = getInternals(form);\n for (const path of leafPaths(values)) {\n const next = getIn(values, path);\n if (!engine.isTouched(path) && !Object.is(engine.getValue(path), next))\n engine.setValue(path, next, 'api');\n }\n }, [form, values]);\n\n return form;\n}\n"],"mappings":";;;;AAcA,SAAgB,QACd,UAA6B,CAAC,GACb;CACjB,MAAM,CAAC,QAAQ,eACb,mBAAsB;EACpB,eAAe,QAAQ,iBAAiB,QAAQ,UAAU,CAAC;EAC3D,QAAQ,QAAQ;EAChB,YAAY,QAAQ,cAAc;CACpC,CAAC,CACH;CACA,MAAM,SAAS,OAAO,OAAO;CAC7B,OAAO,UAAU;CACjB,aAAa,IAAI,CAAC,CAAC,YAAY,WAAW,OAAO,QAAQ,WAAW,MAAW;CAE/E,gBAAgB;EACd,MAAM,EAAE,WAAW,aAAa,IAAI;EACpC,MAAM,0BAAU,IAAI,IAAY;EAChC,IAAI;EAEJ,MAAM,cAAc;GAClB,MAAM,UAAmC,CAAC;GAC1C,KAAK,MAAM,QAAQ,SAAS,MAAM,SAAS,MAAM,OAAO,SAAS,IAAI,CAAC;GACtE,QAAQ,MAAM;GACd,OAAO,QAAQ,iBAAiB,SAA2B,OAAO,UAAU,CAAM;EACpF;EAEA,MAAM,MAAM,OAAO,eAAe,EAAE,MAAM,aAAa;GACrD,IAAI,WAAW,UAAU,CAAC,OAAO,QAAQ,gBAAgB;GACzD,QAAQ,IAAI,IAAI;GAChB,MAAM,WAAW,OAAO,QAAQ,wBAAwB;GACxD,IAAI,YAAY,GAAG;IACjB,MAAM;IACN;GACF;GACA,aAAa,KAAK;GAClB,QAAQ,WAAW,OAAO,QAAQ;EACpC,CAAC;EAED,aAAa;GACX,IAAI;GACJ,aAAa,KAAK;EACpB;CACF,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,EAAE,WAAW;CACnB,gBAAgB;EACd,IAAI,CAAC,QAAQ;EACb,MAAM,EAAE,WAAW,aAAa,IAAI;EACpC,KAAK,MAAM,QAAQ,UAAU,MAAM,GAAG;GACpC,MAAM,OAAO,MAAM,QAAQ,IAAI;GAC/B,IAAI,CAAC,OAAO,UAAU,IAAI,KAAK,CAAC,OAAO,GAAG,OAAO,SAAS,IAAI,GAAG,IAAI,GACnE,OAAO,SAAS,MAAM,MAAM,KAAK;EACrC;CACF,GAAG,CAAC,MAAM,MAAM,CAAC;CAEjB,OAAO;AACT"}