{"version":3,"file":"use-form-watch.cjs","names":["getPath"],"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,eAAA,GAAA,MAAA,QAA0E,CAAC,CAAQ;CAiEzF,OAAO;EACL;EACA,QAAA,GAAA,MAAA,cAjE+C,MAAM,aAAa;GAClE,CAAA,GAAA,MAAA,iBAAgB;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,sBAAA,GAAA,MAAA,cAvDuC,SAAgB;GACvD,MAAM,SACJ,YAAY,QAAQ,OAAO,KACxB,cAAc,UACb,SAAS;IACP,eAAeA,iBAAAA,QAAQ,MAAM,MAAM,cAAc;IACjD,OAAOA,iBAAAA,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,eAAeA,iBAAAA,QAAQ,iBAAiB,MAAM,cAAc;KAC5D,OAAOA,iBAAAA,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,yBAAA,GAAA,MAAA,cAtB0C,mBAA2B;GACrE,OAAO,KAAK,YAAY,OAAO,EAAE,SAAS,SAAS;IAIjD,IAHcA,iBAAAA,QAAQ,MAAM,QAAQ,UAAU,OAGtC,MAFcA,iBAAAA,QAAQ,MAAM,cAEV,GACxB,YAAY,QAAQ,OAAgB,SAAS,OAC3C,GAAG;KACD,eAAeA,iBAAAA,QAAQ,MAAM,cAAc;KAC3C,OAAOA,iBAAAA,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"}