solorpower/app/hooks/usePlantStats.js
haneulai f2bb131884
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
refactor: complete repository structure cleanup
2026-08-07 15:30:44 +09:00

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 };
}