diff --git a/.gitignore b/.gitignore index a62752d..0fc43c5 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ npm-debug.* *.p12 *.key *.mobileprovision +dist/ \ No newline at end of file diff --git a/App.js b/App.js index 2eb95e5..eb21052 100644 --- a/App.js +++ b/App.js @@ -1,61 +1,74 @@ -import React, { useEffect, useRef, useState } from "react"; +import React, { useEffect } from "react"; import { NavigationContainer } from "@react-navigation/native"; -import { - createStackNavigator, - TransitionPresets, -} from "@react-navigation/stack"; +import { createStackNavigator } from "@react-navigation/stack"; import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; -import { AntDesign, Ionicons } from "@expo/vector-icons"; import { Platform, UIManager } from "react-native"; import { UpdateAsync } from "./UpdateAsync.js"; -import { getStationList2 } from "./lib/getStationList2"; import { AS } from "./storageControl"; -import Apps from "./Apps"; import TNDView from "./ndView"; -import TrainBase from "./trainbaseview"; -import HowTo from "./howto"; -import Menu from "./menu"; -import News from "./components/news.js"; -import Setting from "./components/settings.js"; -import TrainMenu from "./components/trainMenu.js"; -import FavoriteList from "./components/FavoriteList.js"; import { LogBox } from "react-native"; import useInterval from "./lib/useInterval"; import { HeaderConfig } from "./lib/HeaderConfig"; - +import { initIcon } from "./lib/initIcon"; +import { + useFavoriteStation, + FavoriteStationProvider, +} from "./stateBox/useFavoriteStation"; +import { Top } from "./Top.js"; +import { MenuPage } from "./MenuPage.js"; +import { + useCurrentTrain, + CurrentTrainProvider, +} from "./stateBox/useCurrentTrain.js"; +import { useAreaInfo, AreaInfoProvider } from "./stateBox/useAreaInfo.js"; +import { + useBusAndTrainData, + BusAndTrainDataProvider, +} from "./stateBox/useBusAndTrainData.js"; +import { AllTrainDiagramProvider } from "./stateBox/useAllTrainDiagram.js"; +import { SheetProvider } from "react-native-actions-sheet"; +import "./components/ActionSheetComponents/sheets.js"; +import { TrainDelayDataProvider } from "./stateBox/useTrainDelayData.js"; LogBox.ignoreLogs([ "ViewPropTypes will be removed", "ColorPropType will be removed", ]); -const Stack = createStackNavigator(); const Tab = createBottomTabNavigator(); if (Platform.OS === "android") { if (UIManager.setLayoutAnimationEnabledExperimental) { UIManager.setLayoutAnimationEnabledExperimental(true); } } -export default function App() { - useEffect(() => { - UpdateAsync(); - }, []); - const [favoriteStation, setFavoriteStation] = useState([]); - useEffect(() => { - AS.getItem("favoriteStation") - .then((d) => { - const returnData = JSON.parse(d); - setFavoriteStation(returnData); - }) - .catch((d) => console.log(d)); - }, []); - const [busAndTrainData, setBusAndTrainData] = useState([]); +export default function App() { + useEffect(() => UpdateAsync(), []); + return ( + + + + + + + + + + + + + + + + ); +} +export function AppContainer() { + const { setBusAndTrainData } = useBusAndTrainData(); useEffect(() => { AS.getItem("busAndTrain") .then((d) => { const returnData = JSON.parse(d); setBusAndTrainData(returnData); }) - .catch((d) => { + .catch(() => { fetch( "https://script.google.com/macros/s/AKfycbw0UW6ZeCDgUYFRP0zxpc_Oqfy-91dBdbWv-cM8n3narKp14IyCd2wy5HW7taXcW7E/exec" ) @@ -67,11 +80,11 @@ export default function App() { }); }, []); - const [currentTrain, setCurrentTrain] = useState([]); //現在在線中の全列車 { num: 列車番号, delay: 遅延時分(状態), Pos: 位置情報 } - const [currentTrainLoading, setCurrentTrainLoading] = useState("loading"); // success, error, loading + const { setCurrentTrain, setCurrentTrainLoading } = useCurrentTrain(); + const getCurrentTrain = () => fetch( - "https://train.jr-shikoku.co.jp/g?arg1=train&arg2=train", + "https://script.google.com/macros/s/AKfycby9Y2-Bm75J_WkbZimi7iS8v5r9wMa9wtzpdwES9sOGF4i6HIYEJOM60W6gM1gXzt1o/exec", HeaderConfig ) .then((response) => response.json()) @@ -82,7 +95,7 @@ export default function App() { setCurrentTrain(d); setCurrentTrainLoading("success"); }) - .catch((e) => { + .catch(() => { console.log("えらー"); setCurrentTrainLoading("error"); }); @@ -91,6 +104,16 @@ export default function App() { useInterval(getCurrentTrain, 15000); //15秒毎に全在線列車取得 + const { areaInfo, setAreaInfo } = useAreaInfo(); + const getAreaData = () => + fetch( + "https://script.google.com/macros/s/AKfycbz80LcaEUrhnlEsLkJy0LG2IRO3DBVQhfNmN1d_0f_HvtsujNQpxM90SrV9yKWH_JG1Ww/exec" + ) + .then((d) => d.text()) + .then((d) => setAreaInfo(d)); + useEffect(getAreaData, []); + useInterval(getAreaData, 60000); //60秒毎に全在線列車取得 + return ( @@ -103,20 +126,7 @@ export default function App() { tabBarIcon: initIcon("barchart", "AntDesign"), }} > - {(props) => ( - - )} + {(props) => } - {(props) => ( - - )} + {(props) => } {(props) => } @@ -157,197 +155,3 @@ export default function App() { ); } - -const initIcon = (name, type) => { - switch (type) { - case "Ionicons": - return ({ focused, color, size }) => ( - - ); - case "AntDesign": - return ({ focused, color, size }) => ( - - ); - } -}; - -const Top = ({ - navigation, - favoriteStation, - setFavoriteStation, - busAndTrainData, - currentTrainState, - currentTrainLoadingState, - getCurrentTrain, -}) => { - const webview = useRef(); - - //地図用 - const [mapsStationData, setMapsStationData] = useState(undefined); - - useEffect(() => { - getStationList2().then(setMapsStationData); - }, []); - - useEffect(() => { - const unsubscribe = navigation.addListener("tabLongPress", (e) => { - navigation.navigate("favoriteList"); - }); - - return unsubscribe; - }, [navigation]); - - return ( - - - {(props) => ( - - )} - - - {(props) => } - - - {(props) => } - - - {(props) => } - - - {(props) => ( - - )} - - - {(props) => ( - - )} - - - ); -}; -function MenuPage({ - navigation, - favoriteStation, - setFavoriteStation, - busAndTrainData, - currentTrainState, - currentTrainLoadingState, - getCurrentTrain, -}) { - useEffect(() => { - const unsubscribe = navigation.addListener("tabPress", (e) => { - AS.getItem("favoriteStation") - .then((d) => { - const returnData = JSON.parse(d); - if (favoriteStation.toString() != d) { - setFavoriteStation(returnData); - } - }) - .catch((d) => console.log(d)); - }); - - return unsubscribe; - }, [navigation]); - return ( - - - {(props) => ( - - )} - - - {(props) => } - - - {(props) => } - - - {(props) => } - - - ); -} -const optionData = { - gestureEnabled: true, - ...TransitionPresets.ModalPresentationIOS, - cardOverlayEnabled: true, - headerTransparent: true, - headerShown: false, -}; diff --git a/Apps.js b/Apps.js index 031d11c..2f6128a 100644 --- a/Apps.js +++ b/Apps.js @@ -1,50 +1,35 @@ import React, { useEffect, useRef, useState } from "react"; -import { - View, - Platform, - ToastAndroid, - Text, - TouchableOpacity, -} from "react-native"; +import { View, Platform, Text, TouchableOpacity } from "react-native"; import { WebView } from "react-native-webview"; import Constants from "expo-constants"; -import { Ionicons, MaterialCommunityIcons } from "@expo/vector-icons"; +import { Ionicons } from "@expo/vector-icons"; import { AS } from "./storageControl"; import { news } from "./config/newsUpdate"; import { getStationList, lineList } from "./lib/getStationList"; import { StationDeteilView } from "./components/ActionSheetComponents/StationDeteilView"; import { injectJavascriptData } from "./lib/webViewInjectjavascript"; -import { getStationList2 } from "./lib/getStationList2"; import { EachTrainInfo } from "./components/ActionSheetComponents/EachTrainInfo"; import { checkDuplicateTrainData } from "./lib/checkDuplicateTrainData"; +import { useFavoriteStation } from "./stateBox/useFavoriteStation"; +import { useCurrentTrain } from "./stateBox/useCurrentTrain"; +import { SheetManager } from "react-native-actions-sheet"; /* import StatusbarDetect from './StatusbarDetect'; var Status = StatusbarDetect(); */ -export default function Apps({ - navigation, - webview, - favoriteStation, - setFavoriteStation, - busAndTrainData, - stationData, - currentTrainState, - currentTrainLoadingState, - getCurrentTrain, -}) { - const { currentTrain, setCurrentTrain } = currentTrainState; - const { currentTrainLoading, setCurrentTrainLoading } = - currentTrainLoadingState; +export default function Apps({ navigation, webview, stationData }) { + const { currentTrain } = useCurrentTrain(); const { navigate } = navigation; var urlcache = ""; + const { favoriteStation } = useFavoriteStation(); //画面表示関連 const [iconSetting, setIconSetting] = useState(undefined); const [mapSwitch, setMapSwitch] = useState(undefined); const [stationMenu, setStationMenu] = useState(undefined); + const [LoadError, setLoadError] = useState(false); //列車情報表示関連 - const EachTrainInfoAsSR = useRef(null); const [trainInfo, setTrainInfo] = useState({ trainNum: undefined, limited: undefined, @@ -52,17 +37,13 @@ export default function Apps({ }); //駅情報画面用 - const StationBoardAcSR = useRef(null); - const [stationBoardData, setStationBoardData] = useState(undefined); const [originalStationList, setOriginalStationList] = useState(); - const [selectedStation, setSelectedStation] = useState(undefined); const [trainMenu, setTrainMenu] = useState("true"); let once = false; useEffect(() => { getStationList().then(setOriginalStationList); }, []); - useEffect(() => {}, [stationData, favoriteStation]); //地図表示テキスト const injectJavascript = injectJavascriptData( mapSwitch, @@ -77,7 +58,7 @@ export default function Apps({ .then((d) => { if (d != news) navigate("news"); }) - .catch((e) => navigate("news")); + .catch(() => navigate("news")); }, []); useEffect(() => { @@ -90,7 +71,7 @@ export default function Apps({ AS.setItem("iconSwitch", "true").then(Updates.reloadAsync); } }) - .catch((d) => AS.setItem("iconSwitch", "true").then(Updates.reloadAsync)); + .catch(() => AS.setItem("iconSwitch", "true").then(Updates.reloadAsync)); }, []); useEffect(() => { @@ -103,7 +84,7 @@ export default function Apps({ AS.setItem("mapSwitch", "false").then(Updates.reloadAsync); } }) - .catch((d) => AS.setItem("mapSwitch", "false").then(Updates.reloadAsync)); + .catch(() => AS.setItem("mapSwitch", "false").then(Updates.reloadAsync)); }, []); useEffect(() => { @@ -116,7 +97,7 @@ export default function Apps({ AS.setItem("stationSwitch", "true").then(Updates.reloadAsync); } }) - .catch((d) => + .catch(() => AS.setItem("stationSwitch", "true").then(Updates.reloadAsync) ); }, []); @@ -130,9 +111,7 @@ export default function Apps({ AS.setItem("trainSwitch", "true").then(Updates.reloadAsync); } }) - .catch((d) => - AS.setItem("trainSwitch", "true").then(Updates.reloadAsync) - ); + .catch(() => AS.setItem("trainSwitch", "true").then(Updates.reloadAsync)); }, []); const onMessage = (event) => { @@ -146,31 +125,47 @@ export default function Apps({ } const dataSet = JSON.parse(event.nativeEvent.data); switch (dataSet.type) { - case "PopUpMenu": { - const selectedStationPDFAddress = dataSet.pdf; - const findStationEachLine = (selectLine) => { - let NearStation = selectLine.filter( - (d) => d.StationTimeTable == selectedStationPDFAddress - ); - return NearStation; - }; - let returnDataBase = lineList - .map((d) => findStationEachLine(originalStationList[d])) - .filter((d) => d.length > 0) - .reduce((pre, current) => { - pre.push(...current); - return pre; - }, []); - - if (returnDataBase.length) { - setStationBoardData(returnDataBase); - StationBoardAcSR.current?.show(); - } else { - setStationBoardData(undefined); - StationBoardAcSR.current?.hide(); - } + case "LoadError": { + setLoadError(true); return; } + case "PopUpMenu": + { + const selectedStationPDFAddress = dataSet.pdf; + const findStationEachLine = (selectLine) => { + let NearStation = selectLine.filter( + (d) => d.StationTimeTable == selectedStationPDFAddress + ); + return NearStation; + }; + let returnDataBase = lineList + .map((d) => findStationEachLine(originalStationList[d])) + .filter((d) => d.length > 0) + .reduce((pre, current) => { + pre.push(...current); + return pre; + }, []); + + if (returnDataBase.length) { + const payload = { + currentStation: returnDataBase, + originalStationList: originalStationList, + navigate: navigate, + goTo: "Apps", + useShow: () => + SheetManager.show("StationDetailView", { + payload, + }), + onExit: () => { + SheetManager.hide("StationDetailView"); + }, + }; + SheetManager.show("StationDetailView", { + payload, + }); + } + } + return; case "ShowTrainTimeInfo": { const { trainNum, limited } = dataSet; //alert(trainNum, limited); @@ -181,7 +176,21 @@ export default function Apps({ currentTrain.filter((a) => a.num == trainNum) ), }); //遅延情報は未実装 - EachTrainInfoAsSR.current?.show(); + const payload = { + data: { + trainNum, + limited, + trainData: checkDuplicateTrainData( + currentTrain.filter((a) => a.num == trainNum) + ), + }, + navigate, + originalStationList, + openStationACFromEachTrainInfo, + }; + SheetManager.show("EachTrainInfo", { + payload, + }); return; } default: { @@ -229,7 +238,7 @@ export default function Apps({ } const openStationACFromEachTrainInfo = (stationName) => { - EachTrainInfoAsSR.current?.hide(); + SheetManager.hide("EachTrainInfo"); const findStationEachLine = (selectLine) => { let NearStation = selectLine.filter((d) => d.Station_JP == stationName); return NearStation; @@ -242,13 +251,26 @@ export default function Apps({ return pre; }, []); if (returnDataBase.length) { - setStationBoardData(returnDataBase); sleep(25, function () { - StationBoardAcSR.current?.show(); + const payload = { + currentStation: returnDataBase, + originalStationList: originalStationList, + navigate: navigate, + goTo: "Apps", + useShow: () => + SheetManager.show("StationDetailView", { + payload, + }), + onExit: () => { + SheetManager.hide("StationDetailView"); + }, + }; + SheetManager.show("StationDetailView", { + payload, + }); }); } else { - setStationBoardData(undefined); - StationBoardAcSR.current?.hide(); + SheetManager.hide("StationDetailView"); } }; return ( @@ -274,7 +296,6 @@ export default function Apps({ onNavigationStateChange={onNavigationStateChange} onMessage={onMessage} injectedJavaScript={injectJavascript} - onTouchMove={() => StationBoardAcSR.current?.hide()} onLoadEnd={() => { if (once) return () => {}; if (!stationData) return () => {}; @@ -304,23 +325,10 @@ export default function Apps({ webview.current.reload()} top={Platform.OS == "ios" ? Constants.statusBarHeight : 0} + LoadError={LoadError} /> - { - StationBoardAcSR.current?.setModalVisible(); - navigate("Apps"); - }} - /> { ); }; -const ReloadButton = ({ onPress, top, mapSwitch }) => { +const ReloadButton = ({ onPress, top, mapSwitch, LoadError = false }) => { const styles = { touch: { position: "absolute", @@ -374,7 +382,7 @@ const ReloadButton = ({ onPress, top, mapSwitch }) => { right: 10, width: 50, height: 50, - backgroundColor: "#0099CC", + backgroundColor: LoadError ? "red" : "#0099CC", borderColor: "white", borderStyle: "solid", borderWidth: 1, diff --git a/MenuPage.js b/MenuPage.js new file mode 100644 index 0000000..804f385 --- /dev/null +++ b/MenuPage.js @@ -0,0 +1,95 @@ +import React, { useEffect } from "react"; +import { + createStackNavigator, + TransitionPresets, +} from "@react-navigation/stack"; +import { AS } from "./storageControl"; +import TrainBase from "./trainbaseview"; +import HowTo from "./howto"; +import Menu from "./menu"; +import Setting from "./components/settings.js"; +import { useFavoriteStation } from "./stateBox/useFavoriteStation"; +import { optionData } from "./lib/stackOption.js"; +import CurrentTrainListView from "./components/CurrentTrainListView.js"; +import AllTrainDiagramView from "./components/AllTrainDiagramView.js"; +const Stack = createStackNavigator(); + +export function MenuPage({ navigation, getCurrentTrain }) { + const { favoriteStation, setFavoriteStation } = useFavoriteStation(); + useEffect(() => { + const unsubscribe = navigation.addListener("tabPress", (e) => { + AS.getItem("favoriteStation") + .then((d) => { + const returnData = JSON.parse(d); + if (favoriteStation.toString() != d) { + setFavoriteStation(returnData); + } + }) + .catch((d) => console.log(d)); + }); + + return unsubscribe; + }, [navigation]); + return ( + + + {(props) => } + + + {(props) => } + + + {(props) => } + + + {(props) => } + + + {(props) => } + + + {(props) => } + + + ); +} diff --git a/Top.js b/Top.js new file mode 100644 index 0000000..9120dc8 --- /dev/null +++ b/Top.js @@ -0,0 +1,98 @@ +import React, { useEffect, useRef, useState } from "react"; +import { + createStackNavigator, + TransitionPresets, +} from "@react-navigation/stack"; +import { getStationList2 } from "./lib/getStationList2"; +import Apps from "./Apps"; +import TrainBase from "./trainbaseview"; +import HowTo from "./howto"; +import News from "./components/news.js"; +import TrainMenu from "./components/trainMenu.js"; +import FavoriteList from "./components/FavoriteList.js"; +import { useFavoriteStation } from "./stateBox/useFavoriteStation"; +import { optionData } from "./lib/stackOption.js"; +const Stack = createStackNavigator(); +export const Top = ({ navigation, getCurrentTrain }) => { + const webview = useRef(); + const { favoriteStation, setFavoriteStation } = useFavoriteStation(); + + //地図用 + const [mapsStationData, setMapsStationData] = useState(undefined); + + useEffect(() => { + getStationList2().then(setMapsStationData); + }, []); + + useEffect(() => { + const unsubscribe = navigation.addListener("tabLongPress", (e) => { + navigation.navigate("favoriteList"); + }); + + return unsubscribe; + }, [navigation]); + + return ( + + + {(props) => ( + + )} + + + {(props) => } + + + {(props) => } + + + {(props) => } + + + {(props) => ( + + )} + + + {(props) => ( + + )} + + + ); +}; diff --git a/app.json b/app.json index ca0a77e..1686ab8 100644 --- a/app.json +++ b/app.json @@ -7,7 +7,7 @@ "ios", "android" ], - "version": "4.5", + "version": "4.6", "orientation": "portrait", "icon": "./assets/icon.png", "splash": { @@ -16,13 +16,14 @@ "backgroundColor": "#00b8ff" }, "updates": { - "fallbackToCacheTimeout": 0 + "fallbackToCacheTimeout": 0, + "url": "https://u.expo.dev/398abf60-57a7-11e9-970c-8f04356d08bf" }, "assetBundlePatterns": [ "**/*" ], "ios": { - "buildNumber": "30", + "buildNumber": "31", "supportsTablet": true, "bundleIdentifier": "jrshikokuinfo.xprocess.hrkn", "config": { @@ -31,7 +32,7 @@ }, "android": { "package": "jrshikokuinfo.xprocess.hrkn", - "versionCode": 18, + "versionCode": 20, "permissions": [ "ACCESS_FINE_LOCATION" ], @@ -46,6 +47,9 @@ "eas": { "projectId": "398abf60-57a7-11e9-970c-8f04356d08bf" } + }, + "runtimeVersion": { + "policy": "sdkVersion" } } } diff --git a/assets/originData/trainList.js b/assets/originData/trainList.js index 8675c27..f0c824c 100644 --- a/assets/originData/trainList.js +++ b/assets/originData/trainList.js @@ -1006,7 +1006,7 @@ "9026M":"宇多津,発,18:36#坂出,発,18:40#高松,着,18:54#", "9028M":"宇多津,発,19:38#坂出,発,19:43#高松,着,19:56#", "9054D":"宇多津,発,9:00#坂出,発,9:07#高松,着,9:21#", -"9095D":"松山,発,10:35#伊予市,発,10:54#下灘,発,11:51#喜多灘,発,12:07#伊予白滝,発,12:42#伊予大洲,着,13:07#", +"9095D":"松山,発,10:34#伊予市,発,10:54#下灘,発,11:51#喜多灘,発,12:07#伊予白滝,発,12:42#伊予大洲,着,13:07#", "9096D":"伊予大洲,発,13:30#伊予白滝,発,13:47#伊予長浜,発,14:24#喜多灘,発,14:36#下灘,発,15:09#伊予上灘,発,15:31#北伊予,発,15:54#松山,着,16:00#", "9323D":"高松,発,9:32#栗林,発,9:53#屋島,発,10:24#八栗口,発,10:40#志度,発,11:32#造田,発,12:14#讃岐津田,発,12:36#三本松,発,13:02#讃岐相生,発,13:31#阿波大宮,発,13:46#板野,発,14:06#板東,発,14:24#池谷,発,14:33#勝瑞,発,14:43#徳島,着,14:56#", "9105D":"児島,発,13:44#坂出,発,14:10#鴨川,発,14:37#端岡,発,14:52#高松,着,15:01#", @@ -1035,8 +1035,23 @@ "9666D":"北伊予,発,22:46#市坪,発,22:50#松山,着,22:55#", "9668M":"市坪,発,23:00#松山,着,23:04#", "9052D":"窪川,発,15:13#土佐久礼,発,15:46#安和,発,15:57#須崎,発,16:25#佐川,発,16:54#日下,発,17:11#伊野,発,17:32#朝倉,発,17:42#高知,着,17:53#", -"9062D":"大歩危,発,14:21#小歩危,発,14:38#阿波川口,発,15:01#阿波池田,発,15:26#坪尻,発,15:53#讃岐財田,発,16:15#琴平,着,16:31#", +"9062D":"大歩危,発,14:21#小歩危,発,14:38#阿波川口,発,15:01#阿波池田,発,15:26#坪尻,発,15:53#讃岐財田,発,16:15#琴平,発,16:50#善通寺,発,17:01#金蔵寺,発,17:09#多度津,着,17:14#", "9920D":"伊予大洲,発,14:33#五郎,発,14:39#伊予白滝,発,14:59#伊予長浜,発,15:09#下灘,発,15:23#伊予上灘,発,15:30#伊予市,発,15:44#南伊予,発,15:49#北伊予,発,15:55#松山,着,16:01#", "9051D":"高知,発,12:04#朝倉,発,12:29#伊野,発,12:49#日下,発,13:06#西佐川,発,13:21#須崎,発,13:45#安和,発,14:05#土佐久礼,発,14:17#影野,発,14:31#窪川,着,14:40#", -"9061D":"琴平,発,10:48#讃岐財田,発,11:12#坪尻,発,11:41#阿波池田,発,12:10#三縄,発,12:19#大歩危,着,12:47#" +"9061D":"多度津,発,10:19#善通寺,発,10:26#琴平,発,10:48#讃岐財田,発,11:12#坪尻,発,11:41#阿波池田,発,12:10#三縄,発,12:19#大歩危,着,12:47#", +"9523D":"川之江,発,9:00#伊予三島,発,9:15#伊予寒川,発,9:31#伊予土居,発,10:03#関川,発,10:16#多喜浜,発,10:31#中萩,発,10:49#伊予西条,着,10:57#", +"9524D":"伊予西条,発,11:11#新居浜,発,11:35#伊予土居,発,11:59#伊予寒川,発,12:08#伊予三島,発,12:17#川之江,着,12:24#", +"9987D":"鳴門,発,22:15#撫養,発,22:18#金比羅前,発,22:21#教会前,発,22:24#立道,発,22:27#阿波大谷,発,22:31#池谷,発,22:36#勝瑞,発,22:41#吉成,発,22:44#佐古,発,22:57#徳島,着,23:00#", +"9093D":"松山,発,13:31#北伊予,発,13:42#下灘,発,14:22#喜多灘,発,14:38#伊予大洲,発,15:13#伊予平野,発,15:37#八幡浜,着,15:50#", +"9094D":"八幡浜,発,16:14#伊予大洲,発,16:33#伊予長浜,発,16:57#下灘,発,17:24#伊予上灘,発,17:36#伊予市,発,17:53#北伊予,発,18:03#市坪,発,18:12#松山,着,18:17#", +"9205D":"児島,発,15:10#宇多津,発,15:28#丸亀,発,15:31#多度津,発,15:36#琴平,発,15:47#讃岐財田,発,16:14#坪尻,発,16:35#佃,発,16:51#阿波池田,発,16:57#阿波川口,発,17:16#大歩危,発,17:35#大田口,発,17:58#大杉,発,18:30#土佐北川,発,18:47#繁藤,発,19:02#土佐山田,発,19:17#後免,発,19:22#土佐一宮,発,19:43#高知,着,19:47#", +"9204D":"高知,発,8:43#土佐一宮,発,8:49#繁藤,発,9:16#大杉,発,9:28#土佐岩原,発,9:48#大歩危,発,10:08#阿波川口,発,10:29#阿波池田,発,10:42#讃岐財田,発,11:09#琴平,発,11:33#金蔵寺,発,11:59#多度津,発,12:06#丸亀,発,12:10#児島,着,12:25#", +"9003M":"高松,発,8:45#坂出,発,9:02#宇多津,着,9:06#", +"9005D":"高松,発,9:42#坂出,発,9:56#宇多津,発,10:01#丸亀,発,10:05#多度津,着,10:10#", +"9004M":"宇多津,発,7:14#坂出,発,7:21#高松,着,7:36#", +"9006D":"宇多津,発,8:26#坂出,発,8:31#高松,着,8:45#", +"9253M":"児島,発,11:02#多度津,発,11:30#善通寺,発,11:54#琴平,着,12:00#", +"9256M":"琴平,発,15:20#善通寺,発,15:26#多度津,発,15:35#宇多津,発,15:44#児島,着,16:04#", +"9057M":"高松,発,18:27#坂出,発,18:41#宇多津,発,18:46#丸亀,発,18:49#多度津,着,18:55#", +"9054M":"宇多津,発,9:00#坂出,発,9:07#高松,着,9:21#" } \ No newline at end of file diff --git a/components/ActionSheetComponents/EachTrainInfo.js b/components/ActionSheetComponents/EachTrainInfo.js index c0ba7b0..e284da8 100644 --- a/components/ActionSheetComponents/EachTrainInfo.js +++ b/components/ActionSheetComponents/EachTrainInfo.js @@ -11,7 +11,7 @@ import { Platform, } from "react-native"; import { Ionicons, MaterialCommunityIcons } from "@expo/vector-icons"; -import ActionSheet from "react-native-actions-sheet"; +import ActionSheet, { SheetManager } from "react-native-actions-sheet"; import { AS } from "../../storageControl"; import LottieView from "lottie-react-native"; import trainList from "../../assets/originData/trainList"; @@ -22,14 +22,15 @@ import { } from "react-native-responsive-screen"; import lineColorList from "../../assets/originData/lineColorList"; -export const EachTrainInfo = ({ - setRef, - data, - navigate, - originalStationList, - openStationACFromEachTrainInfo, - from, -}) => { +export const EachTrainInfo = (props) => { + if (!props.payload) return <>; + const { + data, + navigate, + originalStationList, + openStationACFromEachTrainInfo, + from, + } = props.payload; const [trainData, setTrainData] = useState([]); const [isTop, setIsTop] = useState(true); const [currentPosition, setCurrentPosition] = useState([]); @@ -96,22 +97,15 @@ export const EachTrainInfo = ({ return StationNumbers[0]; }); function findReversalPoints(array) { - // arrayは現在位置の駅ID(駅在宅の場合は1つの配列、駅間の場合は2つの配列) - // stopStationIDListは停車駅の駅IDの配列 - if (!stopStationIDList.length) return []; - const arrayNumber = array.map((d) => ({ - line: d - .split("") - .filter((s) => "A" < s && s < "Z") - .join(""), - ID: d - .split("") - .filter((s) => "0" <= s && s <= "9") - .join(""), - })); - const stopStationIDListNumber = stopStationIDList.map((d) => { - if (!d) return { line: [], ID: [] }; - return { + try { + // arrayは現在位置の駅ID(駅在宅の場合は1つの配列、駅間の場合は2つの配列) + // stopStationIDListは停車駅の駅IDの配列 + if (!stopStationIDList.length) return []; + // arrayが二次元配列だったら早期リターン + if (!array instanceof Array) return []; + if (!array.length) return []; + if (array[0] instanceof Array) return []; + const arrayNumber = array.map((d) => ({ line: d .split("") .filter((s) => "A" < s && s < "Z") @@ -120,84 +114,99 @@ export const EachTrainInfo = ({ .split("") .filter((s) => "0" <= s && s <= "9") .join(""), - }; - }); - // 完全一致 - if (array.length == 1) { - const index = stopStationIDList.indexOf(array[0]); - if (index != -1) return [index]; - // 通過駅の場合 - for (let i = 0; i < stopStationIDListNumber.length - 1; i++) { - if (stopStationIDListNumber[i].ID < arrayNumber[0].ID) { - if (stopStationIDListNumber[i + 1].ID > arrayNumber[0].ID) { - return [i + 1]; - } - } - if (stopStationIDListNumber[i].ID > arrayNumber[0].ID) { - if (stopStationIDListNumber[i + 1].ID < arrayNumber[0].ID) { - return [i + 1]; - } - } - } - } - // 駅間の場合 - if (array.length == 2) { - const index1 = stopStationIDList.indexOf(array[0]); - const index2 = stopStationIDList.indexOf(array[1]); - if (index1 != -1 && index2 != -1) { - // 駅間で通過駅も無い場合 - if (index1 < index2) { - if (index1 + 1 == index2) { - return [index2]; - } else { - const returnArray = []; - for (let i = index1 + 1; i <= index2; i++) { - returnArray.push(i); - } - return returnArray; - } - } - if (index1 > index2) { - if (index2 + 1 == index1) return [index1]; - else { - const returnArray = []; - for (let i = index2 + 1; i <= index1; i++) { - returnArray.push(i); - } - return returnArray; - } - } - } else { - const getNearStationID = (stationID) => { - for (let i = 0; i <= stopStationIDListNumber.length; i++) { - if (stopStationIDListNumber[i].ID < stationID) { - if (stopStationIDListNumber[i + 1].ID > stationID) { - return i + 1; - } - } - if (stopStationIDListNumber[i].ID > stationID) { - if (stopStationIDListNumber[i + 1].ID < stationID) { - return i + 1; - } - } - } + })); + const stopStationIDListNumber = stopStationIDList.map((d) => { + if (!d) return { line: [], ID: [] }; + return { + line: d + .split("") + .filter((s) => "A" < s && s < "Z") + .join(""), + ID: d + .split("") + .filter((s) => "0" <= s && s <= "9") + .join(""), }; - let newIndex1 = index1; - let newIndex2 = index2; - if (index1 == -1) { - newIndex1 = getNearStationID(arrayNumber[0].ID); - } - if (index2 == -1) { - newIndex2 = getNearStationID(arrayNumber[1].ID); - } - if (newIndex1 && newIndex2) { - return [newIndex1, newIndex2]; - } - + }); + // 完全一致 + if (array.length == 1) { + const index = stopStationIDList.indexOf(array[0]); + if (index != -1) return [index]; // 通過駅の場合 + for (let i = 0; i < stopStationIDListNumber.length - 1; i++) { + if (stopStationIDListNumber[i].ID < arrayNumber[0].ID) { + if (stopStationIDListNumber[i + 1].ID > arrayNumber[0].ID) { + return [i + 1]; + } + } + if (stopStationIDListNumber[i].ID > arrayNumber[0].ID) { + if (stopStationIDListNumber[i + 1].ID < arrayNumber[0].ID) { + return [i + 1]; + } + } + } } + // 駅間の場合 + if (array.length == 2) { + const index1 = stopStationIDList.indexOf(array[0]); + const index2 = stopStationIDList.indexOf(array[1]); + if (index1 != -1 && index2 != -1) { + // 駅間で通過駅も無い場合 + if (index1 < index2) { + if (index1 + 1 == index2) { + return [index2]; + } else { + const returnArray = []; + for (let i = index1 + 1; i <= index2; i++) { + returnArray.push(i); + } + return returnArray; + } + } + if (index1 > index2) { + if (index2 + 1 == index1) return [index1]; + else { + const returnArray = []; + for (let i = index2 + 1; i <= index1; i++) { + returnArray.push(i); + } + return returnArray; + } + } + } else { + const getNearStationID = (stationID) => { + for (let i = 0; i <= stopStationIDListNumber.length; i++) { + if (stopStationIDListNumber[i].ID < stationID) { + if (stopStationIDListNumber[i + 1].ID > stationID) { + return i + 1; + } + } + if (stopStationIDListNumber[i].ID > stationID) { + if (stopStationIDListNumber[i + 1].ID < stationID) { + return i + 1; + } + } + } + }; + let newIndex1 = index1; + let newIndex2 = index2; + if (index1 == -1) { + newIndex1 = getNearStationID(arrayNumber[0].ID); + } + if (index2 == -1) { + newIndex2 = getNearStationID(arrayNumber[1].ID); + } + if (newIndex1 && newIndex2) { + return [newIndex1, newIndex2]; + } - return []; + // 通過駅の場合 + } + + return []; + } + } catch (e) { + console.log(e); } } // 使用例 @@ -232,11 +241,7 @@ export const EachTrainInfo = ({ }; return ( - } - > + }> )} - - - - 現在地 {currentPosition.toString()} - - - {data.trainData?.Pos && data.trainData?.Pos.match("~") ? ( - <> - - { - data.trainData?.Pos.replace("(下り)", "") - .replace("(上り)", "") - .split("~")[0] - } - - - ~ - - - { - data.trainData?.Pos.replace("(下り)", "") - .replace("(上り)", "") - .split("~")[1] - } - - - ) : ( - - {data.trainData?.Pos} - - )} - - - {isNaN(data.trainData?.delay) ? "状態" : "遅延時分"} + 現在地 {currentPosition.toString()} - - {data.trainData?.delay} - {isNaN(data.trainData?.delay) ? "" : "分"} - + {data.trainData?.Pos && data.trainData?.Pos.match("~") ? ( + <> + + { + data.trainData?.Pos.replace("(下り)", "") + .replace("(上り)", "") + .split("~")[0] + } + + + ~ + + + { + data.trainData?.Pos.replace("(下り)", "") + .replace("(上り)", "") + .split("~")[1] + } + + + ) : ( + + {data.trainData?.Pos} + + )} - - 列番 - + - {data.trainData?.num} - + + {isNaN(data.trainData?.delay) ? "状態" : "遅延時分"} + + + + {data.trainData?.delay} + {isNaN(data.trainData?.delay) ? "" : "分"} + + + + 列番 + + {data.trainData?.num} + + - - {/* */} - + + )} {station} - {points.findIndex((d) => d == index) >= 0 ? ( + {points && points.findIndex((d) => d == index) >= 0 ? ( { - const { - JRSTraInfoEXAcSR, - getTime, - loadingDelayData, - setLoadingDelayData, - delayData, - } = props; +import { useTrainDelayData } from "../../stateBox/useTrainDelayData"; +export const JRSTraInfo = () => { + const { getTime, delayData, loadingDelayData, setLoadingDelayData } = + useTrainDelayData(); return ( - } - > + }> { borderRadius: 5, alignItems: "center", }} - onPress={() => Linking.openURL("https://twitter.com/JRSTrainfoEX")} + onPress={() => + Linking.openURL("https://mstdn.y-zu.org/@JRSTraInfoEX") + } > - + - TwitterBOTはこちら! + MastodonBOTはこちら! diff --git a/components/ActionSheetComponents/StationDeteilView.js b/components/ActionSheetComponents/StationDeteilView.js index 78c3625..0bd62c0 100644 --- a/components/ActionSheetComponents/StationDeteilView.js +++ b/components/ActionSheetComponents/StationDeteilView.js @@ -1,38 +1,28 @@ import React, { useState, useEffect } from "react"; -import { - StatusBar, - View, - LayoutAnimation, - ScrollView, - Linking, - Text, - TouchableOpacity, -} from "react-native"; +import { View, Linking, Text, TouchableOpacity } from "react-native"; import AutoHeightImage from "react-native-auto-height-image"; import { FontAwesome, Foundation, Ionicons } from "@expo/vector-icons"; import ActionSheet from "react-native-actions-sheet"; import Sign from "../../components/駅名表/Sign"; -import { useInterval } from "../../lib/useInterval"; import { TicketBox } from "../atom/TicketBox"; -import { - widthPercentageToDP as wp, - heightPercentageToDP as hp, -} from "react-native-responsive-screen"; +import { widthPercentageToDP as wp } from "react-native-responsive-screen"; import lineColorList from "../../assets/originData/lineColorList"; import { getPDFViewURL } from "../../lib/getPdfViewURL"; +import { useBusAndTrainData } from "../../stateBox/useBusAndTrainData"; +import { AS } from "../../storageControl"; export const StationDeteilView = (props) => { + if (!props.payload) return <>; const { - StationBoardAcSR, currentStation, originalStationList, - favoriteStation, - setFavoriteStation, - busAndTrainData, navigate, onExit, - } = props; + goTo, + useShow, + } = props.payload; + const { busAndTrainData } = useBusAndTrainData(); const [trainBus, setTrainBus] = useState(); useEffect(() => { if (!currentStation) return () => {}; @@ -44,17 +34,18 @@ export const StationDeteilView = (props) => { } setTrainBus(data[0]); }, [currentStation]); + + const [usePDFView, setUsePDFView] = useState(undefined); + useEffect(() => { + AS.getItem("usePDFView").then(setUsePDFView); + }, []); const info = currentStation && (currentStation[0].StationTimeTable.match(".pdf") ? getPDFViewURL(currentStation[0].StationTimeTable) : currentStation[0].StationTimeTable); return ( - } - > + }> { { - navigate("howto", { - info, - onExit, - }); - StationBoardAcSR.current?.hide(); + usePDFView == "true" + ? Linking.openURL(currentStation[0].StationTimeTable) + : navigate("howto", { + info, + goTo, + useShow, + }); + onExit(); }} oLP={() => Linking.openURL(currentStation[0].StationTimeTable)} /> @@ -105,8 +97,6 @@ export const StationDeteilView = (props) => { ))} */} {currentStation && @@ -118,9 +108,11 @@ export const StationDeteilView = (props) => { info: currentStation[0].JrHpUrl.replace("/index.html", "/") + "/kounai_map.html", - onExit, + + goTo, + useShow, }); - StationBoardAcSR.current?.hide(); + onExit(); }} oLP={() => { Linking.openURL( @@ -141,9 +133,11 @@ export const StationDeteilView = (props) => { onPressButton={() => { navigate("howto", { info: currentStation[0].JrHpUrl, - onExit, + + goTo, + useShow, }); - StationBoardAcSR.current?.hide(); + onExit(); }} onLongPressButton={() => Linking.openURL(currentStation[0].JrHpUrl) @@ -158,11 +152,15 @@ export const StationDeteilView = (props) => { icon={} flex={1} onPressButton={() => { - navigate("howto", { - info, - onExit, - }); - StationBoardAcSR.current?.hide(); + usePDFView == "true" + ? Linking.openURL(currentStation[0].StationTimeTable) + : navigate("howto", { + info, + + goTo, + useShow, + }); + onExit(); }} onLongPressButton={() => Linking.openURL(currentStation[0].StationTimeTable) @@ -191,9 +189,11 @@ export const StationDeteilView = (props) => { onPressButton={() => { navigate("howto", { info: trainBus.address, - onExit, + + goTo, + useShow, }); - StationBoardAcSR.current?.hide(); + onExit(); }} onLongPressButton={() => Linking.openURL(trainBus.address)} > @@ -218,13 +218,7 @@ const StationName = (props) => { ); }; -const NexPreStationLine = ({ - currentStation, - originalStationList, - oP, - favoriteStation, - setFavoriteStation, -}) => { +const NexPreStationLine = ({ currentStation, originalStationList }) => { const [preStation, setPreStation] = useState(); const [nexStation, setNexStation] = useState(); const [lineName, setLineName] = useState(); diff --git a/components/ActionSheetComponents/sheets.js b/components/ActionSheetComponents/sheets.js new file mode 100644 index 0000000..da95b04 --- /dev/null +++ b/components/ActionSheetComponents/sheets.js @@ -0,0 +1,10 @@ +import { registerSheet } from "react-native-actions-sheet"; +import { EachTrainInfo } from "./EachTrainInfo"; +import { JRSTraInfo } from "./JRSTraInfo"; +import { StationDeteilView } from "./StationDeteilView"; + +registerSheet("EachTrainInfo", EachTrainInfo); +registerSheet("JRSTraInfo", JRSTraInfo); +registerSheet("StationDetailView", StationDeteilView); + +export {}; diff --git a/components/AllTrainDiagramView.js b/components/AllTrainDiagramView.js new file mode 100644 index 0000000..b056230 --- /dev/null +++ b/components/AllTrainDiagramView.js @@ -0,0 +1,110 @@ +import React, { useRef, useState, useEffect } from "react"; +import { + View, + Text, + TouchableOpacity, + Linking, + ScrollView, +} from "react-native"; +import MapView, { Marker } from "react-native-maps"; +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"; +import { getTrainType } from "../lib/getTrainType"; +import { checkDuplicateTrainData } from "../lib/checkDuplicateTrainData"; +import { SheetManager } from "react-native-actions-sheet"; +export default function AllTrainDiagramView({ navigation: { navigate } }) { + const { currentTrain } = useCurrentTrain(); + const { areaInfo } = useAreaInfo(); + const { allTrainDiagram } = useAllTrainDiagram(); + const [originalStationList, setOriginalStationList] = useState(); // 第一要素 + const [keyList, setKeyList] = useState(); // 第二要素 + useEffect(() => getStationList().then(setOriginalStationList), []); + useEffect( + () => allTrainDiagram && setKeyList(Object.keys(allTrainDiagram)), + [] + ); + + const openTrainInfo = (d) => { + const train = customTrainDataDetector(d); + let TrainNumber = ""; + if (train.trainNumDistance != undefined) { + const timeInfo = + parseInt(d.replace("M", "").replace("D", "")) - train.trainNumDistance; + TrainNumber = timeInfo + "号"; + } + const payload = { + data: { + trainNum: d, + limited: `${getTrainType(train.type).data}:${ + train.trainName + }${TrainNumber}`, + trainData: checkDuplicateTrainData( + currentTrain.filter((a) => a.num == d) + ), + }, + navigate, + originalStationList, + from: "AllTrainDiagramView", + }; + SheetManager.show("EachTrainInfo", { + payload, + }); + }; + return ( + + + {keyList && + keyList.map((key) => ( + + ))} + + + navigate("menu")} + > + + + 閉じる + + + + + ); +} +const Item = ({ id, openTrainInfo }) => { + return ( + openTrainInfo(id)} + > + + + {id} + + + + ); +}; diff --git a/components/CurrentTrainListView.js b/components/CurrentTrainListView.js new file mode 100644 index 0000000..cc5f880 --- /dev/null +++ b/components/CurrentTrainListView.js @@ -0,0 +1,51 @@ +import React, { useRef } from "react"; +import { View, Text, TouchableOpacity, Linking } from "react-native"; +import MapView, { Marker } from "react-native-maps"; +import { MaterialCommunityIcons } from "@expo/vector-icons"; +import { useCurrentTrain } from "../stateBox/useCurrentTrain"; +export default function CurrentTrainListView({ navigation: { navigate } }) { + const { currentTrain } = useCurrentTrain(); + return ( + + {currentTrain && currentTrain.map((d) => {d.num})} + navigate("menu")} + > + + + 閉じる + + + + + ); +} +const UsefulBox = (props) => { + const { icon, backgroundColor, flex, onPressButton, children } = props; + return ( + + + + {children} + + + ); +}; diff --git a/components/FavoriteList.js b/components/FavoriteList.js index 422ca4c..4888e48 100644 --- a/components/FavoriteList.js +++ b/components/FavoriteList.js @@ -1,21 +1,11 @@ -import React, { Component, useRef, useState, useEffect } from "react"; +import React from "react"; import { View, Text, TouchableOpacity, ScrollView } from "react-native"; -import { WebView } from "react-native-webview"; import { ListItem } from "native-base"; import Icon from "react-native-vector-icons/Entypo"; -import StatusbarDetect from "../StatusbarDetect"; -import { AS } from "../storageControl"; -import { news } from "../config/newsUpdate"; -import { getStationList, lineList } from "../lib/getStationList"; -var Status = StatusbarDetect(); -export default function FavoriteList({ - navigation, - webview, - stationData, - favoriteStation, - setFavoriteStation, -}) { +import { useFavoriteStation } from "../stateBox/useFavoriteStation"; +export default function FavoriteList({ navigation, webview, stationData }) { const { navigate } = navigation; + const { favoriteStation } = useFavoriteStation(); return ( diff --git a/components/settings.js b/components/settings.js index 6f4b39f..3841da3 100644 --- a/components/settings.js +++ b/components/settings.js @@ -10,15 +10,17 @@ export default function Setting(props) { const { navigation: { navigate }, } = props; - const [iconSetting, setIconSetting] = useState(undefined); - const [mapSwitch, setMapSwitch] = useState(undefined); - const [stationMenu, setStationMenu] = useState(undefined); - const [trainMenu, setTrainMenu] = useState(undefined); - const [trainPosition, setTrainPosition] = useState(undefined); + const [iconSetting, setIconSetting] = useState(false); + const [mapSwitch, setMapSwitch] = useState(false); + const [stationMenu, setStationMenu] = useState(false); + const [usePDFView, setUsePDFView] = useState(false); + const [trainMenu, setTrainMenu] = useState(false); + const [trainPosition, setTrainPosition] = useState(false); useEffect(() => { AS.getItem("iconSwitch").then(setIconSetting); AS.getItem("mapSwitch").then(setMapSwitch); AS.getItem("stationSwitch").then(setStationMenu); + AS.getItem("usePDFView").then(setUsePDFView); AS.getItem("trainSwitch").then(setTrainMenu); AS.getItem("trainPositionSwitch").then(setTrainPosition); }, []); @@ -96,6 +98,25 @@ export default function Setting(props) { onValueChange={(value) => setStationMenu(value.toString())} /> + + + 時刻表PDFをアプリ外で表示 + + + setUsePDFView(value.toString())} + /> + - 内部バージョン: 4.5.4.1 + 内部バージョン: 4.6 @@ -158,7 +179,7 @@ export default function Setting(props) { textAlignVertical: "center", }} > - releaseChannel: {Updates.releaseChannel} + releaseChannel: {Updates.channel} @@ -179,6 +200,7 @@ export default function Setting(props) { AS.setItem("iconSwitch", iconSetting.toString()), AS.setItem("mapSwitch", mapSwitch.toString()), AS.setItem("stationSwitch", stationMenu.toString()), + AS.setItem("usePDFView", usePDFView.toString()), AS.setItem("trainSwitch", trainMenu.toString()), AS.setItem("trainPositionSwitch", trainPosition.toString()), ]).then(() => { diff --git a/components/発車時刻表/LED_vidion.js b/components/発車時刻表/LED_vidion.js index 91c586c..33f078c 100644 --- a/components/発車時刻表/LED_vidion.js +++ b/components/発車時刻表/LED_vidion.js @@ -3,16 +3,16 @@ import { View, Text, TouchableOpacity } from "react-native"; import { Switch } from "react-native-elements"; import { widthPercentageToDP as wp } from "react-native-responsive-screen"; import LottieView from "lottie-react-native"; -import { Ionicons, MaterialCommunityIcons } from "@expo/vector-icons"; +import { Ionicons } from "@expo/vector-icons"; import { customTrainDataDetector } from "../custom-train-data"; import { useInterval } from "../../lib/useInterval"; import { objectIsEmpty } from "../../lib/objectIsEmpty"; import { getTrainType } from "../../lib/getTrainType"; -import { HeaderConfig } from "../../lib/HeaderConfig"; import { getTrainDelayStatus } from "../../lib/getTrainDelayStatus"; import { checkDuplicateTrainData } from "../../lib/checkDuplicateTrainData"; - -let diagramData = undefined; +import { useCurrentTrain } from "../../stateBox/useCurrentTrain"; +import { useAreaInfo } from "../../stateBox/useAreaInfo"; +import { SheetManager } from "react-native-actions-sheet"; /** * @@ -46,20 +46,18 @@ let diagramData = undefined; export default function LED_vision(props) { const { station, - setTrainInfo, - EachTrainInfoAsSR, trainDiagram, - currentTrainState, - currentTrainLoadingState, getCurrentTrain, + navigate, + originalStationList, + openStationACFromEachTrainInfo, } = props; - const { currentTrain, setCurrentTrain } = currentTrainState; - const { currentTrainLoading, setCurrentTrainLoading } = - currentTrainLoadingState; + const { currentTrain } = useCurrentTrain(); const [stationDiagram, setStationDiagram] = useState({}); //当該駅の全時刻表 const [finalSwitch, setFinalSwitch] = useState(false); const [trainIDSwitch, setTrainIDSwitch] = useState(false); const [trainDescriptionSwitch, setTrainDescriptionSwitch] = useState(false); + const { areaInfo } = useAreaInfo(); useEffect(() => { // 現在の駅に停車するダイヤを作成する副作用[列車ダイヤと現在駅情報] @@ -149,6 +147,34 @@ export default function LED_vision(props) { return false; }; + const [areaString, setAreaString] = useState(""); + const [areaStringLength, setAreaStringLength] = useState(0); + const [move, setMove] = useState(0); + useInterval( + () => { + if (areaInfo != "") { + if (areaStringLength < move) { + setMove(0); + } else { + setMove(move + 1); + } + } + }, + 350, + true + ); + useEffect(() => { + if (!areaInfo) return () => {}; + setAreaString( + areaInfo.substring(move, areaInfo.length) + areaInfo.substring(0, move) + ); + }, [move]); + + useEffect(() => { + if (!areaInfo) return () => {}; + setAreaStringLength(areaInfo.length); + }, [areaInfo]); + return ( -
- {selectedTrain.map((d, index) => ( +
+ {selectedTrain.map((d) => ( ))} + {areaString != "" && ( + alert(areaInfo)} + /> + )} +