Merge commit '80f4913f891e598b18c6fa2cd0bb18814409fd1d' into special/royal-develop

This commit is contained in:
harukin-OneMix4 2024-02-03 22:41:25 +09:00
commit f4f4f314a8
2 changed files with 308 additions and 239 deletions

View File

@ -7,7 +7,6 @@ import {
Text, Text,
TouchableOpacity, TouchableOpacity,
TouchableWithoutFeedback, TouchableWithoutFeedback,
TouchableHighlight,
Platform, Platform,
} from "react-native"; } from "react-native";
import { Ionicons, MaterialCommunityIcons } from "@expo/vector-icons"; import { Ionicons, MaterialCommunityIcons } from "@expo/vector-icons";
@ -15,9 +14,7 @@ import ActionSheet, {
SheetManager, SheetManager,
useScrollHandlers, useScrollHandlers,
} from "react-native-actions-sheet"; } from "react-native-actions-sheet";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { AS } from "../../storageControl"; import { AS } from "../../storageControl";
import LottieView from "lottie-react-native";
import trainList from "../../assets/originData/trainList"; import trainList from "../../assets/originData/trainList";
import { lineList } from "../../lib/getStationList"; import { lineList } from "../../lib/getStationList";
import { import {
@ -31,7 +28,6 @@ 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 { 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 <></>;
@ -44,123 +40,110 @@ export const EachTrainInfo = (props) => {
} = props.payload; } = props.payload;
const [trainData, setTrainData] = useState([]); const [trainData, setTrainData] = useState([]);
const [currentPosition, setCurrentPosition] = useState([]); const [currentPosition, setCurrentPosition] = useState([]);
const [trainPositionSwitch, setTrainPositionSwitch] = useState("false"); const [trainPositionSwitch, setTrainPositionSwitch] = useState("false");
const { currentTrain } = useCurrentTrain(); const { currentTrain } = useCurrentTrain();
const { initializeTrainPairList } = useBusAndTrainData(); const { getInfluencedTrainData } = useBusAndTrainData();
const [currentTrainData, setCurrentTrainData] = useState([]); const [currentTrainData, setCurrentTrainData] = useState([]);
const [nearTrainIDList, setNearTrainIDList] = useState([]); const [nearTrainIDList, setNearTrainIDList] = useState([]);
const [showNearTrain, setShowNearTrain] = useState([]); const [showNearTrain, setShowNearTrain] = useState([]);
const [isConcatNear, setIsConcatNear] = useState(false); const [isConcatNear, setIsConcatNear] = useState(false);
const [tailStation, setTailStation] = useState();
const [headStation, setHeadStation] = useState();
// const [actionSheetHorizonalScroll, setActionSheetHorizonalScroll] = useState(false);
//裏列車探索 //裏列車探索
useEffect(() => { useEffect(() => {
const trainPairList = initializeTrainPairList();
const returnArray = [];
if (!data.trainNum) return; if (!data.trainNum) return;
if (trainPairList[data.trainNum]) { const [returnArray, TDArray] = getInfluencedTrainData(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)
) {
if (trainList[data.trainNum.substring(1)]) {
returnArray.push(data.trainNum.substring(1));
}
}
if (new RegExp(/^[1-9]\d\d[DM]$/).test(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); setNearTrainIDList(returnArray);
if (!returnArray[0]) return;
const TD = trainList[returnArray[0]];
if (!TD) return;
const TDArray = TD.split("#").filter((d) => d != "");
setShowNearTrain(TDArray); setShowNearTrain(TDArray);
}, [data]); }, [data]);
const openBackTrainInfo = (stationInfo, currentTrainIndex) => { useEffect(() => {
console.log(trainData); //trainDataは現在の列車の停車駅リスト if (trainData.length == 0) return;
console.log(showNearTrain); //showNearTrainは裏列車の停車駅リスト if (showNearTrain.length == 0) return;
const mainTrainStationPosition = trainData.findIndex( showNearTrain.forEach((d) => {
(d) => d.split(",")[0] == stationInfo const [station, se, time] = d.split(",");
);
const relationMain =
mainTrainStationPosition == 0
? "head"
: mainTrainStationPosition == trainData.length - 1
? "tail"
: "middle";
console.log(relationMain);
const subTrainStationPosition = showNearTrain.findIndex( console.log(trainData); //trainDataは現在の列車の停車駅リスト
(d) => d.split(",")[0] == stationInfo console.log(station); //showNearTrainは裏列車の停車駅リスト
); console.log(trainData[0]);
const relationSub = if (station == trainData[0].split(",")[0])
subTrainStationPosition == 0 setHeadStation(trainData[0].split(",")[0]);
? "head" if (station == trainData[trainData.length - 1].split(",")[0])
: subTrainStationPosition == showNearTrain.length - 1 setTailStation(trainData[trainData.length - 1].split(",")[0]);
? "tail" });
: "middle"; }, [trainData, showNearTrain]);
console.log(relationSub);
switch (relationMain) { const openBackTrainInfo = (stationInfo, currentTrainIndex) => {
case "head": const migrationArray = (stationInfo) => {
if (relationSub == "head") { const mainTrainStationPosition = trainData.findIndex(
break; (d) => d.split(",")[0] == stationInfo
} else if (relationSub == "tail") { );
const migrationTrainData = [
...showNearTrain.slice(0, subTrainStationPosition), const relationMain = (() => {
...trainData, if (mainTrainStationPosition == 0) return "head";
]; if (mainTrainStationPosition == trainData.length - 1) return "tail";
setTrainData(migrationTrainData); return "middle";
} else if (relationSub == "middle") { })();
const migrationTrainData = [
...showNearTrain.slice(0, subTrainStationPosition), const subTrainStationPosition = showNearTrain.findIndex(
...trainData, (d) => d.split(",")[0] == stationInfo
]; );
setTrainData(migrationTrainData); const relationSub = (() => {
} if (subTrainStationPosition == 0) return "head";
break; if (subTrainStationPosition == showNearTrain.length - 1) return "tail";
case "tail": return "middle";
if (relationSub == "head") { })();
const migrationTrainData = [
...trainData.slice(0, mainTrainStationPosition), switch (relationMain) {
...showNearTrain, case "head":
]; if (relationSub == "head") {
setTrainData(migrationTrainData); return;
} else if (relationSub == "tail") { } else if (relationSub == "tail") {
break; return [
} else if (relationSub == "middle") { ...showNearTrain.slice(0, subTrainStationPosition),
const migrationTrainData = [ ...trainData,
...trainData.slice(0, mainTrainStationPosition), ];
...showNearTrain.slice(subTrainStationPosition), } else if (relationSub == "middle") {
]; return [
setTrainData(migrationTrainData); ...showNearTrain.slice(0, subTrainStationPosition),
} ...trainData,
break; ];
case "middle": } else return;
if (relationSub == "head") { case "tail":
const migrationTrainData = [ if (relationSub == "head") {
...trainData.slice(0, mainTrainStationPosition), return [
...showNearTrain, ...trainData.slice(0, mainTrainStationPosition),
]; ...showNearTrain,
setTrainData(migrationTrainData); ];
} else if (relationSub == "tail") { } else if (relationSub == "tail") {
const migrationTrainData = [ return;
...showNearTrain.slice(0, subTrainStationPosition), } else if (relationSub == "middle") {
...trainData.slice(mainTrainStationPosition), return [
]; ...trainData.slice(0, mainTrainStationPosition),
setTrainData(migrationTrainData); ...showNearTrain.slice(subTrainStationPosition),
} ];
break; } else return;
} case "middle":
if (relationSub == "head") {
return [
...trainData.slice(0, mainTrainStationPosition),
...showNearTrain,
];
} else if (relationSub == "tail") {
return [
...showNearTrain.slice(0, subTrainStationPosition),
...trainData.slice(mainTrainStationPosition),
];
} else return;
}
};
const array = migrationArray(stationInfo);
if (!array) return;
setTrainData(array);
setIsConcatNear(true); setIsConcatNear(true);
}; };
@ -183,7 +166,12 @@ export const EachTrainInfo = (props) => {
originalStationList, originalStationList,
from: "AllTrainDiagramView", from: "AllTrainDiagramView",
}; };
//SheetManager.show("EachTrainInfo", { payload }); SheetManager.hide("EachTrainInfo").then(() => {
//0.1秒待機してから開く
setTimeout(() => {
SheetManager.show("EachTrainInfo", { payload });
}, 1);
});
}; };
useEffect(() => { useEffect(() => {
setCurrentTrainData( setCurrentTrainData(
@ -399,6 +387,7 @@ export const EachTrainInfo = (props) => {
return ( return (
<ActionSheet <ActionSheet
gestureEnabled={true} gestureEnabled={true}
//gestureEnabled={!actionSheetHorizonalScroll}
CustomHeaderComponent={<></>} CustomHeaderComponent={<></>}
ref={actionSheetRef} ref={actionSheetRef}
drawUnderStatusBar={false} drawUnderStatusBar={false}
@ -466,6 +455,9 @@ export const EachTrainInfo = (props) => {
</View> </View>
{from == "AllTrainDiagramView" || ( {from == "AllTrainDiagramView" || (
<ScrollView <ScrollView
//onTouchStart={() => setActionSheetHorizonalScroll(true)}
//onScrollEndDrag={() => setActionSheetHorizonalScroll(false)}
//onScrollBeginDrag={() => console.log("onScrollBeginDrag")}
style={{ style={{
flexDirection: "row", flexDirection: "row",
//width: widthPercentageToDP("200%"), //width: widthPercentageToDP("200%"),
@ -478,6 +470,8 @@ export const EachTrainInfo = (props) => {
<TrainDataView <TrainDataView
currentTrainData={currentTrainData} currentTrainData={currentTrainData}
currentPosition={currentPosition} currentPosition={currentPosition}
nearTrainIDList={nearTrainIDList}
openTrainInfo={openTrainInfo}
/> />
{/* <View {/* <View
style={{ style={{
@ -622,6 +616,26 @@ export const EachTrainInfo = (props) => {
backgroundColor: "white", backgroundColor: "white",
}} }}
> >
{headStation && !isConcatNear && (
<TouchableOpacity
onPress={() => openBackTrainInfo(headStation)}
style={{
padding: 10,
flexDirection: "row",
borderColor: "blue",
borderWidth: 1,
margin: 10,
borderRadius: 5,
alignItems: "center",
}}
>
<Text
style={{ fontSize: 18, fontWeight: "bold", color: "black" }}
>
本当の始発駅を表示
</Text>
</TouchableOpacity>
)}
{/* <LottieView {/* <LottieView
autoPlay autoPlay
loop loop
@ -630,19 +644,40 @@ export const EachTrainInfo = (props) => {
/> />
<Text>ほげほげふがふが</Text> */} <Text>ほげほげふがふが</Text> */}
{trainData.map((i, index) => (i.split(",")[1] == "提" ? <DataFromButton i={i} /> : {trainData.map((i, index) =>
<StationButton i.split(",")[1] == "提" ? (
i={i} <DataFromButton i={i} />
index={index} ) : (
stationList={stationList} <StationButton
points={points} i={i}
currentTrainData={currentTrainData} index={index}
openStationACFromEachTrainInfo={openStationACFromEachTrainInfo} stationList={stationList}
headAndTail={showNearTrain.map((d) => d.split(",")[0])} points={points}
openBackTrainInfo={openBackTrainInfo} currentTrainData={currentTrainData}
isConcatNear={isConcatNear} openStationACFromEachTrainInfo={openStationACFromEachTrainInfo}
/> />
))} )
)}
{tailStation && !isConcatNear && (
<TouchableOpacity
onPress={() => openBackTrainInfo(tailStation)}
style={{
padding: 10,
flexDirection: "row",
borderColor: "blue",
borderWidth: 1,
margin: 10,
borderRadius: 5,
alignItems: "center",
}}
>
<Text
style={{ fontSize: 18, fontWeight: "bold", color: "black" }}
>
本当の終着駅を表示
</Text>
</TouchableOpacity>
)}
<View style={{ flexDirection: "row" }}> <View style={{ flexDirection: "row" }}>
<View <View
@ -664,7 +699,7 @@ export const EachTrainInfo = (props) => {
); );
}; };
const DataFromButton = ({i}) => { const DataFromButton = ({ i }) => {
const [station, se, time] = i.split(","); const [station, se, time] = i.split(",");
return ( return (
<TouchableWithoutFeedback <TouchableWithoutFeedback
@ -684,14 +719,18 @@ const DataFromButton = ({i}) => {
<Text style={{ fontSize: 20 }}>{station}</Text> <Text style={{ fontSize: 20 }}>{station}</Text>
<View style={{ flex: 1 }} /> <View style={{ flex: 1 }} />
<Text style={{ fontSize: 18 }}> <Text style={{ fontSize: 18 }}>
提供元<MaterialCommunityIcons name={"open-in-new"} color="black" size={20} /> 提供元
<MaterialCommunityIcons
name={"open-in-new"}
color="black"
size={20}
/>
</Text> </Text>
</View> </View>
</View> </View>
</TouchableWithoutFeedback> </TouchableWithoutFeedback>
); );
} };
const StationButton = ({ const StationButton = ({
i, i,
@ -700,9 +739,6 @@ 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
@ -738,124 +774,103 @@ 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 (
<Swipeable <TouchableWithoutFeedback
ref={swipagleRef} onPress={() => openStationACFromEachTrainInfo(station)}
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
}
> >
<TouchableWithoutFeedback <View style={{ flexDirection: "row", backgroundColor: "white" }}>
onPress={() => openStationACFromEachTrainInfo(station)} <View
key={station} style={{
> width: 35,
<View style={{ flexDirection: "row", backgroundColor: "white" }}> position: "relative",
<View marginHorizontal: 15,
style={{ flexDirection: "row",
width: 35, height: "101%",
position: "relative", }}
marginHorizontal: 15, >
flexDirection: "row", {lineIDs.map((lineID, index) => (
height: "101%", <View
}} style={{
> backgroundColor: lineColorList[lineID],
{lineIDs.map((lineID, index) => ( flex: 1,
<View }}
key={lineID}
>
<View style={{ flex: 1 }} />
<Text
style={{ style={{
backgroundColor: lineColorList[lineID], color: "white",
flex: 1, textAlign: "center",
fontSize: 10,
fontWeight: "bold",
}} }}
key={lineID}
> >
<View style={{ flex: 1 }} /> {lineIDs[index]}
<Text {"\n"}
style={{ {EachIDs[index]}
color: "white", </Text>
textAlign: "center", <View style={{ flex: 1 }} />
fontSize: 10, </View>
fontWeight: "bold", ))}
}} </View>
> <View
{lineIDs[index]} style={{
{"\n"} padding: 8,
{EachIDs[index]} flexDirection: "row",
</Text> borderBottomWidth: 1,
<View style={{ flex: 1 }} /> borderBottomColor: "#f0f0f0",
</View> flex: 1,
))} }}
</View> >
<View <Text style={{ fontSize: 20 }}>{station}</Text>
style={{ <View style={{ flex: 1 }} />
padding: 8, {points && points.findIndex((d) => d == index) >= 0 ? (
flexDirection: "row", <Text style={{ fontSize: 20, marginRight: 70 }}>🚊</Text>
borderBottomWidth: 1, ) : null}
borderBottomColor: "#f0f0f0", {!isNaN(currentTrainData?.delay) && currentTrainData?.delay != 0 && (
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 <Text
style={{ style={{
fontSize: 20, fontSize: 15,
color: isNaN(currentTrainData?.delay) color: "black",
? "black"
: currentTrainData?.delay == 0
? "black"
: "red",
width: 60, width: 60,
position: "absolute",
right: 120,
textAlign: "right",
textDecorationLine: "line-through",
}} }}
> >
{timeString[0]}:{timeString[1]} {time}
</Text> </Text>
<Text style={{ fontSize: 18, width: 50 }}> )}
{se?.replace("発", "出発").replace("着", "到着")} <Text
</Text> style={{
</View> 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>
</TouchableWithoutFeedback> </View>
</Swipeable> </TouchableWithoutFeedback>
); );
}; };
const TrainDataView = ({ currentTrainData, currentPosition }) => { const TrainDataView = ({
currentTrainData,
currentPosition,
nearTrainIDList,
openTrainInfo,
}) => {
return ( return (
<View <View
style={{ style={{
@ -882,23 +897,46 @@ const TrainDataView = ({ currentTrainData, currentPosition }) => {
} }
/> />
<View style={{ flex: 1, flexDirection: "column" }}> <View style={{ flex: 1, flexDirection: "column" }}>
<StateBox <View style={{ flex: 1, flexDirection: "row" }}>
title={isNaN(currentTrainData?.delay) ? "状態" : "遅延時分"} <StateBox
text={`${currentTrainData?.delay}${ title={isNaN(currentTrainData?.delay) ? "状態" : "遅延時分"}
isNaN(currentTrainData?.delay) ? "" : "分" text={`${currentTrainData?.delay}${
}`} isNaN(currentTrainData?.delay) ? "" : "分"
/> }`}
<StateBox title="列番" text={currentTrainData?.num} /> />
</View>
<TouchableOpacity
style={{ flex: 1, flexDirection: "row" }}
disabled={nearTrainIDList.length == 0}
onPress={() => {
if (nearTrainIDList.length == 0) return;
openTrainInfo(nearTrainIDList[0]);
}}
>
{nearTrainIDList.length == 0 ? (
<StateBox title="列番" text={currentTrainData?.num} />
) : (
<StateBox
title="増解結相手を表示▶️"
text={`${nearTrainIDList}`}
style={{
borderWidth: 1,
borderColor: "red",
borderStyle: "solid",
}}
/>
)}
</TouchableOpacity>
</View> </View>
</View> </View>
); );
}; };
const StateBox = ({ text, title }) => ( const StateBox = ({ text, title, style }) => (
<View style={boxStyle}> <View style={{ ...boxStyle, ...style }}>
<Text style={{ fontSize: 15, color: "#0099CC" }}>{title}</Text> <Text style={{ fontSize: 12, color: "#0099CC" }}>{title}</Text>
<View style={{ flex: 1 }} /> <View style={{ flex: 1 }} />
<View style={{ fontSize: 32, color: "#0099CC", textAlign: "right" }}> <View style={{ fontSize: 25, color: "#0099CC", textAlign: "right" }}>
{text?.match("") ? ( {text?.match("") ? (
<> <>
<Text style={boxTextStyle}>{text.split("")[0]}</Text> <Text style={boxTextStyle}>{text.split("")[0]}</Text>
@ -919,7 +957,7 @@ const boxStyle = {
margin: 10, margin: 10,
}; };
const boxTextStyle = { const boxTextStyle = {
fontSize: 28, fontSize: 25,
color: "#0099CC", color: "#0099CC",
textAlign: "right", textAlign: "right",
}; };

View File

@ -1,10 +1,12 @@
import React, { createContext, useContext, useState } from "react"; import React, { createContext, useContext, useState } from "react";
import trainList from "../assets/originData/trainList";
const initialState = { const initialState = {
busAndTrainData: [], busAndTrainData: [],
setBusAndTrainData: () => {}, setBusAndTrainData: () => {},
trainPairData: [], trainPairData: [],
setTrainPairData: () => {}, setTrainPairData: () => {},
initializeTrainPairList: () => {}, initializeTrainPairList: () => {},
getInfluencedTrainData: () => {},
}; };
const BusAndTrainDataContext = createContext(initialState); const BusAndTrainDataContext = createContext(initialState);
@ -23,6 +25,34 @@ export const BusAndTrainDataProvider = ({ children }) => {
}); });
return trainPairList; return trainPairList;
}; };
const getInfluencedTrainData = (trainNum) => {
const trainPairList = initializeTrainPairList();
const returnArray = [];
if (!trainNum) return;
if (trainPairList[trainNum]) {
returnArray.push(Object.keys(trainPairList[trainNum])[0]);
}
if (
// 列番が4xxDまたは5xxDの場合はxxDの列番を検索
new RegExp(/^4[1-9]\d\d[DM]$/).test(trainNum) ||
new RegExp(/^5[1-7]\d\d[DM]$/).test(trainNum)
) {
if (trainList[trainNum.substring(1)]) {
returnArray.push(trainNum.substring(1));
}
}
if (new RegExp(/^[1-9]\d\d[DM]$/).test(trainNum)) {
// 列番がxxDの場合は4xxDと5xxDの列番を検索
if (trainList["4" + trainNum]) returnArray.push("4" + trainNum);
if (trainList["5" + trainNum]) returnArray.push("5" + trainNum);
}
if (!returnArray[0]) return [[], []];
const TD = trainList[returnArray[0]];
if (!TD) return [[], []];
const TDArray = TD.split("#").filter((d) => d != "");
return [returnArray, TDArray];
};
return ( return (
<BusAndTrainDataContext.Provider <BusAndTrainDataContext.Provider
value={{ value={{
@ -31,6 +61,7 @@ export const BusAndTrainDataProvider = ({ children }) => {
trainPairData, trainPairData,
setTrainPairData, setTrainPairData,
initializeTrainPairList, initializeTrainPairList,
getInfluencedTrainData,
}} }}
> >
{children} {children}