特急列車の分割併合に対応中(条件不足)
This commit is contained in:
parent
4009b5eef2
commit
6300259e70
52
App.js
52
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 (
|
||||
<SafeAreaProvider>
|
||||
<FavoriteStationProvider>
|
||||
<TrainDelayDataProvider>
|
||||
<CurrentTrainProvider>
|
||||
<AreaInfoProvider>
|
||||
<AllTrainDiagramProvider>
|
||||
<BusAndTrainDataProvider>
|
||||
<SheetProvider>
|
||||
<AppContainer />
|
||||
</SheetProvider>
|
||||
</BusAndTrainDataProvider>
|
||||
</AllTrainDiagramProvider>
|
||||
</AreaInfoProvider>
|
||||
</CurrentTrainProvider>
|
||||
</TrainDelayDataProvider>
|
||||
</FavoriteStationProvider>
|
||||
<GestureHandlerRootView style={{ flex: 1 }}>
|
||||
<FavoriteStationProvider>
|
||||
<TrainDelayDataProvider>
|
||||
<CurrentTrainProvider>
|
||||
<AreaInfoProvider>
|
||||
<AllTrainDiagramProvider>
|
||||
<BusAndTrainDataProvider>
|
||||
<SheetProvider>
|
||||
<AppContainer />
|
||||
</SheetProvider>
|
||||
</BusAndTrainDataProvider>
|
||||
</AllTrainDiagramProvider>
|
||||
</AreaInfoProvider>
|
||||
</CurrentTrainProvider>
|
||||
</TrainDelayDataProvider>
|
||||
</FavoriteStationProvider>
|
||||
</GestureHandlerRootView>
|
||||
</SafeAreaProvider>
|
||||
);
|
||||
}
|
||||
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 = () =>
|
||||
|
@ -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) => {
|
||||
: ""}
|
||||
</Text>
|
||||
<View style={{ flex: 1 }} />
|
||||
<TouchableOpacity
|
||||
onPress={() => {
|
||||
nearTrainIDList.length && openTrainInfo(nearTrainIDList[0]);
|
||||
}}
|
||||
>
|
||||
<Text style={{ fontSize: 20, fontWeight: "bold", color: "white" }}>
|
||||
{data.trainNum}
|
||||
{nearTrainIDList.length ? "..." : ""}
|
||||
</Text>
|
||||
</TouchableOpacity>
|
||||
<Text style={{ fontSize: 20, fontWeight: "bold", color: "white" }}>
|
||||
{data.trainNum}
|
||||
{isConcatNear ? ` + ${nearTrainIDList}` : ""}
|
||||
</Text>
|
||||
|
||||
{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 (
|
||||
<TouchableWithoutFeedback
|
||||
onPress={() => openStationACFromEachTrainInfo(station)}
|
||||
<Swipeable
|
||||
ref={swipagleRef}
|
||||
key={station}
|
||||
onSwipeableOpen={() => {
|
||||
openBackTrainInfo(station, index);
|
||||
swipagleRef.current.close();
|
||||
}}
|
||||
renderRightActions={
|
||||
isConnected && !isConcatNear
|
||||
? (progress, dragX) => {
|
||||
//openBackTrainInfo(station, index);
|
||||
return <View style={{ flex: 1, backgroundColor: "red" }}></View>;
|
||||
}
|
||||
: null
|
||||
}
|
||||
>
|
||||
<View style={{ flexDirection: "row" }}>
|
||||
<View
|
||||
style={{
|
||||
width: 35,
|
||||
position: "relative",
|
||||
marginHorizontal: 15,
|
||||
flexDirection: "row",
|
||||
height: "101%",
|
||||
}}
|
||||
>
|
||||
{lineIDs.map((lineID, index) => (
|
||||
<View
|
||||
style={{
|
||||
backgroundColor: lineColorList[lineID],
|
||||
flex: 1,
|
||||
}}
|
||||
key={lineID}
|
||||
>
|
||||
<View style={{ flex: 1 }} />
|
||||
<Text
|
||||
style={{
|
||||
color: "white",
|
||||
textAlign: "center",
|
||||
fontSize: 10,
|
||||
fontWeight: "bold",
|
||||
}}
|
||||
>
|
||||
{lineIDs[index]}
|
||||
{"\n"}
|
||||
{EachIDs[index]}
|
||||
</Text>
|
||||
<View style={{ flex: 1 }} />
|
||||
</View>
|
||||
))}
|
||||
</View>
|
||||
<View
|
||||
style={{
|
||||
padding: 8,
|
||||
flexDirection: "row",
|
||||
borderBottomWidth: 1,
|
||||
borderBottomColor: "#f0f0f0",
|
||||
flex: 1,
|
||||
}}
|
||||
>
|
||||
<Text style={{ fontSize: 20 }}>{station}</Text>
|
||||
<View style={{ flex: 1 }} />
|
||||
{points && points.findIndex((d) => d == index) >= 0 ? (
|
||||
<Text style={{ fontSize: 20, marginRight: 70 }}>🚊</Text>
|
||||
) : null}
|
||||
{!isNaN(currentTrainData?.delay) && currentTrainData?.delay != 0 && (
|
||||
<Text
|
||||
style={{
|
||||
fontSize: 15,
|
||||
color: "black",
|
||||
width: 60,
|
||||
position: "absolute",
|
||||
right: 120,
|
||||
textAlign: "right",
|
||||
textDecorationLine: "line-through",
|
||||
}}
|
||||
>
|
||||
{time}
|
||||
</Text>
|
||||
)}
|
||||
<Text
|
||||
<TouchableWithoutFeedback
|
||||
onPress={() => openStationACFromEachTrainInfo(station)}
|
||||
key={station}
|
||||
>
|
||||
<View style={{ flexDirection: "row", backgroundColor: "white" }}>
|
||||
<View
|
||||
style={{
|
||||
fontSize: 20,
|
||||
color: isNaN(currentTrainData?.delay)
|
||||
? "black"
|
||||
: currentTrainData?.delay == 0
|
||||
? "black"
|
||||
: "red",
|
||||
width: 60,
|
||||
width: 35,
|
||||
position: "relative",
|
||||
marginHorizontal: 15,
|
||||
flexDirection: "row",
|
||||
height: "101%",
|
||||
}}
|
||||
>
|
||||
{timeString[0]}:{timeString[1]}
|
||||
</Text>
|
||||
<Text style={{ fontSize: 18, width: 50 }}>
|
||||
{se?.replace("発", "出発").replace("着", "到着")}
|
||||
</Text>
|
||||
{lineIDs.map((lineID, index) => (
|
||||
<View
|
||||
style={{
|
||||
backgroundColor: lineColorList[lineID],
|
||||
flex: 1,
|
||||
}}
|
||||
key={lineID}
|
||||
>
|
||||
<View style={{ flex: 1 }} />
|
||||
<Text
|
||||
style={{
|
||||
color: "white",
|
||||
textAlign: "center",
|
||||
fontSize: 10,
|
||||
fontWeight: "bold",
|
||||
}}
|
||||
>
|
||||
{lineIDs[index]}
|
||||
{"\n"}
|
||||
{EachIDs[index]}
|
||||
</Text>
|
||||
<View style={{ flex: 1 }} />
|
||||
</View>
|
||||
))}
|
||||
</View>
|
||||
<View
|
||||
style={{
|
||||
padding: 8,
|
||||
flexDirection: "row",
|
||||
borderBottomWidth: 1,
|
||||
borderBottomColor: "#f0f0f0",
|
||||
borderRightColor: isConnected && !isConcatNear ? "red" : "white",
|
||||
borderRightWidth: 10,
|
||||
paddingRight: 10,
|
||||
flex: 1,
|
||||
}}
|
||||
>
|
||||
<Text style={{ fontSize: 20 }}>{station}</Text>
|
||||
<View style={{ flex: 1 }} />
|
||||
{points && points.findIndex((d) => d == index) >= 0 ? (
|
||||
<Text style={{ fontSize: 20, marginRight: 70 }}>🚊</Text>
|
||||
) : null}
|
||||
{!isNaN(currentTrainData?.delay) &&
|
||||
currentTrainData?.delay != 0 && (
|
||||
<Text
|
||||
style={{
|
||||
fontSize: 15,
|
||||
color: "black",
|
||||
width: 60,
|
||||
position: "absolute",
|
||||
right: 120,
|
||||
textAlign: "right",
|
||||
textDecorationLine: "line-through",
|
||||
}}
|
||||
>
|
||||
{time}
|
||||
</Text>
|
||||
)}
|
||||
<Text
|
||||
style={{
|
||||
fontSize: 20,
|
||||
color: isNaN(currentTrainData?.delay)
|
||||
? "black"
|
||||
: currentTrainData?.delay == 0
|
||||
? "black"
|
||||
: "red",
|
||||
width: 60,
|
||||
}}
|
||||
>
|
||||
{timeString[0]}:{timeString[1]}
|
||||
</Text>
|
||||
<Text style={{ fontSize: 18, width: 50 }}>
|
||||
{se?.replace("発", "出発").replace("着", "到着")}
|
||||
</Text>
|
||||
</View>
|
||||
</View>
|
||||
</View>
|
||||
</TouchableWithoutFeedback>
|
||||
</TouchableWithoutFeedback>
|
||||
</Swipeable>
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -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 (
|
||||
<BusAndTrainDataContext.Provider
|
||||
value={{ busAndTrainData, setBusAndTrainData }}
|
||||
value={{
|
||||
busAndTrainData,
|
||||
setBusAndTrainData,
|
||||
trainPairData,
|
||||
setTrainPairData,
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</BusAndTrainDataContext.Provider>
|
||||
|
Loading…
Reference in New Issue
Block a user