255 lines
7.7 KiB
TypeScript
255 lines
7.7 KiB
TypeScript
import { migrateTrainName } from "@/lib/eachTrainInfoCoreLib/migrateTrainName";
|
|
import { getStringConfig } from "@/lib/getStringConfig";
|
|
import { getTrainType } from "@/lib/getTrainType";
|
|
import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram";
|
|
import { FC, useEffect, useLayoutEffect, useMemo, useState } from "react";
|
|
import {
|
|
View,
|
|
Text,
|
|
TouchableOpacity,
|
|
useWindowDimensions,
|
|
} from "react-native";
|
|
import { customTrainDataDetector } from "../custom-train-data";
|
|
import dayjs from "dayjs";
|
|
import { SheetManager } from "react-native-actions-sheet";
|
|
import { useNavigation } from "@react-navigation/native";
|
|
import { lineList } from "@/lib/getStationList";
|
|
import { useStationList } from "@/stateBox/useStationList";
|
|
import { SharedValue, useAnimatedStyle } from "react-native-reanimated";
|
|
import Animated from "react-native-reanimated";
|
|
import lineColorList from "@/assets/originData/lineColorList";
|
|
import { CustomTrainData, trainTypeID } from "@/lib/CommonTypes";
|
|
|
|
export const ExGridViewItem: FC<{
|
|
d: {
|
|
trainNumber: string;
|
|
array: string;
|
|
name: string;
|
|
timeType: string;
|
|
time: string;
|
|
isOperating: boolean;
|
|
};
|
|
index: number;
|
|
width: SharedValue<number>;
|
|
array: {
|
|
train: string;
|
|
lastStation: string;
|
|
time: string;
|
|
isThrough?: boolean;
|
|
}[];
|
|
}> = ({ d, index, width, array }) => {
|
|
const { allCustomTrainData } = useAllTrainDiagram();
|
|
const { originalStationList, stationList } = useStationList();
|
|
const { navigate, goBack } = useNavigation();
|
|
const [trainData, setTrainData] = useState<CustomTrainData>();
|
|
useEffect(() => {
|
|
if (allCustomTrainData) {
|
|
allCustomTrainData.forEach((x) => {
|
|
if (x.TrainNumber === d.trainNumber) {
|
|
setTrainData(x);
|
|
}
|
|
});
|
|
}
|
|
}, []);
|
|
const { color, name, data } = getTrainType({ type: trainData?.type, whiteMode: true });
|
|
// 列車名、種別、フォントの取得
|
|
const [
|
|
typeString,
|
|
trainName,
|
|
fontAvailable,
|
|
isOneMan,
|
|
infogram,
|
|
isEdit,
|
|
uwasa,
|
|
vehicleFormation,
|
|
trainInfoUrl,
|
|
] = useMemo(() => {
|
|
const {
|
|
type,
|
|
trainName,
|
|
trainNumDistance,
|
|
infogram,
|
|
isEdit,
|
|
uwasa,
|
|
vehicleFormation,
|
|
trainInfoUrl,
|
|
} = customTrainDataDetector(d.trainNumber, allCustomTrainData);
|
|
const [typeString, fontAvailable, isOneMan] = getStringConfig(
|
|
type,
|
|
d.trainNumber
|
|
);
|
|
const trainData = d.array.split("#").filter((d) => d !== "");
|
|
switch (true) {
|
|
case trainData[trainData.length - 1] === undefined:
|
|
return [
|
|
typeString,
|
|
"",
|
|
fontAvailable,
|
|
isOneMan,
|
|
infogram,
|
|
isEdit,
|
|
uwasa,
|
|
vehicleFormation,
|
|
trainInfoUrl,
|
|
];
|
|
default:
|
|
// 行先がある場合は、行先を取得
|
|
const trainName = (d.timeType == "着" || d.timeType == "着編") ? trainData[0].split(",")[0] : trainData[trainData.length - 1].split(",")[0]
|
|
return [
|
|
typeString,
|
|
migrateTrainName(trainName),
|
|
fontAvailable,
|
|
isOneMan,
|
|
infogram,
|
|
isEdit,
|
|
uwasa,
|
|
vehicleFormation,
|
|
trainInfoUrl,
|
|
];
|
|
}
|
|
}, [d.array]);
|
|
const timeArray = d.time.split(":").map((s) => parseInt(s));
|
|
const formattedTime = dayjs()
|
|
.set("hour", timeArray[0])
|
|
.set("minute", timeArray[1])
|
|
.format("m");
|
|
let isSameTimeBefore = false;
|
|
if (index > 0) {
|
|
const beforeItem = array[index - 1];
|
|
const beforeTimeArray = beforeItem.time.split(":").map((s) => parseInt(s));
|
|
const beforeFormattedTime = dayjs()
|
|
.set("hour", beforeTimeArray[0])
|
|
.set("minute", beforeTimeArray[1])
|
|
.format("m");
|
|
isSameTimeBefore = beforeFormattedTime === formattedTime;
|
|
}
|
|
|
|
const openStationACFromEachTrainInfo = async (stationName) => {
|
|
await SheetManager.hide("EachTrainInfo");
|
|
const findStationEachLine = (selectLine) => {
|
|
let NearStation = selectLine.filter((d) => d.Station_JP == stationName);
|
|
return NearStation;
|
|
};
|
|
let returnDataBase = lineList
|
|
.map((d) => findStationEachLine(originalStationList[d]))
|
|
.filter((d) => d.length > 0)
|
|
.reduce((pre, current) => {
|
|
pre.push(...current);
|
|
return pre;
|
|
}, []);
|
|
if (returnDataBase.length) {
|
|
const payload = {
|
|
currentStation: returnDataBase,
|
|
navigate,
|
|
//@ts-ignore
|
|
useShow: () => SheetManager.show("StationDetailView", { payload }),
|
|
onExit: () => SheetManager.hide("StationDetailView"),
|
|
}; //@ts-ignore
|
|
setTimeout(() => SheetManager.show("StationDetailView", { payload }), 50);
|
|
} else {
|
|
SheetManager.hide("StationDetailView");
|
|
}
|
|
};
|
|
const openTrainInfo = () => {
|
|
let TrainNumber = "";
|
|
if (trainData.trainNumDistance != undefined) {
|
|
const timeInfo =
|
|
parseInt(trainData.TrainNumber.replace("M", "").replace("D", "")) -
|
|
trainData.trainNumDistance;
|
|
TrainNumber = timeInfo + "号";
|
|
}
|
|
const payload = {
|
|
data: {
|
|
trainNum: trainData.TrainNumber,
|
|
limited: `${data}:${trainData.trainName}${TrainNumber}`,
|
|
},
|
|
navigate,
|
|
openStationACFromEachTrainInfo,
|
|
from: d.isOperating ? null :"AllTrainIDList",
|
|
};
|
|
SheetManager.show("EachTrainInfo", {
|
|
//@ts-ignore
|
|
payload,
|
|
onClose: (data) => {
|
|
//alert(data);
|
|
},
|
|
});
|
|
};
|
|
const [stationColor, setStationColor] = useState(["gray"]);
|
|
useEffect(() => {
|
|
const Stations = stationList
|
|
.map((a) => a.filter((d) => d.StationName == trainName))
|
|
.reduce((newArray, e) => newArray.concat(e), []);
|
|
const StationNumbers =
|
|
Stations &&
|
|
Stations.filter((d) => d.StationNumber).map((d) => d.StationNumber);
|
|
|
|
if (StationNumbers) {
|
|
const stationLineColor = StationNumbers.map(
|
|
(d) => lineColorList[d.charAt(0)]
|
|
);
|
|
setStationColor(stationLineColor || ["gray"]);
|
|
}
|
|
}, [stationList]);
|
|
// if(typeString == "回送"){
|
|
// return<></>;
|
|
// }
|
|
const animatedStyle = useAnimatedStyle(() => {
|
|
const leftPosition =
|
|
((((width.value - 50) / 100) * parseInt(formattedTime)) / 60) * 100;
|
|
return {
|
|
left: leftPosition,
|
|
};
|
|
}, [formattedTime]);
|
|
return (
|
|
<View style={{ left: 0, height: 50 }}>
|
|
<Animated.View
|
|
style={[
|
|
{
|
|
flexDirection: "column",
|
|
//borderTopWidth: 1,
|
|
//borderBottomWidth: 0.5,
|
|
borderStyle: "solid",
|
|
borderColor: "darkgray",
|
|
opacity: d.timeType.includes("通") ? 0.5 : 1,
|
|
position: "absolute",
|
|
height: "100%",
|
|
width: 28,
|
|
top: isSameTimeBefore ? 10 : 0,
|
|
},
|
|
animatedStyle,
|
|
]}
|
|
>
|
|
<TouchableOpacity style={{ flex: 1 }} onPress={() => openTrainInfo()}>
|
|
<View style={{ position: "relative" }}>
|
|
<Text style={{ fontSize: 20, color: color, opacity: isSameTimeBefore ? 0 : 1, fontWeight:d.isOperating ? "bold" : "thin", fontStyle:d.isOperating? "italic" :"normal" }}>{formattedTime}</Text>
|
|
<Text
|
|
style={{
|
|
fontSize: 10,
|
|
position: "absolute",
|
|
bottom: 0,
|
|
right: 0,
|
|
fontWeight: "bold",
|
|
}}
|
|
>
|
|
{d.timeType}
|
|
</Text>
|
|
</View>
|
|
<View style={{ flex: 1, flexDirection: "column" }}>
|
|
<Text
|
|
style={{
|
|
fontSize: 8,
|
|
flex: 1,
|
|
fontWeight: "bold",
|
|
color: stationColor[0],
|
|
}}
|
|
>
|
|
{trainName}
|
|
</Text>
|
|
</View>
|
|
</TouchableOpacity>
|
|
</Animated.View>
|
|
</View>
|
|
);
|
|
};
|