| 155 | * update the data over time. |
| 156 | */ |
| 157 | export function useListData<T>(options: ListOptions<T>): ListData<T> { |
| 158 | let { |
| 159 | initialItems = [], |
| 160 | initialSelectedKeys, |
| 161 | getKey = (item: any) => item.id ?? item.key, |
| 162 | filter, |
| 163 | initialFilterText = '' |
| 164 | } = options; |
| 165 | |
| 166 | // Store both items and filteredItems in state so we can go back to the unfiltered list |
| 167 | let [state, setState] = useState<ListState<T>>({ |
| 168 | items: initialItems, |
| 169 | selectedKeys: initialSelectedKeys === 'all' ? 'all' : new Set(initialSelectedKeys || []), |
| 170 | filterText: initialFilterText |
| 171 | }); |
| 172 | |
| 173 | let filteredItems = useMemo( |
| 174 | () => (filter ? state.items.filter(item => filter(item, state.filterText)) : state.items), |
| 175 | [state.items, state.filterText, filter] |
| 176 | ); |
| 177 | |
| 178 | return { |
| 179 | ...state, |
| 180 | items: filteredItems, |
| 181 | ...createListActions({getKey}, setState), |
| 182 | getItem(key: Key) { |
| 183 | return state.items.find(item => getKey(item) === key); |
| 184 | } |
| 185 | }; |
| 186 | } |
| 187 | |
| 188 | export function createListActions<T, C>( |
| 189 | opts: CreateListOptions<T, C>, |