import React, { useEffect, useRef, useState } from "react"; import { NavigationContainer } from "@react-navigation/native"; import { createStackNavigator, TransitionPresets, } 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"; 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([]); useEffect(() => { AS.getItem("busAndTrain") .then((d) => { const returnData = JSON.parse(d); setBusAndTrainData(returnData); }) .catch((d) => { fetch( "https://script.google.com/macros/s/AKfycbw0UW6ZeCDgUYFRP0zxpc_Oqfy-91dBdbWv-cM8n3narKp14IyCd2wy5HW7taXcW7E/exec" ) .then((d) => d.json()) .then((d) => { setBusAndTrainData(d); AS.setItem("busAndTrain", JSON.stringify(d)); }); }); }, []); const [currentTrain, setCurrentTrain] = useState([]); //現在在線中の全列車 { num: 列車番号, delay: 遅延時分(状態), Pos: 位置情報 } const [currentTrainLoading, setCurrentTrainLoading] = useState("loading"); // success, error, loading const getCurrentTrain = () => fetch( "https://train.jr-shikoku.co.jp/g?arg1=train&arg2=train", 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((e) => { console.log("えらー"); setCurrentTrainLoading("error"); }); useEffect(getCurrentTrain, []); //初回だけ現在の全在線列車取得 useInterval(getCurrentTrain, 15000); //15秒毎に全在線列車取得 return ( {(props) => ( )} {(props) => ( )} {(props) => } ); } 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, };