diff --git a/constants/api.ts b/constants/api.ts index 37e3861..12ff59c 100644 --- a/constants/api.ts +++ b/constants/api.ts @@ -7,6 +7,9 @@ const BASE_URL = 'https://jr-shikoku-api-data-storage.haruk.in'; export const API_ENDPOINTS = { /** 本日のダイアグラムデータ */ DIAGRAM_TODAY: `${BASE_URL}/tmp/diagram-today.json`, + + /** 本日のダイアグラムデータ(experimental環境用) */ + DIAGRAM_TODAY_BETA: `${BASE_URL}/tmp/diagram-today-beta.json`, /** カスタム列車データ */ CUSTOM_TRAIN_DATA: 'https://haruk.in/api/jr/getTrain.php', diff --git a/lib/jrDataSystemEnvironment.ts b/lib/jrDataSystemEnvironment.ts index b7fb29f..2174aa8 100644 --- a/lib/jrDataSystemEnvironment.ts +++ b/lib/jrDataSystemEnvironment.ts @@ -90,6 +90,13 @@ export const getBackendApiBaseUrl = (environment: unknown): string => { return JR_DATA_SYSTEM_ENVS[envKey].backendApiBaseUrl; }; +export const getDiagramTodayUrl = (environment: unknown): string => { + const envKey = normalizeJrDataSystemEnvironment(environment); + return JR_DATA_SYSTEM_ENVS[envKey].track === "experimental" + ? "https://jr-shikoku-api-data-storage.haruk.in/tmp/diagram-today-beta.json" + : "https://jr-shikoku-api-data-storage.haruk.in/tmp/diagram-today.json"; +}; + export const rewriteBackendApiUrl = (url: string, environment: unknown): string => { if (typeof url !== "string" || url.length === 0) return url; const target = getBackendApiBaseUrl(environment); diff --git a/lib/webViewInjectjavascript.ts b/lib/webViewInjectjavascript.ts index 908f20f..7252521 100644 --- a/lib/webViewInjectjavascript.ts +++ b/lib/webViewInjectjavascript.ts @@ -41,6 +41,11 @@ export interface InjectJavascriptOptions { * experimental 環境では https://jr-shikoku-backend-api-v1-beta.haruk.in を渡す。 */ backendApiBaseUrl?: string; + /** + * ダイアグラムJSONのURL。省略時は本番URL。 + * experimental 環境では diagram-today-beta.json のURLを渡す。 + */ + diagramTodayUrl?: string; } const PRODUCTION_BACKEND_BASE = 'https://jr-shikoku-backend-api-v1.haruk.in'; @@ -55,6 +60,7 @@ export const injectJavascriptData = ({ useElesite, isDark, backendApiBaseUrl, + diagramTodayUrl, mockApiConfig, }: InjectJavascriptOptions): string => { const elesiteStationSequences = [ @@ -1506,6 +1512,11 @@ setStationMenuDialog.observe(document.querySelector('#disp'), { result = result.split(PRODUCTION_BACKEND_BASE).join(backendApiBaseUrl); } + const PRODUCTION_DIAGRAM_TODAY = API_ENDPOINTS.DIAGRAM_TODAY; + if (diagramTodayUrl && diagramTodayUrl !== PRODUCTION_DIAGRAM_TODAY) { + result = result.split(PRODUCTION_DIAGRAM_TODAY).join(diagramTodayUrl); + } + // Prepend XHR interceptor as a fallback for platforms where // injectedJavaScriptBeforeContentLoaded doesn't run reliably. // The __jrsMockActive guard in the interceptor prevents double-patching diff --git a/stateBox/useAllTrainDiagram.tsx b/stateBox/useAllTrainDiagram.tsx index 2ca3b0c..40eef1e 100644 --- a/stateBox/useAllTrainDiagram.tsx +++ b/stateBox/useAllTrainDiagram.tsx @@ -12,6 +12,7 @@ import React, { import { API_ENDPOINTS, STORAGE_KEYS } from "@/constants"; import { getBackendApiBaseUrl, + getDiagramTodayUrl, BACKEND_API_BASE_URLS, } from "@/lib/jrDataSystemEnvironment"; const initialState = { @@ -53,17 +54,23 @@ export const AllTrainDiagramProvider: FC = ({ children }) => { const [backendApiBaseUrl, setBackendApiBaseUrl] = React.useState( BACKEND_API_BASE_URLS.production, ); + const [diagramTodayUrl, setDiagramTodayUrl] = React.useState( + "https://jr-shikoku-api-data-storage.haruk.in/tmp/diagram-today.json", + ); React.useEffect(() => { AS.getItem(STORAGE_KEYS.JR_DATA_SYSTEM_ENV) - .then((value) => setBackendApiBaseUrl(getBackendApiBaseUrl(value))) + .then((value) => { + setBackendApiBaseUrl(getBackendApiBaseUrl(value)); + setDiagramTodayUrl(getDiagramTodayUrl(value)); + }) .catch(() => {}); }, []); const getTrainDiagram = () => { const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 15000); - fetch("https://jr-shikoku-api-data-storage.haruk.in/tmp/diagram-today.json", { signal: controller.signal }) + fetch(diagramTodayUrl, { signal: controller.signal }) .then((res) => res.json()) .then((res) => { const data = {}; diff --git a/stateBox/useTrainMenu.tsx b/stateBox/useTrainMenu.tsx index 84969f9..d15d463 100644 --- a/stateBox/useTrainMenu.tsx +++ b/stateBox/useTrainMenu.tsx @@ -39,6 +39,7 @@ import { useThemeColors } from "@/lib/theme"; import { STORAGE_KEYS } from "@/constants/storage"; import { getBackendApiBaseUrl, + getDiagramTodayUrl, BACKEND_API_BASE_URLS, } from "@/lib/jrDataSystemEnvironment"; @@ -132,6 +133,9 @@ export const TrainMenuProvider: FC = ({ children }) => { const [backendApiBaseUrl, setBackendApiBaseUrl] = useState( BACKEND_API_BASE_URLS.production, ); + const [diagramTodayUrl, setDiagramTodayUrl] = useState( + "https://jr-shikoku-api-data-storage.haruk.in/tmp/diagram-today.json", + ); //更新権限所有確認・情報ソース別利用権限(将来ロールが増えたらここに足す) const [updatePermission, setUpdatePermission] = useState(false); @@ -320,6 +324,7 @@ export const TrainMenuProvider: FC = ({ children }) => { useElesite: useEleSiteSetting, isDark: useThemeColors().isDark, backendApiBaseUrl, + diagramTodayUrl, mockApiConfig, }); @@ -388,6 +393,7 @@ export const TrainMenuProvider: FC = ({ children }) => { // バックエンドAPIベースURL(環境設定から読み込み) AS.getItem(STORAGE_KEYS.JR_DATA_SYSTEM_ENV).then((value) => { setBackendApiBaseUrl(getBackendApiBaseUrl(value)); + setDiagramTodayUrl(getDiagramTodayUrl(value)); }).catch(() => {}); // 静的サンプルデータで初期化(モックAPIが応答するまでのフォールバック) setMockTrainPositions(MOCK_TRAIN_POSITIONS);