import lineColorList from "@/assets/originData/lineColorList"; import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; import { useCurrentTrain } from "@/stateBox/useCurrentTrain"; import { useStationList } from "@/stateBox/useStationList"; import { StationProps } from "@/lib/CommonTypes"; import { FC, useEffect, useState } from "react"; import { Text, TouchableOpacity, View, Image, LayoutAnimation, } from "react-native"; import { getTrainType } from "@/lib/getTrainType"; import { trainPosition } from "@/lib/trainPositionTextArray"; import { StationNumberMaker } from "@/components/駅名表/StationNumberMaker"; import { lineListPair, stationIDPair } from "@/lib/getStationList"; import { findReversalPoints } from "@/lib/eachTrainInfoCoreLib/findReversalPoints"; import { CustomTrainData, trainTypeID } from "@/lib/CommonTypes"; import { getCurrentTrainData } from "@/lib/getCurrentTrainData"; import { Ionicons } from "@expo/vector-icons"; type props = { trainID: string; displaySize: number; setDisplaySize: (e: number) => void; }; export const FixedTrain: FC = ({ trainID, displaySize, setDisplaySize, }) => { const { fixedPosition, setFixedPosition, currentTrain, getCurrentStationData, getPosition, } = useCurrentTrain(); const { allCustomTrainData, allTrainDiagram } = useAllTrainDiagram(); const [train, setTrain] = useState<{ Pos?: string; Direction?: number; Index?: number; Line?: string; PosNum?: number; Type?: string; delay?: string | number; num?: string; }>(null); const [customData, setCustomData] = useState( getCurrentTrainData(trainID, currentTrain, allCustomTrainData) ); useEffect(() => { setCustomData( getCurrentTrainData(trainID, currentTrain, allCustomTrainData) ); }, [currentTrain, trainID]); useEffect(() => { const stationData = getCurrentStationData(trainID); if (stationData) { setTrain(stationData); } }, [trainID, currentTrain]); const { getStationDataFromName, stationList, originalStationList } = useStationList(); const [trainDataWidhThrough, setTrainDataWithThrough] = useState( [] ); useEffect(() => { const trainData = allTrainDiagram[trainID]?.split("#"); if (!trainData) return; //let haveThrough = false; // const stopStationList = trainData.map((i) => { const [station, se, time] = i.split(","); //if (se == "通編") setHaveThrough(true); return stationList.map((a) => a.filter((d) => d.StationName == station)); }); const allThroughStationList = stopStationList.map((i, index, array) => { let allThroughStation = []; if (index == array.length - 1) return; const firstItem = array[index]; const secondItem = array[index + 1]; let betweenStationLine = ""; let baseStationNumberFirst = ""; let baseStationNumberSecond = ""; Object.keys(stationIDPair).forEach((d, index2, array) => { if (!d) return; const haveFirst = firstItem[index2]; const haveSecond = secondItem[index2]; if (haveFirst.length && haveSecond.length) { betweenStationLine = d; baseStationNumberFirst = haveFirst[0].StationNumber; baseStationNumberSecond = haveSecond[0].StationNumber; } }); if (!betweenStationLine) return; let reverse = false; originalStationList[ lineListPair[stationIDPair[betweenStationLine]] ].forEach((d) => { if ( d.StationNumber > baseStationNumberFirst && d.StationNumber < baseStationNumberSecond ) { allThroughStation.push(`${d.Station_JP},通過,`); //setHaveThrough(true); reverse = false; } else { if ( d.StationNumber < baseStationNumberFirst && d.StationNumber > baseStationNumberSecond ) { allThroughStation.push(`${d.Station_JP},通過,`); //setHaveThrough(true); reverse = true; } } }); if (reverse) allThroughStation.reverse(); return allThroughStation; }); let mainArray = [...trainData]; let indexs = 0; trainData.forEach((d, index, array) => { indexs = indexs + 1; if (!allThroughStationList[index]) return; if (allThroughStationList[index].length == 0) return; mainArray.splice(indexs, 0, ...allThroughStationList[index]); indexs = indexs + allThroughStationList[index].length; }); setTrainDataWithThrough(mainArray); }, [allTrainDiagram, stationList, trainID]); const stopStationIDList = trainDataWidhThrough.map((i) => { const [station, se, time] = i.split(","); const Stations = stationList.map((a) => a.filter((d) => d.StationName == station) ); const StationNumbers = Stations && Stations.reduce((newArray, e) => { return newArray.concat(e); }, []).map((d) => d.StationNumber); return StationNumbers; }); const [currentPosition, setCurrentPosition] = useState([]); useEffect(() => { const position = getPosition(train); if (position) setCurrentPosition(position); }, [train]); const [nextStationData, setNextStationData] = useState([]); const [untilStationData, setUntilStationData] = useState([]); useEffect(() => { const points = findReversalPoints(currentPosition, stopStationIDList); if (!points) return; if (points.length == 0) return; let searchCountBase = points.findIndex((d) => d == true); for ( let searchCount = searchCountBase; searchCount < points.length; searchCount++ ) { const nextPos = trainDataWidhThrough[searchCount]; if (nextPos) { const [station, se, time] = nextPos.split(","); if (se.includes("通")) continue; else { setNextStationData(getStationDataFromName(station)); break; } } } let trainList = []; for ( let searchCount = searchCountBase - 1; searchCount < points.length; searchCount++ ) { trainList.push(trainDataWidhThrough[searchCount]); } setUntilStationData(trainList); }, [currentPosition, trainDataWidhThrough]); const [ToData, setToData] = useState(""); useEffect(() => { if (customData.ToData && customData.ToData != "") { setToData(customData.ToData); } else { if (trainDataWidhThrough.length == 0) return; setToData( trainDataWidhThrough[trainDataWidhThrough.length - 2].split(",")[0] ); } }, [customData, trainDataWidhThrough]); const [station, setStation] = useState([]); useEffect(() => { const data = getStationDataFromName(ToData); setStation(data); }, [ToData]); const lineColor = station.length > 0 ? lineColorList[station[0]?.StationNumber.slice(0, 1)] : "black"; //const lineColor = "red"; const customTrainType = getTrainType({ type: customData.type, whiteMode: true, }); return ( { //setFixedPosition({ type: null, value: null }); }} > {customTrainType.shortName} {customData.trainName && ( 6 ? 9 : 14, color: "white", maxWidth: displaySize === 50 ? 65 : 200, textAlignVertical: "center", }} > {customData.trainName} )} {ToData}行 {displaySize === 200 && ( )} {nextStationData[0]?.Station_JP == train?.Pos ? "ただいま" : "次は"} {nextStationData[0]?.Station_JP || "不明"} {displaySize === 50 && ( )} { setFixedPosition({ type: null, value: null }); }} > 列車追跡中 { LayoutAnimation.configureNext(LayoutAnimation.Presets.linear); if (displaySize === 50) { setDisplaySize(200); } else { setDisplaySize(50); } }} > {displaySize == 50 ? "列車情報展開" : "列車情報縮小"} ); }; const CurrentPositionBox = ({ train, lineColor, trainDataWithThrough, isSmall, }) => { let firstText = ""; let secondText = ""; let marginText = ""; let externalText = ""; const { isBetween, Pos: PosData } = trainPosition(train); if (isBetween === true) { const { from, to } = PosData; firstText = from; secondText = to; marginText = "→"; } else { const { Pos } = PosData; if (Pos !== "") { firstText = Pos; } } return ( {isSmall && ( )} {trainDataWithThrough.length > 0 && trainDataWithThrough.map((d, index, array) => { if (!d) return null; if (d == "") return null; const [station, se, time] = d.split(","); return ( <> {(index == 0 && secondText == "") || ( {station.split("").map((i, index) => { return ( {i} ); })} {se.includes("通") ? "" : "●"} )} {index == 0 && secondText != "" && ( )} ); })} ); };