{"version":3,"file":"use-form-values.mjs","names":[],"sources":["../../../src/hooks/use-form-values/use-form-values.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { getPath, setPath } from '../../paths';\nimport { FormMode } from '../../types';\n\nexport interface $FormValues<out Values extends Record<PropertyKey, any>> {\n  initialized: React.RefObject<boolean>;\n  stateValues: Values;\n  refValues: React.RefObject<Values>;\n  valuesSnapshot: React.RefObject<Values>;\n  setValues: <TValues extends Values>(payload: SetValuesInput<TValues>) => void;\n  setFieldValue: <TValues extends Values>(payload: SetFieldValueInput<TValues>) => void;\n  resetValues: () => void;\n  setValuesSnapshot: <TValues extends Values>(payload: TValues) => void;\n  initialize: <TValues extends Values>(values: TValues, onInitialize: () => void) => void;\n  getValues: () => Values;\n  getValuesSnapshot: () => Values;\n  resetField: <TValues extends Values>(\n    path: PropertyKey,\n    subscribers?: (SetFieldValueSubscriber<TValues> | null | undefined)[]\n  ) => void;\n}\n\nexport interface SetValuesSubscriberPayload<Values> {\n  path?: PropertyKey;\n  updatedValues: Values;\n  previousValues: Values;\n}\n\nexport interface SetValuesInput<out Values = Record<string, any>> {\n  values: Partial<Values> | (<TValues extends Values>(values: TValues) => Partial<TValues>);\n  mergeWithPreviousValues?: boolean;\n  updateState?: boolean;\n  subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\nexport type SetFieldValueSubscriber<out Values> = <TValues extends Values>(\n  payload: SetValuesSubscriberPayload<TValues>\n) => void;\n\nexport interface SetFieldValueInput<Values> {\n  path: PropertyKey;\n  value: any;\n  updateState?: boolean;\n  subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\ninterface UseFormValuesInput<Values extends Record<PropertyKey, any>> {\n  initialValues: Values | undefined;\n  mode: FormMode;\n  onValuesChange?: ((values: Values, previousValues: Values) => void) | undefined;\n}\n\nexport function useFormValues<Values extends Record<PropertyKey, any>>({\n  initialValues,\n  onValuesChange,\n  mode,\n}: UseFormValuesInput<Values>): $FormValues<Values> {\n  const initialized = useRef(false);\n  const [stateValues, setStateValues] = useState<Values>(initialValues || ({} as Values));\n  const refValues = useRef(stateValues);\n  const valuesSnapshot = useRef(stateValues);\n\n  const setValues = useCallback(\n    ({\n      values,\n      subscribers,\n      updateState = true,\n      mergeWithPreviousValues = true,\n    }: SetValuesInput<Values>) => {\n      const previousValues = refValues.current;\n      const resolvedValues = values instanceof Function ? values(refValues.current) : values;\n      const updatedValues = mergeWithPreviousValues\n        ? { ...previousValues, ...resolvedValues }\n        : (resolvedValues as Values);\n      refValues.current = updatedValues;\n      if (updateState) {\n        setStateValues(updatedValues);\n        if (mode === 'uncontrolled') {\n          refValues.current = updatedValues;\n        }\n      }\n      onValuesChange?.(updatedValues, previousValues);\n      subscribers\n        ?.filter(Boolean)\n        .forEach((subscriber) => subscriber!({ updatedValues, previousValues }));\n    },\n    [onValuesChange]\n  );\n\n  const setFieldValue = useCallback(\n    (payload: SetFieldValueInput<Values>) => {\n      const currentValue = getPath(payload.path, refValues.current);\n      const updatedValue =\n        payload.value instanceof Function ? payload.value(currentValue) : payload.value;\n\n      if (currentValue !== updatedValue) {\n        const previousValues = refValues.current;\n        const updatedValues = setPath(payload.path, updatedValue, refValues.current);\n        setValues({ values: updatedValues, updateState: payload.updateState });\n\n        payload.subscribers\n          ?.filter(Boolean)\n          .forEach((subscriber) =>\n            subscriber!({ path: payload.path, updatedValues, previousValues })\n          );\n      }\n    },\n    [setValues]\n  );\n\n  const setValuesSnapshot = useCallback((payload: Values) => {\n    valuesSnapshot.current = payload;\n  }, []);\n\n  const initialize = useCallback(\n    (values: Values, onInitialize: () => void) => {\n      if (!initialized.current) {\n        initialized.current = true;\n        setValues({ values, updateState: mode === 'controlled' });\n        setValuesSnapshot(values);\n        onInitialize();\n      }\n    },\n    [setValues]\n  );\n\n  const resetValues = useCallback(() => {\n    setValues({\n      values: valuesSnapshot.current,\n      updateState: true,\n      mergeWithPreviousValues: false,\n    });\n  }, [setValues]);\n\n  const getValues = useCallback(() => refValues.current, []);\n  const getValuesSnapshot = useCallback(() => valuesSnapshot.current, []);\n\n  const resetField = useCallback(\n    (path: PropertyKey, subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[]) => {\n      const snapshotValue = getPath(path, valuesSnapshot.current);\n      if (typeof snapshotValue === 'undefined') {\n        return;\n      }\n      setFieldValue({\n        path,\n        value: snapshotValue,\n        updateState: mode === 'controlled',\n        subscribers,\n      });\n    },\n    [setFieldValue, mode]\n  );\n\n  return {\n    initialized,\n    stateValues,\n    refValues,\n    valuesSnapshot,\n    setValues,\n    setFieldValue,\n    resetValues,\n    setValuesSnapshot,\n    initialize,\n    getValues,\n    getValuesSnapshot,\n    resetField,\n  };\n}\n"],"mappings":";;;;;AAoDA,SAAgB,cAAuD,EACrE,eACA,gBACA,QACkD;CAClD,MAAM,cAAc,OAAO,KAAK;CAChC,MAAM,CAAC,aAAa,kBAAkB,SAAiB,iBAAkB,CAAC,CAAY;CACtF,MAAM,YAAY,OAAO,WAAW;CACpC,MAAM,iBAAiB,OAAO,WAAW;CAEzC,MAAM,YAAY,aACf,EACC,QACA,aACA,cAAc,MACd,0BAA0B,WACE;EAC5B,MAAM,iBAAiB,UAAU;EACjC,MAAM,iBAAiB,kBAAkB,WAAW,OAAO,UAAU,OAAO,IAAI;EAChF,MAAM,gBAAgB,0BAClB;GAAE,GAAG;GAAgB,GAAG;EAAe,IACtC;EACL,UAAU,UAAU;EACpB,IAAI,aAAa;GACf,eAAe,aAAa;GAC5B,IAAI,SAAS,gBACX,UAAU,UAAU;EAExB;EACA,iBAAiB,eAAe,cAAc;EAC9C,aACI,OAAO,OAAO,EACf,SAAS,eAAe,WAAY;GAAE;GAAe;EAAe,CAAC,CAAC;CAC3E,GACA,CAAC,cAAc,CACjB;CAEA,MAAM,gBAAgB,aACnB,YAAwC;EACvC,MAAM,eAAe,QAAQ,QAAQ,MAAM,UAAU,OAAO;EAC5D,MAAM,eACJ,QAAQ,iBAAiB,WAAW,QAAQ,MAAM,YAAY,IAAI,QAAQ;EAE5E,IAAI,iBAAiB,cAAc;GACjC,MAAM,iBAAiB,UAAU;GACjC,MAAM,gBAAgB,QAAQ,QAAQ,MAAM,cAAc,UAAU,OAAO;GAC3E,UAAU;IAAE,QAAQ;IAAe,aAAa,QAAQ;GAAY,CAAC;GAErE,QAAQ,aACJ,OAAO,OAAO,EACf,SAAS,eACR,WAAY;IAAE,MAAM,QAAQ;IAAM;IAAe;GAAe,CAAC,CACnE;EACJ;CACF,GACA,CAAC,SAAS,CACZ;CAEA,MAAM,oBAAoB,aAAa,YAAoB;EACzD,eAAe,UAAU;CAC3B,GAAG,CAAC,CAAC;CAEL,MAAM,aAAa,aAChB,QAAgB,iBAA6B;EAC5C,IAAI,CAAC,YAAY,SAAS;GACxB,YAAY,UAAU;GACtB,UAAU;IAAE;IAAQ,aAAa,SAAS;GAAa,CAAC;GACxD,kBAAkB,MAAM;GACxB,aAAa;EACf;CACF,GACA,CAAC,SAAS,CACZ;CA6BA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,aAlCkB,kBAAkB;GACpC,UAAU;IACR,QAAQ,eAAe;IACvB,aAAa;IACb,yBAAyB;GAC3B,CAAC;EACH,GAAG,CAAC,SAAS,CA4BD;EACV;EACA;EACA,WA7BgB,kBAAkB,UAAU,SAAS,CAAC,CA6B9C;EACR,mBA7BwB,kBAAkB,eAAe,SAAS,CAAC,CA6BnD;EAChB,YA5BiB,aAChB,MAAmB,gBAAyE;GAC3F,MAAM,gBAAgB,QAAQ,MAAM,eAAe,OAAO;GAC1D,IAAI,OAAO,kBAAkB,aAC3B;GAEF,cAAc;IACZ;IACA,OAAO;IACP,aAAa,SAAS;IACtB;GACF,CAAC;EACH,GACA,CAAC,eAAe,IAAI,CAeX;CACX;AACF"}