特急列車の分割併合に対応中(条件不足)
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 { createStackNavigator } from "@react-navigation/stack";
|
||||||
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
|
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
|
||||||
import { Platform, UIManager } from "react-native";
|
import { Platform, UIManager } from "react-native";
|
||||||
|
import { GestureHandlerRootView } from "react-native-gesture-handler";
|
||||||
import { UpdateAsync } from "./UpdateAsync.js";
|
import { UpdateAsync } from "./UpdateAsync.js";
|
||||||
import { AS } from "./storageControl";
|
import { AS } from "./storageControl";
|
||||||
import TNDView from "./ndView";
|
import TNDView from "./ndView";
|
||||||
@ -45,26 +46,28 @@ export default function App() {
|
|||||||
useEffect(() => UpdateAsync(), []);
|
useEffect(() => UpdateAsync(), []);
|
||||||
return (
|
return (
|
||||||
<SafeAreaProvider>
|
<SafeAreaProvider>
|
||||||
<FavoriteStationProvider>
|
<GestureHandlerRootView style={{ flex: 1 }}>
|
||||||
<TrainDelayDataProvider>
|
<FavoriteStationProvider>
|
||||||
<CurrentTrainProvider>
|
<TrainDelayDataProvider>
|
||||||
<AreaInfoProvider>
|
<CurrentTrainProvider>
|
||||||
<AllTrainDiagramProvider>
|
<AreaInfoProvider>
|
||||||
<BusAndTrainDataProvider>
|
<AllTrainDiagramProvider>
|
||||||
<SheetProvider>
|
<BusAndTrainDataProvider>
|
||||||
<AppContainer />
|
<SheetProvider>
|
||||||
</SheetProvider>
|
<AppContainer />
|
||||||
</BusAndTrainDataProvider>
|
</SheetProvider>
|
||||||
</AllTrainDiagramProvider>
|
</BusAndTrainDataProvider>
|
||||||
</AreaInfoProvider>
|
</AllTrainDiagramProvider>
|
||||||
</CurrentTrainProvider>
|
</AreaInfoProvider>
|
||||||
</TrainDelayDataProvider>
|
</CurrentTrainProvider>
|
||||||
</FavoriteStationProvider>
|
</TrainDelayDataProvider>
|
||||||
|
</FavoriteStationProvider>
|
||||||
|
</GestureHandlerRootView>
|
||||||
</SafeAreaProvider>
|
</SafeAreaProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
export function AppContainer() {
|
export function AppContainer() {
|
||||||
const { setBusAndTrainData } = useBusAndTrainData();
|
const { setBusAndTrainData, setTrainPairData } = useBusAndTrainData();
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
AS.getItem("busAndTrain")
|
AS.getItem("busAndTrain")
|
||||||
.then((d) => {
|
.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 { areaInfo, setAreaInfo } = useAreaInfo();
|
||||||
const getAreaData = () =>
|
const getAreaData = () =>
|
||||||
|
@ -30,6 +30,8 @@ import { checkDuplicateTrainData } from "../../lib/checkDuplicateTrainData";
|
|||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import { getTrainType } from "../../lib/getTrainType";
|
import { getTrainType } from "../../lib/getTrainType";
|
||||||
import { customTrainDataDetector } from "../custom-train-data";
|
import { customTrainDataDetector } from "../custom-train-data";
|
||||||
|
import { useBusAndTrainData } from "../../stateBox/useBusAndTrainData";
|
||||||
|
import { Swipeable } from "react-native-gesture-handler";
|
||||||
|
|
||||||
export const EachTrainInfo = (props) => {
|
export const EachTrainInfo = (props) => {
|
||||||
if (!props.payload) return <></>;
|
if (!props.payload) return <></>;
|
||||||
@ -46,14 +48,26 @@ export const EachTrainInfo = (props) => {
|
|||||||
const [trainPositionSwitch, setTrainPositionSwitch] = useState("false");
|
const [trainPositionSwitch, setTrainPositionSwitch] = useState("false");
|
||||||
|
|
||||||
const { currentTrain } = useCurrentTrain();
|
const { currentTrain } = useCurrentTrain();
|
||||||
|
const { trainPairData } = useBusAndTrainData();
|
||||||
|
|
||||||
const [currentTrainData, setCurrentTrainData] = useState([]);
|
const [currentTrainData, setCurrentTrainData] = useState([]);
|
||||||
const [nearTrainIDList, setNearTrainIDList] = useState([]);
|
const [nearTrainIDList, setNearTrainIDList] = useState([]);
|
||||||
|
const [showNearTrain, setShowNearTrain] = useState([]);
|
||||||
|
const [isConcatNear, setIsConcatNear] = useState(false);
|
||||||
|
|
||||||
|
//裏列車探索
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
const trainPairList = {};
|
||||||
|
trainPairData.forEach((d) => {
|
||||||
|
trainPairList[Object.keys(d)[0]] = d[Object.keys(d)[0]];
|
||||||
|
});
|
||||||
const returnArray = [];
|
const returnArray = [];
|
||||||
if (!data.trainNum) return;
|
if (!data.trainNum) return;
|
||||||
|
if (trainPairList[data.trainNum]) {
|
||||||
|
returnArray.push(Object.keys(trainPairList[data.trainNum])[0]);
|
||||||
|
}
|
||||||
if (
|
if (
|
||||||
|
// 列番が4xxDまたは5xxDの場合はxxDの列番を検索
|
||||||
new RegExp(/^4[1-9]\d\d[DM]$/).test(data.trainNum) ||
|
new RegExp(/^4[1-9]\d\d[DM]$/).test(data.trainNum) ||
|
||||||
new RegExp(/^5[1-7]\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 (new RegExp(/^[1-9]\d\d[DM]$/).test(data.trainNum)) {
|
||||||
if (trainList["4" + data.trainNum]) {
|
// 列番がxxDの場合は4xxDと5xxDの列番を検索
|
||||||
returnArray.push("4" + data.trainNum);
|
if (trainList["4" + data.trainNum]) returnArray.push("4" + data.trainNum);
|
||||||
}
|
if (trainList["5" + data.trainNum]) returnArray.push("5" + data.trainNum);
|
||||||
if (trainList["5" + data.trainNum]) {
|
|
||||||
returnArray.push("5" + data.trainNum);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
setNearTrainIDList(returnArray);
|
setNearTrainIDList(returnArray);
|
||||||
|
if (!returnArray[0]) return;
|
||||||
|
const TD = trainList[returnArray[0]];
|
||||||
|
if (!TD) return;
|
||||||
|
const TDArray = TD.split("#").filter((d) => d != "");
|
||||||
|
setShowNearTrain(TDArray);
|
||||||
}, [data]);
|
}, [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 openTrainInfo = (d) => {
|
||||||
const train = customTrainDataDetector(d);
|
const train = customTrainDataDetector(d);
|
||||||
let TrainNumber = "";
|
let TrainNumber = "";
|
||||||
@ -90,9 +142,7 @@ export const EachTrainInfo = (props) => {
|
|||||||
originalStationList,
|
originalStationList,
|
||||||
from: "AllTrainDiagramView",
|
from: "AllTrainDiagramView",
|
||||||
};
|
};
|
||||||
SheetManager.show("EachTrainInfo", {
|
//SheetManager.show("EachTrainInfo", { payload });
|
||||||
payload,
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setCurrentTrainData(
|
setCurrentTrainData(
|
||||||
@ -349,16 +399,10 @@ export const EachTrainInfo = (props) => {
|
|||||||
: ""}
|
: ""}
|
||||||
</Text>
|
</Text>
|
||||||
<View style={{ flex: 1 }} />
|
<View style={{ flex: 1 }} />
|
||||||
<TouchableOpacity
|
<Text style={{ fontSize: 20, fontWeight: "bold", color: "white" }}>
|
||||||
onPress={() => {
|
{data.trainNum}
|
||||||
nearTrainIDList.length && openTrainInfo(nearTrainIDList[0]);
|
{isConcatNear ? ` + ${nearTrainIDList}` : ""}
|
||||||
}}
|
</Text>
|
||||||
>
|
|
||||||
<Text style={{ fontSize: 20, fontWeight: "bold", color: "white" }}>
|
|
||||||
{data.trainNum}
|
|
||||||
{nearTrainIDList.length ? "..." : ""}
|
|
||||||
</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
|
|
||||||
{data.limited != undefined &&
|
{data.limited != undefined &&
|
||||||
getType(data.limited.split(":")[0]) &&
|
getType(data.limited.split(":")[0]) &&
|
||||||
@ -553,6 +597,9 @@ export const EachTrainInfo = (props) => {
|
|||||||
points={points}
|
points={points}
|
||||||
currentTrainData={currentTrainData}
|
currentTrainData={currentTrainData}
|
||||||
openStationACFromEachTrainInfo={openStationACFromEachTrainInfo}
|
openStationACFromEachTrainInfo={openStationACFromEachTrainInfo}
|
||||||
|
headAndTail={showNearTrain.map((d) => d.split(",")[0])}
|
||||||
|
openBackTrainInfo={openBackTrainInfo}
|
||||||
|
isConcatNear={isConcatNear}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
@ -583,6 +630,9 @@ const StationButton = ({
|
|||||||
points,
|
points,
|
||||||
currentTrainData,
|
currentTrainData,
|
||||||
openStationACFromEachTrainInfo,
|
openStationACFromEachTrainInfo,
|
||||||
|
headAndTail,
|
||||||
|
openBackTrainInfo,
|
||||||
|
isConcatNear,
|
||||||
}) => {
|
}) => {
|
||||||
const [station, se, time] = i.split(","); // 阿波池田,発,6:21
|
const [station, se, time] = i.split(","); // 阿波池田,発,6:21
|
||||||
const Stations = stationList
|
const Stations = stationList
|
||||||
@ -618,94 +668,120 @@ const StationButton = ({
|
|||||||
.add(isNaN(currentTrainData?.delay) ? 0 : currentTrainData.delay, "minute");
|
.add(isNaN(currentTrainData?.delay) ? 0 : currentTrainData.delay, "minute");
|
||||||
const timeString = dates.format("HH:mm").split(":");
|
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 (
|
return (
|
||||||
<TouchableWithoutFeedback
|
<Swipeable
|
||||||
onPress={() => openStationACFromEachTrainInfo(station)}
|
ref={swipagleRef}
|
||||||
key={station}
|
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" }}>
|
<TouchableWithoutFeedback
|
||||||
<View
|
onPress={() => openStationACFromEachTrainInfo(station)}
|
||||||
style={{
|
key={station}
|
||||||
width: 35,
|
>
|
||||||
position: "relative",
|
<View style={{ flexDirection: "row", backgroundColor: "white" }}>
|
||||||
marginHorizontal: 15,
|
<View
|
||||||
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
|
|
||||||
style={{
|
style={{
|
||||||
fontSize: 20,
|
width: 35,
|
||||||
color: isNaN(currentTrainData?.delay)
|
position: "relative",
|
||||||
? "black"
|
marginHorizontal: 15,
|
||||||
: currentTrainData?.delay == 0
|
flexDirection: "row",
|
||||||
? "black"
|
height: "101%",
|
||||||
: "red",
|
|
||||||
width: 60,
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{timeString[0]}:{timeString[1]}
|
{lineIDs.map((lineID, index) => (
|
||||||
</Text>
|
<View
|
||||||
<Text style={{ fontSize: 18, width: 50 }}>
|
style={{
|
||||||
{se?.replace("発", "出発").replace("着", "到着")}
|
backgroundColor: lineColorList[lineID],
|
||||||
</Text>
|
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>
|
||||||
</View>
|
</TouchableWithoutFeedback>
|
||||||
</TouchableWithoutFeedback>
|
</Swipeable>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2,6 +2,8 @@ import React, { createContext, useContext, useState } from "react";
|
|||||||
const initialState = {
|
const initialState = {
|
||||||
busAndTrainData: [],
|
busAndTrainData: [],
|
||||||
setBusAndTrainData: () => {},
|
setBusAndTrainData: () => {},
|
||||||
|
trainPairData: [],
|
||||||
|
setTrainPairData: () => {},
|
||||||
};
|
};
|
||||||
|
|
||||||
const BusAndTrainDataContext = createContext(initialState);
|
const BusAndTrainDataContext = createContext(initialState);
|
||||||
@ -12,10 +14,16 @@ export const useBusAndTrainData = () => {
|
|||||||
|
|
||||||
export const BusAndTrainDataProvider = ({ children }) => {
|
export const BusAndTrainDataProvider = ({ children }) => {
|
||||||
const [busAndTrainData, setBusAndTrainData] = useState([]);
|
const [busAndTrainData, setBusAndTrainData] = useState([]);
|
||||||
|
const [trainPairData, setTrainPairData] = useState([]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<BusAndTrainDataContext.Provider
|
<BusAndTrainDataContext.Provider
|
||||||
value={{ busAndTrainData, setBusAndTrainData }}
|
value={{
|
||||||
|
busAndTrainData,
|
||||||
|
setBusAndTrainData,
|
||||||
|
trainPairData,
|
||||||
|
setTrainPairData,
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</BusAndTrainDataContext.Provider>
|
</BusAndTrainDataContext.Provider>
|
||||||
|
Loading…
Reference in New Issue
Block a user