150 lines
4.8 KiB
TypeScript
150 lines
4.8 KiB
TypeScript
import React, { useEffect } from "react";
|
|
import { Linking, Platform, UIManager } from "react-native";
|
|
import { GestureHandlerRootView } from "react-native-gesture-handler";
|
|
import "./utils/disableFontScaling"; // グローバルなフォントスケーリング無効化
|
|
import { AppContainer } from "./Apps";
|
|
import { UpdateAsync } from "./UpdateAsync";
|
|
import { LogBox } from "react-native";
|
|
import { FavoriteStationProvider } from "./stateBox/useFavoriteStation";
|
|
import { CurrentTrainProvider } from "./stateBox/useCurrentTrain";
|
|
import { AreaInfoProvider } from "./stateBox/useAreaInfo";
|
|
import { BusAndTrainDataProvider } from "./stateBox/useBusAndTrainData";
|
|
import { AllTrainDiagramProvider } from "./stateBox/useAllTrainDiagram";
|
|
import { SheetProvider, SheetManager } from "react-native-actions-sheet";
|
|
import "./components/ActionSheetComponents/sheets";
|
|
import { TrainDelayDataProvider } from "./stateBox/useTrainDelayData";
|
|
import { SafeAreaProvider } from "react-native-safe-area-context";
|
|
import { DeviceOrientationChangeProvider } from "./stateBox/useDeviceOrientationChange";
|
|
import { TrainMenuProvider } from "./stateBox/useTrainMenu";
|
|
import { buildProvidersTree } from "./lib/providerTreeProvider";
|
|
import { StationListProvider } from "./stateBox/useStationList";
|
|
import { NotificationProvider } from "./stateBox/useNotifications";
|
|
import { UserPositionProvider } from "./stateBox/useUserPosition";
|
|
import { rootNavigationRef } from "./lib/rootNavigation";
|
|
import { AppThemeProvider } from "./lib/theme";
|
|
import StatusbarDetect from "./StatusbarDetect";
|
|
|
|
LogBox.ignoreLogs([
|
|
"ViewPropTypes will be removed",
|
|
"ColorPropType will be removed",
|
|
]);
|
|
|
|
if (Platform.OS === "android") {
|
|
if (UIManager.setLayoutAnimationEnabledExperimental) {
|
|
UIManager.setLayoutAnimationEnabledExperimental(true);
|
|
}
|
|
}
|
|
|
|
export default function App() {
|
|
useEffect(() => {
|
|
UpdateAsync();
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
const openFelicaPage = (retryCount = 0) => {
|
|
if (!rootNavigationRef.isReady()) {
|
|
if (retryCount < 8) {
|
|
setTimeout(() => openFelicaPage(retryCount + 1), 250);
|
|
}
|
|
return;
|
|
}
|
|
|
|
rootNavigationRef.navigate("topMenu", {
|
|
screen: "setting",
|
|
params: {
|
|
screen: "FelicaHistoryPage",
|
|
},
|
|
} as any);
|
|
};
|
|
|
|
const navigateWhenReady = (
|
|
callback: () => void,
|
|
url: string,
|
|
retryCount = 0
|
|
) => {
|
|
if (!rootNavigationRef.isReady()) {
|
|
if (retryCount < 8) {
|
|
setTimeout(() => navigateWhenReady(callback, url, retryCount + 1), 250);
|
|
}
|
|
return;
|
|
}
|
|
callback();
|
|
};
|
|
|
|
const routeFromUrl = (url: string, retryCount = 0) => {
|
|
const normalized = (url || "").toLowerCase();
|
|
if (!normalized) return;
|
|
|
|
if (
|
|
normalized.includes("felicahistorypage") ||
|
|
normalized.includes("open/felica")
|
|
) {
|
|
navigateWhenReady(() => openFelicaPage(), url, retryCount);
|
|
} else if (normalized.includes("open/traininfo")) {
|
|
navigateWhenReady(() => {
|
|
rootNavigationRef.navigate("topMenu", { screen: "menu" } as any);
|
|
setTimeout(() => {
|
|
SheetManager.show("JRSTraInfo");
|
|
}, 450);
|
|
}, url, retryCount);
|
|
} else if (normalized.includes("open/operation")) {
|
|
navigateWhenReady(() => {
|
|
rootNavigationRef.navigate("information" as any);
|
|
}, url, retryCount);
|
|
} else if (normalized.includes("open/settings")) {
|
|
navigateWhenReady(() => {
|
|
rootNavigationRef.navigate("topMenu", {
|
|
screen: "setting",
|
|
} as any);
|
|
}, url, retryCount);
|
|
} else if (normalized.includes("open/topmenu")) {
|
|
navigateWhenReady(() => {
|
|
rootNavigationRef.navigate("topMenu", {
|
|
screen: "menu",
|
|
} as any);
|
|
}, url, retryCount);
|
|
}
|
|
};
|
|
|
|
Linking.getInitialURL().then((url) => {
|
|
if (url) routeFromUrl(url);
|
|
});
|
|
|
|
const sub = Linking.addEventListener("url", ({ url }) => {
|
|
routeFromUrl(url);
|
|
});
|
|
|
|
return () => {
|
|
sub.remove();
|
|
};
|
|
}, []);
|
|
|
|
const ProviderTree = buildProvidersTree([
|
|
AllTrainDiagramProvider,
|
|
NotificationProvider,
|
|
UserPositionProvider,
|
|
StationListProvider,
|
|
FavoriteStationProvider,
|
|
TrainDelayDataProvider,
|
|
CurrentTrainProvider,
|
|
AreaInfoProvider,
|
|
BusAndTrainDataProvider,
|
|
TrainMenuProvider,
|
|
SheetProvider,
|
|
]);
|
|
return (
|
|
<AppThemeProvider>
|
|
<DeviceOrientationChangeProvider>
|
|
<SafeAreaProvider>
|
|
<StatusbarDetect />
|
|
<GestureHandlerRootView style={{ flex: 1 }}>
|
|
<ProviderTree>
|
|
<AppContainer />
|
|
</ProviderTree>
|
|
</GestureHandlerRootView>
|
|
</SafeAreaProvider>
|
|
</DeviceOrientationChangeProvider>
|
|
</AppThemeProvider>
|
|
);
|
|
}
|