path修正

This commit is contained in:
harukin-expo-dev-env
2025-09-12 19:05:18 +00:00
parent 7bea2ac454
commit 50b2cbb21c
13 changed files with 284 additions and 360 deletions

View File

@@ -6,19 +6,19 @@ import Constants from "expo-constants";
import { Dimensions, StatusBar } from "react-native"; import { Dimensions, StatusBar } from "react-native";
import { SheetManager } from "react-native-actions-sheet"; import { SheetManager } from "react-native-actions-sheet";
import { AS } from "./storageControl"; import { AS } from "@/storageControl";
import TrainBase from "./components/trainbaseview"; import TrainBase from "@/components/trainbaseview";
import HowTo from "./howto"; import HowTo from "@/howto";
import Menu from "./menu"; import { Menu } from "@/menu";
import News from "./components/news"; import News from "@/components/news";
import Setting from "./components/Settings/settings"; import Setting from "@/components/Settings/settings";
import { useFavoriteStation } from "./stateBox/useFavoriteStation"; import { useFavoriteStation } from "@/stateBox/useFavoriteStation";
import { optionData } from "./lib/stackOption"; import { optionData } from "@/lib/stackOption";
import AllTrainDiagramView from "./components/AllTrainDiagramView"; import AllTrainDiagramView from "@/components/AllTrainDiagramView";
import { useNavigation } from "@react-navigation/native"; import { useNavigation } from "@react-navigation/native";
import { news } from "./config/newsUpdate"; import { news } from "@/config/newsUpdate";
import { useBottomTabBarHeight } from "@react-navigation/bottom-tabs"; import { useBottomTabBarHeight } from "@react-navigation/bottom-tabs";
import GeneralWebView from "./GeneralWebView"; import GeneralWebView from "@/GeneralWebView";
import { StationDiagramView } from "@/components/StationDiagram/StationDiagramView"; import { StationDiagramView } from "@/components/StationDiagram/StationDiagramView";
const Stack = createStackNavigator(); const Stack = createStackNavigator();

View File

@@ -1,17 +1,21 @@
import lineColorList from "@/assets/originData/lineColorList"; import lineColorList from "@/assets/originData/lineColorList";
import { customTrainDataDetector } from "@/components/custom-train-data";
import { StationNumberMaker } from "@/components/駅名表/StationNumberMaker"; import { StationNumberMaker } from "@/components/駅名表/StationNumberMaker";
import { checkDuplicateTrainData } from "@/lib/checkDuplicateTrainData"; import { checkDuplicateTrainData } from "@/lib/checkDuplicateTrainData";
import { CustomTrainData, trainTypeID } from "@/lib/CommonTypes"; import {
CustomTrainData,
eachTrainDiagramType,
StationProps,
} from "@/lib/CommonTypes";
import { getCurrentTrainData } from "@/lib/getCurrentTrainData"; import { getCurrentTrainData } from "@/lib/getCurrentTrainData";
import { getTrainDelayStatus } from "@/lib/getTrainDelayStatus"; import { getTrainDelayStatus } from "@/lib/getTrainDelayStatus";
import { getTrainType } from "@/lib/getTrainType"; import { getTrainType } from "@/lib/getTrainType";
import { objectIsEmpty } from "@/lib/objectIsEmpty"; import { objectIsEmpty } from "@/lib/objectIsEmpty";
import { trainPosition } from "@/lib/trainPositionTextArray"; import { getTime, trainTimeFiltering } from "@/lib/trainTimeFiltering";
import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram";
import { useAreaInfo } from "@/stateBox/useAreaInfo"; import { useAreaInfo } from "@/stateBox/useAreaInfo";
import { useCurrentTrain } from "@/stateBox/useCurrentTrain"; import { useCurrentTrain } from "@/stateBox/useCurrentTrain";
import { useStationList, StationProps } from "@/stateBox/useStationList"; import { useStationList } from "@/stateBox/useStationList";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { Text, TouchableOpacity, View } from "react-native"; import { Text, TouchableOpacity, View } from "react-native";
@@ -30,112 +34,6 @@ export const FixedStation = ({ stationID }) => {
: "white"; : "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 { allTrainDiagram } = useAllTrainDiagram();
const { areaInfo, areaStationID } = useAreaInfo(); const { areaInfo, areaStationID } = useAreaInfo();
const [stationDiagram, setStationDiagram] = useState({}); //当該駅の全時刻表 const [stationDiagram, setStationDiagram] = useState({}); //当該駅の全時刻表
@@ -162,7 +60,9 @@ export const FixedStation = ({ stationID }) => {
setIsInfoArea(station.some((s) => areaStationID.includes(s.StationNumber))); setIsInfoArea(station.some((s) => areaStationID.includes(s.StationNumber)));
}, [allTrainDiagram, station]); }, [allTrainDiagram, station]);
const [trainTimeAndNumber, setTrainTimeAndNumber] = useState([]); const [trainTimeAndNumber, setTrainTimeAndNumber] = useState<
eachTrainDiagramType[]
>([]);
useEffect(() => { useEffect(() => {
//現在の駅に停車する列車から時刻を切り出してLEDベースにフォーマット //現在の駅に停車する列車から時刻を切り出してLEDベースにフォーマット
@@ -170,20 +70,15 @@ export const FixedStation = ({ stationID }) => {
const getTimeData = getTime(stationDiagram, station[0]); const getTimeData = getTime(stationDiagram, station[0]);
setTrainTimeAndNumber(getTimeData); setTrainTimeAndNumber(getTimeData);
}, [stationDiagram]); }, [stationDiagram]);
const [selectedTrain, setSelectedTrain] = useState< const [selectedTrain, setSelectedTrain] = useState<eachTrainDiagramType[]>(
{ []
isThrough?: boolean; );
train?: string;
lastStation?: string;
time?: string;
}[]
>([]);
useEffect(() => { useEffect(() => {
if (!trainTimeAndNumber) return () => {}; if (!trainTimeAndNumber) return () => {};
if (!currentTrain) return () => {}; if (!currentTrain) return () => {};
const data = trainTimeAndNumber const data = trainTimeAndNumber
.filter((d) => currentTrain.map((m) => m.num).includes(d.train)) //現在の列車に絞る[ToDo] .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.isThrough)
.filter((d) => d.lastStation != station[0].Station_JP); //最終列車表示設定 .filter((d) => d.lastStation != station[0].Station_JP); //最終列車表示設定
setSelectedTrain(data); setSelectedTrain(data);
@@ -302,9 +197,11 @@ const FixedStationBoxEachTrain = ({ d, station }) => {
currentTrainData, currentTrainData,
station.Station_JP station.Station_JP
)}`; )}`;
const [train, setTrain] = useState<CustomTrainData>(getCurrentTrainData(d.train,currentTrain,allCustomTrainData)); const [train, setTrain] = useState<CustomTrainData>(
getCurrentTrainData(d.train, currentTrain, allCustomTrainData)
);
useEffect(() => { useEffect(() => {
setTrain(getCurrentTrainData(d.train,currentTrain,allCustomTrainData)); setTrain(getCurrentTrainData(d.train, currentTrain, allCustomTrainData));
}, [currentTrain, d.train]); }, [currentTrain, d.train]);
const { name, color } = getTrainType({ type: train.type, whiteMode: true }); const { name, color } = getTrainType({ type: train.type, whiteMode: true });
return ( return (

View File

@@ -1,12 +1,13 @@
import lineColorList from "@/assets/originData/lineColorList"; import lineColorList from "@/assets/originData/lineColorList";
import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram";
import { useCurrentTrain } from "@/stateBox/useCurrentTrain"; 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 { FC, useEffect, useState } from "react";
import { Text, TouchableOpacity, View, Image } from "react-native"; import { Text, TouchableOpacity, View, Image } from "react-native";
import { getTrainType } from "@/lib/getTrainType"; import { getTrainType } from "@/lib/getTrainType";
import { trainPosition } from "@/lib/trainPositionTextArray"; import { trainPosition } from "@/lib/trainPositionTextArray";
import { StationNumberMaker } from "../../駅名表/StationNumberMaker"; import { StationNumberMaker } from "@/components/駅名表/StationNumberMaker";
import { lineListPair, stationIDPair } from "@/lib/getStationList"; import { lineListPair, stationIDPair } from "@/lib/getStationList";
import { findReversalPoints } from "@/lib/eachTrainInfoCoreLib/findReversalPoints"; import { findReversalPoints } from "@/lib/eachTrainInfoCoreLib/findReversalPoints";
import { CustomTrainData, trainTypeID } from "@/lib/CommonTypes"; import { CustomTrainData, trainTypeID } from "@/lib/CommonTypes";

View File

@@ -1,9 +1,9 @@
import React, { FC, useState } from "react"; import React, { FC, useState } from "react";
import { View, Text, TouchableOpacity } from "react-native"; import { View, Text, TouchableOpacity } from "react-native";
import { useInterval } from "../../lib/useInterval"; import { useInterval } from "@/lib/useInterval";
import lineColorList from "../../assets/originData/lineColorList"; import lineColorList from "@/assets/originData/lineColorList";
import { StationProps } from "@/stateBox/useStationList"; import { StationProps } from "@/lib/CommonTypes";
type StationNumberProps = { type StationNumberProps = {
currentStation: StationProps[]; currentStation: StationProps[];
active: boolean; active: boolean;

View File

@@ -1,24 +1,23 @@
import React, { FC, useEffect, useState } from "react"; import React, { FC, useEffect, useState } from "react";
import { TouchableOpacity } from "react-native"; import { TouchableOpacity } from "react-native";
import { checkDuplicateTrainData } from "../../lib/checkDuplicateTrainData"; import { checkDuplicateTrainData } from "@/lib/checkDuplicateTrainData";
import { getTrainDelayStatus } from "../../lib/getTrainDelayStatus"; import { getTrainDelayStatus } from "@/lib/getTrainDelayStatus";
import { getTrainType } from "../../lib/getTrainType"; import { getTrainType } from "@/lib/getTrainType";
import { useCurrentTrain } from "../../stateBox/useCurrentTrain"; import { useCurrentTrain } from "@/stateBox/useCurrentTrain";
import { SheetManager } from "react-native-actions-sheet"; import { SheetManager } from "react-native-actions-sheet";
import { Description } from "./LED_inside_Component/Description"; import { Description } from "@/components/発車時刻表/LED_inside_Component/Description";
import { DependTime } from "./LED_inside_Component/DependTime"; import { DependTime } from "@/components/発車時刻表/LED_inside_Component/DependTime";
import { LastStation } from "./LED_inside_Component/LastStation"; import { LastStation } from "@/components/発車時刻表/LED_inside_Component/LastStation";
import { StatusAndDelay } from "./LED_inside_Component/StatusAndDelay"; import { StatusAndDelay } from "@/components/発車時刻表/LED_inside_Component/StatusAndDelay";
import { TrainName } from "./LED_inside_Component/TrainName"; import { TrainName } from "@/components/発車時刻表/LED_inside_Component/TrainName";
import { customTrainDataDetector } from "../custom-train-data"; import { TrainPosition } from "@/components/発車時刻表/LED_inside_Component/TrainPosition";
import { TrainPosition } from "./LED_inside_Component/TrainPosition"; import { StationPosPushDialog } from "@/components/発車時刻表/LED_inside_Component/TrainPositionDataPush";
import { StationPosPushDialog } from "./LED_inside_Component/TrainPositionDataPush"; import { StationPosDeleteDialog } from "@/components/発車時刻表/LED_inside_Component/TrainPositionDataDelete";
import { StationPosDeleteDialog } from "./LED_inside_Component/TrainPositionDataDelete"; import { useStationList } from "@/stateBox/useStationList";
import { useStationList } from "../../stateBox/useStationList";
import useInterval from "@/lib/useInterval"; import useInterval from "@/lib/useInterval";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram";
import { CustomTrainData, trainTypeID } from "@/lib/CommonTypes"; import { CustomTrainData, StationProps, trainTypeID } from "@/lib/CommonTypes";
import { getCurrentTrainData } from "@/lib/getCurrentTrainData"; import { getCurrentTrainData } from "@/lib/getCurrentTrainData";
type Props = { type Props = {
@@ -30,10 +29,7 @@ type Props = {
}; };
trainIDSwitch: boolean; trainIDSwitch: boolean;
trainDescriptionSwitch: boolean; trainDescriptionSwitch: boolean;
station: { station: StationProps;
Station_JP: string;
StationNumber: string;
};
navigate: (screen: string, data?: any) => void; navigate: (screen: string, data?: any) => void;
openStationACFromEachTrainInfo: (station: string) => void; openStationACFromEachTrainInfo: (station: string) => void;
}; };

View File

@@ -1,18 +1,17 @@
import React, { useState, useEffect } from "react"; import React, { useState, useEffect, FC } from "react";
import { View, useWindowDimensions } from "react-native"; import { View, useWindowDimensions } from "react-native";
import dayjs from "dayjs"; import { objectIsEmpty } from "@/lib/objectIsEmpty";
import { useInterval } from "../../lib/useInterval"; import { useCurrentTrain } from "@/stateBox/useCurrentTrain";
import { objectIsEmpty } from "../../lib/objectIsEmpty"; import { useAreaInfo } from "@/stateBox/useAreaInfo";
import { useCurrentTrain } from "../../stateBox/useCurrentTrain"; import { AS } from "@/storageControl";
import { useAreaInfo } from "../../stateBox/useAreaInfo"; import { Footer } from "@/components/発車時刻表/LED_Vision_Component/Footer";
import { AS } from "../../storageControl"; import { Header } from "@/components/発車時刻表/LED_Vision_Component/Header";
import { Footer } from "./LED_Vision_Component/Footer"; import { EachData } from "@/components/発車時刻表/EachData";
import { Header } from "./LED_Vision_Component/Header";
import { Description } from "./LED_inside_Component/Description";
import { EachData } from "./EachData";
import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram";
import { trainPosition } from "@/lib/trainPositionTextArray"; import { AreaDescription } from "@/components/発車時刻表/LED_inside_Component/AreaDescription";
import { AreaDescription } from "./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 サンライズ瀬戸琴平(延長)(臨時?) * 9031M サンライズ瀬戸琴平(延長)(臨時?)
* 9062D 四国まんなか千年ものがたり(臨時?) * 9062D 四国まんなか千年ものがたり(臨時?)
*/ */
export default function LED_vision(props) { type props = {
const { station, navigate, openStationACFromEachTrainInfo } = props; station: StationProps[];
};
export const LED_vision: FC<props> = (props) => {
const { station } = props;
const { navigate, addListener, isFocused } = useNavigation();
const { currentTrain } = useCurrentTrain(); const { currentTrain } = useCurrentTrain();
const [stationDiagram, setStationDiagram] = useState({}); //当該駅の全時刻表 const [stationDiagram, setStationDiagram] = useState<{
[key: string]: string;
}>({}); //当該駅の全時刻表
const [finalSwitch, setFinalSwitch] = useState(false); const [finalSwitch, setFinalSwitch] = useState(false);
const [trainIDSwitch, setTrainIDSwitch] = useState(false); const [trainIDSwitch, setTrainIDSwitch] = useState(false);
const [trainDescriptionSwitch, setTrainDescriptionSwitch] = useState(false); const [trainDescriptionSwitch, setTrainDescriptionSwitch] = useState(false);
@@ -85,7 +91,9 @@ export default function LED_vision(props) {
/* /*
{lastStation: "当駅止", time: "12:34", train: "1234M"} {lastStation: "当駅止", time: "12:34", train: "1234M"}
*/ */
const [trainTimeAndNumber, setTrainTimeAndNumber] = useState([]); const [trainTimeAndNumber, setTrainTimeAndNumber] = useState<
eachTrainDiagramType[]
>([]);
useEffect(() => { useEffect(() => {
//現在の駅に停車する列車から時刻を切り出してLEDベースにフォーマット //現在の駅に停車する列車から時刻を切り出してLEDベースにフォーマット
@@ -94,102 +102,19 @@ export default function LED_vision(props) {
setTrainTimeAndNumber(getTimeData); setTrainTimeAndNumber(getTimeData);
}, [stationDiagram]); }, [stationDiagram]);
const [selectedTrain, setSelectedTrain] = useState([]); const [selectedTrain, setSelectedTrain] = useState<eachTrainDiagramType[]>(
[]
);
useEffect(() => { useEffect(() => {
if (!trainTimeAndNumber) return () => {}; if (!trainTimeAndNumber) return () => {};
if (!currentTrain) return () => {}; if (!currentTrain) return () => {};
const data = trainTimeAndNumber const data = trainTimeAndNumber
.filter((d) => currentTrain.map((m) => m.num).includes(d.train)) //現在の列車に絞る[ToDo] .filter((d) => currentTrain.map((m) => m.num).includes(d.train)) //現在の列車に絞る[ToDo]
.filter(timeFiltering) .filter((d) => trainTimeFiltering({ d, currentTrain, station })) //時間フィルター
.filter((d) => !!finalSwitch || d.lastStation != station[0].Station_JP) //最終列車表示設定 .filter((d) => !!finalSwitch || d.lastStation != station[0].Station_JP); //最終列車表示設定
setSelectedTrain(data); setSelectedTrain(data);
}, [trainTimeAndNumber, currentTrain, finalSwitch]); }, [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 { width } = useWindowDimensions();
const adjustedWidth = width * 0.98; const adjustedWidth = width * 0.98;
return ( return (
@@ -210,7 +135,7 @@ export default function LED_vision(props) {
trainIDSwitch, trainIDSwitch,
trainDescriptionSwitch, trainDescriptionSwitch,
navigate, navigate,
openStationACFromEachTrainInfo, openStationACFromEachTrainInfo: () => {},
}} }}
station={station[0]} station={station[0]}
key={d.train} key={d.train}
@@ -236,4 +161,4 @@ export default function LED_vision(props) {
/> />
</View> </View>
); );
} };

View File

@@ -1,8 +1,8 @@
import React, { FC } from "react"; import React, { FC } from "react";
import { Text, View } from "react-native"; import { Text, View } from "react-native";
import { useWindowDimensions } from "react-native"; import { useWindowDimensions } from "react-native";
import lineColorList from "../../assets/originData/lineColorList"; import lineColorList from "@/assets/originData/lineColorList";
import { StationProps } from "@/stateBox/useStationList"; import { StationProps } from "@/lib/CommonTypes";
type props = { type props = {
currentStation: StationProps[]; currentStation: StationProps[];

View File

@@ -35,4 +35,24 @@ export type CustomTrainData = {
isSeason?: boolean; isSeason?: boolean;
vehicleFormation?: string; vehicleFormation?: string;
trainInfoUrl?: 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;
}; };

112
lib/trainTimeFiltering.ts Normal file
View File

@@ -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;
}
});
};

View File

@@ -1,58 +1,54 @@
import React, { useRef, useState, useEffect, useLayoutEffect } from "react"; import React, { useRef, useState, useEffect, useLayoutEffect, FC } from "react";
import { import { Platform, View, ScrollView, LayoutAnimation } from "react-native";
Platform,
View,
ScrollView,
useWindowDimensions,
LayoutAnimation,
Text,
TouchableOpacity,
} from "react-native";
import Constants from "expo-constants"; import Constants from "expo-constants";
import { import {
configureReanimatedLogger, configureReanimatedLogger,
ReanimatedLogLevel, ReanimatedLogLevel,
} from "react-native-reanimated"; } from "react-native-reanimated";
import StatusbarDetect from "./StatusbarDetect"; import StatusbarDetect from "@/StatusbarDetect";
import LED_vision from "./components/発車時刻表/LED_vidion"; import { LED_vision } from "@/components/発車時刻表/LED_vidion";
import { TitleBar } from "./components/Menu/TitleBar"; import { TitleBar } from "@/components/Menu/TitleBar";
import { FixedContentBottom } from "./components/Menu/FixedContentBottom"; import { FixedContentBottom } from "@/components/Menu/FixedContentBottom";
import { lineList, stationIDPair } from "./lib/getStationList"; import { lineList, stationIDPair } from "@/lib/getStationList";
import { useFavoriteStation } from "./stateBox/useFavoriteStation"; import { useFavoriteStation } from "@/stateBox/useFavoriteStation";
import { useNavigation } from "@react-navigation/native"; import { useNavigation } from "@react-navigation/native";
import { useStationList } from "./stateBox/useStationList"; import { useStationList } from "@/stateBox/useStationList";
import { TopMenuButton } from "@/components/Menu/TopMenuButton"; import { TopMenuButton } from "@/components/Menu/TopMenuButton";
import { JRSTraInfoBox } from "@/components/Menu/JRSTraInfoBox"; import { JRSTraInfoBox } from "@/components/Menu/JRSTraInfoBox";
import MapView, { Marker } from "react-native-maps"; import MapView, { Marker } from "react-native-maps";
import { useSafeAreaInsets } from "react-native-safe-area-context"; import { CarouselBox } from "@/components/Menu/Carousel/CarouselBox";
import { useBottomTabBarHeight } from "@react-navigation/bottom-tabs"; import { CarouselTypeChanger } from "@/components/Menu/Carousel/CarouselTypeChanger";
import { CarouselBox } from "./components/Menu/Carousel/CarouselBox"; import { useUserPosition } from "@/stateBox/useUserPosition";
import { CarouselTypeChanger } from "./components/Menu/Carousel/CarouselTypeChanger"; import { AS } from "@/storageControl";
import { useUserPosition } from "./stateBox/useUserPosition"; import { lineList_LineWebID } from "@/lib/getStationList";
import { AS } from "./storageControl"; import { StationProps } from "@/lib/CommonTypes";
import { lineList_LineWebID } from "./lib/getStationList"; import { LocationObject } from "expo-location";
import { Ionicons } from "@expo/vector-icons";
configureReanimatedLogger({ configureReanimatedLogger({
level: ReanimatedLogLevel.error, // Set the log level to error level: ReanimatedLogLevel.error, // Set the log level to error
strict: true, // Reanimated runs in strict mode by default strict: true, // Reanimated runs in strict mode by default
}); });
export default function Menu(props) {
type props = {
scrollRef: React.RefObject<ScrollView>;
mapHeight: number;
MapFullHeight: number;
mapMode: boolean;
setMapMode: React.Dispatch<React.SetStateAction<boolean>>;
};
export const Menu: FC<props> = (props) => {
const { scrollRef, mapHeight, MapFullHeight, mapMode, setMapMode } = props; const { scrollRef, mapHeight, MapFullHeight, mapMode, setMapMode } = props;
const { navigate, addListener, isFocused } = useNavigation(); const { navigate } = useNavigation();
const { favoriteStation } = useFavoriteStation(); const { favoriteStation } = useFavoriteStation();
const { originalStationList, getStationDataFromNameBase } = useStationList(); const { originalStationList, getStationDataFromNameBase } = useStationList();
const { height, width } = useWindowDimensions(); const [stationListMode, setStationListMode] = useState<
const { bottom, left, right, top } = useSafeAreaInsets(); "position" | "favorite"
const tabBarHeight = useBottomTabBarHeight(); >("position");
const [stationListMode, setStationListMode] = useState(
/*<"position"|"favorite">*/ "position"
);
useEffect(() => { useEffect(() => {
AS.getItem("stationListMode") AS.getItem("stationListMode")
.then((res) => setStationListMode(res)) .then((res) => setStationListMode(res))
.catch((e) => { .catch(() => {
// AS.setItem("stationListMode", "position"); // AS.setItem("stationListMode", "position");
}); });
}, []); }, []);
@@ -92,11 +88,17 @@ export default function Menu(props) {
}; };
//現在地基準の駅名標リストアップ機能 //現在地基準の駅名標リストアップ機能
const { position, locationStatus } = useUserPosition(); const { position, locationStatus } = useUserPosition();
const [nearPositionStation, setNearPositionStation] = useState<
StationProps[][]
>([]); //第三要素
useEffect(() => { useEffect(() => {
if (!position) return () => {}; if (!position) return () => {};
makeCurrentStation(position); makeCurrentStation(position);
}, [position, stationListMode]); }, [position, stationListMode]);
const makeCurrentStation = (location) => {
const makeCurrentStation = (location: LocationObject) => {
if (!originalStationList) return () => {}; if (!originalStationList) return () => {};
const findStationEachLine = (selectLine) => { const findStationEachLine = (selectLine) => {
const searchArea = 0.055; //検索範囲 const searchArea = 0.055; //検索範囲
@@ -128,7 +130,7 @@ export default function Menu(props) {
return NearStation; return NearStation;
}; };
let _stList = lineList let _stList: StationProps[] = lineList
.map((d) => findStationEachLine(originalStationList[d])) .map((d) => findStationEachLine(originalStationList[d]))
.filter((d) => d.length > 0) .filter((d) => d.length > 0)
.reduce((pre, current) => { .reduce((pre, current) => {
@@ -137,7 +139,9 @@ export default function Menu(props) {
}, []); }, []);
if (_stList.length == 0) setNearPositionStation([]); if (_stList.length == 0) setNearPositionStation([]);
else { else {
let returnData = []; console.log("hoge");
console.log(_stList);
let returnData: StationProps[][] = [];
_stList.forEach((d, index, array) => { _stList.forEach((d, index, array) => {
const stationName = d.Station_JP; const stationName = d.Station_JP;
if (returnData.findIndex((d) => d[0].Station_JP == stationName) != -1) 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 [listIndex, setListIndex] = useState(0);
const [listUpStation, setListUpStation] = useState([]); const [listUpStation, setListUpStation] = useState<StationProps[][]>([]);
const [isSearchMode, setisSearchMode] = useState(false); const [isSearchMode, setisSearchMode] = useState(false);
const [input, setInput] = React.useState(""); const [input, setInput] = useState("");
useLayoutEffect(() => { useLayoutEffect(() => {
if (!!isSearchMode) { if (!!isSearchMode) {
const returnData = []; const returnData = [];
if (!input || input == "") { if (!input || input == "") {
Object.keys(lineList_LineWebID).forEach((d, indexBase) => { Object.keys(lineList_LineWebID).forEach((d) => {
originalStationList[d].forEach((D, index) => { originalStationList[d].forEach((D) => {
if ( if (
isSearchMode && isSearchMode &&
isSearchMode != stationIDPair[lineList_LineWebID[d]] isSearchMode != stationIDPair[lineList_LineWebID[d]]
@@ -196,12 +198,16 @@ export default function Menu(props) {
const hoge = getStationDataFromNameBase(input); const hoge = getStationDataFromNameBase(input);
hoge.forEach((d, index, array) => { hoge.forEach((d, index, array) => {
const stationName = d.Station_JP; 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; return;
returnData.push(array.filter((d2) => d2.Station_JP == stationName)); returnData.push(array.filter((d2) => d2.Station_JP == stationName));
}); });
} }
if (JSON.stringify(returnData) == JSON.stringify(listUpStation)) return; if (JSON.stringify(returnData) == JSON.stringify(listUpStation)) return;
console.log("returnData");
console.log(returnData);
setListUpStation(returnData); setListUpStation(returnData);
} else if (stationListMode == "position") { } else if (stationListMode == "position") {
const returnData = nearPositionStation.filter((d) => d != undefined); const returnData = nearPositionStation.filter((d) => d != undefined);
@@ -242,8 +248,8 @@ export default function Menu(props) {
if (mapMode) { if (mapMode) {
mapsRef?.current.fitToCoordinates( mapsRef?.current.fitToCoordinates(
listUpStation.map((d) => ({ listUpStation.map((d) => ({
latitude: parseFloat(d[0].lat), latitude: d[0].lat,
longitude: parseFloat(d[0].lng), longitude: d[0].lng,
})), })),
{ edgePadding: { top: 80, bottom: 120, left: 50, right: 50 } } // Add margin values here { edgePadding: { top: 80, bottom: 120, left: 50, right: 50 } } // Add margin values here
); );
@@ -261,24 +267,7 @@ export default function Menu(props) {
}} }}
> >
<StatusbarDetect /> <StatusbarDetect />
{!mapMode ? ( {!mapMode ? <TitleBar /> : <></>}
<TitleBar />
) : (
<></>
// <Text
// style={{
// fontSize: 30,
// color: "#0099CC",
// fontWeight: "bold",
// position: "absolute",
// top: 0,
// zIndex: 1000,
// fontStyle: "italic",
// }}
// >
// JRShikoku RailScope
// </Text>
)}
<ScrollView <ScrollView
ref={scrollRef} ref={scrollRef}
snapToStart={false} snapToStart={false}
@@ -334,8 +323,8 @@ export default function Menu(props) {
<Marker <Marker
key={index + StationNumber} key={index + StationNumber}
coordinate={{ coordinate={{
latitude: parseFloat(lat), latitude: lat,
longitude: parseFloat(lng), longitude: lng,
}} }}
image={require("@/assets/reccha-small.png")} image={require("@/assets/reccha-small.png")}
onPress={() => { onPress={() => {
@@ -344,8 +333,8 @@ export default function Menu(props) {
if (mapsRef.current) { if (mapsRef.current) {
mapsRef.current.animateToRegion( mapsRef.current.animateToRegion(
{ {
latitude: parseFloat(lat), latitude: lat,
longitude: parseFloat(lng), longitude: lng,
latitudeDelta: 0.05, latitudeDelta: 0.05,
longitudeDelta: 0.05, longitudeDelta: 0.05,
}, },
@@ -401,11 +390,7 @@ export default function Menu(props) {
}} }}
/> />
{listUpStation[listIndex] && ( {listUpStation[listIndex] && (
<LED_vision <LED_vision station={listUpStation[listIndex]} />
station={listUpStation[listIndex]}
navigate={navigate}
openStationACFromEachTrainInfo={() => {}}
/>
)} )}
</> </>
)} )}
@@ -433,4 +418,4 @@ export default function Menu(props) {
)} )}
</View> </View>
); );
} };

View File

@@ -6,10 +6,10 @@ import React, {
useRef, useRef,
FC, FC,
} from "react"; } from "react";
import { HeaderConfig } from "../lib/HeaderConfig"; import { HeaderConfig } from "@/lib/HeaderConfig";
import useInterval from "../lib/useInterval"; import useInterval from "@/lib/useInterval";
import { useStationList } from "./useStationList"; import { useStationList } from "@/stateBox/useStationList";
import { checkDuplicateTrainData } from "@/lib/checkDuplicateTrainData"; import { checkDuplicateTrainData } from "@/lib/checkDuplicateTrainData";
import { getStationID } from "@/lib/eachTrainInfoCoreLib/getStationData"; import { getStationID } from "@/lib/eachTrainInfoCoreLib/getStationData";
import { trainDataType } from "@/lib/trainPositionTextArray"; import { trainDataType } from "@/lib/trainPositionTextArray";
@@ -167,7 +167,6 @@ export const CurrentTrainProvider:FC<props> = ({ children }) => {
) => { ) => {
//e:trainNumber //e:trainNumber
if (!currentTrain.length) return; if (!currentTrain.length) return;
console.log(currentTrain);
return checkDuplicateTrainData( return checkDuplicateTrainData(
currentTrain.filter((d) => d.num == e), currentTrain.filter((d) => d.num == e),
stationList stationList

View File

@@ -6,8 +6,9 @@ import React, {
useLayoutEffect, useLayoutEffect,
FC, FC,
} from "react"; } from "react";
import { AS } from "../storageControl"; import { AS } from "@/storageControl";
import { StationProps, useStationList } from "./useStationList"; import { useStationList } from "@/stateBox/useStationList";
import { StationProps } from "@/lib/CommonTypes";
const initialState = { const initialState = {
favoriteStation: [], favoriteStation: [],
setFavoriteStation: () => {}, setFavoriteStation: () => {},

View File

@@ -9,20 +9,8 @@ import {
lineList, lineList,
getStationList, getStationList,
lineList_LineWebID, lineList_LineWebID,
} from "../lib/getStationList"; } from "@/lib/getStationList";
export type StationProps = { import { StationProps } from "@/lib/CommonTypes";
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;
};
type initialStateType = { type initialStateType = {
originalStationList: StationProps[][]; originalStationList: StationProps[][];
setOriginalStationList: React.Dispatch<React.SetStateAction<StationProps[]>>; setOriginalStationList: React.Dispatch<React.SetStateAction<StationProps[]>>;