94 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import React, {
 | |
|   createContext,
 | |
|   useContext,
 | |
|   useState,
 | |
|   useEffect,
 | |
|   useRef,
 | |
| } from "react";
 | |
| import { HeaderConfig } from "../lib/HeaderConfig";
 | |
| 
 | |
| import useInterval from "../lib/useInterval";
 | |
| const initialState = {
 | |
|   webview: {},
 | |
|   currentTrain: [],
 | |
|   setCurrentTrain: () => {},
 | |
|   currentTrainLoading: "loading",
 | |
|   setCurrentTrainLoading: () => {},
 | |
|   getCurrentTrain: () => {},
 | |
| };
 | |
| 
 | |
| const CurrentTrainContext = createContext(initialState);
 | |
| 
 | |
| export const useCurrentTrain = () => {
 | |
|   return useContext(CurrentTrainContext);
 | |
| };
 | |
| 
 | |
| export const CurrentTrainProvider = ({ children }) => {
 | |
|   const [currentTrain, setCurrentTrain] = useState([]); //現在在線中の全列車 { num: 列車番号, delay: 遅延時分(状態), Pos: 位置情報 }
 | |
|   const [currentTrainLoading, setCurrentTrainLoading] = useState("loading"); // success, error, loading
 | |
|   const getCurrentTrain = () => {
 | |
|     fetch("https://n8n.haruk.in/webhook/c501550c-7d1b-4e50-927b-4429fe18931a")
 | |
|       .then((response) => response.json())
 | |
|       .then((d) => d.data)
 | |
|       .then((d) =>
 | |
|         d.map((x) => ({
 | |
|           Index: x.Index,
 | |
|           num: x.TrainNum,
 | |
|           delay: x.delay,
 | |
|           Pos: x.Pos,
 | |
|           PosNum: x.PosNum,
 | |
|           Direction: x.Direction,
 | |
|           Type: x.Type,
 | |
|           Line: x.Line,
 | |
|         }))
 | |
|       )
 | |
|       .then((d) => {
 | |
|         setCurrentTrain(d);
 | |
|         setCurrentTrainLoading("success");
 | |
|       })
 | |
|       .catch(() => {
 | |
|         //alert("現在の全在線列車取得エラー/再取得します");
 | |
|         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");
 | |
|           });
 | |
|       });
 | |
|   };
 | |
|   const inject = (i) => {
 | |
|     webview.current?.injectJavaScript(i);
 | |
|   };
 | |
| 
 | |
|   useEffect(getCurrentTrain, []); //初回だけ現在の全在線列車取得
 | |
| 
 | |
|   useInterval(getCurrentTrain, 15000); //15秒毎に全在線列車取得
 | |
| 
 | |
|   const webview = useRef();
 | |
|   return (
 | |
|     <CurrentTrainContext.Provider
 | |
|       value={{
 | |
|         webview,
 | |
|         currentTrain,
 | |
|         setCurrentTrain,
 | |
|         currentTrainLoading,
 | |
|         setCurrentTrainLoading,
 | |
|         getCurrentTrain,
 | |
|         inject,
 | |
|       }}
 | |
|     >
 | |
|       {children}
 | |
|     </CurrentTrainContext.Provider>
 | |
|   );
 | |
| };
 |