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

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 getAreaData = () =>
fetch(
@ -128,7 +104,7 @@ export function AppContainer() {
tabBarIcon: initIcon("barchart", "AntDesign"),
}}
>
{(props) => <Top {...props} getCurrentTrain={getCurrentTrain} />}
{(props) => <Top {...props} />}
</Tab.Screen>
<Tab.Screen
name="menuPage"
@ -139,7 +115,7 @@ export function AppContainer() {
tabBarIcon: initIcon("ios-radio", "Ionicons"),
}}
>
{(props) => <MenuPage {...props} getCurrentTrain={getCurrentTrain} />}
{(props) => <MenuPage {...props} />}
</Tab.Screen>
<Tab.Screen
name="home"

View File

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

View File

@ -12,10 +12,12 @@ import { useFavoriteStation } from "./stateBox/useFavoriteStation";
import { optionData } from "./lib/stackOption.js";
import CurrentTrainListView from "./components/CurrentTrainListView.js";
import AllTrainDiagramView from "./components/AllTrainDiagramView.js";
import { useCurrentTrain } from "./stateBox/useCurrentTrain.js";
const Stack = createStackNavigator();
export function MenuPage({ navigation, getCurrentTrain }) {
export function MenuPage({ navigation }) {
const { favoriteStation, setFavoriteStation } = useFavoriteStation();
const { getCurrentTrain } = useCurrentTrain();
useEffect(() => {
const unsubscribe = navigation.addListener("tabPress", (e) => {
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 { useFavoriteStation } from "./stateBox/useFavoriteStation";
import { optionData } from "./lib/stackOption.js";
import { useCurrentTrain } from "./stateBox/useCurrentTrain.js";
const Stack = createStackNavigator();
export const Top = ({ navigation, getCurrentTrain }) => {
export const Top = ({ navigation }) => {
const webview = useRef();
const { favoriteStation, setFavoriteStation } = useFavoriteStation();
const { getCurrentTrain } = useCurrentTrain();
//地図用
const [mapsStationData, setMapsStationData] = useState(undefined);

View File

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

View File

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

View File

@ -321,9 +321,6 @@ const EachData = ({
limited: `${getTrainType(train.type).data}:${
train.trainName
}${TrainNumber}`,
trainData: checkDuplicateTrainData(
currentTrain.filter((a) => a.num == d.train)
),
},
navigate,
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 = {
currentTrain: [],
setCurrentTrain: () => {},
currentTrainLoading: "loading",
setCurrentTrainLoading: () => {},
getCurrentTrain: () => {},
};
const CurrentTrainContext = createContext(initialState);
@ -15,7 +19,27 @@ export const useCurrentTrain = () => {
export const CurrentTrainProvider = ({ children }) => {
const [currentTrain, setCurrentTrain] = useState([]); //現在在線中の全列車 { num: 列車番号, delay: 遅延時分(状態), Pos: 位置情報 }
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 (
<CurrentTrainContext.Provider
value={{
@ -23,6 +47,7 @@ export const CurrentTrainProvider = ({ children }) => {
setCurrentTrain,
currentTrainLoading,
setCurrentTrainLoading,
getCurrentTrain,
}}
>
{children}