/** * Примеры использования сгенерированных use* функций * с SWR и React Query */ import { Api, HttpClient } from './output/Api'; import useSWR from 'swr'; import { useQuery } from '@tanstack/react-query'; // ============================================ // НАСТРОЙКА API КЛИЕНТА // ============================================ const httpClient = new HttpClient({ baseUrl: 'https://cdn.example.com', }); // Устанавливаем токен (например, из localStorage) if (typeof window !== 'undefined') { const token = localStorage.getItem('auth_token'); if (token) { httpClient.setSecurityData({ token }); } } const api = new Api(httpClient); // ============================================ // ПРИМЕР 1: ИСПОЛЬЗОВАНИЕ С SWR // ============================================ // Простой GET запрос без параметров function UserProfile() { const profileConfig = api.auth.useGetProfile(); const { data, error, isLoading } = useSWR( profileConfig.path, // Ключ для кеша () => api.auth.getProfile() // Функция для загрузки данных ); if (isLoading) return
Загрузка...
; if (error) return
Ошибка: {error.message}
; if (!data) return null; return (

Профиль пользователя

Email: {data.email}

Имя: {data.firstName} {data.lastName}

Email подтверждён: {data.isEmailVerified ? 'Да' : 'Нет'}

); } // GET запрос с параметрами function ProjectDetails({ projectId }: { projectId: string }) { const projectConfig = api.projects.useFindOne({ id: projectId }); const { data: project, error, isLoading } = useSWR( [projectConfig.path, projectId], // Составной ключ () => api.projects.findOne({ id: projectId }) ); if (isLoading) return
Загрузка проекта...
; if (error) return
Ошибка: {error.message}
; if (!project) return null; return (

{project.name}

{project.description}

Bucket: {project.s3Bucket}

Region: {project.s3Region}

); } // Список с автоматической ревалидацией function ProjectsList() { const projectsConfig = api.projects.useFindAll(); const { data: projects, error, isLoading, mutate } = useSWR( projectsConfig.path, () => api.projects.findAll(), { refreshInterval: 5000, // Обновлять каждые 5 секунд revalidateOnFocus: true, // Обновлять при фокусе на окно } ); const handleCreateProject = async () => { await api.projects.create({ name: 'Новый проект', description: 'Описание', }); // Обновляем список mutate(); }; if (isLoading) return
Загрузка списка...
; if (error) return
Ошибка: {error.message}
; return (

Мои проекты ({projects?.length || 0})

); } // ============================================ // ПРИМЕР 2: ИСПОЛЬЗОВАНИЕ С REACT QUERY // ============================================ function UserProfileWithReactQuery() { const profileConfig = api.auth.useGetProfile(); const { data, error, isLoading } = useQuery({ queryKey: [profileConfig.path], queryFn: () => api.auth.getProfile(), }); if (isLoading) return
Загрузка...
; if (error) return
Ошибка
; return (

{data?.firstName} {data?.lastName}

{data?.email}

); } function ProjectsListWithReactQuery() { const projectsConfig = api.projects.useFindAll(); const { data: projects, isLoading } = useQuery({ queryKey: [projectsConfig.path], queryFn: () => api.projects.findAll(), staleTime: 5 * 60 * 1000, // 5 минут refetchInterval: 30000, // Обновлять каждые 30 секунд }); if (isLoading) return
Загрузка...
; return (

Проекты

{projects?.map((p) => (
{p.name}
))}
); } // ============================================ // ПРИМЕР 3: УСЛОВНАЯ ЗАГРУЗКА // ============================================ function ConditionalProfile({ userId }: { userId?: string }) { const profileConfig = api.auth.useGetProfile(); const { data } = useSWR( // Загружаем только если есть userId userId ? profileConfig.path : null, () => api.auth.getProfile() ); return data ?
{data.email}
: null; } // ============================================ // ПРИМЕР 4: ЗАВИСИМЫЕ ЗАПРОСЫ // ============================================ function DependentQueries() { // Сначала получаем список проектов const projectsConfig = api.projects.useFindAll(); const { data: projects } = useSWR( projectsConfig.path, () => api.projects.findAll() ); // Затем получаем первый проект (только когда список загружен) const firstProjectId = projects?.[0]?.id; const projectConfig = firstProjectId ? api.projects.useFindOne({ id: firstProjectId }) : null; const { data: firstProject } = useSWR( projectConfig ? [projectConfig.path, firstProjectId] : null, () => firstProjectId ? api.projects.findOne({ id: firstProjectId }) : null ); return (

Всего проектов: {projects?.length || 0}

{firstProject && (

Первый проект:

{firstProject.name}

)}
); } // ============================================ // ПРИМЕР 5: СОЗДАНИЕ ХУКА-ОБЁРТКИ // ============================================ // Универсальный хук для всех GET запросов function useApiQuery( useConfigFn: () => { path: string; method: 'GET'; secure?: boolean }, apiFn: () => Promise, options?: Parameters[2] ) { const config = useConfigFn(); return useSWR(config.path, apiFn, options); } // Использование function MyComponent() { const { data, error, isLoading } = useApiQuery( api.auth.useGetProfile, api.auth.getProfile, { revalidateOnFocus: true } ); // ... } // ============================================ // ПРИМЕР 6: ПОЛЬЗОВАТЕЛЬСКИЙ FETCHER ДЛЯ SWR // ============================================ // Создаём универсальный fetcher const apiFetcher = async (key: string | string[]) => { const path = Array.isArray(key) ? key[0] : key; // Находим соответствующий метод API // В реальном приложении можно использовать маппинг return api.auth.getProfile(); // пример }; // SWRConfig для всего приложения import { SWRConfig } from 'swr'; function App() { return ( ); } export { UserProfile, ProjectDetails, ProjectsList, UserProfileWithReactQuery, ProjectsListWithReactQuery, ConditionalProfile, DependentQueries, useApiQuery, };