This commit is contained in:
2025-10-03 15:43:22 +05:00
commit 531e2d2e7e
54 changed files with 2943 additions and 0 deletions
+92
View File
@@ -0,0 +1,92 @@
# Client - React Query Integration
## Установленные пакеты
- `@tanstack/react-query` - управление серверным состоянием
- `ky` - современный HTTP-клиент
## Структура
### `/src/lib`
- `api.ts` - конфигурация HTTP-клиента (ky)
- `queryClient.ts` - конфигурация React Query
### `/src/hooks`
- `useAuth.ts` - хуки для аутентификации
- `useLogin()` - вход
- `useRegister()` - регистрация
- `useMe()` - получение текущего пользователя
- `useLogout()` - выход
### `/src/types`
- `auth.ts` - TypeScript типы для аутентификации
## Примеры использования
### Логин
```tsx
import { useLogin } from "../hooks/useAuth";
function LoginPage() {
const loginMutation = useLogin();
const handleSubmit = async (data) => {
try {
await loginMutation.mutateAsync(data);
// Успешный логин
} catch (error) {
// Обработка ошибки
}
};
return (
<form onSubmit={handleSubmit}>
{/* форма */}
{loginMutation.isPending && <p>Загрузка...</p>}
{loginMutation.isError && <p>Ошибка!</p>}
</form>
);
}
```
### Получение текущего пользователя
```tsx
import { useMe } from "../hooks/useAuth";
function Profile() {
const { data: user, isLoading, isError } = useMe();
if (isLoading) return <div>Загрузка...</div>;
if (isError) return <div>Ошибка</div>;
return <div>Привет, {user?.name}!</div>;
}
```
### Выход
```tsx
import { useLogout } from "../hooks/useAuth";
function LogoutButton() {
const logoutMutation = useLogout();
return (
<button onClick={() => logoutMutation.mutate()}>
Выйти
</button>
);
}
```
## Фичи
### API клиент (ky)
- Автоматическое добавление Bearer токена из localStorage
- Префикс URL для всех запросов
- JSON по умолчанию
### React Query
- Автоматическое кэширование (5 минут)
- Retry логика для запросов
- Оптимистичные обновления
- Автоматическая инвалидация кэша