import * as React from 'react'; import { useAppServices } from '../../app/AppServicesContext'; import { HttpError } from '../../services/http/IHttpClient'; import { fetchWeatherCheck } from './weatherRepository'; import { IWeatherCheck, IWeatherPeriod } from './weatherTypes'; import { WEATHER_TEXTS } from './texts'; export type WeatherLoadStatus = | { kind: 'idle' } | { kind: 'loading' } | { kind: 'error'; message: string } | { kind: 'ready'; data: IWeatherCheck }; /** Текст ошибки как в main: «статус текст» для ответа API, иначе сообщение ошибки. */ export function weatherErrorDetails(error: unknown): string { if (error instanceof HttpError) return `${error.status} ${error.statusText}`; return error instanceof Error ? error.message : String(error); } /** * Загрузка сверки погоды за период. Без проекта или периода — ничего не грузит (idle). * setData — для замены позиций после оценки ИИ. */ export function useWeatherCheck( projectId: number | undefined, period: IWeatherPeriod | undefined ): { status: WeatherLoadStatus; setData: (update: (data: IWeatherCheck) => IWeatherCheck) => void } { const services = useAppServices(); const [status, setStatus] = React.useState({ kind: 'idle' }); const start = period?.start; const end = period?.end; React.useEffect(() => { if (projectId === undefined || !start || !end) { setStatus({ kind: 'idle' }); return; } let isCancelled = false; setStatus({ kind: 'loading' }); fetchWeatherCheck(services.tnsuApi, services.settings.apiBaseUrl, projectId, { start, end }) .then((data) => { if (!isCancelled) setStatus({ kind: 'ready', data }); }) .catch((error: unknown) => { console.error('Ошибка загрузки сверки погоды:', error); if (!isCancelled) setStatus({ kind: 'error', message: WEATHER_TEXTS.loadError(weatherErrorDetails(error)) }); }); return () => { isCancelled = true; }; }, [services, projectId, start, end]); const setData = React.useCallback((update: (data: IWeatherCheck) => IWeatherCheck): void => { setStatus((prev) => (prev.kind === 'ready' ? { kind: 'ready', data: update(prev.data) } : prev)); }, []); return { status, setData }; }