Some checks are pending
CI / Crawler (Python ${{ matrix.python-version }}) (3.10) (push) Waiting to run
CI / Crawler (Python ${{ matrix.python-version }}) (3.11) (push) Waiting to run
CI / API (Python 3.11) (push) Waiting to run
CI / Database migration (push) Waiting to run
CI / App web build (Node 20) (push) Waiting to run
74 lines
2.2 KiB
JavaScript
74 lines
2.2 KiB
JavaScript
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
|
|
import { getHourlyPlantStats, getPlantStats } from '../services/solarApi';
|
|
import {
|
|
formatHourlyChartData,
|
|
formatPeriodChartData,
|
|
toLocalIsoDate,
|
|
} from '../utils/statsChart';
|
|
|
|
const buildPeriodParams = (period, selectedDate) => {
|
|
const year = selectedDate.getFullYear();
|
|
const month = selectedDate.getMonth() + 1;
|
|
|
|
if (period === 'day') return { period, year, month };
|
|
return { period, year };
|
|
};
|
|
|
|
const formatUpdatedAt = (value) => {
|
|
if (!value) return '-';
|
|
const date = new Date(value);
|
|
if (Number.isNaN(date.getTime())) return '-';
|
|
return date.toLocaleTimeString('ko-KR', { hour: '2-digit', minute: '2-digit' });
|
|
};
|
|
|
|
export default function usePlantStats(plant, period, selectedDate) {
|
|
const [chartData, setChartData] = useState([]);
|
|
const [loading, setLoading] = useState(true);
|
|
const [error, setError] = useState(null);
|
|
|
|
const reload = useCallback(async () => {
|
|
try {
|
|
setLoading(true);
|
|
setError(null);
|
|
|
|
if (period === 'today') {
|
|
const result = await getHourlyPlantStats(plant.id, toLocalIsoDate(selectedDate));
|
|
setChartData(formatHourlyChartData(result?.data || [], selectedDate));
|
|
} else {
|
|
const result = await getPlantStats(
|
|
plant.id,
|
|
buildPeriodParams(period, selectedDate),
|
|
);
|
|
setChartData(formatPeriodChartData(period, result?.data || [], selectedDate));
|
|
}
|
|
} catch (requestError) {
|
|
setError(requestError.message);
|
|
setChartData([]);
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}, [period, plant.id, selectedDate]);
|
|
|
|
useEffect(() => {
|
|
reload();
|
|
}, [reload]);
|
|
|
|
const todayData = useMemo(() => {
|
|
if (period !== 'today' || toLocalIsoDate(selectedDate) !== toLocalIsoDate(new Date())) {
|
|
return null;
|
|
}
|
|
|
|
const latestLog = plant.latest_log;
|
|
if (!latestLog) return null;
|
|
|
|
return {
|
|
currentKw: Number(latestLog.current_kw) || 0,
|
|
todayKwh: Number(latestLog.today_kwh) || 0,
|
|
updatedAt: formatUpdatedAt(latestLog.created_at),
|
|
};
|
|
}, [period, plant.latest_log, selectedDate]);
|
|
|
|
return { chartData, loading, error, reload, todayData };
|
|
}
|