Есть страница, на которой отображаются элементы items. Есть pagination и фильтры. Фильтрация на бэкенде. Используется RTK Query.
Есть требование, что страница должена периодически обновляться в фоне, поэтому используется pollingInterval.
При переключении между страницами а также при изменении фильтров я хочу отображать спиннер. А вот при фоновом обновлении спиннер не нужно показывать.
Как это лучше реализовать? В RTK query возвращает isLoading и isFetching, однако первый устанавливается в true при первой загрузке компонента, а второй устанавливается в true при каждом запросе, в не зависимости от того изменились ли параметры или это polling.
Пока единственный вариант, который я вижу, это нагородить еще отдельный стейт в компоненте и useEffect's, и в через этот отдельный стейт понимать причину обновления данных. Но выглядит это велосипедно. Как обычно решается такая вроде бы типовая задача?
Примерный вид компонента:
export const MyPage: React.FC = () => {
const itemsPerPage = 50;
const [searchText, setSearchText] = useState(''),
[activePage, setActivePage] = useState(1),
[filters, setFilters] = useState<Filters>({
status: 'all',
category: '1'
});
const {
data,
isLoading,
isFetching,
isSuccess,
refetch,
} = useSearchItemsQuery(
{
sortBy: sortBy,
startAt: (activePage - 1) * itemsPerPage,
maxResults: itemsPerPage,
searchText,
filters,
},
{ refetchOnFocus: true, pollingInterval: 30000 },
);
return (
<div>
{data && items.map(item => <Item key={item.id} item={item} />)}
<Spinner show={isLoading || isFetching />
</div>
)
}