From 5d9a7e185f6f96619b59bb2ccfed37792eb0f356 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Sun, 7 Sep 2025 14:29:54 +0000 Subject: [PATCH] =?UTF-8?q?=E5=B7=A6=E5=81=B4=E3=81=AE=E6=83=85=E5=A0=B1?= =?UTF-8?q?=E4=B8=80=E9=80=9A=E3=82=8A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/Apps/FixedPositionBox.tsx | 246 ++++++++++++++++++++------- 1 file changed, 189 insertions(+), 57 deletions(-) diff --git a/components/Apps/FixedPositionBox.tsx b/components/Apps/FixedPositionBox.tsx index 1bd30fa..679363a 100644 --- a/components/Apps/FixedPositionBox.tsx +++ b/components/Apps/FixedPositionBox.tsx @@ -11,6 +11,8 @@ import { getTrainType } from "@/lib/getTrainType"; import Constants from "expo-constants"; import { trainPosition } from "@/lib/trainPositionTextArray"; import { StationNumberMaker } from "../駅名表/StationNumberMaker"; +import { lineListPair, stationIDPair } from "@/lib/getStationList"; +import { findReversalPoints } from "@/lib/eachTrainInfoCoreLib/findReversalPoints"; export const FixedPositionBox = () => { const { fixedPosition, setFixedPosition } = useCurrentTrain(); @@ -131,7 +133,13 @@ export const FixedStation = ({ stationID }) => { }; export const FixedTrain = ({ trainID }) => { - const { fixedPosition, setFixedPosition, currentTrain,getCurrentStationData } = useCurrentTrain(); + const { + fixedPosition, + setFixedPosition, + currentTrain, + getCurrentStationData, + getPosition, + } = useCurrentTrain(); const { allCustomTrainData, allTrainDiagram } = useAllTrainDiagram(); const getTrainDataFromCurrentTrain = (trainNum: string) => { @@ -193,24 +201,133 @@ export const FixedTrain = ({ trainID }) => { } }, [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([]); + useEffect(() => { + const points = findReversalPoints(currentPosition, stopStationIDList); + if (!points) return; + if (points.length == 0) return; + let searchCount = points.findIndex((d) => d == true); + for (searchCount; 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; + } + } + } + }, [currentPosition, trainDataWidhThrough]); const [ToData, setToData] = useState(""); useEffect(() => { if (customData.ToData && customData.ToData != "") { setToData(customData.ToData); } else { - const base = allTrainDiagram[trainID]; - if (!base) return; - const data = base.split("#"); - setToData(data[data.length - 2].split(",")[0]); + if (trainDataWidhThrough.length == 0) return; + setToData( + trainDataWidhThrough[trainDataWidhThrough.length - 2].split(",")[0] + ); } - }, [customData, train]); + }, [customData, trainDataWidhThrough]); const [stringConfig, setStringConfig] = useState([, ,]); useEffect(() => { const x = getStringConfig(customData.type, customData.TrainNumber); setStringConfig(x); }, [customData]); - const { getStationDataFromName } = useStationList(); const [station, setStation] = useState([]); useEffect(() => { const data = getStationDataFromName(ToData); @@ -271,7 +388,7 @@ export const FixedTrain = ({ trainID }) => { style={{ fontSize: customData?.trainName?.length > 6 ? 9 : 14, color: "white", - maxWidth: 70, + maxWidth: 65, textAlignVertical: "center", }} > @@ -343,13 +460,28 @@ export const FixedTrain = ({ trainID }) => { > + 次は + + + - 次は 新居浜 + {nextStationData[0]?.Station_JP || "不明"} { borderBottomWidth: 0, borderLeftWidth: 0, borderRightWidth: 10, - flex: 1, }} > - - + ); }; -const CurrentPositionBox = ({train,lineColor})=>{ - let firstText = ""; +const CurrentPositionBox = ({ train, lineColor }) => { + let firstText = ""; let secondText = ""; let marginText = ""; let externalText = ""; @@ -391,44 +521,46 @@ const CurrentPositionBox = ({train,lineColor})=>{ firstText = Pos; } } - return - - - - - - 現在地: - - - {marginText == "→" ? firstText + marginText + secondText : firstText} - - ; -} \ No newline at end of file + return ( + + + + + + + 現在地: + + + {marginText == "→" ? firstText + marginText + secondText : firstText} + + + ); +};