現在地表示をリアルタイム更新するように変更

This commit is contained in:
harukin-OneMix4 2024-01-02 00:18:54 +09:00
parent a4e85ff2e6
commit 3ca91f402e
8 changed files with 72 additions and 63 deletions

28
App.js
View File

@ -80,30 +80,6 @@ export function AppContainer() {
}); });
}, []); }, []);
const { setCurrentTrain, setCurrentTrainLoading } = useCurrentTrain();
const getCurrentTrain = () =>
fetch(
"https://script.google.com/macros/s/AKfycby9Y2-Bm75J_WkbZimi7iS8v5r9wMa9wtzpdwES9sOGF4i6HIYEJOM60W6gM1gXzt1o/exec",
HeaderConfig
)
.then((response) => response.json())
.then((d) =>
d.map((x) => ({ num: x.TrainNum, delay: x.delay, Pos: x.Pos }))
)
.then((d) => {
setCurrentTrain(d);
setCurrentTrainLoading("success");
})
.catch(() => {
console.log("えらー");
setCurrentTrainLoading("error");
});
useEffect(getCurrentTrain, []); //初回だけ現在の全在線列車取得
useInterval(getCurrentTrain, 15000); //15秒毎に全在線列車取得
const { areaInfo, setAreaInfo } = useAreaInfo(); const { areaInfo, setAreaInfo } = useAreaInfo();
const getAreaData = () => const getAreaData = () =>
fetch( fetch(
@ -128,7 +104,7 @@ export function AppContainer() {
tabBarIcon: initIcon("barchart", "AntDesign"), tabBarIcon: initIcon("barchart", "AntDesign"),
}} }}
> >
{(props) => <Top {...props} getCurrentTrain={getCurrentTrain} />} {(props) => <Top {...props} />}
</Tab.Screen> </Tab.Screen>
<Tab.Screen <Tab.Screen
name="menuPage" name="menuPage"
@ -139,7 +115,7 @@ export function AppContainer() {
tabBarIcon: initIcon("ios-radio", "Ionicons"), tabBarIcon: initIcon("ios-radio", "Ionicons"),
}} }}
> >
{(props) => <MenuPage {...props} getCurrentTrain={getCurrentTrain} />} {(props) => <MenuPage {...props} />}
</Tab.Screen> </Tab.Screen>
<Tab.Screen <Tab.Screen
name="home" name="home"

View File

@ -180,9 +180,6 @@ export default function Apps({ navigation, webview, stationData }) {
data: { data: {
trainNum, trainNum,
limited, limited,
trainData: checkDuplicateTrainData(
currentTrain.filter((a) => a.num == trainNum)
),
}, },
navigate, navigate,
originalStationList, originalStationList,

View File

@ -12,10 +12,12 @@ import { useFavoriteStation } from "./stateBox/useFavoriteStation";
import { optionData } from "./lib/stackOption.js"; import { optionData } from "./lib/stackOption.js";
import CurrentTrainListView from "./components/CurrentTrainListView.js"; import CurrentTrainListView from "./components/CurrentTrainListView.js";
import AllTrainDiagramView from "./components/AllTrainDiagramView.js"; import AllTrainDiagramView from "./components/AllTrainDiagramView.js";
import { useCurrentTrain } from "./stateBox/useCurrentTrain.js";
const Stack = createStackNavigator(); const Stack = createStackNavigator();
export function MenuPage({ navigation, getCurrentTrain }) { export function MenuPage({ navigation }) {
const { favoriteStation, setFavoriteStation } = useFavoriteStation(); const { favoriteStation, setFavoriteStation } = useFavoriteStation();
const { getCurrentTrain } = useCurrentTrain();
useEffect(() => { useEffect(() => {
const unsubscribe = navigation.addListener("tabPress", (e) => { const unsubscribe = navigation.addListener("tabPress", (e) => {
AS.getItem("favoriteStation") AS.getItem("favoriteStation")

4
Top.js
View File

@ -12,10 +12,12 @@ import TrainMenu from "./components/trainMenu.js";
import FavoriteList from "./components/FavoriteList.js"; import FavoriteList from "./components/FavoriteList.js";
import { useFavoriteStation } from "./stateBox/useFavoriteStation"; import { useFavoriteStation } from "./stateBox/useFavoriteStation";
import { optionData } from "./lib/stackOption.js"; import { optionData } from "./lib/stackOption.js";
import { useCurrentTrain } from "./stateBox/useCurrentTrain.js";
const Stack = createStackNavigator(); const Stack = createStackNavigator();
export const Top = ({ navigation, getCurrentTrain }) => { export const Top = ({ navigation }) => {
const webview = useRef(); const webview = useRef();
const { favoriteStation, setFavoriteStation } = useFavoriteStation(); const { favoriteStation, setFavoriteStation } = useFavoriteStation();
const { getCurrentTrain } = useCurrentTrain();
//地図用 //地図用
const [mapsStationData, setMapsStationData] = useState(undefined); const [mapsStationData, setMapsStationData] = useState(undefined);

View File

@ -24,6 +24,8 @@ import {
widthPercentageToDP, widthPercentageToDP,
} from "react-native-responsive-screen"; } from "react-native-responsive-screen";
import lineColorList from "../../assets/originData/lineColorList"; import lineColorList from "../../assets/originData/lineColorList";
import { useCurrentTrain } from "../../stateBox/useCurrentTrain";
import { checkDuplicateTrainData } from "../../lib/checkDuplicateTrainData";
export const EachTrainInfo = (props) => { export const EachTrainInfo = (props) => {
if (!props.payload) return <></>; if (!props.payload) return <></>;
@ -40,6 +42,18 @@ export const EachTrainInfo = (props) => {
const [trainPositionSwitch, setTrainPositionSwitch] = useState("false"); const [trainPositionSwitch, setTrainPositionSwitch] = useState("false");
const { currentTrain } = useCurrentTrain();
const [currentTrainData, setCurrentTrainData] = useState([]);
useEffect(() => {
setCurrentTrainData(
checkDuplicateTrainData(
currentTrain.filter((d) => d.num == data.trainNum)
)
);
}, [currentTrain]);
useEffect(() => { useEffect(() => {
//列車現在地アイコン表示スイッチ //列車現在地アイコン表示スイッチ
AS.getItem("trainPositionSwitch") AS.getItem("trainPositionSwitch")
@ -65,17 +79,17 @@ export const EachTrainInfo = (props) => {
return Station.map((d) => d.StationNumber)[0]; return Station.map((d) => d.StationNumber)[0];
}; };
useEffect(() => { useEffect(() => {
//data.trainData.Pos = "鴨川~端岡"; //test //currentTrainData.Pos = "鴨川~端岡"; //test
if (!data.trainData?.Pos) return; if (!currentTrainData?.Pos) return;
if (data.trainData?.Pos.match("")) { if (currentTrainData?.Pos.match("")) {
const pos = data.trainData?.Pos.replace("(下り)", "") const pos = currentTrainData?.Pos.replace("(下り)", "")
.replace("(上り)", "") .replace("(上り)", "")
.split(""); .split("");
setCurrentPosition([getStationData(pos[0]), getStationData(pos[1])]); setCurrentPosition([getStationData(pos[0]), getStationData(pos[1])]);
} else { } else {
setCurrentPosition([getStationData(data.trainData?.Pos)]); setCurrentPosition([getStationData(currentTrainData?.Pos)]);
} }
}, [data.trainData]); }, [currentTrainData]);
const stationList = const stationList =
originalStationList && originalStationList &&
@ -339,7 +353,7 @@ export const EachTrainInfo = (props) => {
現在地 {currentPosition.toString()} 現在地 {currentPosition.toString()}
</Text> </Text>
<View style={{ flex: 1 }} /> <View style={{ flex: 1 }} />
{data.trainData?.Pos && data.trainData?.Pos.match("") ? ( {currentTrainData?.Pos && currentTrainData?.Pos.match("") ? (
<> <>
<Text <Text
style={{ style={{
@ -349,7 +363,7 @@ export const EachTrainInfo = (props) => {
}} }}
> >
{ {
data.trainData?.Pos.replace("(下り)", "") currentTrainData?.Pos.replace("(下り)", "")
.replace("(上り)", "") .replace("(上り)", "")
.split("")[0] .split("")[0]
} }
@ -365,7 +379,7 @@ export const EachTrainInfo = (props) => {
}} }}
> >
{ {
data.trainData?.Pos.replace("(下り)", "") currentTrainData?.Pos.replace("(下り)", "")
.replace("(上り)", "") .replace("(上り)", "")
.split("")[1] .split("")[1]
} }
@ -379,7 +393,7 @@ export const EachTrainInfo = (props) => {
textAlign: "right", textAlign: "right",
}} }}
> >
{data.trainData?.Pos} {currentTrainData?.Pos}
</Text> </Text>
)} )}
</View> </View>
@ -394,7 +408,7 @@ export const EachTrainInfo = (props) => {
}} }}
> >
<Text style={{ fontSize: 15, color: "#0099CC" }}> <Text style={{ fontSize: 15, color: "#0099CC" }}>
{isNaN(data.trainData?.delay) ? "状態" : "遅延時分"} {isNaN(currentTrainData?.delay) ? "状態" : "遅延時分"}
</Text> </Text>
<View style={{ flex: 1 }} /> <View style={{ flex: 1 }} />
<Text <Text
@ -404,8 +418,8 @@ export const EachTrainInfo = (props) => {
textAlign: "right", textAlign: "right",
}} }}
> >
{data.trainData?.delay} {currentTrainData?.delay}
{isNaN(data.trainData?.delay) ? "" : "分"} {isNaN(currentTrainData?.delay) ? "" : "分"}
</Text> </Text>
</View> </View>
<View <View
@ -425,7 +439,7 @@ export const EachTrainInfo = (props) => {
textAlign: "right", textAlign: "right",
}} }}
> >
{data.trainData?.num} {currentTrainData?.num}
</Text> </Text>
</View> </View>
</View> </View>
@ -546,8 +560,8 @@ export const EachTrainInfo = (props) => {
<Text style={{ fontSize: 20 }}>停車駅</Text> <Text style={{ fontSize: 20 }}>停車駅</Text>
<View style={{ flex: 1 }} /> <View style={{ flex: 1 }} />
<View style={{ flexDirection: "row" }}> <View style={{ flexDirection: "row" }}>
{!isNaN(data.trainData?.delay) && {!isNaN(currentTrainData?.delay) &&
data.trainData?.delay != 0 && ( currentTrainData?.delay != 0 && (
<Text <Text
style={{ style={{
fontSize: 15, fontSize: 15,
@ -564,9 +578,9 @@ export const EachTrainInfo = (props) => {
<Text <Text
style={{ style={{
fontSize: 20, fontSize: 20,
color: isNaN(data.trainData?.delay) color: isNaN(currentTrainData?.delay)
? "black" ? "black"
: data.trainData?.delay == 0 : currentTrainData?.delay == 0
? "black" ? "black"
: "red", : "red",
width: 60, width: 60,
@ -612,8 +626,8 @@ export const EachTrainInfo = (props) => {
if (time) { if (time) {
date.setHours(time.split(":")[0], time.split(":")[1]); date.setHours(time.split(":")[0], time.split(":")[1]);
} }
if (!isNaN(data.trainData?.delay)) { if (!isNaN(currentTrainData?.delay)) {
date.setMinutes(date.getMinutes() + data.trainData?.delay); date.setMinutes(date.getMinutes() + currentTrainData?.delay);
} }
const timeString = date.toTimeString().split(" ")[0].split(":"); const timeString = date.toTimeString().split(" ")[0].split(":");
return ( return (
@ -685,8 +699,8 @@ export const EachTrainInfo = (props) => {
🚊 🚊
</Text> </Text>
) : null} ) : null}
{!isNaN(data.trainData?.delay) && {!isNaN(currentTrainData?.delay) &&
data.trainData?.delay != 0 && ( currentTrainData?.delay != 0 && (
<Text <Text
style={{ style={{
fontSize: 15, fontSize: 15,
@ -704,9 +718,9 @@ export const EachTrainInfo = (props) => {
<Text <Text
style={{ style={{
fontSize: 20, fontSize: 20,
color: isNaN(data.trainData?.delay) color: isNaN(currentTrainData?.delay)
? "black" ? "black"
: data.trainData?.delay == 0 : currentTrainData?.delay == 0
? "black" ? "black"
: "red", : "red",
width: 60, width: 60,

View File

@ -16,7 +16,6 @@ import { MaterialCommunityIcons } from "@expo/vector-icons";
import { useCurrentTrain } from "../stateBox/useCurrentTrain"; import { useCurrentTrain } from "../stateBox/useCurrentTrain";
import { useAreaInfo } from "../stateBox/useAreaInfo"; import { useAreaInfo } from "../stateBox/useAreaInfo";
import { useAllTrainDiagram } from "../stateBox/useAllTrainDiagram"; import { useAllTrainDiagram } from "../stateBox/useAllTrainDiagram";
import { EachTrainInfo } from "./ActionSheetComponents/EachTrainInfo";
import { customTrainDataDetector } from "./custom-train-data"; import { customTrainDataDetector } from "./custom-train-data";
import { getStationList, lineList } from "../lib/getStationList"; import { getStationList, lineList } from "../lib/getStationList";
@ -65,9 +64,6 @@ export default function AllTrainDiagramView({ navigation: { navigate } }) {
limited: `${getTrainType(train.type).data}:${ limited: `${getTrainType(train.type).data}:${
train.trainName train.trainName
}${TrainNumber}`, }${TrainNumber}`,
trainData: checkDuplicateTrainData(
currentTrain.filter((a) => a.num == d)
),
}, },
navigate, navigate,
originalStationList, originalStationList,

View File

@ -321,9 +321,6 @@ const EachData = ({
limited: `${getTrainType(train.type).data}:${ limited: `${getTrainType(train.type).data}:${
train.trainName train.trainName
}${TrainNumber}`, }${TrainNumber}`,
trainData: checkDuplicateTrainData(
currentTrain.filter((a) => a.num == d.train)
),
}, },
navigate, navigate,
originalStationList, originalStationList,

View File

@ -1,9 +1,13 @@
import React, { createContext, useContext, useState } from "react"; import React, { createContext, useContext, useState, useEffect } from "react";
import { HeaderConfig } from "../lib/HeaderConfig";
import useInterval from "../lib/useInterval";
const initialState = { const initialState = {
currentTrain: [], currentTrain: [],
setCurrentTrain: () => {}, setCurrentTrain: () => {},
currentTrainLoading: "loading", currentTrainLoading: "loading",
setCurrentTrainLoading: () => {}, setCurrentTrainLoading: () => {},
getCurrentTrain: () => {},
}; };
const CurrentTrainContext = createContext(initialState); const CurrentTrainContext = createContext(initialState);
@ -15,7 +19,27 @@ export const useCurrentTrain = () => {
export const CurrentTrainProvider = ({ children }) => { export const CurrentTrainProvider = ({ children }) => {
const [currentTrain, setCurrentTrain] = useState([]); //現在在線中の全列車 { num: 列車番号, delay: 遅延時分(状態), Pos: 位置情報 } const [currentTrain, setCurrentTrain] = useState([]); //現在在線中の全列車 { num: 列車番号, delay: 遅延時分(状態), Pos: 位置情報 }
const [currentTrainLoading, setCurrentTrainLoading] = useState("loading"); // success, error, loading const [currentTrainLoading, setCurrentTrainLoading] = useState("loading"); // success, error, loading
const getCurrentTrain = () =>
fetch(
"https://script.google.com/macros/s/AKfycby9Y2-Bm75J_WkbZimi7iS8v5r9wMa9wtzpdwES9sOGF4i6HIYEJOM60W6gM1gXzt1o/exec",
HeaderConfig
)
.then((response) => response.json())
.then((d) =>
d.map((x) => ({ num: x.TrainNum, delay: x.delay, Pos: x.Pos }))
)
.then((d) => {
setCurrentTrain(d);
setCurrentTrainLoading("success");
})
.catch(() => {
console.log("えらー");
setCurrentTrainLoading("error");
});
useEffect(getCurrentTrain, []); //初回だけ現在の全在線列車取得
useInterval(getCurrentTrain, 15000); //15秒毎に全在線列車取得
return ( return (
<CurrentTrainContext.Provider <CurrentTrainContext.Provider
value={{ value={{
@ -23,6 +47,7 @@ export const CurrentTrainProvider = ({ children }) => {
setCurrentTrain, setCurrentTrain,
currentTrainLoading, currentTrainLoading,
setCurrentTrainLoading, setCurrentTrainLoading,
getCurrentTrain,
}} }}
> >
{children} {children}