From 50b2cbb21ce99dd082581fd959af2f27e92dcbd3 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Fri, 12 Sep 2025 19:05:18 +0000 Subject: [PATCH] =?UTF-8?q?path=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MenuPage.tsx | 22 +-- .../Apps/FixedPositionBox/FixedStationBox.tsx | 141 +++--------------- .../Apps/FixedPositionBox/FixedTrainBox.tsx | 5 +- components/Menu/StationPagination.tsx | 6 +- components/発車時刻表/EachData.tsx | 34 ++--- components/発車時刻表/LED_vidion.tsx | 139 ++++------------- components/駅名表/StationNumberMaker.tsx | 4 +- lib/CommonTypes.ts | 20 +++ lib/trainTimeFiltering.ts | 112 ++++++++++++++ menu.js => menu.tsx | 133 ++++++++--------- stateBox/useCurrentTrain.tsx | 7 +- stateBox/useFavoriteStation.tsx | 5 +- stateBox/useStationList.tsx | 16 +- 13 files changed, 284 insertions(+), 360 deletions(-) create mode 100644 lib/trainTimeFiltering.ts rename menu.js => menu.tsx (80%) diff --git a/MenuPage.tsx b/MenuPage.tsx index 4a3bcb9..5d48aa7 100644 --- a/MenuPage.tsx +++ b/MenuPage.tsx @@ -6,19 +6,19 @@ import Constants from "expo-constants"; import { Dimensions, StatusBar } from "react-native"; import { SheetManager } from "react-native-actions-sheet"; -import { AS } from "./storageControl"; -import TrainBase from "./components/trainbaseview"; -import HowTo from "./howto"; -import Menu from "./menu"; -import News from "./components/news"; -import Setting from "./components/Settings/settings"; -import { useFavoriteStation } from "./stateBox/useFavoriteStation"; -import { optionData } from "./lib/stackOption"; -import AllTrainDiagramView from "./components/AllTrainDiagramView"; +import { AS } from "@/storageControl"; +import TrainBase from "@/components/trainbaseview"; +import HowTo from "@/howto"; +import { Menu } from "@/menu"; +import News from "@/components/news"; +import Setting from "@/components/Settings/settings"; +import { useFavoriteStation } from "@/stateBox/useFavoriteStation"; +import { optionData } from "@/lib/stackOption"; +import AllTrainDiagramView from "@/components/AllTrainDiagramView"; import { useNavigation } from "@react-navigation/native"; -import { news } from "./config/newsUpdate"; +import { news } from "@/config/newsUpdate"; import { useBottomTabBarHeight } from "@react-navigation/bottom-tabs"; -import GeneralWebView from "./GeneralWebView"; +import GeneralWebView from "@/GeneralWebView"; import { StationDiagramView } from "@/components/StationDiagram/StationDiagramView"; const Stack = createStackNavigator(); diff --git a/components/Apps/FixedPositionBox/FixedStationBox.tsx b/components/Apps/FixedPositionBox/FixedStationBox.tsx index 9a02703..7896cc6 100644 --- a/components/Apps/FixedPositionBox/FixedStationBox.tsx +++ b/components/Apps/FixedPositionBox/FixedStationBox.tsx @@ -1,17 +1,21 @@ import lineColorList from "@/assets/originData/lineColorList"; -import { customTrainDataDetector } from "@/components/custom-train-data"; import { StationNumberMaker } from "@/components/駅名表/StationNumberMaker"; import { checkDuplicateTrainData } from "@/lib/checkDuplicateTrainData"; -import { CustomTrainData, trainTypeID } from "@/lib/CommonTypes"; +import { + CustomTrainData, + eachTrainDiagramType, + StationProps, +} from "@/lib/CommonTypes"; import { getCurrentTrainData } from "@/lib/getCurrentTrainData"; import { getTrainDelayStatus } from "@/lib/getTrainDelayStatus"; import { getTrainType } from "@/lib/getTrainType"; import { objectIsEmpty } from "@/lib/objectIsEmpty"; -import { trainPosition } from "@/lib/trainPositionTextArray"; +import { getTime, trainTimeFiltering } from "@/lib/trainTimeFiltering"; import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; import { useAreaInfo } from "@/stateBox/useAreaInfo"; import { useCurrentTrain } from "@/stateBox/useCurrentTrain"; -import { useStationList, StationProps } from "@/stateBox/useStationList"; +import { useStationList } from "@/stateBox/useStationList"; + import dayjs from "dayjs"; import { useEffect, useState } from "react"; import { Text, TouchableOpacity, View } from "react-native"; @@ -30,112 +34,6 @@ export const FixedStation = ({ stationID }) => { : "white"; //// - const timeFiltering = (d) => { - const baseTime = 2; - if (currentTrain.filter((t) => t.num == d.train).length == 0) { - const date = dayjs(); - const trainTime = date - .hour(parseInt(d.time.split(":")[0])) - .minute(parseInt(d.time.split(":")[1])); - - if (date.isAfter(trainTime)) { - return false; - } else if (trainTime.diff(date) < baseTime * 60 * 60 * 1000) { - return true; - } - return false; - } else { - const Pos = trainPosition( - currentTrain.filter((t) => t.num == d.train)[0] - ); - const nextPos = Pos.isBetween ? Pos.Pos.to : Pos.Pos.Pos; - const PrePos = Pos.isBetween ? Pos.Pos.from : ""; - if (station[0].Station_JP == nextPos) { - if (d.lastStation != station[0].Station_JP) return true; - } else if (station[0].Station_JP == PrePos) { - return false; - } - let [h, m] = d.time.split(":"); - let delay = isNaN(currentTrain.filter((t) => t.num == d.train)[0].delay) - ? 0 - : currentTrain.filter((t) => t.num == d.train)[0].delay; - const date = dayjs(); - let targetHour = parseInt(h); - - // 4時を日付変更線として処理 - if (targetHour < 4) { - targetHour += 24; - } - - let currentHour = date.hour(); - if (currentHour < 4) { - currentHour += 24; - } - - const db = dayjs() - .hour(targetHour) - .minute(parseInt(m) + parseInt(delay)); - const currentTime = dayjs().hour(currentHour); - - return !currentTime.isAfter(db); - } - }; - type trainDataProps = { - train?: string; - lastStation?: string; - time?: string; - isThrough?: boolean; - }; - const getTime = (stationDiagram, station) => { - const returnData = Object.keys(stationDiagram) - .map((trainNum) => { - let trainData: trainDataProps = {}; - stationDiagram[trainNum].split("#").forEach((data) => { - if (data.match("着")) { - trainData.lastStation = data.split(",着,")[0]; - } - if (data.match("着編")) { - trainData.lastStation = data.split(",着編,")[0]; - } - if (data.split(",")[0] === station.Station_JP) { - if (data.match(",発,")) { - trainData.time = data.split(",発,")[1]; - } else if (data.match(",発編,")) { - trainData.time = data.split(",発編,")[1]; - } else if (data.match(",通編,")) { - trainData.time = data.split(",通編,")[1]; - trainData.isThrough = true; - } else if (data.match(",着,")) { - trainData.time = data.split(",着,")[1]; - } else if (data.match(",着編,")) { - trainData.time = data.split(",着編,")[1]; - } - } - }); - return { - train: trainNum, - time: trainData.time, - lastStation: trainData.lastStation, - isThrough: trainData.isThrough, - }; - }) - .filter((d) => d.time); - return returnData.sort((a, b) => { - switch (true) { - case parseInt(a.time.split(":")[0]) < parseInt(b.time.split(":")[0]): - return -1; - case parseInt(a.time.split(":")[0]) > parseInt(b.time.split(":")[0]): - return 1; - case parseInt(a.time.split(":")[1]) < parseInt(b.time.split(":")[1]): - return -1; - case parseInt(a.time.split(":")[1]) > parseInt(b.time.split(":")[1]): - return 1; - default: - return 0; - } - }); - }; - const { allTrainDiagram } = useAllTrainDiagram(); const { areaInfo, areaStationID } = useAreaInfo(); const [stationDiagram, setStationDiagram] = useState({}); //当該駅の全時刻表 @@ -162,7 +60,9 @@ export const FixedStation = ({ stationID }) => { setIsInfoArea(station.some((s) => areaStationID.includes(s.StationNumber))); }, [allTrainDiagram, station]); - const [trainTimeAndNumber, setTrainTimeAndNumber] = useState([]); + const [trainTimeAndNumber, setTrainTimeAndNumber] = useState< + eachTrainDiagramType[] + >([]); useEffect(() => { //現在の駅に停車する列車から時刻を切り出してLEDベースにフォーマット @@ -170,20 +70,15 @@ export const FixedStation = ({ stationID }) => { const getTimeData = getTime(stationDiagram, station[0]); setTrainTimeAndNumber(getTimeData); }, [stationDiagram]); - const [selectedTrain, setSelectedTrain] = useState< - { - isThrough?: boolean; - train?: string; - lastStation?: string; - time?: string; - }[] - >([]); + const [selectedTrain, setSelectedTrain] = useState( + [] + ); useEffect(() => { if (!trainTimeAndNumber) return () => {}; if (!currentTrain) return () => {}; const data = trainTimeAndNumber .filter((d) => currentTrain.map((m) => m.num).includes(d.train)) //現在の列車に絞る[ToDo] - .filter(timeFiltering) + .filter((d) => trainTimeFiltering({ d, currentTrain, station })) //時間フィルター .filter((d) => !d.isThrough) .filter((d) => d.lastStation != station[0].Station_JP); //最終列車表示設定 setSelectedTrain(data); @@ -302,9 +197,11 @@ const FixedStationBoxEachTrain = ({ d, station }) => { currentTrainData, station.Station_JP )}`; - const [train, setTrain] = useState(getCurrentTrainData(d.train,currentTrain,allCustomTrainData)); + const [train, setTrain] = useState( + getCurrentTrainData(d.train, currentTrain, allCustomTrainData) + ); useEffect(() => { - setTrain(getCurrentTrainData(d.train,currentTrain,allCustomTrainData)); + setTrain(getCurrentTrainData(d.train, currentTrain, allCustomTrainData)); }, [currentTrain, d.train]); const { name, color } = getTrainType({ type: train.type, whiteMode: true }); return ( diff --git a/components/Apps/FixedPositionBox/FixedTrainBox.tsx b/components/Apps/FixedPositionBox/FixedTrainBox.tsx index 3b36988..57b05ce 100644 --- a/components/Apps/FixedPositionBox/FixedTrainBox.tsx +++ b/components/Apps/FixedPositionBox/FixedTrainBox.tsx @@ -1,12 +1,13 @@ import lineColorList from "@/assets/originData/lineColorList"; import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; import { useCurrentTrain } from "@/stateBox/useCurrentTrain"; -import { useStationList, StationProps } from "@/stateBox/useStationList"; +import { useStationList } from "@/stateBox/useStationList"; +import { StationProps } from "@/lib/CommonTypes"; import { FC, useEffect, useState } from "react"; import { Text, TouchableOpacity, View, Image } from "react-native"; import { getTrainType } from "@/lib/getTrainType"; import { trainPosition } from "@/lib/trainPositionTextArray"; -import { StationNumberMaker } from "../../駅名表/StationNumberMaker"; +import { StationNumberMaker } from "@/components/駅名表/StationNumberMaker"; import { lineListPair, stationIDPair } from "@/lib/getStationList"; import { findReversalPoints } from "@/lib/eachTrainInfoCoreLib/findReversalPoints"; import { CustomTrainData, trainTypeID } from "@/lib/CommonTypes"; diff --git a/components/Menu/StationPagination.tsx b/components/Menu/StationPagination.tsx index 8eee662..1ce715c 100644 --- a/components/Menu/StationPagination.tsx +++ b/components/Menu/StationPagination.tsx @@ -1,9 +1,9 @@ import React, { FC, useState } from "react"; import { View, Text, TouchableOpacity } from "react-native"; -import { useInterval } from "../../lib/useInterval"; +import { useInterval } from "@/lib/useInterval"; -import lineColorList from "../../assets/originData/lineColorList"; -import { StationProps } from "@/stateBox/useStationList"; +import lineColorList from "@/assets/originData/lineColorList"; +import { StationProps } from "@/lib/CommonTypes"; type StationNumberProps = { currentStation: StationProps[]; active: boolean; diff --git a/components/発車時刻表/EachData.tsx b/components/発車時刻表/EachData.tsx index 916f9f3..8ffda2c 100644 --- a/components/発車時刻表/EachData.tsx +++ b/components/発車時刻表/EachData.tsx @@ -1,24 +1,23 @@ import React, { FC, useEffect, useState } from "react"; import { TouchableOpacity } from "react-native"; -import { checkDuplicateTrainData } from "../../lib/checkDuplicateTrainData"; -import { getTrainDelayStatus } from "../../lib/getTrainDelayStatus"; -import { getTrainType } from "../../lib/getTrainType"; -import { useCurrentTrain } from "../../stateBox/useCurrentTrain"; +import { checkDuplicateTrainData } from "@/lib/checkDuplicateTrainData"; +import { getTrainDelayStatus } from "@/lib/getTrainDelayStatus"; +import { getTrainType } from "@/lib/getTrainType"; +import { useCurrentTrain } from "@/stateBox/useCurrentTrain"; import { SheetManager } from "react-native-actions-sheet"; -import { Description } from "./LED_inside_Component/Description"; -import { DependTime } from "./LED_inside_Component/DependTime"; -import { LastStation } from "./LED_inside_Component/LastStation"; -import { StatusAndDelay } from "./LED_inside_Component/StatusAndDelay"; -import { TrainName } from "./LED_inside_Component/TrainName"; -import { customTrainDataDetector } from "../custom-train-data"; -import { TrainPosition } from "./LED_inside_Component/TrainPosition"; -import { StationPosPushDialog } from "./LED_inside_Component/TrainPositionDataPush"; -import { StationPosDeleteDialog } from "./LED_inside_Component/TrainPositionDataDelete"; -import { useStationList } from "../../stateBox/useStationList"; +import { Description } from "@/components/発車時刻表/LED_inside_Component/Description"; +import { DependTime } from "@/components/発車時刻表/LED_inside_Component/DependTime"; +import { LastStation } from "@/components/発車時刻表/LED_inside_Component/LastStation"; +import { StatusAndDelay } from "@/components/発車時刻表/LED_inside_Component/StatusAndDelay"; +import { TrainName } from "@/components/発車時刻表/LED_inside_Component/TrainName"; +import { TrainPosition } from "@/components/発車時刻表/LED_inside_Component/TrainPosition"; +import { StationPosPushDialog } from "@/components/発車時刻表/LED_inside_Component/TrainPositionDataPush"; +import { StationPosDeleteDialog } from "@/components/発車時刻表/LED_inside_Component/TrainPositionDataDelete"; +import { useStationList } from "@/stateBox/useStationList"; import useInterval from "@/lib/useInterval"; import dayjs from "dayjs"; import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; -import { CustomTrainData, trainTypeID } from "@/lib/CommonTypes"; +import { CustomTrainData, StationProps, trainTypeID } from "@/lib/CommonTypes"; import { getCurrentTrainData } from "@/lib/getCurrentTrainData"; type Props = { @@ -30,10 +29,7 @@ type Props = { }; trainIDSwitch: boolean; trainDescriptionSwitch: boolean; - station: { - Station_JP: string; - StationNumber: string; - }; + station: StationProps; navigate: (screen: string, data?: any) => void; openStationACFromEachTrainInfo: (station: string) => void; }; diff --git a/components/発車時刻表/LED_vidion.tsx b/components/発車時刻表/LED_vidion.tsx index 93407f6..3960267 100644 --- a/components/発車時刻表/LED_vidion.tsx +++ b/components/発車時刻表/LED_vidion.tsx @@ -1,18 +1,17 @@ -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, FC } from "react"; import { View, useWindowDimensions } from "react-native"; -import dayjs from "dayjs"; -import { useInterval } from "../../lib/useInterval"; -import { objectIsEmpty } from "../../lib/objectIsEmpty"; -import { useCurrentTrain } from "../../stateBox/useCurrentTrain"; -import { useAreaInfo } from "../../stateBox/useAreaInfo"; -import { AS } from "../../storageControl"; -import { Footer } from "./LED_Vision_Component/Footer"; -import { Header } from "./LED_Vision_Component/Header"; -import { Description } from "./LED_inside_Component/Description"; -import { EachData } from "./EachData"; +import { objectIsEmpty } from "@/lib/objectIsEmpty"; +import { useCurrentTrain } from "@/stateBox/useCurrentTrain"; +import { useAreaInfo } from "@/stateBox/useAreaInfo"; +import { AS } from "@/storageControl"; +import { Footer } from "@/components/発車時刻表/LED_Vision_Component/Footer"; +import { Header } from "@/components/発車時刻表/LED_Vision_Component/Header"; +import { EachData } from "@/components/発車時刻表/EachData"; import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; -import { trainPosition } from "@/lib/trainPositionTextArray"; -import { AreaDescription } from "./LED_inside_Component/AreaDescription"; +import { AreaDescription } from "@/components/発車時刻表/LED_inside_Component/AreaDescription"; +import { getTime, trainTimeFiltering } from "@/lib/trainTimeFiltering"; +import { eachTrainDiagramType, StationProps } from "@/lib/CommonTypes"; +import { useNavigation } from "@react-navigation/native"; /** * @@ -43,10 +42,17 @@ import { AreaDescription } from "./LED_inside_Component/AreaDescription"; * 9031M サンライズ瀬戸琴平(延長)(臨時?) * 9062D 四国まんなか千年ものがたり(臨時?) */ -export default function LED_vision(props) { - const { station, navigate, openStationACFromEachTrainInfo } = props; +type props = { + station: StationProps[]; +}; +export const LED_vision: FC = (props) => { + const { station } = props; + + const { navigate, addListener, isFocused } = useNavigation(); const { currentTrain } = useCurrentTrain(); - const [stationDiagram, setStationDiagram] = useState({}); //当該駅の全時刻表 + const [stationDiagram, setStationDiagram] = useState<{ + [key: string]: string; + }>({}); //当該駅の全時刻表 const [finalSwitch, setFinalSwitch] = useState(false); const [trainIDSwitch, setTrainIDSwitch] = useState(false); const [trainDescriptionSwitch, setTrainDescriptionSwitch] = useState(false); @@ -85,7 +91,9 @@ export default function LED_vision(props) { /* {lastStation: "当駅止", time: "12:34", train: "1234M"} */ - const [trainTimeAndNumber, setTrainTimeAndNumber] = useState([]); + const [trainTimeAndNumber, setTrainTimeAndNumber] = useState< + eachTrainDiagramType[] + >([]); useEffect(() => { //現在の駅に停車する列車から時刻を切り出してLEDベースにフォーマット @@ -94,102 +102,19 @@ export default function LED_vision(props) { setTrainTimeAndNumber(getTimeData); }, [stationDiagram]); - const [selectedTrain, setSelectedTrain] = useState([]); + const [selectedTrain, setSelectedTrain] = useState( + [] + ); useEffect(() => { if (!trainTimeAndNumber) return () => {}; if (!currentTrain) return () => {}; const data = trainTimeAndNumber .filter((d) => currentTrain.map((m) => m.num).includes(d.train)) //現在の列車に絞る[ToDo] - .filter(timeFiltering) - .filter((d) => !!finalSwitch || d.lastStation != station[0].Station_JP) //最終列車表示設定 + .filter((d) => trainTimeFiltering({ d, currentTrain, station })) //時間フィルター + .filter((d) => !!finalSwitch || d.lastStation != station[0].Station_JP); //最終列車表示設定 setSelectedTrain(data); }, [trainTimeAndNumber, currentTrain, finalSwitch]); - const getTime = (stationDiagram, station) => { - const returnData = Object.keys(stationDiagram) - .map((trainNum) => { - let trainData = {}; - stationDiagram[trainNum].split("#").forEach((data) => { - if (data.match("着")) { - trainData.lastStation = data.split(",着,")[0]; - } - if (data.match("着編")) { - trainData.lastStation = data.split(",着編,")[0]; - } - if (data.split(",")[0] === station.Station_JP) { - if (data.match(",発,")) { - trainData.time = data.split(",発,")[1]; - }else if (data.match(",発編,")) { - trainData.time = data.split(",発編,")[1]; - } else if (data.match(",通編,")) { - trainData.time = data.split(",通編,")[1]; - trainData.isThrough = true; - } else if (data.match(",着,")) { - trainData.time = data.split(",着,")[1]; - }else if (data.match(",着編,")) { - trainData.time = data.split(",着編,")[1]; - } - } - }); - return { - train: trainNum, - time: trainData.time, - lastStation: trainData.lastStation, - isThrough: trainData.isThrough, - }; - }) - .filter((d) => d.time); - return returnData.sort((a, b) => { - switch (true) { - case parseInt(a.time.split(":")[0]) < parseInt(b.time.split(":")[0]): - return -1; - case parseInt(a.time.split(":")[0]) > parseInt(b.time.split(":")[0]): - return 1; - case parseInt(a.time.split(":")[1]) < parseInt(b.time.split(":")[1]): - return -1; - case parseInt(a.time.split(":")[1]) > parseInt(b.time.split(":")[1]): - return 1; - default: - return 0; - } - }); - }; - - const timeFiltering = (d) => { - - const baseTime = 2; - if (currentTrain.filter((t) => t.num == d.train).length == 0) { - const date = dayjs(); - const trainTime = date - .hour(parseInt(d.time.split(":")[0])) - .minute(parseInt(d.time.split(":")[1])); - - if (date.isAfter(trainTime)) { - return false; - } else if (trainTime.diff(date) < baseTime * 60 * 60 * 1000) { - return true; - } - return false; - } else { - const Pos = trainPosition( - currentTrain.filter((t) => t.num == d.train)[0] - ); - const nextPos = Pos.isBetween ? Pos.Pos.to : Pos.Pos.Pos; - const PrePos = Pos.isBetween ? Pos.Pos.from : ""; - if (station[0].Station_JP == nextPos) { - if(d.lastStation != station[0].Station_JP) return true; - } else if (station[0].Station_JP == PrePos) { - return false; - } - const date = dayjs(); - let [h, m] = d.time.split(":"); - let delay = isNaN(currentTrain.filter((t) => t.num == d.train)[0].delay) - ? 0 - : currentTrain.filter((t) => t.num == d.train)[0].delay; - const db = date.hour(parseInt(h)).minute(parseInt(m) + parseInt(delay)); - return !date.isAfter(db); - } - }; const { width } = useWindowDimensions(); const adjustedWidth = width * 0.98; return ( @@ -210,7 +135,7 @@ export default function LED_vision(props) { trainIDSwitch, trainDescriptionSwitch, navigate, - openStationACFromEachTrainInfo, + openStationACFromEachTrainInfo: () => {}, }} station={station[0]} key={d.train} @@ -236,4 +161,4 @@ export default function LED_vision(props) { /> ); -} +}; diff --git a/components/駅名表/StationNumberMaker.tsx b/components/駅名表/StationNumberMaker.tsx index b5466ae..3793cba 100644 --- a/components/駅名表/StationNumberMaker.tsx +++ b/components/駅名表/StationNumberMaker.tsx @@ -1,8 +1,8 @@ import React, { FC } from "react"; import { Text, View } from "react-native"; import { useWindowDimensions } from "react-native"; -import lineColorList from "../../assets/originData/lineColorList"; -import { StationProps } from "@/stateBox/useStationList"; +import lineColorList from "@/assets/originData/lineColorList"; +import { StationProps } from "@/lib/CommonTypes"; type props = { currentStation: StationProps[]; diff --git a/lib/CommonTypes.ts b/lib/CommonTypes.ts index 28ea258..1bf4789 100644 --- a/lib/CommonTypes.ts +++ b/lib/CommonTypes.ts @@ -35,4 +35,24 @@ export type CustomTrainData = { isSeason?: boolean; vehicleFormation?: string; trainInfoUrl?: string; +}; + export type eachTrainDiagramType = { + train: string; + time: string; + lastStation: string; + isThrough: boolean; + }; + + export type StationProps = { + DispNum: string; + JrHpUrl?: string; + MyStation: string; + StationMap: string; + StationNumber: string | null; + StationTimeTable: string; + Station_EN: string; + Station_JP: string; + jslodApi: string; + lat: number; + lng: number; }; \ No newline at end of file diff --git a/lib/trainTimeFiltering.ts b/lib/trainTimeFiltering.ts new file mode 100644 index 0000000..7a848cb --- /dev/null +++ b/lib/trainTimeFiltering.ts @@ -0,0 +1,112 @@ +import dayjs from "dayjs"; +import { trainDataType, trainPosition } from "@/lib/trainPositionTextArray"; +import { eachTrainDiagramType, StationProps } from "@/lib/CommonTypes"; +type trainDataProps = { + d: eachTrainDiagramType; + currentTrain: trainDataType[]; + station: StationProps[]; +}; +export const trainTimeFiltering: (x: trainDataProps) => boolean = (props) => { + const { d, currentTrain, station } = props; + const baseTime = 2; + if (currentTrain.filter((t) => t.num == d.train).length == 0) { + const date = dayjs(); + const trainTime = date + .hour(parseInt(d.time.split(":")[0])) + .minute(parseInt(d.time.split(":")[1])); + + if (date.isAfter(trainTime)) { + return false; + } else if (trainTime.diff(date) < baseTime * 60 * 60 * 1000) { + return true; + } + return false; + } else { + const Pos = trainPosition(currentTrain.filter((t) => t.num == d.train)[0]); + const nextPos = Pos.isBetween ? Pos.Pos.to : Pos.Pos.Pos; + const PrePos = Pos.isBetween ? Pos.Pos.from : ""; + if (station[0].Station_JP == nextPos) { + if (d.lastStation != station[0].Station_JP) return true; + } else if (station[0].Station_JP == PrePos) { + return false; + } + let [h, m] = d.time.split(":"); + let delay = isNaN(currentTrain.filter((t) => t.num == d.train)[0].delay) + ? 0 + : currentTrain.filter((t) => t.num == d.train)[0].delay; + const date = dayjs(); + let targetHour = parseInt(h); + + // 4時を日付変更線として処理 + if (targetHour < 4) { + targetHour += 24; + } + + let currentHour = date.hour(); + if (currentHour < 4) { + currentHour += 24; + } + + const db = dayjs() + .hour(targetHour) + .minute(parseInt(m) + parseInt(delay)); + const currentTime = dayjs().hour(currentHour); + + return !currentTime.isAfter(db); + } +}; +type getTimeProps = (stationDiagram: { [key: string]: string }, station: StationProps) => eachTrainDiagramType[]; +export const getTime: getTimeProps = (stationDiagram, station) => { + const returnData = Object.keys(stationDiagram) + .map((trainNum) => { + let trainData: eachTrainDiagramType = { + time: "", + lastStation: "", + isThrough: false, + train: trainNum, + }; + stationDiagram[trainNum].split("#").forEach((data) => { + if (data.match("着")) { + trainData.lastStation = data.split(",着,")[0]; + } + if (data.match("着編")) { + trainData.lastStation = data.split(",着編,")[0]; + } + if (data.split(",")[0] === station.Station_JP) { + if (data.match(",発,")) { + trainData.time = data.split(",発,")[1]; + } else if (data.match(",発編,")) { + trainData.time = data.split(",発編,")[1]; + } else if (data.match(",通編,")) { + trainData.time = data.split(",通編,")[1]; + trainData.isThrough = true; + } else if (data.match(",着,")) { + trainData.time = data.split(",着,")[1]; + } else if (data.match(",着編,")) { + trainData.time = data.split(",着編,")[1]; + } + } + }); + return { + train: trainNum, + time: trainData.time, + lastStation: trainData.lastStation, + isThrough: trainData.isThrough, + }; + }) + .filter((d) => d.time); + return returnData.sort((a, b) => { + switch (true) { + case parseInt(a.time.split(":")[0]) < parseInt(b.time.split(":")[0]): + return -1; + case parseInt(a.time.split(":")[0]) > parseInt(b.time.split(":")[0]): + return 1; + case parseInt(a.time.split(":")[1]) < parseInt(b.time.split(":")[1]): + return -1; + case parseInt(a.time.split(":")[1]) > parseInt(b.time.split(":")[1]): + return 1; + default: + return 0; + } + }); +}; \ No newline at end of file diff --git a/menu.js b/menu.tsx similarity index 80% rename from menu.js rename to menu.tsx index d8deea1..1d0fc88 100644 --- a/menu.js +++ b/menu.tsx @@ -1,58 +1,54 @@ -import React, { useRef, useState, useEffect, useLayoutEffect } from "react"; -import { - Platform, - View, - ScrollView, - useWindowDimensions, - LayoutAnimation, - Text, - TouchableOpacity, -} from "react-native"; +import React, { useRef, useState, useEffect, useLayoutEffect, FC } from "react"; +import { Platform, View, ScrollView, LayoutAnimation } from "react-native"; import Constants from "expo-constants"; import { configureReanimatedLogger, ReanimatedLogLevel, } from "react-native-reanimated"; -import StatusbarDetect from "./StatusbarDetect"; +import StatusbarDetect from "@/StatusbarDetect"; -import LED_vision from "./components/発車時刻表/LED_vidion"; -import { TitleBar } from "./components/Menu/TitleBar"; -import { FixedContentBottom } from "./components/Menu/FixedContentBottom"; +import { LED_vision } from "@/components/発車時刻表/LED_vidion"; +import { TitleBar } from "@/components/Menu/TitleBar"; +import { FixedContentBottom } from "@/components/Menu/FixedContentBottom"; -import { lineList, stationIDPair } from "./lib/getStationList"; -import { useFavoriteStation } from "./stateBox/useFavoriteStation"; +import { lineList, stationIDPair } from "@/lib/getStationList"; +import { useFavoriteStation } from "@/stateBox/useFavoriteStation"; import { useNavigation } from "@react-navigation/native"; -import { useStationList } from "./stateBox/useStationList"; +import { useStationList } from "@/stateBox/useStationList"; import { TopMenuButton } from "@/components/Menu/TopMenuButton"; import { JRSTraInfoBox } from "@/components/Menu/JRSTraInfoBox"; import MapView, { Marker } from "react-native-maps"; -import { useSafeAreaInsets } from "react-native-safe-area-context"; -import { useBottomTabBarHeight } from "@react-navigation/bottom-tabs"; -import { CarouselBox } from "./components/Menu/Carousel/CarouselBox"; -import { CarouselTypeChanger } from "./components/Menu/Carousel/CarouselTypeChanger"; -import { useUserPosition } from "./stateBox/useUserPosition"; -import { AS } from "./storageControl"; -import { lineList_LineWebID } from "./lib/getStationList"; -import { Ionicons } from "@expo/vector-icons"; +import { CarouselBox } from "@/components/Menu/Carousel/CarouselBox"; +import { CarouselTypeChanger } from "@/components/Menu/Carousel/CarouselTypeChanger"; +import { useUserPosition } from "@/stateBox/useUserPosition"; +import { AS } from "@/storageControl"; +import { lineList_LineWebID } from "@/lib/getStationList"; +import { StationProps } from "@/lib/CommonTypes"; +import { LocationObject } from "expo-location"; configureReanimatedLogger({ level: ReanimatedLogLevel.error, // Set the log level to error strict: true, // Reanimated runs in strict mode by default }); -export default function Menu(props) { + +type props = { + scrollRef: React.RefObject; + mapHeight: number; + MapFullHeight: number; + mapMode: boolean; + setMapMode: React.Dispatch>; +}; +export const Menu: FC = (props) => { const { scrollRef, mapHeight, MapFullHeight, mapMode, setMapMode } = props; - const { navigate, addListener, isFocused } = useNavigation(); + const { navigate } = useNavigation(); const { favoriteStation } = useFavoriteStation(); const { originalStationList, getStationDataFromNameBase } = useStationList(); - const { height, width } = useWindowDimensions(); - const { bottom, left, right, top } = useSafeAreaInsets(); - const tabBarHeight = useBottomTabBarHeight(); - const [stationListMode, setStationListMode] = useState( - /*<"position"|"favorite">*/ "position" - ); + const [stationListMode, setStationListMode] = useState< + "position" | "favorite" + >("position"); useEffect(() => { AS.getItem("stationListMode") .then((res) => setStationListMode(res)) - .catch((e) => { + .catch(() => { // AS.setItem("stationListMode", "position"); }); }, []); @@ -92,11 +88,17 @@ export default function Menu(props) { }; //現在地基準の駅名標リストアップ機能 const { position, locationStatus } = useUserPosition(); + + const [nearPositionStation, setNearPositionStation] = useState< + StationProps[][] + >([]); //第三要素 + useEffect(() => { if (!position) return () => {}; makeCurrentStation(position); }, [position, stationListMode]); - const makeCurrentStation = (location) => { + + const makeCurrentStation = (location: LocationObject) => { if (!originalStationList) return () => {}; const findStationEachLine = (selectLine) => { const searchArea = 0.055; //検索範囲 @@ -128,7 +130,7 @@ export default function Menu(props) { return NearStation; }; - let _stList = lineList + let _stList: StationProps[] = lineList .map((d) => findStationEachLine(originalStationList[d])) .filter((d) => d.length > 0) .reduce((pre, current) => { @@ -137,7 +139,9 @@ export default function Menu(props) { }, []); if (_stList.length == 0) setNearPositionStation([]); else { - let returnData = []; + console.log("hoge"); + console.log(_stList); + let returnData: StationProps[][] = []; _stList.forEach((d, index, array) => { const stationName = d.Station_JP; if (returnData.findIndex((d) => d[0].Station_JP == stationName) != -1) @@ -166,19 +170,17 @@ export default function Menu(props) { } }; - const [nearPositionStation, setNearPositionStation] = useState([]); //第三要素 - const [listIndex, setListIndex] = useState(0); - const [listUpStation, setListUpStation] = useState([]); + const [listUpStation, setListUpStation] = useState([]); const [isSearchMode, setisSearchMode] = useState(false); - const [input, setInput] = React.useState(""); + const [input, setInput] = useState(""); useLayoutEffect(() => { if (!!isSearchMode) { const returnData = []; if (!input || input == "") { - Object.keys(lineList_LineWebID).forEach((d, indexBase) => { - originalStationList[d].forEach((D, index) => { + Object.keys(lineList_LineWebID).forEach((d) => { + originalStationList[d].forEach((D) => { if ( isSearchMode && isSearchMode != stationIDPair[lineList_LineWebID[d]] @@ -196,12 +198,16 @@ export default function Menu(props) { const hoge = getStationDataFromNameBase(input); hoge.forEach((d, index, array) => { const stationName = d.Station_JP; - if (returnData.findIndex((d1) => d1[0].Station_JP == stationName) != -1) + if ( + returnData.findIndex((d1) => d1[0].Station_JP == stationName) != -1 + ) return; returnData.push(array.filter((d2) => d2.Station_JP == stationName)); }); } if (JSON.stringify(returnData) == JSON.stringify(listUpStation)) return; + console.log("returnData"); + console.log(returnData); setListUpStation(returnData); } else if (stationListMode == "position") { const returnData = nearPositionStation.filter((d) => d != undefined); @@ -242,8 +248,8 @@ export default function Menu(props) { if (mapMode) { mapsRef?.current.fitToCoordinates( listUpStation.map((d) => ({ - latitude: parseFloat(d[0].lat), - longitude: parseFloat(d[0].lng), + latitude: d[0].lat, + longitude: d[0].lng, })), { edgePadding: { top: 80, bottom: 120, left: 50, right: 50 } } // Add margin values here ); @@ -261,24 +267,7 @@ export default function Menu(props) { }} > - {!mapMode ? ( - - ) : ( - <> - // - // JRShikoku RailScope - // - )} + {!mapMode ? : <>} { @@ -344,8 +333,8 @@ export default function Menu(props) { if (mapsRef.current) { mapsRef.current.animateToRegion( { - latitude: parseFloat(lat), - longitude: parseFloat(lng), + latitude: lat, + longitude: lng, latitudeDelta: 0.05, longitudeDelta: 0.05, }, @@ -401,11 +390,7 @@ export default function Menu(props) { }} /> {listUpStation[listIndex] && ( - {}} - /> + )} )} @@ -433,4 +418,4 @@ export default function Menu(props) { )} ); -} +}; diff --git a/stateBox/useCurrentTrain.tsx b/stateBox/useCurrentTrain.tsx index 29d14b5..4c3dc2b 100644 --- a/stateBox/useCurrentTrain.tsx +++ b/stateBox/useCurrentTrain.tsx @@ -6,10 +6,10 @@ import React, { useRef, FC, } from "react"; -import { HeaderConfig } from "../lib/HeaderConfig"; +import { HeaderConfig } from "@/lib/HeaderConfig"; -import useInterval from "../lib/useInterval"; -import { useStationList } from "./useStationList"; +import useInterval from "@/lib/useInterval"; +import { useStationList } from "@/stateBox/useStationList"; import { checkDuplicateTrainData } from "@/lib/checkDuplicateTrainData"; import { getStationID } from "@/lib/eachTrainInfoCoreLib/getStationData"; import { trainDataType } from "@/lib/trainPositionTextArray"; @@ -167,7 +167,6 @@ export const CurrentTrainProvider:FC = ({ children }) => { ) => { //e:trainNumber if (!currentTrain.length) return; - console.log(currentTrain); return checkDuplicateTrainData( currentTrain.filter((d) => d.num == e), stationList diff --git a/stateBox/useFavoriteStation.tsx b/stateBox/useFavoriteStation.tsx index f5b702e..983abcf 100644 --- a/stateBox/useFavoriteStation.tsx +++ b/stateBox/useFavoriteStation.tsx @@ -6,8 +6,9 @@ import React, { useLayoutEffect, FC, } from "react"; -import { AS } from "../storageControl"; -import { StationProps, useStationList } from "./useStationList"; +import { AS } from "@/storageControl"; +import { useStationList } from "@/stateBox/useStationList"; +import { StationProps } from "@/lib/CommonTypes"; const initialState = { favoriteStation: [], setFavoriteStation: () => {}, diff --git a/stateBox/useStationList.tsx b/stateBox/useStationList.tsx index c08e7a2..ba70bff 100644 --- a/stateBox/useStationList.tsx +++ b/stateBox/useStationList.tsx @@ -9,20 +9,8 @@ import { lineList, getStationList, lineList_LineWebID, -} from "../lib/getStationList"; -export type StationProps = { - DispNum: string; - JrHpUrl: string; - MyStation: string; - StationMap: string; - StationNumber: string | null; - StationTimeTable: string; - Station_EN: string; - Station_JP: string; - jslodApi: string; - lat: number; - lng: number; -}; +} from "@/lib/getStationList"; +import { StationProps } from "@/lib/CommonTypes"; type initialStateType = { originalStationList: StationProps[][]; setOriginalStationList: React.Dispatch>;