84 lines
2.6 KiB
TypeScript
84 lines
2.6 KiB
TypeScript
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<TrainData | undefined>();
|
|
const [currentPosition, setCurrentPosition] = useState<string[]>([]);
|
|
const [trainPositionSwitch, setTrainPositionSwitch] = useState<string>('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,
|
|
};
|
|
};
|