From d8453608c923d0f6725402ba16bb76ea5d8bbf02 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Thu, 3 Jul 2025 15:09:35 +0000 Subject: [PATCH 1/7] =?UTF-8?q?=E5=88=97=E8=BB=8A=E6=83=85=E5=A0=B1?= =?UTF-8?q?=E3=81=AE=E9=A0=AD=E3=81=AB=E8=A8=98=E8=BC=89=E3=81=99=E3=82=8B?= =?UTF-8?q?=E5=88=97=E8=BB=8A=E5=90=8D=E3=82=92=E3=82=B5=E3=83=BC=E3=83=90?= =?UTF-8?q?=E3=83=BC=E3=81=8B=E3=82=89=E5=8B=95=E7=9A=84=E3=81=AB=E5=8F=96?= =?UTF-8?q?=E5=BE=97=E5=A4=89=E6=9B=B4=E5=8F=AF=E8=83=BD=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EachTrainInfoCore.js | 5 +- .../EachTrainInfoCore/HeaderText.tsx | 30 +- .../EachTrainInfoCore/trainIconStatus.tsx | 60 ++-- components/AllTrainDiagramView.js | 4 +- components/custom-train-data.ts | 302 +++++++++--------- components/発車時刻表/EachData.tsx | 35 +- lib/webViewInjectjavascript.ts | 3 + stateBox/useAllTrainDiagram.js | 20 +- 8 files changed, 263 insertions(+), 196 deletions(-) diff --git a/components/ActionSheetComponents/EachTrainInfoCore.js b/components/ActionSheetComponents/EachTrainInfoCore.js index c6f7cc0..23a15cb 100644 --- a/components/ActionSheetComponents/EachTrainInfoCore.js +++ b/components/ActionSheetComponents/EachTrainInfoCore.js @@ -44,7 +44,8 @@ export const EachTrainInfoCore = ({ }) => { const { currentTrain } = useCurrentTrain(); const { originalStationList, stationList } = useStationList(); - const { allTrainDiagram: trainList } = useAllTrainDiagram(); + const { allTrainDiagram: trainList, allCustonTrainData } = + useAllTrainDiagram(); const { setTrainInfo } = useTrainMenu(); const [currentTrainData, setCurrentTrainData] = useState(); @@ -322,7 +323,7 @@ export const EachTrainInfoCore = ({ }, []); const openTrainInfo = (d) => { - const train = customTrainDataDetector(d); + const train = customTrainDataDetector(d, allCustonTrainData); let TrainNumber = ""; if (train.trainNumDistance != undefined) { const timeInfo = diff --git a/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx b/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx index 69d0663..79b6195 100644 --- a/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx +++ b/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx @@ -1,8 +1,6 @@ import React, { CSSProperties, FC, useEffect, useMemo, useState } from "react"; -import { Text, View, LayoutAnimation, TextStyle, TouchableOpacity } from "react-native"; -import { Ionicons } from "@expo/vector-icons"; +import { Text, View, TextStyle, TouchableOpacity } from "react-native"; import { SheetManager } from "react-native-actions-sheet"; -import { getType } from "../../../lib/eachTrainInfoCoreLib/getType"; import { migrateTrainName } from "../../../lib/eachTrainInfoCoreLib/migrateTrainName"; import { TrainIconStatus } from "./trainIconStatus"; import { TrainViewIcon } from "./trainViewIcon"; @@ -10,6 +8,7 @@ import { OneManText } from "./HeaderTextParts/OneManText"; import { customTrainDataDetector } from "@/components/custom-train-data"; import { InfogramText } from "@/components/ActionSheetComponents/EachTrainInfoCore/HeaderTextParts/InfogramText"; import { useTrainMenu } from "@/stateBox/useTrainMenu"; +import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; import { useNotification } from "@/stateBox/useNotifications"; type Props = { @@ -40,17 +39,21 @@ export const HeaderText: FC = ({ tailStation, navigate, from, - scrollHandlers + scrollHandlers, }) => { const { limited, trainNum } = data; const { updatePermission } = useTrainMenu(); - const {expoPushToken} = useNotification(); + const { allCustonTrainData } = useAllTrainDiagram(); + const { expoPushToken } = useNotification(); // 列車名、種別、フォントの取得 const [typeName, trainName, fontAvailable, isOneMan, infogram] = useMemo(() => { - const customTrainData = customTrainDataDetector(trainNum); + const customTrainData = customTrainDataDetector( + trainNum, + allCustonTrainData + ); const [type, fontAvailable, isOneMan] = (() => { switch (customTrainData.type) { case "LTDEXP": @@ -123,14 +126,23 @@ export const HeaderText: FC = ({ }, [trainData]); return ( - scrollHandlers.ref.current?.scrollTo({ y: 0, animated: true })}> + + scrollHandlers.ref.current?.scrollTo({ y: 0, animated: true }) + } + > { navigate("generalWebView", { - uri: "https://jr-shikoku-data-post-system.pages.dev?trainNum=" + trainNum + "&token=" + expoPushToken, - useExitButton: false + uri: + "https://jr-shikoku-data-post-system.pages.dev?trainNum=" + + trainNum + + "&token=" + + expoPushToken, + useExitButton: false, }); SheetManager.hide("EachTrainInfo"); }} diff --git a/components/ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx b/components/ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx index ce910e1..105eb0f 100644 --- a/components/ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx +++ b/components/ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx @@ -6,6 +6,7 @@ import { useInterval } from "../../../lib/useInterval"; import { Icon } from "@expo/vector-icons/build/createIconSet"; import { SheetManager } from "react-native-actions-sheet"; import { customTrainDataDetector } from "../../custom-train-data"; +import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; type GlyphNames = ComponentProps["name"]; @@ -22,11 +23,14 @@ export const TrainIconStatus: FC = ({ data, navigate, from }) => { const [trainIcon, setTrainIcon] = useState(null); const [anpanmanStatus, setAnpanmanStatus] = useState(); const [address, setAddress] = useState(""); + const { allCustonTrainData } = useAllTrainDiagram(); useEffect(() => { if (!data.trainNum) return; - const { trainIcon, infoUrl } = customTrainDataDetector(data.trainNum); - if (trainIcon) setTrainIcon(trainIcon); - + const { img, infoUrl } = customTrainDataDetector( + data.trainNum, + allCustonTrainData + ); + if (img) setTrainIcon(img); if (infoUrl) setAddress(infoUrl); switch (data.trainNum) { @@ -57,31 +61,31 @@ export const TrainIconStatus: FC = ({ data, navigate, from }) => { } }); break; - case "2074D": - case "2076D": - case "2080D": - case "2082D": - case "2071D": - case "2073D": - case "2079D": - case "2081D": - fetch( - `https://n8n.haruk.in/webhook/dosan-anpanman-first?trainNum=${ - data.trainNum - }&month=${dayjs().format("M")}&day=${dayjs().format("D")}` - ) - .then((d) => d.json()) - .then((d) => { - console.log(d); - if (d.trainStatus == "〇") { - //setAnpanmanStatus({name:"checkmark-circle-outline",color:"blue"}); - } else if (d.trainStatus == "▲") { - setAnpanmanStatus({ name: "warning-outline", color: "yellow" }); - } else if (d.trainStatus == "×") { - //setAnpanmanStatus({ name: "close-circle-outline", color: "red" }); - } - }); - break; + case "2074D": + case "2076D": + case "2080D": + case "2082D": + case "2071D": + case "2073D": + case "2079D": + case "2081D": + fetch( + `https://n8n.haruk.in/webhook/dosan-anpanman-first?trainNum=${ + data.trainNum + }&month=${dayjs().format("M")}&day=${dayjs().format("D")}` + ) + .then((d) => d.json()) + .then((d) => { + console.log(d); + if (d.trainStatus == "〇") { + //setAnpanmanStatus({name:"checkmark-circle-outline",color:"blue"}); + } else if (d.trainStatus == "▲") { + setAnpanmanStatus({ name: "warning-outline", color: "yellow" }); + } else if (d.trainStatus == "×") { + //setAnpanmanStatus({ name: "close-circle-outline", color: "red" }); + } + }); + break; } }, [data.trainNum]); const [move, setMove] = useState(true); diff --git a/components/AllTrainDiagramView.js b/components/AllTrainDiagramView.js index a9ddd98..c426258 100644 --- a/components/AllTrainDiagramView.js +++ b/components/AllTrainDiagramView.js @@ -21,7 +21,7 @@ import { BigButton } from "./atom/BigButton"; import { Switch } from "react-native-elements"; export default function AllTrainDiagramView() { const { goBack, navigate } = useNavigation(); - const { keyList, allTrainDiagram } = useAllTrainDiagram(); + const { keyList, allTrainDiagram, allCustonTrainData } = useAllTrainDiagram(); const [input, setInput] = useState(""); // 文字入力 const [keyBoardVisible, setKeyBoardVisible] = useState(false); const [useStationName, setUseStationName] = useState(false); @@ -53,7 +53,7 @@ export default function AllTrainDiagramView() { }, []); const openTrainInfo = (d) => { - const train = customTrainDataDetector(d); + const train = customTrainDataDetector(d, allCustonTrainData); let TrainNumber = ""; if (train.trainNumDistance != undefined) { const timeInfo = diff --git a/components/custom-train-data.ts b/components/custom-train-data.ts index 59c049a..abe330c 100644 --- a/components/custom-train-data.ts +++ b/components/custom-train-data.ts @@ -1,6 +1,19 @@ import dayjs from "dayjs"; -export const customTrainDataDetector = (TrainNumber: string) => { - const trainGetText = `?trainNum=${TrainNumber}&month=${dayjs().format("M")}&day=${dayjs().format("D")}`; +export const customTrainDataDetector = ( + TrainNumber: string, + allCustonTrainData?: any[] +) => { + if (allCustonTrainData && allCustonTrainData.length > 0) { + const customTrain = allCustonTrainData.find( + (train) => train.TrainNumber === TrainNumber + ); + if (customTrain) { + return customTrain; + } + } + const trainGetText = `?trainNum=${TrainNumber}&month=${dayjs().format( + "M" + )}&day=${dayjs().format("D")}`; switch (TrainNumber) { //しおかぜメイン //8000 ノーマル @@ -24,23 +37,23 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "しおかぜ", - trainIcon: "https://storage.haruk.in/s8000nr.png", + img: "https://storage.haruk.in/s8000nr.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/shiokaze.html", trainNumDistance: 0, info: "いしづちと併結 / 8000系で運転", - infogram: "G" + infogram: "G", }; case "2M": return { type: "LTDEXP", trainName: "しおかぜ", - trainIcon: "https://storage.haruk.in/s8000nr.png", + img: "https://storage.haruk.in/s8000nr.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/shiokaze.html", trainNumDistance: 0, info: "8000系で運転", - infogram: "G" + infogram: "G", }; //8000 アンパン case "10M": @@ -50,11 +63,11 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "しおかぜ", - trainIcon: `https://n8n.haruk.in/webhook/anpanman-pictures.png${trainGetText}`, + img: `https://n8n.haruk.in/webhook/anpanman-pictures.png${trainGetText}`, infoUrl: "https://www.jr-eki.com/aptrain/naani/yosan/train.html", trainNumDistance: 0, info: "いしづちと併結 / アンパンマン列車で運転", - infogram: "G" + infogram: "G", }; //8600 case "8M": @@ -68,12 +81,12 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "しおかぜ", - trainIcon: "https://storage.haruk.in/s8600.png", + img: "https://storage.haruk.in/s8600.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/shiokaze.html", trainNumDistance: 0, info: "いしづちと併結 / 8600系で運転", - infogram: "G" + infogram: "G", }; //いしづちメイン @@ -99,12 +112,12 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "いしづち", - trainIcon: "https://storage.haruk.in/s8000no.png", + img: "https://storage.haruk.in/s8000no.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/ishizuchi.html", trainNumDistance: 1000, info: "しおかぜと併結 / 8000系で運転", - infogram: "" + infogram: "", }; //8000 アンパン @@ -115,11 +128,11 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "いしづち", - trainIcon: `https://n8n.haruk.in/webhook/anpanman-pictures.png${trainGetText}`, + img: `https://n8n.haruk.in/webhook/anpanman-pictures.png${trainGetText}`, infoUrl: "https://www.jr-eki.com/aptrain/naani/yosan/train.html", trainNumDistance: 1000, info: "しおかぜと併結 / アンパンマン列車で運転", - infogram: "" + infogram: "", }; //8600 @@ -134,12 +147,12 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "いしづち", - trainIcon: "https://storage.haruk.in/s8600_isz.png", + img: "https://storage.haruk.in/s8600_isz.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/ishizuchi.html", trainNumDistance: 1000, info: "しおかぜと併結 / 8600系で運転", - infogram: "" + infogram: "", }; //MEXP @@ -148,24 +161,24 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "モーニングEXP高松", - trainIcon: "https://storage.haruk.in/s8000nr.png", + img: "https://storage.haruk.in/s8000nr.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/morning.html", trainNumDistance: null, info: "8000系で運転", - infogram: "G" + infogram: "G", }; //8600 case "1091M": return { type: "LTDEXP", trainName: "モーニングEXP松山", - trainIcon: "https://storage.haruk.in/s8600_isz.png", + img: "https://storage.haruk.in/s8600_isz.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/morning.html", trainNumDistance: null, info: "8600系で運転", - infogram: "G" + infogram: "G", }; //三桁いしづち //8000 アンパン @@ -174,11 +187,11 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "いしづち", - trainIcon: `https://n8n.haruk.in/webhook/anpanman-pictures.png${trainGetText}`, + img: `https://n8n.haruk.in/webhook/anpanman-pictures.png${trainGetText}`, infoUrl: "https://www.jr-eki.com/aptrain/naani/yosan/train.html", trainNumDistance: 940, info: "アンパンマン列車で運転", - infogram: "G" + infogram: "G", }; //8600 case "1043M": @@ -186,23 +199,23 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "いしづち", - trainIcon: "https://storage.haruk.in/s8600_isz.png", + img: "https://storage.haruk.in/s8600_isz.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/ishizuchi.html", trainNumDistance: 940, info: "8600系で運転", - infogram: "" + infogram: "", }; case "1046M": return { type: "LTDEXP", trainName: "いしづち", - trainIcon: "https://storage.haruk.in/s8600_isz.png", + img: "https://storage.haruk.in/s8600_isz.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/ishizuchi.html", trainNumDistance: 940, info: "8600系で運転", - infogram: "G" + infogram: "G", }; //南風 2700ノーマル @@ -227,11 +240,12 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "南風", - trainIcon: "https://storage.haruk.in/s2700.png", - infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/nanpu.html", + img: "https://storage.haruk.in/s2700.png", + infoUrl: + "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/nanpu.html", trainNumDistance: 30, info: "2700系で運転", - infogram: "G" + infogram: "G", }; //2700アンパン @@ -248,11 +262,11 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "南風", - trainIcon: `https://n8n.haruk.in/webhook/anpanman-pictures.png${trainGetText}`, + img: `https://n8n.haruk.in/webhook/anpanman-pictures.png${trainGetText}`, infoUrl: "https://www.jr-eki.com/aptrain/naani/dosan/train.html", trainNumDistance: 30, info: "アンパンマン列車で運転", - infogram: "G" + infogram: "G", }; //うずしお @@ -273,12 +287,12 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "うずしお", - trainIcon: "https://storage.haruk.in/s2700_uzu.png", + img: "https://storage.haruk.in/s2700_uzu.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/uzushio.html", trainNumDistance: 3000, info: "2700系で運転", - infogram: "" + infogram: "", }; //2700 二両編成 @@ -295,12 +309,12 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "うずしお", - trainIcon: "https://storage.haruk.in/s2700_uzu.png", + img: "https://storage.haruk.in/s2700_uzu.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/uzushio.html", trainNumDistance: 3000, info: "2700系で運転", - infogram: "" + infogram: "", }; //2600 @@ -317,15 +331,14 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "うずしお", - trainIcon: "https://storage.haruk.in/s2600.png", + img: "https://storage.haruk.in/s2600.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/uzushio.html", trainNumDistance: 3000, info: "2600系で運転", - infogram: "" + infogram: "", }; - //マリンライナー case "3104M": case "3106M": @@ -398,11 +411,12 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "Rapid", trainName: "マリンライナー", - trainIcon: "https://storage.haruk.in/s5001.png", - infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/marine.html", + img: "https://storage.haruk.in/s5001.png", + infoUrl: + "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/marine.html", trainNumDistance: 3100, info: "", - infogram: "G" + infogram: "G", }; case "3102M": case "3101M": @@ -412,22 +426,23 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "Rapid", trainName: "マリンライナー", - trainIcon: "https://storage.haruk.in/s5001k.png", - infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/marine.html", + img: "https://storage.haruk.in/s5001k.png", + infoUrl: + "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/marine.html", trainNumDistance: 3100, info: "", - infogram: "" + infogram: "", }; //下りサンポート case "1219M": return { type: "Normal", trainName: "南風リレー", - trainIcon: "", + img: "", infoUrl: "", trainNumDistance: null, info: " 土曜・休日は多度津-琴平間運休", - infogram: "" + infogram: "", }; case "111M": @@ -443,11 +458,11 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "Rapid", trainName: "サンポート南風リレー", - trainIcon: null, + img: null, infoUrl: null, trainNumDistance: null, info: null, - infogram: "" + infogram: "", }; case "5109M": case "5135M": @@ -455,32 +470,32 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "OneManRapid", trainName: "サンポート南風リレー", - trainIcon: null, + img: null, infoUrl: null, trainNumDistance: null, info: null, - infogram: "" + infogram: "", }; case "137M": return { type: "Rapid", trainName: "サンポート", - trainIcon: null, + img: null, infoUrl: null, trainNumDistance: null, info: "土曜・休日運休", - infogram: "" + infogram: "", }; //上りサンポート case "116M": return { type: "Normal", trainName: "南風リレー", - trainIcon: null, + img: null, infoUrl: null, trainNumDistance: null, info: null, - infogram: "" + infogram: "", }; case "130M": @@ -494,11 +509,11 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "Rapid", trainName: "サンポート南風リレー", - trainIcon: "", + img: "", infoUrl: "", trainNumDistance: null, info: "", - infogram: "" + infogram: "", }; case "5118M": case "5120M": @@ -508,11 +523,11 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "OneManRapid", trainName: "サンポート南風リレー", - trainIcon: null, + img: null, infoUrl: null, trainNumDistance: null, info: null, - infogram: "" + infogram: "", }; //サンライズ瀬戸 @@ -521,24 +536,24 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "NightLTDEXP", trainName: "サンライズ瀬戸", - trainIcon: "https://storage.haruk.in/w285.png", + img: "https://storage.haruk.in/w285.png", infoUrl: "https://www.jr-odekake.net/train/sunriseseto_izumo/index.html", trainNumDistance: null, info: "", - infogram: "ブ" + infogram: "ブ", }; case "8041M": //琴平延長高松迄 case "8031M": //琴平延長高松以降 return { type: "NightLTDEXP", trainName: "サンライズ瀬戸", - trainIcon: "https://storage.haruk.in/w285.png", + img: "https://storage.haruk.in/w285.png", infoUrl: "https://www.jr-odekake.net/train/sunriseseto_izumo/index.html", trainNumDistance: null, info: "琴平延長運転日", - infogram: "ブ" + infogram: "ブ", }; //宇和海 @@ -572,11 +587,12 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "宇和海", - trainIcon: "https://storage.haruk.in/s2000_uwa.png", - infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/uwakai.html", + img: "https://storage.haruk.in/s2000_uwa.png", + infoUrl: + "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/uwakai.html", trainNumDistance: 1050, info: "2000系で運転", - infogram: "" + infogram: "", }; //2000 アンパン込み case "1058D": @@ -588,11 +604,11 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "宇和海", - trainIcon: `https://n8n.haruk.in/webhook/anpanman-pictures.png${trainGetText}`, + img: `https://n8n.haruk.in/webhook/anpanman-pictures.png${trainGetText}`, infoUrl: "https://www.jr-eki.com/aptrain/naani/yosan/train.html", trainNumDistance: 1050, info: "アンパン列車で運転", - infogram: "" + infogram: "", }; //しまんと case "2002D": @@ -602,12 +618,12 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "しまんと", - trainIcon: "https://storage.haruk.in/s2700_smn.png", + img: "https://storage.haruk.in/s2700_smn.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/shimanto.html", trainNumDistance: 2000, info: "2700系で運転", - infogram: "" + infogram: "", }; //あしずり 2000 @@ -622,12 +638,12 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "あしずり", - trainIcon: `https://n8n.haruk.in/webhook/anpanman-pictures.png${trainGetText}`, + img: `https://n8n.haruk.in/webhook/anpanman-pictures.png${trainGetText}`, infoUrl: "https://www.jr-eki.com/aptrain/naani/first-generation/jikoku.html", trainNumDistance: 2070, info: "2000系で運転", - infogram: "" + infogram: "", }; //あしずり 2700 @@ -638,24 +654,24 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "あしずり", - trainIcon: "https://storage.haruk.in/s2700_asi.png", + img: "https://storage.haruk.in/s2700_asi.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/ashizuri.html", trainNumDistance: 2070, info: "2700系で運転", - infogram: "" + infogram: "", }; case "2072D": case "2083D": return { type: "LTDEXP", trainName: "あしずり", - trainIcon: "https://storage.haruk.in/s2700_asi.png", + img: "https://storage.haruk.in/s2700_asi.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/ashizuri.html", trainNumDistance: 2070, info: "2700系で運転", - infogram: "G" + infogram: "G", }; //剣山 @@ -669,12 +685,12 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "剣山", - trainIcon: "https://storage.haruk.in/s185tu.png", + img: "https://storage.haruk.in/s185tu.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/tsurugisan.html", trainNumDistance: 4000, info: "キハ185系で運転", - infogram: "" + infogram: "", }; //よしのがわトロッコ @@ -683,12 +699,12 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "よしのがわトロッコ", - trainIcon: "https://storage.haruk.in/s185to_ai.png", + img: "https://storage.haruk.in/s185to_ai.png", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/event_train/yoshino_torokko.html", trainNumDistance: null, info: "", - infogram: "" + infogram: "", }; //岡山高松アントロ @@ -700,12 +716,12 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "アンパンマントロッコ", - trainIcon: "https://storage.haruk.in/s32to4.png", + img: "https://storage.haruk.in/s32to4.png", infoUrl: "https://www.jr-eki.com/aptrain/naani/torokko_seto/jikoku.html", trainNumDistance: null, info: "", - infogram: "G" + infogram: "G", }; //伊予灘ものがたり @@ -714,22 +730,22 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "伊予灘ものがたり", - trainIcon: "https://storage.haruk.in/s185iyor.png", + img: "https://storage.haruk.in/s185iyor.png", infoUrl: "https://iyonadamonogatari.com/", trainNumDistance: null, info: "", - infogram: "G" + infogram: "G", }; case "8092D": case "8094D": return { type: "LTDEXP", trainName: "伊予灘ものがたり", - trainIcon: "https://storage.haruk.in/s185iyoy.png", + img: "https://storage.haruk.in/s185iyoy.png", infoUrl: "https://iyonadamonogatari.com/", trainNumDistance: null, info: "", - infogram: "G" + infogram: "G", }; //千年ものがたり @@ -738,11 +754,11 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "四国まんなか千年ものがたり", - trainIcon: "https://storage.haruk.in/s185mm1.png", + img: "https://storage.haruk.in/s185mm1.png", infoUrl: "https://www.jr-shikoku.co.jp/sennenmonogatari/", trainNumDistance: null, info: "", - infogram: "G" + infogram: "G", }; //夜明けものがたり @@ -753,67 +769,67 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "LTDEXP", trainName: "時代の夜明けのものがたり", - trainIcon: "https://storage.haruk.in/s185ym1.png", + img: "https://storage.haruk.in/s185ym1.png", infoUrl: "https://www.jr-shikoku.co.jp/yoakenomonogatari/index.html", trainNumDistance: null, info: "", - infogram: "G" + infogram: "G", }; case "9174M": return { type: "SPCL_Rapid", trainName: "マリンライナー94号", - trainIcon: "https://storage.haruk.in/s5001.png", - infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/marine.html", + img: "https://storage.haruk.in/s5001.png", + infoUrl: + "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/marine.html", trainNumDistance: null, info: "臨時列車 4/12,13,19のみ運転", - infogram: "G" + infogram: "G", }; case "9395D": return { type: "SPCL_Normal", trainName: "", - trainIcon: "https://storage.haruk.in/s1500.png", + img: "https://storage.haruk.in/s1500.png", infoUrl: null, trainNumDistance: null, info: "臨時列車 4/12,13,19のみ運転", - infogram: "" + infogram: "", + }; + case "9662D": + case "9665D": + return { + type: "SPCL_Normal", + trainName: "れんげ号", + img: "", + infoUrl: null, + trainNumDistance: null, + info: "臨時列車 4/29のみ運転", + infogram: "", + }; + case "9664D": + case "9663D": + return { + type: "SPCL_Normal", + trainName: "わらぐろ号", + img: "", + infoUrl: null, + trainNumDistance: null, + info: "臨時列車 4/29のみ運転", + infogram: "", }; - case "9662D": - case "9665D": - return { - type: "SPCL_Normal", - trainName: "れんげ号", - trainIcon: "", - infoUrl: null, - trainNumDistance: null, - info: "臨時列車 4/29のみ運転", - infogram: "" - }; - case "9664D": - case "9663D": - return { - type: "SPCL_Normal", - trainName: "わらぐろ号", - trainIcon: "", - infoUrl: null, - trainNumDistance: null, - info: "臨時列車 4/29のみ運転", - infogram: "" - }; default: - if(getJRF(TrainNumber) !== null){ + if (getJRF(TrainNumber) !== null) { return { type: "Freight", trainName: getJRF(TrainNumber), - trainIcon: "https://storage.haruk.in/ef210a.png", + img: "https://storage.haruk.in/ef210a.png", infoUrl: null, trainNumDistance: null, info: "", infogram: "", }; - } - else if ( + } else if ( new RegExp(/^4[1-9]\d\d[DM]$/).test(TrainNumber) || new RegExp(/^5[1-7]\d\d[DM]$/).test(TrainNumber) || new RegExp(/^3[2-9]\d\d[DM]$/).test(TrainNumber) @@ -821,38 +837,38 @@ export const customTrainDataDetector = (TrainNumber: string) => { return { type: "OneMan", trainName: "", - trainIcon: null, + img: null, infoUrl: null, trainNumDistance: null, info: null, - infogram: "" + infogram: "", }; else if ( new RegExp(/^[1-9]\d\d[DM]$/).test(TrainNumber) || new RegExp(/^1[26]\d\d[DM]$/).test(TrainNumber) || new RegExp(/^58\d\d[DM]$/).test(TrainNumber) || new RegExp(/^6\d\d\d[DM]$/).test(TrainNumber) - ){ - return { - type: "Normal", - trainName: "", - trainIcon: null, - infoUrl: null, - trainNumDistance: null, - info: null, - infogram: "" - }; - } else { - return { - type: "Other", - trainName: "", - trainIcon: null, - infoUrl: null, - trainNumDistance: null, - info: null, - infogram: "" - }; - } + ) { + return { + type: "Normal", + trainName: "", + img: null, + infoUrl: null, + trainNumDistance: null, + info: null, + infogram: "", + }; + } else { + return { + type: "Other", + trainName: "", + img: null, + infoUrl: null, + trainNumDistance: null, + info: null, + infogram: "", + }; + } } }; export const getJRF = (num: string) => { diff --git a/components/発車時刻表/EachData.tsx b/components/発車時刻表/EachData.tsx index 664fd8e..1e2f2dc 100644 --- a/components/発車時刻表/EachData.tsx +++ b/components/発車時刻表/EachData.tsx @@ -18,6 +18,7 @@ import { TrainPositionDataDelete } from "./LED_inside_Component/TrainPositionDat import { useStationList } from "../../stateBox/useStationList"; import useInterval from "@/lib/useInterval"; import dayjs from "dayjs"; +import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; type Props = { d: { @@ -45,6 +46,7 @@ export const EachData: FC = (props) => { } = props; const { currentTrain } = useCurrentTrain(); const { stationList } = useStationList(); + const { allCustonTrainData } = useAllTrainDiagram(); const openTrainInfo = (d: { train: string; lastStation: string; @@ -74,7 +76,10 @@ export const EachData: FC = (props) => { }; const getTrainDataFromCurrentTrain = (trainNum: string) => { - const customTrainData = customTrainDataDetector(d.train); + const customTrainData = customTrainDataDetector( + d.train, + allCustonTrainData + ); switch (customTrainData.type) { case "Normal": case "OneMan": @@ -122,21 +127,22 @@ export const EachData: FC = (props) => { const [isShow, setIsShow] = useState(true); const [isDepartureNow, setIsDepartureNow] = useState(false); - useEffect(()=>{ + useEffect(() => { const currentTime = dayjs(); - const trainTime = currentTime.set("hour", parseInt(d.time.split(":")[0])).set("minute", parseInt(d.time.split(":")[1])); + const trainTime = currentTime + .set("hour", parseInt(d.time.split(":")[0])) + .set("minute", parseInt(d.time.split(":")[1])); const diff = trainTime.diff(currentTime, "minute"); if (diff < 2) setIsDepartureNow(true); else setIsDepartureNow(false); - return()=>{ + return () => { setIsDepartureNow(false); setIsShow(true); - } - }, [d.time,currentTrainData]); - useInterval(()=>{ + }; + }, [d.time, currentTrainData]); + useInterval(() => { if (isDepartureNow) { - setIsShow(!isShow); - + setIsShow(!isShow); } }, 800); return ( @@ -172,7 +178,7 @@ export const EachData: FC = (props) => { opacity: isShow ? 1 : 0.5, }} onPress={() => openTrainInfo(d)} - key={ d.train + "-eachData" } + key={d.train + "-eachData"} > = (props) => { {!!isDepartureNow && ( - + )} {trainDescriptionSwitch && ( {}, + allCustonTrainData: [], }; const AllTrainDiagramContext = createContext(initialState); @@ -12,6 +13,7 @@ export const useAllTrainDiagram = () => useContext(AllTrainDiagramContext); export const AllTrainDiagramProvider = ({ children }) => { const [allTrainDiagram, setAllTrainDiagram] = useState(trainList); + const [allCustonTrainData, setAllCustonTrainData] = useState([]); // カスタム列車データ const [keyList, setKeyList] = useState(); // 第二要素 useEffect( () => allTrainDiagram && setKeyList(Object.keys(allTrainDiagram)), @@ -41,10 +43,26 @@ export const AllTrainDiagramProvider = ({ children }) => { }); }); }, []); + useEffect(() => { + // カスタム列車データの取得 + fetch("https://n8n.haruk.in/webhook/jr-shikoku-position-custom-datalist") + .then((res) => res.json()) + .then((res) => { + setAllCustonTrainData(res[0].data); + }) + .catch(() => { + alert("カスタム列車データの取得に失敗しました。"); + }); + }, []); return ( {children} From bb41118e39f273fa9a5359f0e9042ee163e8e6cf Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Sat, 5 Jul 2025 05:19:06 +0000 Subject: [PATCH 2/7] =?UTF-8?q?=E6=95=B0=E5=AD=97=E3=81=AE=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E3=82=84=E3=83=AA=E3=82=B9=E3=83=88=E3=81=AE=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E4=BD=8D=E7=BD=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/AllTrainDiagramView.js | 9 +++++++++ lib/webViewInjectjavascript.ts | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/components/AllTrainDiagramView.js b/components/AllTrainDiagramView.js index c426258..491f9cc 100644 --- a/components/AllTrainDiagramView.js +++ b/components/AllTrainDiagramView.js @@ -74,6 +74,7 @@ export default function AllTrainDiagramView() { return ( { if (useStationName) { @@ -93,6 +94,14 @@ export default function AllTrainDiagramView() { return d.includes(input); })} renderItem={({ item }) => } + ListEmptyComponent={ + + + 検索結果がありません。 + + + } + keyExtractor={(item) => item} //initialNumToRender={100} /> diff --git a/lib/webViewInjectjavascript.ts b/lib/webViewInjectjavascript.ts index 0858bb4..cc4076b 100644 --- a/lib/webViewInjectjavascript.ts +++ b/lib/webViewInjectjavascript.ts @@ -1266,7 +1266,7 @@ export const injectJavascriptData: InjectJavascriptData = ( isWanman = data.isWanman; if(data.trainName != ""){ trainName = data.trainName; - if(!isNaN(data.trainNumDistance)){ + if(data.trainNumDistance != null){ trainName += parseInt(列番データ.replace("M", "").replace("D", "")) - data.trainNumDistance+"号"; } } From 3488c5e8d5cfde69e253ef0e03bf3c303e873bc1 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Sat, 5 Jul 2025 05:33:55 +0000 Subject: [PATCH 3/7] =?UTF-8?q?=E3=82=A2=E3=82=A4=E3=82=B3=E3=83=B3?= =?UTF-8?q?=E3=81=8C=E8=A8=AD=E5=AE=9A=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=81=A6=E3=82=82=E3=82=A2=E3=83=89=E3=83=AC=E3=82=B9=E3=81=8C?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=81=95=E3=82=8C=E3=81=A6=E3=81=AA=E3=81=8B?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E3=82=89=E3=82=AF=E3=83=AA=E3=83=83=E3=82=AF?= =?UTF-8?q?=E3=81=A7=E3=81=8D=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/components/ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx b/components/ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx index 105eb0f..2612f7f 100644 --- a/components/ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx +++ b/components/ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx @@ -108,6 +108,7 @@ export const TrainIconStatus: FC = ({ data, navigate, from }) => { }); SheetManager.hide("EachTrainInfo"); }} + disabled={!address} > {move ? ( Date: Sat, 5 Jul 2025 07:47:44 +0000 Subject: [PATCH 4/7] =?UTF-8?q?=E3=81=8A=E6=B0=97=E3=81=AB=E5=85=A5?= =?UTF-8?q?=E3=82=8A=E3=83=AA=E3=82=B9=E3=83=88=E3=81=8B=E3=82=89=E3=81=AE?= =?UTF-8?q?=E3=82=B8=E3=83=A3=E3=83=B3=E3=83=97=E3=82=92=E5=85=A8=E3=81=A6?= =?UTF-8?q?=E3=81=AE=E9=A7=85=E3=81=A7=E5=88=A9=E7=94=A8=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/Apps/WebView.jsx | 44 +++++++++++++++++++++++++++---------- lib/getStationList.ts | 11 ++++++++++ 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/components/Apps/WebView.jsx b/components/Apps/WebView.jsx index 28e19dc..257d189 100644 --- a/components/Apps/WebView.jsx +++ b/components/Apps/WebView.jsx @@ -2,7 +2,13 @@ import React from "react"; import { Platform, LayoutAnimation } from "react-native"; import { WebView } from "react-native-webview"; -import { lineList, stationNamePair } from "../../lib/getStationList"; +import { + lineList, + lineList_LineWebID, + lineListPair, + stationIDPair, + stationNamePair, +} from "../../lib/getStationList"; import { checkDuplicateTrainData } from "../../lib/checkDuplicateTrainData"; import { useFavoriteStation } from "../../stateBox/useFavoriteStation"; import { useCurrentTrain } from "../../stateBox/useCurrentTrain"; @@ -129,19 +135,35 @@ export const AppsWebView = ({ openStationACFromEachTrainInfo }) => { const onLoadEnd = () => { if (once) return () => {}; if (!stationData) return () => {}; + if (!originalStationList) return () => {}; if (favoriteStation.length < 1) return () => {}; - 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; + const bootStationList = []; + Object.keys(originalStationList).forEach((d) => { + let findNearStations = false; + originalStationList[d].forEach((x) => { + let lineName = lineList_LineWebID[d]; + if (findNearStations) { + if (x.MyStation){ + bootStationList.push({ line: lineName, station: x }); + findNearStations = false; + } + return; + } + if (x.StationNumber == favoriteStation[0][0].StationNumber) { + console.log(originalStationList[d]); + if (!x.MyStation) findNearStations = true; + else bootStationList.push({ line: lineName, station: x }); + } }); - return returnData[0]; - }; - const lineName = getStationLine(favoriteStation[0][0]); + if (favoriteStation[0].StationNumber == "M12") { + bootStationList.push({ + line: "seto", + station: { Station_JP: "児島", MyStation: "0" }, + }); + } + }); webview.current?.injectJavaScript( - `MoveDisplayStation('${lineName}_${favoriteStation[0][0].MyStation}_${favoriteStation[0][0].Station_JP}')` + `MoveDisplayStation('${bootStationList[0].line}_${bootStationList[0].station.MyStation}_${bootStationList[0].station.Station_JP}')` ); once = true; }; diff --git a/lib/getStationList.ts b/lib/getStationList.ts index 1a851f3..796e893 100644 --- a/lib/getStationList.ts +++ b/lib/getStationList.ts @@ -40,6 +40,17 @@ export const lineListPair = { N: "鳴門線(池谷-鳴門間)[N]", M: "瀬戸大橋線(児島-宇多津間)[M]", }; +export const lineList_LineWebID = { + "予讃線(高松-松山間)[Y]" : "yosan", + "予讃線(松山-宇和島間)[U]" : "uwajima", + "予讃線/愛ある伊予灘線(向井原-伊予大洲間)[S]" : "uwajima2", + "土讃線(多度津-高知間)[D]" : "dosan", + "土讃線(高知-窪川間)[K]" : "dosan2", + "高徳線(高松-徳島間)[T]" : "koutoku", + "徳島線(徳島-阿波池田間)[B]" : "tokushima", + "鳴門線(池谷-鳴門間)[N]" : "naruto", + "瀬戸大橋線(児島-宇多津間)[M]" : "seto", +}; export const getStationList2 = async () => { return { yosan, From 65123424a34d6511a09a818b583f12292c8e3bb2 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Sat, 5 Jul 2025 07:57:55 +0000 Subject: [PATCH 5/7] =?UTF-8?q?=E9=A7=85=E3=81=B8=E3=81=AE=E7=A7=BB?= =?UTF-8?q?=E5=8B=95=E3=82=B9=E3=82=AF=E3=83=AA=E3=83=97=E3=83=88=E3=82=92?= =?UTF-8?q?hooks=E3=81=AB=E7=A7=BB=E5=8B=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/Apps/WebView.jsx | 33 ++--------------- stateBox/useStationList.tsx | 74 +++++++++++++++++++++++++++++-------- 2 files changed, 63 insertions(+), 44 deletions(-) diff --git a/components/Apps/WebView.jsx b/components/Apps/WebView.jsx index 257d189..13d0e13 100644 --- a/components/Apps/WebView.jsx +++ b/components/Apps/WebView.jsx @@ -23,7 +23,7 @@ export const AppsWebView = ({ openStationACFromEachTrainInfo }) => { const { navigate } = useNavigation(); const { favoriteStation } = useFavoriteStation(); const { isLandscape } = useDeviceOrientationChange(); - const { originalStationList, stationList } = useStationList(); + const { originalStationList, stationList, getInjectJavascriptAddress } = useStationList(); const { setSelectedLine, mapsStationData: stationData, @@ -137,34 +137,9 @@ export const AppsWebView = ({ openStationACFromEachTrainInfo }) => { if (!stationData) return () => {}; if (!originalStationList) return () => {}; if (favoriteStation.length < 1) return () => {}; - const bootStationList = []; - Object.keys(originalStationList).forEach((d) => { - let findNearStations = false; - originalStationList[d].forEach((x) => { - let lineName = lineList_LineWebID[d]; - if (findNearStations) { - if (x.MyStation){ - bootStationList.push({ line: lineName, station: x }); - findNearStations = false; - } - return; - } - if (x.StationNumber == favoriteStation[0][0].StationNumber) { - console.log(originalStationList[d]); - if (!x.MyStation) findNearStations = true; - else bootStationList.push({ line: lineName, station: x }); - } - }); - if (favoriteStation[0].StationNumber == "M12") { - bootStationList.push({ - line: "seto", - station: { Station_JP: "児島", MyStation: "0" }, - }); - } - }); - webview.current?.injectJavaScript( - `MoveDisplayStation('${bootStationList[0].line}_${bootStationList[0].station.MyStation}_${bootStationList[0].station.Station_JP}')` - ); + const string = getInjectJavascriptAddress(favoriteStation[0][0].StationNumber); + if (!string) return () => {}; + webview.current?.injectJavaScript(string); once = true; }; diff --git a/stateBox/useStationList.tsx b/stateBox/useStationList.tsx index 97eac6a..aae75b8 100644 --- a/stateBox/useStationList.tsx +++ b/stateBox/useStationList.tsx @@ -5,7 +5,11 @@ import React, { useEffect, FC, } from "react"; -import { lineList, getStationList } from "../lib/getStationList"; +import { + lineList, + getStationList, + lineList_LineWebID, +} from "../lib/getStationList"; type initialStateType = { originalStationList: any[][]; @@ -13,6 +17,7 @@ type initialStateType = { getStationDataFromName: (id: string) => any[]; getStationDataFromId: (id: string) => any[]; stationList: any[]; + getInjectJavascriptAddress: (StationNumber: string) => string; }; const initialState = { originalStationList: [[]], @@ -20,6 +25,7 @@ const initialState = { getStationDataFromName: () => [], getStationDataFromId: () => [], stationList: [], + getInjectJavascriptAddress: (StationNumber: string) => "", }; const StationListContext = createContext(initialState); @@ -40,7 +46,10 @@ export const StationListProvider: FC = ({ children }) => { Object.keys(originalStationList).forEach((key) => { originalStationList[key].forEach((station) => { if (station.StationNumber === id) { - returnArray = [...returnArray, ...getStationDataFromName(station.Station_JP)]; + returnArray = [ + ...returnArray, + ...getStationDataFromName(station.Station_JP), + ]; } }); }); @@ -58,21 +67,56 @@ export const StationListProvider: FC = ({ children }) => { return returnArray; }; const [stationList, setStationList] = useState([[]]); - useEffect(()=>{ - if(originalStationList.length === 0) return; - const stationList = - lineList.map((d) => - originalStationList[d].map((a) => ({ - StationNumber: a.StationNumber, - StationName: a.Station_JP, - })) - ); - setStationList(stationList); - },[originalStationList]) - + useEffect(() => { + if (originalStationList.length === 0) return; + const stationList = lineList.map((d) => + originalStationList[d].map((a) => ({ + StationNumber: a.StationNumber, + StationName: a.Station_JP, + })) + ); + setStationList(stationList); + }, [originalStationList]); + + const getInjectJavascriptAddress = (StationNumber: string) => { + const bootStationList = []; + Object.keys(originalStationList).forEach((d) => { + let findNearStations = false; + originalStationList[d].forEach((x) => { + let lineName = lineList_LineWebID[d]; + if (findNearStations) { + if (x.MyStation) { + bootStationList.push({ line: lineName, station: x }); + findNearStations = false; + } + return; + } + if (x.StationNumber == StationNumber) { + console.log(originalStationList[d]); + if (!x.MyStation) findNearStations = true; + else bootStationList.push({ line: lineName, station: x }); + } + }); + if (StationNumber == "M12") { + bootStationList.push({ + line: "seto", + station: { Station_JP: "児島", MyStation: "0" }, + }); + } + }); + return `MoveDisplayStation('${bootStationList[0].line}_${bootStationList[0].station.MyStation}_${bootStationList[0].station.Station_JP}')`; + }; + return ( {children} From 218f9d509393bdd4de37ec4f1137a6dd0b7f1aa7 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Sat, 5 Jul 2025 08:48:16 +0000 Subject: [PATCH 6/7] =?UTF-8?q?=E5=85=A8=E9=A7=85=E5=9C=B0=E5=9B=B3?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/TrainMenu/MapPin.tsx | 11 ++++++----- components/trainMenu.js | 18 ++++++++---------- lib/getStationList.ts | 5 +++++ stateBox/useStationList.tsx | 2 +- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/components/TrainMenu/MapPin.tsx b/components/TrainMenu/MapPin.tsx index f679e6b..5d4eef2 100644 --- a/components/TrainMenu/MapPin.tsx +++ b/components/TrainMenu/MapPin.tsx @@ -1,6 +1,7 @@ import React, { FC } from "react"; import { Marker } from "react-native-maps"; import { useNavigation } from "@react-navigation/native"; +import { useStationList } from "@/stateBox/useStationList"; type Props = { index: number; indexBase: number; @@ -13,7 +14,8 @@ type Props = { export const MapPin: FC = (props) => { const { index, indexBase, latlng, D, d, navigate, webview } = props; - const {goBack} = useNavigation(); + const { goBack } = useNavigation(); + const { getInjectJavascriptAddress } = useStationList(); return ( = (props) => { longitude: parseFloat(latlng[1]), }} onPress={() => { - webview.current?.injectJavaScript( - `MoveDisplayStation('${d}_${D.MyStation}_${D.Station_JP}'); - document.getElementById("disp").insertAdjacentHTML("afterbegin", "
");` - ); + const address = getInjectJavascriptAddress(D.StationNumber); + if (!address) return; + webview.current?.injectJavaScript(address); if (navigate) goBack(); }} image={require("../../assets/reccha-small.png")} diff --git a/components/trainMenu.js b/components/trainMenu.js index ad3ad94..746084f 100644 --- a/components/trainMenu.js +++ b/components/trainMenu.js @@ -4,12 +4,13 @@ import MapView from "react-native-maps"; import { useCurrentTrain } from "../stateBox/useCurrentTrain"; import { useNavigation } from "@react-navigation/native"; import lineColorList from "../assets/originData/lineColorList"; -import { lineListPair, stationIDPair } from "../lib/getStationList"; +import { lineList_LineWebID, lineListPair, stationIDPair } from "../lib/getStationList"; import { SheetManager } from "react-native-actions-sheet"; import { useTrainMenu } from "../stateBox/useTrainMenu"; import { MapPin } from "./TrainMenu/MapPin"; import { UsefulBox } from "./TrainMenu/UsefulBox"; import { MapsButton } from "./TrainMenu/MapsButton"; +import { useStationList } from "@/stateBox/useStationList"; export default function TrainMenu({ style }) { const { webview } = useCurrentTrain(); const mapRef = useRef(); @@ -20,22 +21,19 @@ export default function TrainMenu({ style }) { setSelectedLine, mapsStationData: stationData, } = useTrainMenu(); + const { originalStationList } = useStationList(); useEffect(() => { const stationPinData = []; - Object.keys(stationData).forEach((d, indexBase) => { - stationData[d].forEach((D, index) => { - if (!D.StationMap) return null; - if (selectedLine && selectedLine != d) return; - const latlng = D.StationMap.replace( - "https://www.google.co.jp/maps/place/", - "" - ).split(","); + Object.keys(originalStationList).forEach((d, indexBase) => { + originalStationList[d].forEach((D, index) => { + if (selectedLine && selectedLine != lineList_LineWebID[d]) return; + const latlng = [D.lat,D.lng]; if (latlng.length == 0) return null; stationPinData.push({ D, d, latlng, indexBase: 0, index }); }); }); setStationPin(stationPinData); - }, [stationData, selectedLine]); + }, [originalStationList, selectedLine]); useLayoutEffect(() => { mapRef.current.fitToCoordinates( stationPin.map(({ latlng }) => ({ diff --git a/lib/getStationList.ts b/lib/getStationList.ts index 796e893..02608df 100644 --- a/lib/getStationList.ts +++ b/lib/getStationList.ts @@ -178,6 +178,11 @@ export const getStationList = async () => { 予讃線, stationList["日英対応表"] ); + stationList["予讃線(松山-宇和島間)[U]"] = addStationPosition( + concatBetweenStations(stationList["予讃線(松山-宇和島間)[U]"]), + 内子線, + stationList["日英対応表"] + ); stationList["予讃線/愛ある伊予灘線(向井原-伊予大洲間)[S]"] = addStationPosition( concatBetweenStations( diff --git a/stateBox/useStationList.tsx b/stateBox/useStationList.tsx index aae75b8..4a0d10a 100644 --- a/stateBox/useStationList.tsx +++ b/stateBox/useStationList.tsx @@ -104,7 +104,7 @@ export const StationListProvider: FC = ({ children }) => { }); } }); - return `MoveDisplayStation('${bootStationList[0].line}_${bootStationList[0].station.MyStation}_${bootStationList[0].station.Station_JP}')`; + return `MoveDisplayStation('${bootStationList[0].line}_${bootStationList[0].station.MyStation}_${bootStationList[0].station.Station_JP}');document.getElementById("disp").insertAdjacentHTML("afterbegin", "
");`; }; return ( From 012544beebf66d416d7a93f252e599ce201bcb47 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Sat, 5 Jul 2025 09:43:44 +0000 Subject: [PATCH 7/7] =?UTF-8?q?=E9=A7=85=E3=81=AE=E5=9C=B0=E5=9B=B3?= =?UTF-8?q?=E6=83=85=E5=A0=B1=E3=82=92=E5=85=A8=E9=96=8B=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/ActionSheetComponents/StationDeteilView.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/components/ActionSheetComponents/StationDeteilView.js b/components/ActionSheetComponents/StationDeteilView.js index a75c2e2..b4a4626 100644 --- a/components/ActionSheetComponents/StationDeteilView.js +++ b/components/ActionSheetComponents/StationDeteilView.js @@ -135,9 +135,7 @@ export const StationDeteilView = (props) => { useShow={useShow} /> )} - {!currentStation[0].StationMap || ( - - )} + {!trainBus || (