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; 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(); 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 ( openTrainInfo()}> {formattedTime} {d.timeType} {trainName} ); };