UNPKG

@mantine/form

Version:

Mantine form management library

1 lines 5.14 kB
{"version":3,"file":"use-form-watch.mjs","names":[],"sources":["../../../src/hooks/use-form-watch/use-form-watch.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { getPath } from '../../paths';\nimport { FormPathValue, LooseKeys } from '../../paths.types';\nimport { FormFieldSubscriber, Watch } from '../../types';\nimport { $FormStatus } from '../use-form-status/use-form-status';\nimport { $FormValues, SetValuesSubscriberPayload } from '../use-form-values/use-form-values';\n\ninterface UseFormWatchInput<out Values extends Record<PropertyKey, any>> {\n $values: $FormValues<Values>;\n $status: $FormStatus<Values>;\n cascadeUpdates?: boolean;\n}\n\nexport interface $FormWatch<Values extends Record<PropertyKey, any>> {\n subscribers: React.RefObject<Record<string, FormFieldSubscriber<Values, any>[]>>;\n watch: Watch<Values, any>;\n getFieldSubscribers: (path: any) => ((input: SetValuesSubscriberPayload<Values>) => void)[];\n notifyWatchSubscribers: (previousValues: Values) => void;\n}\n\nexport function useFormWatch<\n Values extends Record<PropertyKey, any>,\n Field extends LooseKeys<Values> = LooseKeys<Values>,\n>({ $values, $status, cascadeUpdates }: UseFormWatchInput<Values>) {\n const subscribers = useRef<Record<Field, FormFieldSubscriber<Values, Field>[]>>({} as any);\n\n const watch: Watch<Values, Field> = useCallback((path, callback) => {\n useEffect(() => {\n subscribers.current[path] = subscribers.current[path] || [];\n subscribers.current[path].push(callback);\n\n return () => {\n subscribers.current[path] = subscribers.current[path].filter((cb) => cb !== callback);\n };\n }, [callback]);\n }, []);\n\n const getFieldSubscribers = useCallback((path: Field) => {\n const result: ((input: SetValuesSubscriberPayload<Values>) => void)[] =\n subscribers.current[path]?.map(\n (callback) => (input: SetValuesSubscriberPayload<Values>) =>\n callback({\n previousValue: getPath(path, input.previousValues) as any,\n value: getPath(path, input.updatedValues) as any,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n ) ?? [];\n\n for (const subscriptionKey in subscribers.current) {\n const isParent = String(path).startsWith(`${subscriptionKey}.`);\n const isChild = String(subscriptionKey).startsWith(`${path}.`);\n\n if (isParent || (cascadeUpdates && isChild)) {\n result.push(\n ...subscribers.current[subscriptionKey].map(\n (cb) => (input: SetValuesSubscriberPayload<Values>) =>\n cb({\n previousValue: getPath(subscriptionKey, input.previousValues) as any,\n value: getPath(subscriptionKey, input.updatedValues) as any,\n touched: $status.isTouched(subscriptionKey),\n dirty: $status.isDirty(subscriptionKey),\n })\n )\n );\n }\n }\n\n return result;\n }, []);\n\n const notifyWatchSubscribers = useCallback((previousValues: Values) => {\n Object.keys(subscribers.current).forEach((path) => {\n const value = getPath(path, $values.refValues.current);\n const previousValue = getPath(path, previousValues);\n\n if (value !== previousValue) {\n subscribers.current[path as Field]?.forEach((cb) =>\n cb({\n previousValue: getPath(path, previousValues) as FormPathValue<Values, Field>,\n value: getPath(path, $values.refValues.current) as FormPathValue<Values, Field>,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n );\n }\n });\n }, []);\n\n return {\n subscribers,\n watch,\n getFieldSubscribers,\n notifyWatchSubscribers,\n };\n}\n"],"mappings":";;;;AAoBA,SAAgB,aAGd,EAAE,SAAS,SAAS,kBAA6C;CACjE,MAAM,cAAc,OAA4D,CAAC,CAAQ;CAiEzF,OAAO;EACL;EACA,OAjEkC,aAAa,MAAM,aAAa;GAClE,gBAAgB;IACd,YAAY,QAAQ,QAAQ,YAAY,QAAQ,SAAS,CAAC;IAC1D,YAAY,QAAQ,MAAM,KAAK,QAAQ;IAEvC,aAAa;KACX,YAAY,QAAQ,QAAQ,YAAY,QAAQ,MAAM,QAAQ,OAAO,OAAO,QAAQ;IACtF;GACF,GAAG,CAAC,QAAQ,CAAC;EACf,GAAG,CAAC,CAwDE;EACJ,qBAvD0B,aAAa,SAAgB;GACvD,MAAM,SACJ,YAAY,QAAQ,OAAO,KACxB,cAAc,UACb,SAAS;IACP,eAAe,QAAQ,MAAM,MAAM,cAAc;IACjD,OAAO,QAAQ,MAAM,MAAM,aAAa;IACxC,SAAS,QAAQ,UAAU,IAAI;IAC/B,OAAO,QAAQ,QAAQ,IAAI;GAC7B,CAAC,CACL,KAAK,CAAC;GAER,KAAK,MAAM,mBAAmB,YAAY,SAAS;IACjD,MAAM,WAAW,OAAO,IAAI,EAAE,WAAW,GAAG,gBAAgB,EAAE;IAC9D,MAAM,UAAU,OAAO,eAAe,EAAE,WAAW,GAAG,KAAK,EAAE;IAE7D,IAAI,YAAa,kBAAkB,SACjC,OAAO,KACL,GAAG,YAAY,QAAQ,iBAAiB,KACrC,QAAQ,UACP,GAAG;KACD,eAAe,QAAQ,iBAAiB,MAAM,cAAc;KAC5D,OAAO,QAAQ,iBAAiB,MAAM,aAAa;KACnD,SAAS,QAAQ,UAAU,eAAe;KAC1C,OAAO,QAAQ,QAAQ,eAAe;IACxC,CAAC,CACL,CACF;GAEJ;GAEA,OAAO;EACT,GAAG,CAAC,CAuBgB;EAClB,wBAtB6B,aAAa,mBAA2B;GACrE,OAAO,KAAK,YAAY,OAAO,EAAE,SAAS,SAAS;IAIjD,IAHc,QAAQ,MAAM,QAAQ,UAAU,OAGtC,MAFc,QAAQ,MAAM,cAEV,GACxB,YAAY,QAAQ,OAAgB,SAAS,OAC3C,GAAG;KACD,eAAe,QAAQ,MAAM,cAAc;KAC3C,OAAO,QAAQ,MAAM,QAAQ,UAAU,OAAO;KAC9C,SAAS,QAAQ,UAAU,IAAI;KAC/B,OAAO,QAAQ,QAAQ,IAAI;IAC7B,CAAC,CACH;GAEJ,CAAC;EACH,GAAG,CAAC,CAMmB;CACvB;AACF"}