map • Lines: 1{"mappings":"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","sources":["packages/react-stately/src/data/useAsyncList.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {createListActions, ListData, ListState} from './useListData';\nimport {Key, LoadingState, Selection, SortDescriptor} from '@react-types/shared';\nimport {useEffect, useReducer, useRef} from 'react';\n\nexport interface AsyncListOptions<T, C> {\n /** The keys for the initially selected items. */\n initialSelectedKeys?: Iterable<Key>;\n /** The initial sort descriptor. */\n initialSortDescriptor?: SortDescriptor;\n /** The initial filter text. */\n initialFilterText?: string;\n /** A function that returns a unique key for an item object. */\n getKey?: (item: T) => Key;\n /** A function that loads the data for the items in the list. */\n load: AsyncListLoadFunction<T, C>;\n /**\n * An optional function that performs sorting. If not provided,\n * then `sortDescriptor` is passed to the `load` function.\n */\n sort?: AsyncListLoadFunction<T, C, AsyncListLoadOptions<T, C> & {sortDescriptor: SortDescriptor}>;\n}\n\nexport type AsyncListLoadFunction<\n T,\n C,\n S extends AsyncListLoadOptions<T, C> = AsyncListLoadOptions<T, C>\n> = (state: S) => AsyncListStateUpdate<T, C> | Promise<AsyncListStateUpdate<T, C>>;\n\nexport interface AsyncListLoadOptions<T, C> {\n /** The items currently in the list. */\n items: T[];\n /** The keys of the currently selected items in the list. */\n selectedKeys: Selection;\n /** The current sort descriptor for the list. */\n sortDescriptor?: SortDescriptor;\n /** An abort signal used to notify the load function that the request has been aborted. */\n signal: AbortSignal;\n /** The pagination cursor returned from the last page load. */\n cursor?: C;\n /** The current filter text used to perform server side filtering. */\n filterText?: string;\n /** The current loading state of the list. */\n loadingState?: LoadingState;\n}\n\nexport interface AsyncListStateUpdate<T, C> {\n /** The new items to append to the list. */\n items: Iterable<T>;\n /** The keys to add to the selection. */\n selectedKeys?: Iterable<Key>;\n /** The sort descriptor to set. */\n sortDescriptor?: SortDescriptor;\n /** The pagination cursor to be used for the next page load. */\n cursor?: C;\n /** The updated filter text for the list. */\n filterText?: string;\n}\n\ninterface AsyncListState<T, C> extends ListState<T> {\n state: LoadingState;\n items: T[];\n // disabledKeys?: Iterable<Key>,\n selectedKeys: Selection;\n // selectedKey?: Key,\n // expandedKeys?: Iterable<Key>,\n sortDescriptor?: SortDescriptor;\n error?: Error;\n abortController?: AbortController;\n cursor?: C;\n}\n\ntype ActionType =\n | 'success'\n | 'error'\n | 'loading'\n | 'loadingMore'\n | 'sorting'\n | 'update'\n | 'filtering';\ninterface Action<T, C> {\n type: ActionType;\n items?: Iterable<T>;\n selectedKeys?: Iterable<Key>;\n sortDescriptor?: SortDescriptor;\n error?: Error;\n abortController?: AbortController;\n updater?: (state: ListState<T>) => ListState<T>;\n cursor?: C;\n filterText?: string;\n}\n\nexport interface AsyncListData<T> extends ListData<T> {\n /** Whether data is currently being loaded. */\n isLoading: boolean;\n /** If loading data failed, then this contains the error that occurred. */\n error?: Error;\n // disabledKeys?: Set<Key>,\n // selectedKey?: Key,\n // expandedKeys?: Set<Key>,\n /** The current sort descriptor for the list. */\n sortDescriptor?: SortDescriptor;\n\n /** Reloads the data in the list. */\n reload(): void;\n /** Loads the next page of data in the list. */\n loadMore(): void;\n /** Triggers sorting for the list. */\n sort(descriptor: SortDescriptor): void;\n /** The current loading state for the list. */\n loadingState: LoadingState;\n}\n\nfunction reducer<T, C>(data: AsyncListState<T, C>, action: Action<T, C>): AsyncListState<T, C> {\n let selectedKeys;\n switch (data.state) {\n case 'idle':\n case 'error':\n switch (action.type) {\n case 'loading':\n case 'loadingMore':\n case 'sorting':\n case 'filtering':\n return {\n ...data,\n filterText: action.filterText ?? data.filterText,\n state: action.type,\n // Reset items to an empty list if loading, but not when sorting.\n items: action.type === 'loading' ? [] : data.items,\n sortDescriptor: action.sortDescriptor ?? data.sortDescriptor,\n abortController: action.abortController\n };\n case 'update':\n return {\n ...data,\n ...action.updater?.(data)\n };\n case 'success':\n case 'error':\n return data;\n default:\n throw new Error(`Invalid action \"${action.type}\" in state \"${data.state}\"`);\n }\n case 'loading':\n case 'sorting':\n case 'filtering':\n switch (action.type) {\n case 'success':\n // Ignore if there is a newer abortcontroller in state.\n // This means that multiple requests were going at once.\n // We want to take only the latest result.\n if (action.abortController !== data.abortController) {\n return data;\n }\n\n selectedKeys = action.selectedKeys ?? data.selectedKeys;\n return {\n ...data,\n filterText: action.filterText ?? data.filterText,\n state: 'idle',\n items: [...(action.items ?? [])],\n selectedKeys: selectedKeys === 'all' ? 'all' : new Set(selectedKeys),\n sortDescriptor: action.sortDescriptor ?? data.sortDescriptor,\n abortController: undefined,\n cursor: action.cursor\n };\n case 'error':\n if (action.abortController !== data.abortController) {\n return data;\n }\n\n return {\n ...data,\n state: 'error',\n error: action.error,\n abortController: undefined\n };\n case 'loading':\n case 'loadingMore':\n case 'sorting':\n case 'filtering':\n // We're already loading, and another load was triggered at the same time.\n // We need to abort the previous load and start a new one.\n data.abortController?.abort('aborting current load and starting new one');\n return {\n ...data,\n filterText: action.filterText ?? data.filterText,\n state: action.type,\n // Reset items to an empty list if loading, but not when sorting.\n items: action.type === 'loading' ? [] : data.items,\n abortController: action.abortController\n };\n case 'update':\n // We're already loading, and an update happened at the same time (e.g. selectedKey changed).\n // Update data but don't abort previous load.\n return {\n ...data,\n ...action.updater?.(data)\n };\n default:\n throw new Error(`Invalid action \"${action.type}\" in state \"${data.state}\"`);\n }\n case 'loadingMore':\n switch (action.type) {\n case 'success':\n selectedKeys =\n data.selectedKeys === 'all' || action.selectedKeys === 'all'\n ? 'all'\n : new Set([...data.selectedKeys, ...(action.selectedKeys ?? [])]);\n // Append the new items\n return {\n ...data,\n state: 'idle',\n items: [...data.items, ...(action.items ?? [])],\n selectedKeys,\n sortDescriptor: action.sortDescriptor ?? data.sortDescriptor,\n abortController: undefined,\n cursor: action.cursor\n };\n case 'error':\n if (action.abortController !== data.abortController) {\n return data;\n }\n\n return {\n ...data,\n state: 'error',\n error: action.error\n };\n case 'loading':\n case 'sorting':\n case 'filtering':\n // We're already loading more, and another load was triggered at the same time.\n // We need to abort the previous load more and start a new one.\n data.abortController?.abort();\n return {\n ...data,\n filterText: action.filterText ?? data.filterText,\n state: action.type,\n // Reset items to an empty list if loading, but not when sorting.\n items: action.type === 'loading' ? [] : data.items,\n abortController: action.abortController\n };\n case 'loadingMore':\n // If already loading more and another loading more is triggered, abort the new load more since\n // it is a duplicate request since the cursor hasn't been updated.\n // Do not overwrite the data.abortController\n action.abortController?.abort();\n\n return data;\n case 'update':\n // We're already loading, and an update happened at the same time (e.g. selectedKey changed).\n // Update data but don't abort previous load.\n return {\n ...data,\n ...action.updater?.(data)\n };\n default:\n throw new Error(`Invalid action \"${action.type}\" in state \"${data.state}\"`);\n }\n default:\n throw new Error(`Invalid state \"${data.state}\"`);\n }\n}\n\n/**\n * Manages state for an immutable async loaded list data structure, and provides convenience methods\n * to update the data over time. Manages loading and error states, pagination, and sorting.\n */\nexport function useAsyncList<T, C = string>(options: AsyncListOptions<T, C>): AsyncListData<T> {\n const {\n load,\n sort,\n initialSelectedKeys,\n initialSortDescriptor,\n getKey = (item: any) => item.id || item.key,\n initialFilterText = ''\n } = options;\n\n let [data, dispatch] = useReducer<AsyncListState<T, C>, [Action<T, C>]>(reducer, {\n state: 'idle',\n error: undefined,\n items: [],\n selectedKeys: initialSelectedKeys === 'all' ? 'all' : new Set(initialSelectedKeys),\n sortDescriptor: initialSortDescriptor,\n filterText: initialFilterText\n });\n\n const dispatchFetch = async (action: Action<T, C>, fn: AsyncListLoadFunction<T, C>) => {\n let abortController = new AbortController();\n try {\n dispatch({...action, abortController});\n let previousFilterText = action.filterText ?? data.filterText;\n\n let response = await fn({\n items: data.items.slice(),\n selectedKeys: data.selectedKeys,\n sortDescriptor: action.sortDescriptor ?? data.sortDescriptor,\n signal: abortController.signal,\n cursor: action.type === 'loadingMore' ? data.cursor : undefined,\n filterText: previousFilterText,\n loadingState: data.state\n });\n\n let filterText = response.filterText ?? previousFilterText;\n dispatch({type: 'success', ...response, abortController});\n\n // Fetch a new filtered list if filterText is updated via `load` response func rather than list.setFilterText\n // Only do this if not aborted (e.g. user triggers another filter action before load completes)\n if (filterText && filterText !== previousFilterText && !abortController.signal.aborted) {\n dispatchFetch({type: 'filtering', filterText}, load);\n }\n } catch (e) {\n dispatch({type: 'error', error: e as Error, abortController});\n }\n };\n\n let didDispatchInitialFetch = useRef(false);\n useEffect(() => {\n if (!didDispatchInitialFetch.current) {\n dispatchFetch({type: 'loading'}, load);\n didDispatchInitialFetch.current = true;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n items: data.items,\n selectedKeys: data.selectedKeys,\n sortDescriptor: data.sortDescriptor,\n isLoading:\n data.state === 'loading' ||\n data.state === 'loadingMore' ||\n data.state === 'sorting' ||\n data.state === 'filtering',\n loadingState: data.state,\n error: data.error,\n filterText: data.filterText,\n getItem(key: Key) {\n return data.items.find(item => getKey(item) === key);\n },\n reload() {\n dispatchFetch({type: 'loading'}, load);\n },\n loadMore() {\n // Ignore if already loading more or if performing server side filtering.\n if (\n data.state === 'loading' ||\n data.state === 'loadingMore' ||\n data.state === 'filtering' ||\n data.cursor == null\n ) {\n return;\n }\n\n dispatchFetch({type: 'loadingMore'}, load);\n },\n sort(sortDescriptor: SortDescriptor) {\n dispatchFetch(\n {type: 'sorting', sortDescriptor},\n (sort || load) as AsyncListLoadFunction<T, C>\n );\n },\n ...createListActions({...options, getKey, cursor: data.cursor}, fn => {\n dispatch({type: 'update', updater: fn});\n }),\n setFilterText(filterText: string) {\n dispatchFetch({type: 'filtering', filterText}, load);\n }\n };\n}\n"],"names":[],"version":3,"file":"useAsyncList.cjs.map"}