tsxのFC宣言をProviderに追加

This commit is contained in:
harukin-expo-dev-env
2025-09-11 16:55:05 +00:00
parent 9ac36216b9
commit 58df77ae49
8 changed files with 107 additions and 89 deletions

View File

@@ -9,30 +9,13 @@ export const initIcon = (
tabBarBadge: string, tabBarBadge: string,
isInfo: boolean isInfo: boolean
) => { ) => {
switch (type) { const IconComponent = type == "Ionicons" ? Ionicons : AntDesign;
case "Ionicons": return ({ focused, color, size }) => (
return ({ focused, color, size }) => ( <>
<> {!!tabBarBadge && <Badge tabBarBadge={tabBarBadge} isInfo={isInfo} />}
{!!tabBarBadge && <Badge tabBarBadge={tabBarBadge} isInfo={isInfo} />} <IconComponent name={name} size={30} color={focused ? "#0099CC" : "black"} />
<Ionicons </>
name={name} );
size={30}
color={focused ? "#0099CC" : "black"}
/>
</>
);
case "AntDesign":
return ({ focused, color, size }) => (
<>
{!!tabBarBadge && <Badge tabBarBadge={tabBarBadge} isInfo={isInfo} />}
<AntDesign
name={name}
size={30}
color={focused ? "#0099CC" : "black"}
/>
</>
);
}
}; };
type BadgeProps = { tabBarBadge: string; isInfo: boolean }; type BadgeProps = { tabBarBadge: string; isInfo: boolean };
@@ -60,7 +43,7 @@ export const Badge: FC<BadgeProps> = ({ tabBarBadge, isInfo }) => {
shadowOffset: { width: 0, height: 0 }, shadowOffset: { width: 0, height: 0 },
shadowOpacity: 0.5, shadowOpacity: 0.5,
shadowRadius: 4, shadowRadius: 4,
elevation: 2 elevation: 2,
}} }}
> >
<Text style={{ color: "white", paddingHorizontal: 4 }}> <Text style={{ color: "white", paddingHorizontal: 4 }}>

View File

@@ -1,12 +1,19 @@
import React, { Ref, useRef, useState,useEffect } from "react"; import React, { Ref, useRef, useState, useEffect } from "react";
import { View, Platform, TouchableOpacity, StyleProp, ViewStyle,Linking } from "react-native"; import {
View,
Platform,
TouchableOpacity,
StyleProp,
ViewStyle,
Linking,
} from "react-native";
import { WebView } from "react-native-webview"; import { WebView } from "react-native-webview";
import Constants from "expo-constants"; import Constants from "expo-constants";
import { Ionicons } from "@expo/vector-icons"; import { Ionicons } from "@expo/vector-icons";
import { useNavigation } from "@react-navigation/native"; import { useNavigation } from "@react-navigation/native";
export default function tndView() { export default function tndView() {
const webview = useRef<WebView>(null); const webview = useRef<WebView>(null);
const { navigate, addListener, isFocused } = useNavigation(); const { navigate, addListener, isFocused } = useNavigation();
const jsa = ` const jsa = `
document.querySelector('.sitettl').style.display = 'none'; document.querySelector('.sitettl').style.display = 'none';
document.querySelector('.attention').style.display = 'none'; document.querySelector('.attention').style.display = 'none';
@@ -100,23 +107,23 @@ setInterval(() => {
}); });
}, 1000); }, 1000);
`; `;
const goToTrainMenu = () =>{ const goToTrainMenu = () => {
if (Platform.OS === "web") { if (Platform.OS === "web") {
Linking.openURL("https://www.jr-shikoku.co.jp/info/"); Linking.openURL("https://www.jr-shikoku.co.jp/info/");
setTimeout(() => { setTimeout(() => {
// @ts-ignore // @ts-ignore
navigate("topMenu", { screen: "menu" }); navigate("topMenu", { screen: "menu" });
}, 100); }, 100);
return; return;
} }
} };
useEffect(() => { useEffect(() => {
// @ts-ignore // @ts-ignore
const unsubscribe = addListener("tabPress", goToTrainMenu); const unsubscribe = addListener("tabPress", goToTrainMenu);
return unsubscribe; return unsubscribe;
}, [addListener]); }, [addListener]);
return ( return (
<View <View
style={{ style={{
@@ -147,7 +154,7 @@ setInterval(() => {
} }
const ReloadButton = ({ onPress, top, LoadError = false }) => { const ReloadButton = ({ onPress, top, LoadError = false }) => {
const styles:StyleProp<ViewStyle> = { const styles: StyleProp<ViewStyle> = {
position: "absolute", position: "absolute",
top, top,
right: 10, right: 10,

View File

@@ -1,7 +1,7 @@
import trainList from "@/assets/originData/trainList"; import trainList from "@/assets/originData/trainList";
import useInterval from "@/lib/useInterval"; import useInterval from "@/lib/useInterval";
import { AS } from "@/storageControl"; import { AS } from "@/storageControl";
import React, { createContext, useContext, useEffect, useState } from "react"; import React, { createContext, FC, useContext, useEffect, useState } from "react";
const initialState = { const initialState = {
allTrainDiagram: {}, allTrainDiagram: {},
setAllTrainDiagram: (e) => {}, setAllTrainDiagram: (e) => {},
@@ -18,8 +18,10 @@ type initialStateType = {
const AllTrainDiagramContext = createContext<initialStateType>(initialState); const AllTrainDiagramContext = createContext<initialStateType>(initialState);
export const useAllTrainDiagram = () => useContext(AllTrainDiagramContext); export const useAllTrainDiagram = () => useContext(AllTrainDiagramContext);
type Props = {
export const AllTrainDiagramProvider = ({ children }) => { children: React.ReactNode;
};
export const AllTrainDiagramProvider:FC<Props> = ({ children }) => {
const [allTrainDiagram, setAllTrainDiagram] = useState(trainList); const [allTrainDiagram, setAllTrainDiagram] = useState(trainList);
const [allCustomTrainData, setAllCustomTrainData] = useState([]); // カスタム列車データ const [allCustomTrainData, setAllCustomTrainData] = useState([]); // カスタム列車データ
const [keyList, setKeyList] = useState<string[]>([]); // 第二要素 const [keyList, setKeyList] = useState<string[]>([]); // 第二要素

View File

@@ -1,4 +1,10 @@
import React, { createContext, useContext, useState, useEffect } from "react"; import React, {
createContext,
useContext,
useState,
useEffect,
FC,
} from "react";
import useInterval from "../lib/useInterval"; import useInterval from "../lib/useInterval";
const setoStationID = [ const setoStationID = [
@@ -327,8 +333,6 @@ const areaStationPair = {
yodo: { id: "G", stationID: yodoStationID }, yodo: { id: "G", stationID: yodoStationID },
}; };
const initialState = { const initialState = {
areaInfo: "", areaInfo: "",
setAreaInfo: () => {}, setAreaInfo: () => {},
@@ -351,8 +355,8 @@ const AreaInfoContext = createContext<initialStateType>(initialState);
export const useAreaInfo = () => { export const useAreaInfo = () => {
return useContext(AreaInfoContext); return useContext(AreaInfoContext);
}; };
type props = { children: React.ReactNode };
export const AreaInfoProvider = ({ children }) => { export const AreaInfoProvider: FC<props> = ({ children }) => {
const [areaInfo, setAreaInfo] = useState(""); const [areaInfo, setAreaInfo] = useState("");
const [areaIconBadgeText, setAreaIconBadgeText] = useState(""); const [areaIconBadgeText, setAreaIconBadgeText] = useState("");
const [areaStationID, setAreaStationID] = useState([]); const [areaStationID, setAreaStationID] = useState([]);

View File

@@ -1,4 +1,10 @@
import React, { createContext, useContext, useState, useEffect } from "react"; import React, {
createContext,
useContext,
useState,
useEffect,
FC,
} from "react";
import { AS } from "../storageControl"; import { AS } from "../storageControl";
import { useAllTrainDiagram } from "./useAllTrainDiagram"; import { useAllTrainDiagram } from "./useAllTrainDiagram";
const initialState = { const initialState = {
@@ -15,14 +21,16 @@ const BusAndTrainDataContext = createContext(initialState);
export const useBusAndTrainData = () => { export const useBusAndTrainData = () => {
return useContext(BusAndTrainDataContext); return useContext(BusAndTrainDataContext);
}; };
type props = { children: React.ReactNode };
export const BusAndTrainDataProvider = ({ children }) => { export const BusAndTrainDataProvider: FC<props> = ({ children }) => {
const { allTrainDiagram } = useAllTrainDiagram(); const { allTrainDiagram } = useAllTrainDiagram();
const [busAndTrainData, setBusAndTrainData] = useState<{ const [busAndTrainData, setBusAndTrainData] = useState<
address: string; {
name: string; address: string;
type: "station-data" | "bus-stop" | "train-info"; name: string;
}[]>([]); type: "station-data" | "bus-stop" | "train-info";
}[]
>([]);
const [trainPairData, setTrainPairData] = useState<any[]>([]); const [trainPairData, setTrainPairData] = useState<any[]>([]);
useEffect(() => { useEffect(() => {
AS.getItem("busAndTrain202403") AS.getItem("busAndTrain202403")
@@ -57,7 +65,7 @@ export const BusAndTrainDataProvider = ({ children }) => {
}); });
return trainPairList; return trainPairList;
}; };
const getInfluencedTrainData = (trainNum:string) => { const getInfluencedTrainData = (trainNum: string) => {
const trainPairList = initializeTrainPairList(); const trainPairList = initializeTrainPairList();
// 9253M ラマル // 9253M ラマル

View File

@@ -4,6 +4,7 @@ import React, {
useState, useState,
useEffect, useEffect,
useRef, useRef,
FC,
} from "react"; } from "react";
import { HeaderConfig } from "../lib/HeaderConfig"; import { HeaderConfig } from "../lib/HeaderConfig";
@@ -48,8 +49,10 @@ const CurrentTrainContext = createContext<initialStateType>(initialState);
export const useCurrentTrain = () => { export const useCurrentTrain = () => {
return useContext(CurrentTrainContext); return useContext(CurrentTrainContext);
}; };
type props = {
export const CurrentTrainProvider = ({ children }) => { children: React.ReactNode;
}
export const CurrentTrainProvider:FC<props> = ({ children }) => {
const [currentTrain, setCurrentTrain] = useState<trainDataType[]>([]); //現在在線中の全列車 { num: 列車番号, delay: 遅延時分(状態), Pos: 位置情報 } const [currentTrain, setCurrentTrain] = useState<trainDataType[]>([]); //現在在線中の全列車 { num: 列車番号, delay: 遅延時分(状態), Pos: 位置情報 }
const [currentTrainLoading, setCurrentTrainLoading] = const [currentTrainLoading, setCurrentTrainLoading] =
useState<loading>("loading"); useState<loading>("loading");

View File

@@ -1,11 +1,11 @@
import React, { createContext, useContext, useEffect, useState } from "react"; import React, { createContext, FC, useContext, useEffect, useState } from "react";
const initialState = { const initialState = {
getTime: new Date(), getTime: new Date(),
setGetTime: () => {}, setGetTime: (e) => {},
loadingDelayData: true, loadingDelayData: true,
setLoadingDelayData: (loading) => {}, setLoadingDelayData: (loading) => {},
delayData: undefined, delayData: undefined,
setDelayData: () => {}, setDelayData: (e) => {},
}; };
const TrainDelayDataContext = createContext(initialState); const TrainDelayDataContext = createContext(initialState);
@@ -13,8 +13,10 @@ const TrainDelayDataContext = createContext(initialState);
export const useTrainDelayData = () => { export const useTrainDelayData = () => {
return useContext(TrainDelayDataContext); return useContext(TrainDelayDataContext);
}; };
type props = {
export const TrainDelayDataProvider = ({ children }) => { children: React.ReactNode;
};
export const TrainDelayDataProvider:FC<props> = ({ children }) => {
const [delayData, setDelayData] = useState(undefined); const [delayData, setDelayData] = useState(undefined);
const [getTime, setGetTime] = useState(new Date()); const [getTime, setGetTime] = useState(new Date());
const [loadingDelayData, setLoadingDelayData] = useState(true); const [loadingDelayData, setLoadingDelayData] = useState(true);

View File

@@ -1,4 +1,10 @@
import React, { createContext, useContext, useState, useEffect } from "react"; import React, {
createContext,
useContext,
useState,
useEffect,
FC,
} from "react";
import { ASCore } from "../storageControl"; import { ASCore } from "../storageControl";
@@ -30,8 +36,8 @@ const initialState = {
setTrainInfo: (e) => {}, setTrainInfo: (e) => {},
trainMenu: "true", trainMenu: "true",
setTrainMenu: (e) => {}, setTrainMenu: (e) => {},
updatePermission : false, updatePermission: false,
setUpdatePermission : (e) => {}, setUpdatePermission: (e) => {},
injectJavascript: "", injectJavascript: "",
}; };
@@ -40,33 +46,36 @@ const TrainMenuContext = createContext(initialState);
export const useTrainMenu = () => { export const useTrainMenu = () => {
return useContext(TrainMenuContext); return useContext(TrainMenuContext);
}; };
type props = { children: React.ReactNode };
export const TrainMenuProvider = ({ children }) => { export const TrainMenuProvider: FC<props> = ({ children }) => {
const { expoPushToken } = useNotification(); const { expoPushToken } = useNotification();
const [selectedLine, setSelectedLine] = useState(undefined); const [selectedLine, setSelectedLine] = useState(undefined);
const [mapsStationData, setMapsStationData] = useState(undefined); const [mapsStationData, setMapsStationData] = useState(undefined);
useEffect(() => { useEffect(() => {
getStationList2().then(setMapsStationData); getStationList2().then(setMapsStationData);
}, []); }, []);
type boolType = "true" | "false" | undefined;
//画面表示関連 //画面表示関連
const [iconSetting, setIconSetting] = useState<"true" | "false" | undefined>(undefined); const [iconSetting, setIconSetting] = useState<boolType>(undefined);
const [mapSwitch, setMapSwitch] = useState<"true" | "false" | undefined>(undefined); const [mapSwitch, setMapSwitch] = useState<boolType>(undefined);
const [stationMenu, setStationMenu] = useState<"true" | "false" | undefined>(undefined); const [stationMenu, setStationMenu] = useState<boolType>(undefined);
const [LoadError, setLoadError] = useState(false); const [LoadError, setLoadError] = useState(false);
//更新権限所有確認 //更新権限所有確認
const [updatePermission, setUpdatePermission] = useState(false); const [updatePermission, setUpdatePermission] = useState(false);
useEffect(()=>{ useEffect(() => {
fetch("https://n8n.haruk.in/webhook/data-edit-permission?token=" + expoPushToken).then((res)=>res.json()) fetch(
.then((res)=>{ "https://n8n.haruk.in/webhook/data-edit-permission?token=" + expoPushToken
if(res.data == true){ )
setUpdatePermission(true); .then((res) => res.json())
}else{ .then((res) => {
setUpdatePermission(false); if (res.data == true) {
} setUpdatePermission(true);
}) } else {
}, [expoPushToken]) setUpdatePermission(false);
}
});
}, [expoPushToken]);
//列車情報表示関連 //列車情報表示関連
const [trainInfo, setTrainInfo] = useState({ const [trainInfo, setTrainInfo] = useState({