{"version":3,"sources":["../../src/use-tracked-ref-state/index.ts"],"sourcesContent":["import { useRef } from 'react'\nimport { useCreation } from '../use-creation'\nimport { useRender } from '../use-render'\nimport { useStableFn } from '../use-stable-fn'\nimport { shallowEqual } from '../utils/equal'\n\nexport type UseTrackedRefStateRefState<S> = { [K in keyof S]: { used: boolean; value: S[K] } }\n\nexport type UseTrackedRefStateReturns<S extends object, Keys extends keyof S = keyof S> = readonly [\n  S,\n  {\n    updateRefState: <K extends Keys>(\n      key: K,\n      newValue: S[K],\n      compare?: (prevData: S[K], nextData: S[K]) => boolean,\n    ) => void\n    markKeyAsUsed: <K extends Keys>(key: K) => void\n  },\n  UseTrackedRefStateRefState<S>,\n]\n\nexport function useTrackedRefState<S extends object, Keys extends keyof S = keyof S>(\n  refState: S,\n): UseTrackedRefStateReturns<S, Keys> {\n  const render = useRender()\n\n  const stateRef = useRef(\n    useCreation(() => {\n      const result = {} as UseTrackedRefStateRefState<S>\n      for (const key in refState) {\n        result[key] = { used: false, value: refState[key] }\n      }\n      return result\n    }),\n  )\n\n  const updateRefState = useStableFn(\n    <K extends keyof S>(\n      key: K,\n      newValue: S[K],\n      compare: (prevData: S[K], nextData: S[K]) => boolean = shallowEqual,\n    ) => {\n      const refItem = stateRef.current[key]\n      if (shallowEqual(refItem.value, newValue)) return\n\n      const isValueChanged = !compare(refItem.value, newValue)\n\n      if (isValueChanged) {\n        refItem.value = newValue\n        refItem.used && render()\n      }\n    },\n  )\n\n  const markKeyAsUsed = useStableFn(<K extends Keys>(key: K) => {\n    stateRef.current[key].used = true\n  })\n\n  const actions = useCreation(() => ({\n    updateRefState,\n    markKeyAsUsed,\n  }))\n\n  const getters = useCreation(() => {\n    const result = {} as S\n    for (const key in stateRef.current) {\n      Object.defineProperty(result, key, {\n        enumerable: true,\n        get() {\n          markKeyAsUsed(key as unknown as Keys)\n          return stateRef.current[key].value\n        },\n      })\n    }\n    return result\n  })\n\n  return [getters, actions, stateRef.current] as const\n}\n"],"names":["useTrackedRefState","refState","render","useRender","stateRef","useRef","useCreation","result","key","used","value","updateRefState","useStableFn","newValue","compare","shallowEqual","refItem","current","isValueChanged","markKeyAsUsed","actions","getters","Object","defineProperty","enumerable","get"],"mappings":";;;;+BAqBgBA;;;eAAAA;;;qBArBO;2BACK;yBACF;2BACE;qBACC;AAiBtB,SAASA,mBACdC,QAAW;IAEX,IAAMC,SAASC,IAAAA,oBAAS;IAExB,IAAMC,WAAWC,IAAAA,aAAM,EACrBC,IAAAA,wBAAW,EAAC;QACV,IAAMC,SAAS,CAAC;QAChB,IAAK,IAAMC,OAAOP,SAAU;YAC1BM,MAAM,CAACC,IAAI,GAAG;gBAAEC,MAAM;gBAAOC,OAAOT,QAAQ,CAACO,IAAI;YAAC;QACpD;QACA,OAAOD;IACT;IAGF,IAAMI,iBAAiBC,IAAAA,wBAAW,EAChC,SACEJ,KACAK;YACAC,2EAAuDC,mBAAY;QAEnE,IAAMC,UAAUZ,SAASa,OAAO,CAACT,IAAI;QACrC,IAAIO,IAAAA,mBAAY,EAACC,QAAQN,KAAK,EAAEG,WAAW;QAE3C,IAAMK,iBAAiB,CAACJ,QAAQE,QAAQN,KAAK,EAAEG;QAE/C,IAAIK,gBAAgB;YAClBF,QAAQN,KAAK,GAAGG;YAChBG,QAAQP,IAAI,IAAIP;QAClB;IACF;IAGF,IAAMiB,gBAAgBP,IAAAA,wBAAW,EAAC,SAAiBJ;QACjDJ,SAASa,OAAO,CAACT,IAAI,CAACC,IAAI,GAAG;IAC/B;IAEA,IAAMW,UAAUd,IAAAA,wBAAW,EAAC;eAAO;YACjCK,gBAAAA;YACAQ,eAAAA;QACF;;IAEA,IAAME,UAAUf,IAAAA,wBAAW,EAAC;;YAGxBgB,OAAOC,cAAc,CAAChB,QAAQC,KAAK;gBACjCgB,YAAY;gBACZC,KAAAA,SAAAA;oBACEN,cAAcX;oBACd,OAAOJ,SAASa,OAAO,CAACT,IAAI,CAACE,KAAK;gBACpC;YACF;QACF;QATA,IAAMH,SAAS,CAAC;QAChB,IAAK,IAAMC,OAAOJ,SAASa,OAAO;QASlC,OAAOV;IACT;IAEA,OAAO;QAACc;QAASD;QAAShB,SAASa,OAAO;KAAC;AAC7C"}