Чтобы переписать `useMutation` в `useQuery`, и потом иметь возможность вызывать `invalidateQueries`, нужно немного изменить логику вашего компонента. Вместо использования мутации для вызова функции получения токенов, вы можете создать запрос для получения данных, и дополнительно обработать результаты, чтобы обновить состояние вашего приложения.
Вот переписанный код:
```typescript
import { authService } from '@/services/auth.service';
import { useUserStore } from '@/store/use-user-store';
import { useQuery, useQueryClient } from '@tanstack/react-query';
import { usePathname } from 'next/navigation';
import { useEffect } from 'react';
const FetchUser = ({ children }: React.PropsWithChildren) => {
const { setIsAuth, setUser, setIsLoading } = useUserStore();
const pathname = usePathname();
const queryClient = useQueryClient();
const { data, error, isLoading } = useQuery({
queryKey: ['verify-auth'],
queryFn: authService.getNewTokens,
refetchOnWindowFocus: false, // если не нужно обновлять на фокусе
onSuccess(data) {
setIsAuth(true);
setUser(data.data.user);
},
onError() {
setIsAuth(false);
setUser(null);
},
});
useEffect(() => {
if (pathname) {
setIsLoading(true);
queryClient.invalidateQueries(['verify-auth']);
}
}, [pathname, queryClient]);
useEffect(() => {
setIsLoading(isLoading);
}, [isLoading]);
if (isLoading) return <div>Loading...</div>; // Можно отобразить загрузку
if (error) return <div>Error: {error.message}</div>; // Обработка ошибки
return <>{children}</>;
};
export default FetchUser;
```
### Объяснение изменений:
1. **Использование `useQuery`**: Вместо `useMutation`, вы используете `useQuery`, который автоматически осуществляет запрос данных. Это позволяет отслеживать состояние загрузки и ошибок.
2. **`invalidateQueries`**: В `useEffect` вы вызываете `invalidateQueries`, чтобы обновить данные при смене `pathname`. `queryClient` инъектируется с помощью `useQueryClient`, что позволяет вам управлять кэшированными запросами.
3. **Обработка состояния загрузки и ошибок**: Добавлено условие для отрисовки индикатора загрузки или сообщения об ошибке.
Таким образом, компонент теперь использует `useQuery` для получения данных, при этом сохраняется возможность обновления запросов с помощью `invalidateQueries` при изменении пути.