import { useState, useEffect } from 'react'; import { AS } from '@/storageControl'; import { STORAGE_KEYS } from '@/constants'; import { logger } from '@/utils/logger'; import { useCurrentTrain } from '@/stateBox/useCurrentTrain'; import { findReversalPoints } from '@/lib/eachTrainInfoCoreLib/findReversalPoints'; type TrainData = { trainNum: string; position?: string[]; delay?: number | "入線"; [key: string]: unknown; }; export const useTrainPosition = ( trainNum: string, stopStationIDList: string[][] ) => { const { currentTrain, getCurrentStationData, getPosition } = useCurrentTrain(); const [currentTrainData, setCurrentTrainData] = useState(); const [currentPosition, setCurrentPosition] = useState([]); const [trainPositionSwitch, setTrainPositionSwitch] = useState('false'); useEffect(() => { const trainPosData = getCurrentStationData(trainNum); if (trainPosData) { logger.debug('Train position data:', trainPosData); setCurrentTrainData(trainPosData); } }, [currentTrain, trainNum, getCurrentStationData]); useEffect(() => { if (!stopStationIDList.length || !currentTrainData) return; let position = getPosition(currentTrainData); if (!position) return; if (position.length > 1) { // 伊予市駅の特殊処理 const iyoIndex = stopStationIDList.findIndex((d) => d.includes('U14')); if (position[0] === '-Iyo') { position[0] = stopStationIDList[iyoIndex - 1]?.[0]; } else if (position[0] === '+Iyo') { position[0] = stopStationIDList[iyoIndex + 1]?.[0]; } if (position[1] === '+Iyo') { position[1] = stopStationIDList[iyoIndex + 1]?.[0]; } else if (position[1] === '-Iyo') { position[1] = stopStationIDList[iyoIndex - 1]?.[0]; } } setCurrentPosition(position); }, [currentTrainData, stopStationIDList, getPosition]); useEffect(() => { AS.getItem(STORAGE_KEYS.TRAIN_POSITION_SWITCH) .then((value) => { if (value) setTrainPositionSwitch(value); }) .catch(() => AS.setItem(STORAGE_KEYS.TRAIN_POSITION_SWITCH, 'true')); }, []); const points = trainPositionSwitch === 'true' ? findReversalPoints(currentPosition, stopStationIDList, true) : stopStationIDList.map(() => false); const pointsDisplay = trainPositionSwitch === 'true' ? findReversalPoints(currentPosition, stopStationIDList, false) : stopStationIDList.map(() => false); return { currentTrainData, currentPosition, points, pointsDisplay, trainPositionSwitch, }; };