import React, { useEffect, useRef, useState } from "react"; import { View, Platform, ToastAndroid, Text, TouchableOpacity, } from "react-native"; import { WebView } from "react-native-webview"; import Constants from "expo-constants"; import { Ionicons, MaterialCommunityIcons } 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 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; const { navigate } = navigation; var urlcache = ""; //画面表示関連 const [iconSetting, setIconSetting] = useState(undefined); const [mapSwitch, setMapSwitch] = useState(undefined); const [stationMenu, setStationMenu] = useState(undefined); //列車情報表示関連 const EachTrainInfoAsSR = useRef(null); const [trainInfo, setTrainInfo] = useState({ trainNum: undefined, limited: undefined, trainData: undefined, }); //駅情報画面用 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, iconSetting, stationMenu, trainMenu ); useEffect(() => { //ニュース表示 AS.getItem("status") .then((d) => { if (d != news) navigate("news"); }) .catch((e) => navigate("news")); }, []); useEffect(() => { //列車アイコンスイッチ AS.getItem("iconSwitch") .then((d) => { if (d) { setIconSetting(d); } else { AS.setItem("iconSwitch", "true").then(Updates.reloadAsync); } }) .catch((d) => AS.setItem("iconSwitch", "true").then(Updates.reloadAsync)); }, []); useEffect(() => { //地図スイッチ AS.getItem("mapSwitch") .then((d) => { if (d) { setMapSwitch(d); } else { AS.setItem("mapSwitch", "false").then(Updates.reloadAsync); } }) .catch((d) => AS.setItem("mapSwitch", "false").then(Updates.reloadAsync)); }, []); useEffect(() => { //駅メニュースイッチ AS.getItem("stationSwitch") .then((d) => { if (d) { setStationMenu(d); } else { AS.setItem("stationSwitch", "true").then(Updates.reloadAsync); } }) .catch((d) => AS.setItem("stationSwitch", "true").then(Updates.reloadAsync) ); }, []); useEffect(() => { //列車メニュースイッチ AS.getItem("trainSwitch") .then((d) => { if (d) { setTrainMenu(d); } else { AS.setItem("trainSwitch", "true").then(Updates.reloadAsync); } }) .catch((d) => AS.setItem("trainSwitch", "true").then(Updates.reloadAsync) ); }, []); const onMessage = (event) => { if (event.nativeEvent.data.includes("train.html")) { navigate("trainbase", { info: event.nativeEvent.data, from: "Train" }); return; } if (!originalStationList) { alert("駅名標データを取得中..."); return; } 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(); } return; } case "ShowTrainTimeInfo": { const { trainNum, limited } = dataSet; //alert(trainNum, limited); setTrainInfo({ trainNum, limited, trainData: checkDuplicateTrainData( currentTrain.filter((a) => a.num == trainNum) ), }); //遅延情報は未実装 EachTrainInfoAsSR.current?.show(); return; } default: { return; } } }; const onNavigationStateChange = (event) => { if (event.url != urlcache) { //URL二重判定回避 urlcache = event.url; if (event.url.includes("https://train.jr-shikoku.co.jp/usage.htm")) { if (Platform.OS === "android") navigate("howto", { info: event.url }); webview?.current.goBack(); //Actions.howto(); } else if ( event.url.includes("https://train.jr-shikoku.co.jp/train.html") ) { //Actions.trainbase({info: event.url}); if (Platform.OS === "android") navigate("trainbase", { info: event.url }); webview?.current.goBack(); } } }; function sleep(waitSec, callbackFunc) { // 経過時間(秒) var spanedSec = 0; // 1秒間隔で無名関数を実行 var id = setInterval(function () { spanedSec++; // 経過時間 >= 待機時間の場合、待機終了。 if (spanedSec >= waitSec) { // タイマー停止 clearInterval(id); // 完了時、コールバック関数を実行 if (callbackFunc) callbackFunc(); } }, 1); } const openStationACFromEachTrainInfo = (stationName) => { EachTrainInfoAsSR.current?.hide(); const findStationEachLine = (selectLine) => { let NearStation = selectLine.filter((d) => d.Station_JP == stationName); 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); sleep(25, function () { StationBoardAcSR.current?.show(); }); } else { setStationBoardData(undefined); StationBoardAcSR.current?.hide(); } }; return ( {/* {Status} */} StationBoardAcSR.current?.hide()} onLoadEnd={() => { if (once) return () => {}; if (!stationData) return () => {}; if (favoriteStation.length > 0) { const getStationLine = (now) => { const returnData = Object.keys(stationData).filter((d) => { const cache = stationData[d].findIndex( (data) => data.Station_JP == now.Station_JP ); return cache != -1; }); return returnData[0]; }; const lineName = getStationLine(favoriteStation[0][0]); webview.current?.injectJavaScript( `MoveDisplayStation('${lineName}_${favoriteStation[0][0].MyStation}_${favoriteStation[0][0].Station_JP}')` ); once = true; } }} /> navigate("trainMenu", { webview })} top={Platform.OS == "ios" ? Constants.statusBarHeight : 0} mapSwitch={mapSwitch == "true" ? "flex" : "none"} /> webview.current.reload()} top={Platform.OS == "ios" ? Constants.statusBarHeight : 0} /> { StationBoardAcSR.current?.setModalVisible(); navigate("Apps"); }} /> ); } const MapsButton = ({ onPress, top, mapSwitch }) => { const styles = { touch: { position: "absolute", top, left: 10, width: 50, height: 50, backgroundColor: "#0099CC", borderColor: "white", borderStyle: "solid", borderWidth: 1, borderRadius: 50, alignContent: "center", alignSelf: "center", alignItems: "center", display: mapSwitch, }, text: { textAlign: "center", width: "auto", height: "auto", textAlignVertical: "center", fontWeight: "bold", color: "white", }, }; return ( ); }; const ReloadButton = ({ onPress, top, mapSwitch }) => { const styles = { touch: { position: "absolute", top, right: 10, width: 50, height: 50, backgroundColor: "#0099CC", borderColor: "white", borderStyle: "solid", borderWidth: 1, borderRadius: 50, alignContent: "center", alignSelf: "center", alignItems: "center", display: mapSwitch, }, text: { textAlign: "center", width: "auto", height: "auto", textAlignVertical: "center", fontWeight: "bold", color: "white", }, }; return ( ); };