{"version":3,"sources":["../../src/utils/handleUnlisteners.ts","../../src/createPaginatedStorage/index.ts"],"names":["_storage","_getItem","_arg1","_arg2","_keys","concat_default","_parent","_promise","_resolve","_pages","_stableStorage","_value","identity","useForceRerender","_root","_path","useEffect","onValueChange_default","_onValueChange","alwaysTrue_default","alwaysFalse_default","createSimpleState_default","noop"],"mappings":"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","file":"chunk-LBGLMNGC.cjs","sourcesContent":["import type { AnyAsyncState, LoadableState } from '../types';\n\nconst handleUnlisteners = (\n  valueUnlistener: () => void,\n  state: AnyAsyncState\n) => {\n  const loadUnlistener: undefined | (() => void) =\n    (state as LoadableState).load && (state as LoadableState).load();\n\n  return loadUnlistener\n    ? () => {\n        valueUnlistener();\n\n        loadUnlistener();\n      }\n    : valueUnlistener;\n};\n\nexport default handleUnlisteners;\n","import { useEffect } from 'react';\nimport type {\n  StateInitializer,\n  LoadableState,\n  PaginatedStorage,\n  PollableStateOptions,\n  RequestableStateOptions,\n  WithInitModule,\n  PollableState,\n  LoadableStateScope,\n  PollableStateScope,\n  PaginatedStorageOptions,\n} from '../types';\nimport onValueChange from '../onValueChange';\nimport alwaysFalse from '../utils/alwaysFalse';\nimport alwaysTrue from '../utils/alwaysTrue';\nimport type { PrimitiveOrNested } from 'keyweaver';\nimport type createRequestableState from '../createRequestableState';\nimport type createRequestableStateScope from '../createRequestableStateScope';\nimport type createPollableState from '../createPollableState';\nimport type createPollableStateScope from '../createPollableStateScope';\nimport useForceRerender from 'react-helpful-utils/useForceRerender';\nimport handleUnlisteners from '../utils/handleUnlisteners';\nimport concat from '../utils/concat';\nimport noop from 'lodash.noop';\nimport identity from 'lodash.identity';\nimport createSimpleState from '../utils/createSimpleState';\n\nfunction getItem(this: PaginatedStorage<any>, page: number) {\n  const self = this;\n\n  const { _storage: _pages } = self;\n\n  if (_pages.has(page)) {\n    return _pages.get(page);\n  }\n\n  const item = self._getItem(\n    self._arg1,\n    self._arg2,\n    self._keys ? concat(self._keys, page) : [page],\n    _tickStart,\n    _tickEnd,\n    self\n  );\n\n  _pages.set(page, item);\n\n  return item;\n}\n\nfunction _delete(this: PaginatedStorage<any>, page: number) {\n  this._storage.delete(page);\n}\n\nfunction _tickStart(this: LoadableState) {\n  const self = this;\n\n  const index = self._keys![self._keys!.length - 1];\n\n  const parent = self._parent!;\n\n  if (!parent._promise) {\n    parent._promise = new Promise<void>((res) => {\n      parent._resolve = res;\n    });\n  }\n\n  parent._pages.add(index);\n\n  parent._stableStorage.set(index, self._value);\n}\n\nfunction _tickEnd(this: LoadableState) {\n  const self = this;\n\n  const parent = self._parent!;\n\n  if (\n    parent._promise &&\n    parent._pages.delete(self._keys![self._keys!.length - 1]) &&\n    !parent._pages.size\n  ) {\n    parent._stableStorage.clear();\n\n    parent._promise = parent._resolve() as undefined;\n  }\n}\n\nfunction usePages(\n  this: PaginatedStorage<LoadableState | LoadableStateScope>,\n  getState: (scope: any) => LoadableState = identity\n) {\n  const self = this;\n\n  const stableStorage = self._stableStorage;\n\n  const count: number = self.page._value;\n\n  const forceRerender = useForceRerender();\n\n  const values = new Array(count);\n\n  const errors = new Array(count);\n\n  for (let i = 0; i < count; i++) {\n    let state = getState(self.get(i));\n\n    errors[i] = state.error._value;\n\n    if (stableStorage.has(i)) {\n      const _value = stableStorage.get(i);\n\n      state = {\n        _root: { _value },\n        _value,\n        get: state.get,\n        _path: state._path,\n      } as LoadableState;\n    }\n\n    values[i] = state.get();\n  }\n\n  useEffect(() => {\n    let prevPage = count;\n\n    let isCallable = true;\n\n    const cleanupMap = new Map<number, () => void>();\n\n    const callback = () => {\n      if (self._promise) {\n        if (isCallable) {\n          isCallable = false;\n\n          self._promise.then(() => {\n            isCallable = true;\n\n            forceRerender();\n          });\n        }\n      } else {\n        forceRerender();\n      }\n    };\n\n    for (let i = 0; i < prevPage; i++) {\n      const state = getState(self.get(i));\n\n      cleanupMap.set(\n        i,\n        handleUnlisteners(onValueChange([state, state.error], callback), state)\n      );\n    }\n\n    const unlisten = self.page._onValueChange((nextPage: number) => {\n      if (nextPage > prevPage) {\n        if (!self._promise) {\n          const { shouldRevalidate: _shouldRevalidate } = self._arg1;\n\n          const shouldRevalidate = _shouldRevalidate\n            ? _shouldRevalidate != true\n              ? _shouldRevalidate\n              : alwaysTrue\n            : alwaysFalse;\n\n          for (let i = 0; i < prevPage; i++) {\n            const item = self.get(i);\n\n            const state = getState(item);\n\n            if (shouldRevalidate(item)) {\n              const prev = cleanupMap.get(i)!;\n\n              cleanupMap.set(i, state.load(true));\n\n              prev();\n            } else if ((state as PollableState<any>).control) {\n              (state as PollableState<any>).control.reset();\n            }\n          }\n        }\n\n        for (let i = prevPage; i < nextPage; i++) {\n          const state = getState(self.get(i));\n\n          cleanupMap.set(\n            i,\n            handleUnlisteners(\n              onValueChange([state, state.error], callback),\n              state\n            )\n          );\n        }\n      } else {\n        for (let i = nextPage; i < prevPage; i++) {\n          cleanupMap.get(i)!();\n\n          cleanupMap.delete(i);\n        }\n      }\n\n      forceRerender();\n    });\n\n    return () => {\n      unlisten();\n\n      for (let i = 0; i < prevPage; i++) {\n        cleanupMap.get(i)!();\n\n        cleanupMap.delete(i);\n      }\n    };\n  }, [self]);\n\n  return [values, errors] as const;\n}\n\ntype Args<CreateState, T, O> = WithInitModule<\n  T | undefined,\n  [createState: CreateState, options: O & PaginatedStorageOptions<T>]\n>;\n\nexport type PaginatedRequestableStateArgs<\n  T,\n  E,\n  Keys extends PrimitiveOrNested[] = [],\n> = Args<\n  typeof createRequestableState,\n  T,\n  RequestableStateOptions<T, E, [...Keys, page: number]>\n>;\n\nexport type PaginatedRequestableNestedStateArgs<\n  T,\n  E,\n  Keys extends PrimitiveOrNested[] = [],\n> = Args<\n  typeof createRequestableStateScope,\n  T,\n  RequestableStateOptions<T, E, [...Keys, page: number]>\n>;\n\nexport type PaginatedPollableStateArgs<\n  T,\n  E,\n  Keys extends PrimitiveOrNested[] = [],\n> = Args<\n  typeof createPollableState,\n  T,\n  PollableStateOptions<T, E, [...Keys, page: number]>\n>;\n\nexport type PaginatedPollableNestedStateArgs<\n  T,\n  E,\n  Keys extends PrimitiveOrNested[] = [],\n> = Args<\n  typeof createPollableStateScope,\n  T,\n  PollableStateOptions<T, E, [...Keys, page: number]>\n>;\n\n/**\n * Creates a paginated state storage to manage and load data efficiently across multiple pages.\n * The created storage allows the loading and handling of data in a paginated structure, with support\n * for {@link createRequestableState requestable} and {@link createPollableState pollable} states.\n */\nconst createPaginatedStorage: {\n  <T, Error = any>(\n    ...args: PaginatedRequestableStateArgs<T, Error>\n  ): PaginatedStorage<LoadableState<T, Error>>;\n  <T, Error = any>(\n    ...args: PaginatedRequestableNestedStateArgs<T, Error>\n  ): PaginatedStorage<LoadableStateScope<T, Error>>;\n\n  <T, Error = any>(\n    ...args: PaginatedPollableStateArgs<T, Error>\n  ): PaginatedStorage<PollableState<T, Error>>;\n  <T, Error = any>(\n    ...args: PaginatedPollableNestedStateArgs<T, Error>\n  ): PaginatedStorage<PollableStateScope<T, Error>>;\n} = (\n  createState: any,\n  options: PaginatedStorageOptions<any>,\n  stateInitializer?: StateInitializer,\n  keys?: any[]\n): any =>\n  ({\n    _storage: new Map(),\n    _pages: new Set(),\n    _stableStorage: new Map(),\n    page: createSimpleState(1),\n    _getItem: createState,\n    _arg1: options,\n    _arg2: stateInitializer,\n    get: getItem,\n    delete: _delete,\n    _promise: undefined,\n    _resolve: noop,\n    _keys: keys,\n    usePages,\n  }) as PaginatedStorage<any>;\n\nexport type { PaginatedStorage };\n\nexport default createPaginatedStorage;\n"]}