From 6300259e709a52d0bb00825a7fd1ecfe32b0a1d1 Mon Sep 17 00:00:00 2001 From: harukin-OneMix4 Date: Tue, 16 Jan 2024 01:54:51 +0900 Subject: [PATCH] =?UTF-8?q?=E7=89=B9=E6=80=A5=E5=88=97=E8=BB=8A=E3=81=AE?= =?UTF-8?q?=E5=88=86=E5=89=B2=E4=BD=B5=E5=90=88=E3=81=AB=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E4=B8=AD(=E6=9D=A1=E4=BB=B6=E4=B8=8D=E8=B6=B3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.js | 52 +++- .../ActionSheetComponents/EachTrainInfo.js | 276 +++++++++++------- stateBox/useBusAndTrainData.js | 10 +- 3 files changed, 221 insertions(+), 117 deletions(-) diff --git a/App.js b/App.js index 87592e3..da40942 100644 --- a/App.js +++ b/App.js @@ -3,6 +3,7 @@ import { NavigationContainer } from "@react-navigation/native"; import { createStackNavigator } from "@react-navigation/stack"; import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; import { Platform, UIManager } from "react-native"; +import { GestureHandlerRootView } from "react-native-gesture-handler"; import { UpdateAsync } from "./UpdateAsync.js"; import { AS } from "./storageControl"; import TNDView from "./ndView"; @@ -45,26 +46,28 @@ export default function App() { useEffect(() => UpdateAsync(), []); return ( - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + ); } export function AppContainer() { - const { setBusAndTrainData } = useBusAndTrainData(); + const { setBusAndTrainData, setTrainPairData } = useBusAndTrainData(); useEffect(() => { AS.getItem("busAndTrain") .then((d) => { @@ -82,6 +85,23 @@ export function AppContainer() { }); }); }, []); + useEffect(() => { + AS.getItem("trainPairData") + .then((d) => { + const returnData = JSON.parse(d); + setTrainPairData(returnData); + }) + .catch(() => { + fetch( + "https://script.google.com/macros/s/AKfycbyoBH7_rBwzPmhU1ghRBNTAVuvGltIrZtWxE07gDdhGGlDL9Ip2qk3pFM5u2xtRBl8/exec" + ) + .then((d) => d.json()) + .then((d) => { + setTrainPairData(d); + AS.setItem("trainPairData", JSON.stringify(d)); + }); + }); + }, []); const { areaInfo, setAreaInfo } = useAreaInfo(); const getAreaData = () => diff --git a/components/ActionSheetComponents/EachTrainInfo.js b/components/ActionSheetComponents/EachTrainInfo.js index 5afc5d5..de91f14 100644 --- a/components/ActionSheetComponents/EachTrainInfo.js +++ b/components/ActionSheetComponents/EachTrainInfo.js @@ -30,6 +30,8 @@ import { checkDuplicateTrainData } from "../../lib/checkDuplicateTrainData"; import dayjs from "dayjs"; import { getTrainType } from "../../lib/getTrainType"; import { customTrainDataDetector } from "../custom-train-data"; +import { useBusAndTrainData } from "../../stateBox/useBusAndTrainData"; +import { Swipeable } from "react-native-gesture-handler"; export const EachTrainInfo = (props) => { if (!props.payload) return <>; @@ -46,14 +48,26 @@ export const EachTrainInfo = (props) => { const [trainPositionSwitch, setTrainPositionSwitch] = useState("false"); const { currentTrain } = useCurrentTrain(); + const { trainPairData } = useBusAndTrainData(); const [currentTrainData, setCurrentTrainData] = useState([]); const [nearTrainIDList, setNearTrainIDList] = useState([]); + const [showNearTrain, setShowNearTrain] = useState([]); + const [isConcatNear, setIsConcatNear] = useState(false); + //裏列車探索 useEffect(() => { + const trainPairList = {}; + trainPairData.forEach((d) => { + trainPairList[Object.keys(d)[0]] = d[Object.keys(d)[0]]; + }); const returnArray = []; if (!data.trainNum) return; + if (trainPairList[data.trainNum]) { + returnArray.push(Object.keys(trainPairList[data.trainNum])[0]); + } if ( + // 列番が4xxDまたは5xxDの場合はxxDの列番を検索 new RegExp(/^4[1-9]\d\d[DM]$/).test(data.trainNum) || new RegExp(/^5[1-7]\d\d[DM]$/).test(data.trainNum) ) { @@ -62,15 +76,53 @@ export const EachTrainInfo = (props) => { } } if (new RegExp(/^[1-9]\d\d[DM]$/).test(data.trainNum)) { - if (trainList["4" + data.trainNum]) { - returnArray.push("4" + data.trainNum); - } - if (trainList["5" + data.trainNum]) { - returnArray.push("5" + data.trainNum); - } + // 列番がxxDの場合は4xxDと5xxDの列番を検索 + if (trainList["4" + data.trainNum]) returnArray.push("4" + data.trainNum); + if (trainList["5" + data.trainNum]) returnArray.push("5" + data.trainNum); } setNearTrainIDList(returnArray); + if (!returnArray[0]) return; + const TD = trainList[returnArray[0]]; + if (!TD) return; + const TDArray = TD.split("#").filter((d) => d != ""); + setShowNearTrain(TDArray); }, [data]); + + const openBackTrainInfo = (stationInfo, currentTrainIndex) => { + console.log(trainData); + console.log(showNearTrain); + const stationPosition = showNearTrain.findIndex( + (d) => d.split(",")[0] == stationInfo + ); + const relationBackTrain = + stationPosition == 0 + ? "head" + : stationPosition == showNearTrain.length - 1 + ? "tail" + : "middle"; + if (relationBackTrain === "head") { + const migrationTrainData = [ + ...trainData.slice(0, currentTrainIndex), + ...showNearTrain, + ]; + setTrainData(migrationTrainData); + } else if (relationBackTrain === "tail") { + const migrationTrainData = [ + ...showNearTrain.slice(0, showNearTrain.length - 1), + ...trainData.slice(currentTrainIndex), + ]; + setTrainData(migrationTrainData); + } else if (relationBackTrain === "middle") { + const migrationTrainData = [ + ...trainData.slice(0, currentTrainIndex), + ...showNearTrain.slice(0, stationPosition), + ...trainData.slice(currentTrainIndex), + ]; + setTrainData(migrationTrainData); + } + setIsConcatNear(true); + }; + const openTrainInfo = (d) => { const train = customTrainDataDetector(d); let TrainNumber = ""; @@ -90,9 +142,7 @@ export const EachTrainInfo = (props) => { originalStationList, from: "AllTrainDiagramView", }; - SheetManager.show("EachTrainInfo", { - payload, - }); + //SheetManager.show("EachTrainInfo", { payload }); }; useEffect(() => { setCurrentTrainData( @@ -349,16 +399,10 @@ export const EachTrainInfo = (props) => { : ""} - { - nearTrainIDList.length && openTrainInfo(nearTrainIDList[0]); - }} - > - - {data.trainNum} - {nearTrainIDList.length ? "..." : ""} - - + + {data.trainNum} + {isConcatNear ? ` + ${nearTrainIDList}` : ""} + {data.limited != undefined && getType(data.limited.split(":")[0]) && @@ -553,6 +597,9 @@ export const EachTrainInfo = (props) => { points={points} currentTrainData={currentTrainData} openStationACFromEachTrainInfo={openStationACFromEachTrainInfo} + headAndTail={showNearTrain.map((d) => d.split(",")[0])} + openBackTrainInfo={openBackTrainInfo} + isConcatNear={isConcatNear} /> ))} @@ -583,6 +630,9 @@ const StationButton = ({ points, currentTrainData, openStationACFromEachTrainInfo, + headAndTail, + openBackTrainInfo, + isConcatNear, }) => { const [station, se, time] = i.split(","); // 阿波池田,発,6:21 const Stations = stationList @@ -618,94 +668,120 @@ const StationButton = ({ .add(isNaN(currentTrainData?.delay) ? 0 : currentTrainData.delay, "minute"); const timeString = dates.format("HH:mm").split(":"); + const StationNames = Stations && Stations[0]?.StationName; + const [isConnected, setIsConnected] = useState( + headAndTail.includes(StationNames) + ); + const swipagleRef = useRef(null); return ( - openStationACFromEachTrainInfo(station)} + { + openBackTrainInfo(station, index); + swipagleRef.current.close(); + }} + renderRightActions={ + isConnected && !isConcatNear + ? (progress, dragX) => { + //openBackTrainInfo(station, index); + return ; + } + : null + } > - - - {lineIDs.map((lineID, index) => ( - - - - {lineIDs[index]} - {"\n"} - {EachIDs[index]} - - - - ))} - - - {station} - - {points && points.findIndex((d) => d == index) >= 0 ? ( - 🚊 - ) : null} - {!isNaN(currentTrainData?.delay) && currentTrainData?.delay != 0 && ( - - {time} - - )} - openStationACFromEachTrainInfo(station)} + key={station} + > + + - {timeString[0]}:{timeString[1]} - - - {se?.replace("発", "出発").replace("着", "到着")} - + {lineIDs.map((lineID, index) => ( + + + + {lineIDs[index]} + {"\n"} + {EachIDs[index]} + + + + ))} + + + {station} + + {points && points.findIndex((d) => d == index) >= 0 ? ( + 🚊 + ) : null} + {!isNaN(currentTrainData?.delay) && + currentTrainData?.delay != 0 && ( + + {time} + + )} + + {timeString[0]}:{timeString[1]} + + + {se?.replace("発", "出発").replace("着", "到着")} + + - - + + ); }; diff --git a/stateBox/useBusAndTrainData.js b/stateBox/useBusAndTrainData.js index a4791b5..e8694bd 100644 --- a/stateBox/useBusAndTrainData.js +++ b/stateBox/useBusAndTrainData.js @@ -2,6 +2,8 @@ import React, { createContext, useContext, useState } from "react"; const initialState = { busAndTrainData: [], setBusAndTrainData: () => {}, + trainPairData: [], + setTrainPairData: () => {}, }; const BusAndTrainDataContext = createContext(initialState); @@ -12,10 +14,16 @@ export const useBusAndTrainData = () => { export const BusAndTrainDataProvider = ({ children }) => { const [busAndTrainData, setBusAndTrainData] = useState([]); + const [trainPairData, setTrainPairData] = useState([]); return ( {children}