Compare commits

..

No commits in common. "715c0ddf9461bc55185cb421a789e10df2079b7b" and "002c60baa1dad811892257a61a63fe6890507e83" have entirely different histories.

16 changed files with 383 additions and 445 deletions

16
Top.js
View File

@ -32,12 +32,20 @@ export const Top = () => {
const goToTrainMenu = () => { const goToTrainMenu = () => {
if (Platform.OS === "web") { if (Platform.OS === "web") {
Linking.openURL("https://train.jr-shikoku.co.jp/"); Linking.openURL("https://train.jr-shikoku.co.jp/");
setTimeout(() => navigate("topMenu", { screen: "menu" }), 100); setTimeout(() => {
navigate("topMenu", { screen: "menu" });
}, 100);
return; return;
} }
if (!isFocused()) navigate("positions", { screen: "Apps" }); if (!isFocused()) {
else if (mapSwitch == "true") navigate("positions", { screen: "trainMenu" }); navigate("positions", { screen: "Apps" });
else webview.current?.injectJavaScript(`AccordionClassEvent()`); }
if (mapSwitch == "true") {
navigate("positions", { screen: "trainMenu" });
} else {
webview.current?.injectJavaScript(`AccordionClassEvent()`);
}
return; return;
}; };

View File

@ -923,13 +923,7 @@
"585D":"徳島,発,22:55#阿波富田,発,22:58#二軒屋,発,23:01#文化の森,発,23:03#地蔵橋,発,23:07#中田,発,23:11#南小松島,発,23:15#阿波赤石,発,23:19#立江,発,23:22#羽ノ浦,発,23:26#西原,発,23:29#阿波中島,発,23:32#阿南,着,23:36#", "585D":"徳島,発,22:55#阿波富田,発,22:58#二軒屋,発,23:01#文化の森,発,23:03#地蔵橋,発,23:07#中田,発,23:11#南小松島,発,23:15#阿波赤石,発,23:19#立江,発,23:22#羽ノ浦,発,23:26#西原,発,23:29#阿波中島,発,23:32#阿南,着,23:36#",
// 臨時列車 // 臨時列車
"9395D":"臨時列車,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250314_20250413_tomorrow_together_worldtour.pdf#高松,発,22:10#昭和町,発,22:13#栗林公園北口,発,22:16#栗林,発,22:19#木太町,発,22:23#屋島,発,22:36#古高松南,発,22:39#八栗口,発,22:43#讃岐牟礼,発,22:45#志度,発,22:49#オレンジタウン,発,22:53#造田,発,22:57#神前,発,23:00#讃岐津田,発,23:06#鶴羽,発,23:10#丹生,発,23:15#三本松,着,23:18#", "9395D":"WEST LIVE TOUR 2025臨,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250228_20250323_west-live-tour-2025.pdf#高松,発,22:10#昭和町,発,22:12#栗林公園北口,発,22:15#栗林,発,22:18#木太町,発,22:22#屋島,発,22:26#古高松南,発,22:38#八栗口,発,22:41#讃岐牟礼,発,22:44#志度,発,22:48#オレンジタウン,発,22:52#造田,発,22:56#神前,発,22:59#讃岐津田,発,23:05#鶴羽,発,23:09#丹生,発,23:14#三本松,着,23:18#",
"9174M":"臨時列車,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250314_20250413_tomorrow_together_worldtour.pdf#高松,発,22:00#坂出,発,22:16#児島,発,22:39#茶屋町,発,22:48#早島,発,22:55#妹尾,発,22:59#岡山,着,23:06#", "9174M":"WEST LIVE TOUR 2025臨,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250228_20250323_west-live-tour-2025.pdf#高松,発,22:00#坂出,発,22:16#児島,発,22:39#茶屋町,発,22:55#早島,発,22:59#妹尾,発,23:03#岡山,着,23:12#",
// わらぐろ号/れんげ号
"9662D":"宇和れんげまつり臨時列車,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250124_20250629_rinji_spring.pdf#宇和島,発,10:00#北宇和島,発,10:03#高光,発,10:07#伊予吉田,発,10:21#立間,発,10:50#下宇和,発,10:36#卯之町,発,10:39#上宇和,発,10:42#伊予石城,発,10:46#双岩,発,10:53#八幡浜,着,10:58#",
"9664D":"宇和れんげまつり臨時列車,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250124_20250629_rinji_spring.pdf#卯之町,発,11:18#上宇和,発,11:21#伊予石城,発,11:25#双岩,発,11:34#八幡浜,着,11:39#",
"9663D":"宇和れんげまつり臨時列車,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250124_20250629_rinji_spring.pdf#八幡浜,発,10:07#双岩,発,10:16#伊予石城,発,10:23#上宇和,発,10:27#卯之町,着,10:30#",
"9665D":"宇和れんげまつり臨時列車,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250124_20250629_rinji_spring.pdf#八幡浜,発,13:38#双岩,発,13:45#伊予石城,発,13:52#上宇和,発,13:56#卯之町,発,14:07#下宇和,発,14:10#立間,発,14:18#伊予吉田,発,14:25#高光,発,14:31#北宇和島,発,14:35#宇和島,着,14:37#",
} }

View File

@ -1,4 +1,4 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useMemo, useRef, useState } from "react";
import { import {
View, View,
Text, Text,
@ -28,6 +28,8 @@ import { ShortHeader } from "./EachTrainInfo/ShortHeader";
import { ScrollStickyContent } from "./EachTrainInfo/ScrollStickyContent"; import { ScrollStickyContent } from "./EachTrainInfo/ScrollStickyContent";
import { getStationID } from "../../lib/eachTrainInfoCoreLib/getStationData"; import { getStationID } from "../../lib/eachTrainInfoCoreLib/getStationData";
import { findReversalPoints } from "../../lib/eachTrainInfoCoreLib/findReversalPoints"; import { findReversalPoints } from "../../lib/eachTrainInfoCoreLib/findReversalPoints";
import { migrateTrainName } from "../../lib/eachTrainInfoCoreLib/migrateTrainName";
import { getType } from "../../lib/eachTrainInfoCoreLib/getType";
import { searchSpecialTrain } from "../../lib/eachTrainInfoCoreLib/searchSpecialTrain"; import { searchSpecialTrain } from "../../lib/eachTrainInfoCoreLib/searchSpecialTrain";
import { openBackTrainInfo } from "../../lib/eachTrainInfoCoreLib/openBackTrainInfo"; import { openBackTrainInfo } from "../../lib/eachTrainInfoCoreLib/openBackTrainInfo";
import { ShowSpecialTrain } from "./EachTrainInfo/ShowSpecialTrain"; import { ShowSpecialTrain } from "./EachTrainInfo/ShowSpecialTrain";
@ -43,11 +45,14 @@ export const EachTrainInfoCore = ({
from, from,
navigate, navigate,
}) => { }) => {
// const [actionSheetHorizonalScroll, setActionSheetHorizonalScroll] = useState(false);
const { currentTrain } = useCurrentTrain(); const { currentTrain } = useCurrentTrain();
const { originalStationList, stationList } = useStationList(); const { originalStationList, stationList } = useStationList();
const { setTrainInfo } = useTrainMenu(); const { setTrainInfo } = useTrainMenu();
const [currentTrainData, setCurrentTrainData] = useState(); const [currentTrainData, setCurrentTrainData] = useState();
// const [actionSheetHorizonalScroll, setActionSheetHorizonalScroll] = useState(false);
useEffect(() => { useEffect(() => {
if (!currentTrain.length) return; if (!currentTrain.length) return;
setCurrentTrainData( setCurrentTrainData(
@ -191,6 +196,29 @@ export const EachTrainInfoCore = ({
} }
setIsJumped(true); setIsJumped(true);
}, [points]); }, [points]);
const trainName = useMemo(() => {
if (!data.limited) return "";
const limitedArray = data.limited.split(":");
const type = getType(limitedArray[0]);
switch (true) {
case !!limitedArray[1]:
// 特急の場合は、列車名を取得
return type + migrateTrainName(limitedArray[1]);
case trainData.length == 0:
// 特急以外の場合は、列車番号を取得
return type;
default:
// 行先がある場合は、行先を取得
return (
type +
migrateTrainName(
trainData[trainData.length - 1].split(",")[0] + "行き"
)
);
}
}, [data.limited, trainData]);
const { height } = useWindowDimensions(); const { height } = useWindowDimensions();
const { isLandscape } = useDeviceOrientationChange(); const { isLandscape } = useDeviceOrientationChange();
const scrollHandlers = actionSheetRef const scrollHandlers = actionSheetRef
@ -298,7 +326,8 @@ export const EachTrainInfoCore = ({
}); });
const currentPos = currentPosID.filter((d) => d != false)[0]; const currentPos = currentPosID.filter((d) => d != false)[0];
if (currentPos) { if (currentPos) {
setCurrentPosition(direction == 0 ? currentPos.reverse() : currentPos); if (direction == 0) setCurrentPosition(currentPos.reverse());
else setCurrentPosition(currentPos);
} else if (direction == 0) { } else if (direction == 0) {
setCurrentPosition([ setCurrentPosition([
getStationID(pos[1], stationList), getStationID(pos[1], stationList),

View File

@ -57,31 +57,6 @@ export const TrainIconStatus: FC<Props> = ({ data, navigate, from }) => {
} }
}); });
break; 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]); }, [data.trainNum]);
const [move, setMove] = useState(true); const [move, setMove] = useState(true);

View File

@ -10,7 +10,6 @@ import {
BackHandler, BackHandler,
} from "react-native"; } from "react-native";
import { Ionicons, MaterialCommunityIcons } from "@expo/vector-icons"; import { Ionicons, MaterialCommunityIcons } from "@expo/vector-icons";
import dayjs from "dayjs";
import ActionSheet, { import ActionSheet, {
SheetManager, SheetManager,
useScrollHandlers, useScrollHandlers,
@ -20,11 +19,9 @@ import { useSafeAreaInsets } from "react-native-safe-area-context";
import ViewShot from "react-native-view-shot"; import ViewShot from "react-native-view-shot";
import * as Sharing from "expo-sharing"; import * as Sharing from "expo-sharing";
import { useTrainDelayData } from "../../stateBox/useTrainDelayData"; import { useTrainDelayData } from "../../stateBox/useTrainDelayData";
import { BottomButtons } from "./JRSTraInfo/BottomButtons";
export const JRSTraInfo = () => { export const JRSTraInfo = () => {
const { getTime, delayData, loadingDelayData, setLoadingDelayData } = const { getTime, delayData, loadingDelayData, setLoadingDelayData } =
useTrainDelayData(); useTrainDelayData();
const timeData = dayjs(getTime).format("HH:mm");
const actionSheetRef = useRef(null); const actionSheetRef = useRef(null);
const scrollHandlers = useScrollHandlers("scrollview-1", actionSheetRef); const scrollHandlers = useScrollHandlers("scrollview-1", actionSheetRef);
const insets = useSafeAreaInsets(); const insets = useSafeAreaInsets();
@ -49,7 +46,11 @@ export const JRSTraInfo = () => {
ref={actionSheetRef} ref={actionSheetRef}
isModal={Platform.OS == "ios"} isModal={Platform.OS == "ios"}
containerStyle={ containerStyle={
Platform.OS == "android" ? { paddingBottom: insets.bottom } : {} Platform.OS == "android"
? {
paddingBottom: insets.bottom,
}
: {}
} }
useBottomSafeAreaPadding={Platform.OS == "android"} useBottomSafeAreaPadding={Platform.OS == "android"}
> >
@ -89,8 +90,15 @@ export const JRSTraInfo = () => {
列車遅延速報EX 列車遅延速報EX
</Text> </Text>
<View style={{ flex: 1 }} /> <View style={{ flex: 1 }} />
{/* <TouchableOpacity style={{padding:10,backgroundColor:"white",alignContent:"center"}} onPress={() => {doFetch()}}>
<Text style={{fontSize:20,fontWeight:"bold",color:"#0099CC"}}>最新の情報へ更新</Text>
</TouchableOpacity> */}
<Text style={{ fontSize: 30, fontWeight: "bold", color: "white" }}> <Text style={{ fontSize: 30, fontWeight: "bold", color: "white" }}>
{timeData} {getTime
? getTime.toLocaleTimeString("ja-JP").split(":")[0] +
":" +
getTime.toLocaleTimeString("ja-JP").split(":")[1]
: NaN}{" "}
</Text> </Text>
<Ionicons <Ionicons
name="reload" name="reload"
@ -148,7 +156,57 @@ export const JRSTraInfo = () => {
</View> </View>
</ScrollView> </ScrollView>
</ViewShot> </ViewShot>
<BottomButtons onCapture={onCapture} /> <View
style={{
padding: 10,
backgroundColor: "#0099CC",
flexDirection: "row",
justifyContent: "space-between",
}}
>
<TouchableOpacity
style={{
padding: 10,
flexDirection: "row",
borderColor: "white",
borderWidth: 1,
margin: 10,
borderRadius: 5,
alignItems: "center",
backgroundColor: "#0099CC",
flex: 1,
}}
onPress={() =>
Linking.openURL("https://mstdn.y-zu.org/@JRSTraInfoEX")
}
>
<MaterialCommunityIcons name="mastodon" color="white" size={30} />
<View style={{ flex: 1 }} />
<Text style={{ fontSize: 25, fontWeight: "bold", color: "white" }}>
MastodonBOT
</Text>
<View style={{ flex: 1 }} />
</TouchableOpacity>
<TouchableOpacity
style={{
padding: 10,
flexDirection: "row",
borderColor: "white",
borderWidth: 1,
margin: 10,
borderRadius: 5,
alignItems: "center",
backgroundColor: "#0099CC",
}}
onPress={onCapture}
>
<MaterialCommunityIcons
name="share-variant"
color="white"
size={30}
/>
</TouchableOpacity>
</View>
</View> </View>
</ActionSheet> </ActionSheet>
); );

View File

@ -1,49 +0,0 @@
import React, { CSSProperties, FC } from "react";
import {
View,
Text,
TouchableOpacity,
Linking,
StyleProp,
ViewStyle,
} from "react-native";
import { MaterialCommunityIcons } from "@expo/vector-icons";
const styles: StyleProp<ViewStyle> = {
padding: 10,
flexDirection: "row",
borderColor: "white",
borderWidth: 1,
margin: 10,
borderRadius: 5,
alignItems: "center",
backgroundColor: "#0099CC",
};
export const BottomButtons: FC<{ onCapture: () => void }> = ({ onCapture }) => {
return (
<View
style={{
padding: 10,
backgroundColor: "#0099CC",
flexDirection: "row",
justifyContent: "space-between",
}}
>
<TouchableOpacity
style={{ ...styles, flex: 1 }}
onPress={() => Linking.openURL("https://mstdn.y-zu.org/@JRSTraInfoEX")}
>
<MaterialCommunityIcons name="mastodon" color="white" size={30} />
<View style={{ flex: 1 }} />
<Text style={{ fontSize: 25, fontWeight: "bold", color: "white" }}>
MastodonBOT
</Text>
<View style={{ flex: 1 }} />
</TouchableOpacity>
<TouchableOpacity style={styles} onPress={onCapture}>
<MaterialCommunityIcons name="share-variant" color="white" size={30} />
</TouchableOpacity>
</View>
);
};

View File

@ -18,23 +18,24 @@ import { widthPercentageToDP as wp } from "react-native-responsive-screen";
import { getPDFViewURL } from "../../lib/getPdfViewURL"; import { getPDFViewURL } from "../../lib/getPdfViewURL";
import { useBusAndTrainData } from "../../stateBox/useBusAndTrainData"; import { useBusAndTrainData } from "../../stateBox/useBusAndTrainData";
import { AS } from "../../storageControl"; import { AS } from "../../storageControl";
import { StationMapButton } from "./StationDeteilView/StationMapButton";
import { TrainBusButton } from "./StationDeteilView/TrainBusButton";
import { 駅構内図 } from "./StationDeteilView/StationInsideMapButton";
import { WebSiteButton } from "./StationDeteilView/WebSiteButton";
import { StationTimeTableButton } from "./StationDeteilView/StationTimeTableButton";
export const StationDeteilView = (props) => { export const StationDeteilView = (props) => {
if (!props.payload) return <></>; if (!props.payload) return <></>;
const { currentStation, navigate, onExit, goTo, useShow } = props.payload; const {
currentStation,
navigate,
onExit,
goTo,
useShow,
} = props.payload;
const { busAndTrainData } = useBusAndTrainData(); const { busAndTrainData } = useBusAndTrainData();
const [trainBus, setTrainBus] = useState(); const [trainBus, setTrainBus] = useState();
useEffect(() => { useEffect(() => {
if (!currentStation) return () => {}; if (!currentStation) return () => {};
const data = busAndTrainData.filter((d) => const data = busAndTrainData.filter((d) => {
d.name === currentStation[0].Station_JP return d.name === currentStation[0].Station_JP;
); });
if (data.length == 0) { if (data.length == 0) {
setTrainBus(); setTrainBus();
} }
@ -89,7 +90,12 @@ export const StationDeteilView = (props) => {
</View> </View>
<View> <View>
{currentStation && ( {currentStation && (
<View style={{ margin: 10, marginHorizontal: wp("10%") }}> <View
style={{
margin: 10,
marginHorizontal: wp("10%"),
}}
>
<Sign <Sign
currentStation={currentStation} currentStation={currentStation}
oP={() => { oP={() => {
@ -109,51 +115,102 @@ export const StationDeteilView = (props) => {
{currentStation && {currentStation &&
currentStation[0].JrHpUrl && currentStation[0].JrHpUrl &&
currentStation[0].StationNumber != "M12" && ( currentStation[0].StationNumber != "M12" && (
<駅構内図 //児島例外/ <駅構内図 //高松/阿波池田&後免&須崎kounai.png児島例外/
navigate={navigate} oP={() => {
goTo={goTo} navigate("howto", {
useShow={useShow} info:
address={currentStation[0].JrHpUrl} currentStation[0].JrHpUrl.replace("/index.html", "/") +
onExit={onExit} "/kounai_map.html",
goTo,
useShow,
});
onExit();
}}
oLP={() => {
Linking.openURL(
currentStation[0].JrHpUrl.replace("/index.html", "/") +
"/kounai_map.html"
);
}}
uri={currentStation[0].JrHpUrl.replace("/index.html", "/")}
/> />
)} )}
{currentStation && ( {currentStation && (
<View style={{ flexDirection: "row" }}> <View style={{ flexDirection: "row" }}>
{!currentStation[0].JrHpUrl || ( {!currentStation[0].JrHpUrl || (
<WebSiteButton <TicketBox
navigate={navigate} backgroundColor={"#AD7FA8"}
info={currentStation[0].JrHpUrl} icon={<Foundation name="web" color="white" size={50} />}
goTo={goTo} flex={1}
useShow={useShow} onPressButton={() => {
onExit={onExit}
/>
)}
{!currentStation[0].StationTimeTable || (
<StationTimeTableButton
info={info}
address={currentStation[0].StationTimeTable}
usePDFView={usePDFView}
navigate={navigate}
onExit={onExit}
goTo={goTo}
useShow={useShow}
/>
)}
{!currentStation[0].StationMap || (
<StationMapButton stationMap={currentStation[0].StationMap} />
)}
{!trainBus || (
<TrainBusButton
address={trainBus.address}
press={() => {
navigate("howto", { navigate("howto", {
info: trainBus.address, info: currentStation[0].JrHpUrl,
goTo, goTo,
useShow, useShow,
}); });
onExit(); onExit();
}} }}
/> onLongPressButton={() =>
Linking.openURL(currentStation[0].JrHpUrl)
}
>
web
</TicketBox>
)}
{!currentStation[0].StationTimeTable || (
<TicketBox
backgroundColor={"#8F5902"}
icon={<FontAwesome name="table" color="white" size={50} />}
flex={1}
onPressButton={() => {
usePDFView == "true"
? Linking.openURL(currentStation[0].StationTimeTable)
: navigate("howto", {
info,
goTo,
useShow,
});
onExit();
}}
onLongPressButton={() =>
Linking.openURL(currentStation[0].StationTimeTable)
}
>
時刻表
</TicketBox>
)}
{!currentStation[0].StationMap || (
<TicketBox
backgroundColor={"#888A85"}
icon={<Ionicons name="map" color="white" size={50} />}
flex={1}
onPressButton={() =>
Linking.openURL(currentStation[0].StationMap)
}
>
Map
</TicketBox>
)}
{!trainBus || (
<TicketBox
backgroundColor={"#CE5C00"}
icon={<Ionicons name="bus" color="white" size={50} />}
flex={1}
onPressButton={() => {
navigate("howto", {
info: trainBus.address,
goTo,
useShow,
});
onExit();
}}
onLongPressButton={() => Linking.openURL(trainBus.address)}
>
並行バス
</TicketBox>
)} )}
</View> </View>
)} )}
@ -163,6 +220,67 @@ export const StationDeteilView = (props) => {
); );
}; };
const 駅構内図 = (props) => {
const [open, setOpen] = useState(false);
return (
<>
<TouchableOpacity
style={{
height: 50,
backgroundColor: "#888A85",
flexDirection: "column",
alignContent: "center",
alignItems: "center",
margin: 2,
}}
onPress={props.oP}
onLongPress={props.oLP}
//onPress={() => setOpen(!open)}
>
<View style={{ flex: 1 }} />
<Text
style={{
color: "white",
textAlign: "center",
textAlignVertical: "center",
flex: 1,
}}
>
{open ? "駅構内図を非表示" : "駅構内図を表示"}
</Text>
<View style={{ flex: 1 }} />
</TouchableOpacity>
<View>
{open && (
<>
<AutoHeightImage
source={{ uri: props.uri + "images/kounai.gif" }}
resizeMode="contain"
width={wp("100%")}
/>
<AutoHeightImage
source={{ uri: props.uri + "images/kounai.png" }}
resizeMode="contain"
width={wp("100%")}
/>
<AutoHeightImage
source={{ uri: props.uri + "images/kounai_1f.gif" }}
resizeMode="contain"
width={wp("100%")}
/>
<AutoHeightImage
source={{ uri: props.uri + "images/kounai_2f.png" }}
resizeMode="contain"
width={wp("100%")}
/>
</>
)}
</View>
</>
);
};
const Handler = () => { const Handler = () => {
useEffect(() => { useEffect(() => {
const backAction = () => { const backAction = () => {
@ -176,4 +294,4 @@ const Handler = () => {
return () => backHandler.remove(); return () => backHandler.remove();
}, []); }, []);
return <></>; return <></>;
}; };

View File

@ -1,43 +0,0 @@
import { FC } from "react";
import { TouchableOpacity, View, Text, Linking } from "react-native";
type Props = {
navigate: (screen: string, params: { info: string; goTo: string; useShow: boolean }) => void;
address: string;
goTo: string;
useShow: boolean;
onExit: () => void;
};
export const 駅構内図:FC<Props> = (props) => {
const { navigate, address, goTo, useShow, onExit } = props;
const info = address.replace("/index.html", "/") + "/kounai_map.html";
return (
<TouchableOpacity
style={{
height: 50,
backgroundColor: "#888A85",
flexDirection: "column",
alignContent: "center",
alignItems: "center",
margin: 2,
}}
onPress={() => {
navigate("howto", { info, goTo, useShow });
onExit();
}}
onLongPress={() => Linking.openURL(info)}
>
<View style={{ flex: 1 }} />
<Text
style={{
color: "white",
textAlign: "center",
textAlignVertical: "center",
flex: 1,
}}
>
</Text>
<View style={{ flex: 1 }} />
</TouchableOpacity>
);
};

View File

@ -1,16 +0,0 @@
import React from "react";
import { Linking } from "react-native";
import { Ionicons } from "@expo/vector-icons";
import { TicketBox } from "@/components/atom/TicketBox";
export const StationMapButton = ({stationMap}) => {
return (
<TicketBox
backgroundColor={"#888A85"}
icon={<Ionicons name="map" color="white" size={50} />}
flex={1}
onPressButton={() => Linking.openURL(stationMap)}
>
Map
</TicketBox>
);
};

View File

@ -1,32 +0,0 @@
import React, { FC } from "react";
import { Linking } from "react-native";
import { FontAwesome } from "@expo/vector-icons";
import { TicketBox } from "@/components/atom/TicketBox";
type Props = {
info: string;
address: string;
usePDFView: string;
navigate: (screen: string, params?: object) => void;
onExit: () => void;
goTo: string;
useShow: string;
};
export const StationTimeTableButton: FC<Props> = (props) => {
const { info, address, usePDFView, navigate, onExit, goTo, useShow } = props;
return (
<TicketBox
backgroundColor={"#8F5902"}
icon={<FontAwesome name="table" color="white" size={50} />}
flex={1}
onPressButton={() => {
usePDFView == "true"
? Linking.openURL(address)
: navigate("howto", { info, goTo, useShow });
onExit();
}}
onLongPressButton={() => Linking.openURL(address)}
>
</TicketBox>
);
};

View File

@ -1,21 +0,0 @@
import React, { FC } from "react";
import { Linking } from "react-native";
import { Ionicons } from "@expo/vector-icons";
import { TicketBox } from "@/components/atom/TicketBox";
type Props = {
address: string;
press: () => void;
};
export const TrainBusButton: FC<Props> = ({ address, press }) => {
return (
<TicketBox
backgroundColor={"#CE5C00"}
icon={<Ionicons name="bus" color="white" size={50} />}
flex={1}
onPressButton={press}
onLongPressButton={() => Linking.openURL(address)}
>
</TicketBox>
);
};

View File

@ -1,28 +0,0 @@
import React, { FC } from "react";
import { Linking } from "react-native";
import { Foundation } from "@expo/vector-icons";
import { TicketBox } from "@/components/atom/TicketBox";
type Props = {
navigate: (screen: string, params: any) => void;
info: string;
goTo: string;
useShow: string;
onExit: () => void;
};
export const WebSiteButton: FC<Props> = (Props) => {
const { navigate, info, goTo, useShow, onExit } = Props;
return (
<TicketBox
backgroundColor={"#AD7FA8"}
icon={<Foundation name="web" color="white" size={50} />}
flex={1}
onPressButton={() => {
navigate("howto", { info, goTo, useShow });
onExit();
}}
onLongPressButton={() => Linking.openURL(info)}
>
web
</TicketBox>
);
};

View File

@ -17,7 +17,7 @@ import { SwitchArea } from "../atom/SwitchArea";
import { useNotification } from "../../stateBox/useNotifications"; import { useNotification } from "../../stateBox/useNotifications";
import { SheetHeaderItem } from "@/components/atom/SheetHeaderItem"; import { SheetHeaderItem } from "@/components/atom/SheetHeaderItem";
const versionCode = "6.0.2"; const versionCode = "6.0.1";
export const SettingTopPage = ({ export const SettingTopPage = ({
testNFC, testNFC,

View File

@ -49,7 +49,7 @@ export const customTrainDataDetector = (TrainNumber: string) => {
return { return {
type: "LTDEXP", type: "LTDEXP",
trainName: "しおかぜ", trainName: "しおかぜ",
trainIcon: `https://n8n.haruk.in/webhook/anpanman-pictures.png?trainNum=${TrainNumber}`, trainIcon: "https://storage.haruk.in/s8000ap.png",
infoUrl: "https://www.jr-eki.com/aptrain/naani/yosan/train.html", infoUrl: "https://www.jr-eki.com/aptrain/naani/yosan/train.html",
trainNumDistance: 0, trainNumDistance: 0,
info: "いしづちと併結 / アンパンマン列車で運転", info: "いしづちと併結 / アンパンマン列車で運転",
@ -114,7 +114,7 @@ export const customTrainDataDetector = (TrainNumber: string) => {
return { return {
type: "LTDEXP", type: "LTDEXP",
trainName: "いしづち", trainName: "いしづち",
trainIcon: `https://n8n.haruk.in/webhook/anpanman-pictures.png?trainNum=${TrainNumber}`, trainIcon: "https://storage.haruk.in/s8000ap.png",
infoUrl: "https://www.jr-eki.com/aptrain/naani/yosan/train.html", infoUrl: "https://www.jr-eki.com/aptrain/naani/yosan/train.html",
trainNumDistance: 1000, trainNumDistance: 1000,
info: "しおかぜと併結 / アンパンマン列車で運転", info: "しおかぜと併結 / アンパンマン列車で運転",
@ -173,7 +173,7 @@ export const customTrainDataDetector = (TrainNumber: string) => {
return { return {
type: "LTDEXP", type: "LTDEXP",
trainName: "いしづち", trainName: "いしづち",
trainIcon: `https://n8n.haruk.in/webhook/anpanman-pictures.png?trainNum=${TrainNumber}`, trainIcon: "https://storage.haruk.in/s8000ap.png",
infoUrl: "https://www.jr-eki.com/aptrain/naani/yosan/train.html", infoUrl: "https://www.jr-eki.com/aptrain/naani/yosan/train.html",
trainNumDistance: 940, trainNumDistance: 940,
info: "アンパンマン列車で運転", info: "アンパンマン列車で運転",
@ -247,7 +247,9 @@ export const customTrainDataDetector = (TrainNumber: string) => {
return { return {
type: "LTDEXP", type: "LTDEXP",
trainName: "南風", trainName: "南風",
trainIcon: `https://n8n.haruk.in/webhook/anpanman-pictures.png?trainNum=${TrainNumber}`, trainIcon: `https://n8n.haruk.in/webhook/dosan-anpanman-pictures.png?trainNum=${TrainNumber}&day=${dayjs().format(
"yyyy-MM-DD"
)}`,
infoUrl: "https://www.jr-eki.com/aptrain/naani/dosan/train.html", infoUrl: "https://www.jr-eki.com/aptrain/naani/dosan/train.html",
trainNumDistance: 30, trainNumDistance: 30,
info: "アンパンマン列車で運転", info: "アンパンマン列車で運転",
@ -587,7 +589,7 @@ export const customTrainDataDetector = (TrainNumber: string) => {
return { return {
type: "LTDEXP", type: "LTDEXP",
trainName: "宇和海", trainName: "宇和海",
trainIcon: `https://n8n.haruk.in/webhook/anpanman-pictures.png?trainNum=${TrainNumber}`, trainIcon: "https://storage.haruk.in/s2002a.png",
infoUrl: "https://www.jr-eki.com/aptrain/naani/yosan/train.html", infoUrl: "https://www.jr-eki.com/aptrain/naani/yosan/train.html",
trainNumDistance: 1050, trainNumDistance: 1050,
info: "アンパン列車で運転", info: "アンパン列車で運転",
@ -621,9 +623,9 @@ export const customTrainDataDetector = (TrainNumber: string) => {
return { return {
type: "LTDEXP", type: "LTDEXP",
trainName: "あしずり", trainName: "あしずり",
trainIcon: `https://n8n.haruk.in/webhook/anpanman-pictures.png?trainNum=${TrainNumber}`, trainIcon: "https://storage.haruk.in/s2000_asi.png",
infoUrl: infoUrl:
"https://www.jr-eki.com/aptrain/naani/first-generation/jikoku.html", "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/ashizuri.html",
trainNumDistance: 2070, trainNumDistance: 2070,
info: "2000系で運転", info: "2000系で運転",
infogram: "" infogram: ""
@ -765,41 +767,19 @@ export const customTrainDataDetector = (TrainNumber: string) => {
trainIcon: "https://storage.haruk.in/s5001.png", trainIcon: "https://storage.haruk.in/s5001.png",
infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/marine.html", infoUrl: "https://www.jr-shikoku.co.jp/01_trainbus/vehicle-info/marine.html",
trainNumDistance: null, trainNumDistance: null,
info: "臨時列車 4/12,13,19のみ運転", info: "WEST LIVE TOUR 2025臨 3/21,22のみ運転",
infogram: "" infogram: ""
}; };
case "9395D": case "9395D":
return { return {
type: "SPCL_Normal", type: "SPCL_Normal",
trainName: "", trainName: "",
trainIcon: "https://storage.haruk.in/s1500.png", trainIcon: null,
infoUrl: null, infoUrl: null,
trainNumDistance: null, trainNumDistance: null,
info: "臨時列車 4/12,13,19のみ運転", info: "WEST LIVE TOUR 2025臨 3/21,22のみ運転",
infogram: "" 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: default:
if(getJRF(TrainNumber) !== null){ if(getJRF(TrainNumber) !== null){
return { return {

View File

@ -28,16 +28,9 @@ export const injectJavascriptData: InjectJavascriptData = (
// 上部ヘッダーの取り扱い、自動再読み込み、setStringsの実行 // 上部ヘッダーの取り扱い、自動再読み込み、setStringsの実行
const bootData = ` const bootData = `
let probremsData = [];
fetch("https://n8n.haruk.in/webhook/jrshikoku-position-problems").then((response) => response.json()).then((data) => {
probremsData = data.data;
});
const setReload = () =>{ const setReload = () =>{
try{ try{
document.getElementById('refreshIcon').click(); document.getElementById('refreshIcon').click();
fetch("https://n8n.haruk.in/webhook/jrshikoku-position-problems").then((response) => response.json()).then((data) => {
probremsData = data.data;
});
setStrings(); setStrings();
}catch(error){} }catch(error){}
setTimeout(setReload, 10000); setTimeout(setReload, 10000);
@ -46,12 +39,16 @@ export const injectJavascriptData: InjectJavascriptData = (
`; `;
// 左か右かを判定してアイコンを設置する // 左か右かを判定してアイコンを設置する
const trainIcon = ` const trainIcon = `
const setStationIcon = (setIconElem,img,hasProblem) =>{ const setStationIcon = (setIconElem,img) =>{
const position = setIconElem.getAttribute("style").includes("left"); if(setIconElem.getAttribute("style").includes("left")){
setIconElem.insertAdjacentHTML('beforebegin', "<img src="+img+" style='float:"+(position ? 'left' : 'right')+";height:20px;'>"); setIconElem.insertAdjacentHTML('beforebegin', "<img src="+img+" style='float:left;height:20px;'>");
}
else{
setIconElem.insertAdjacentHTML('beforebegin', "<img src="+img+" style='float:right;height:20px;'>");
}
setIconElem.remove(); setIconElem.remove();
} }
const setTrainIcon = (,e,hasProblem) =>{ const setTrainIcon = (,e) =>{
switch(){ switch(){
//しおかぜメイン //しおかぜメイン
//8000 ノーマル //8000 ノーマル
@ -73,14 +70,14 @@ export const injectJavascriptData: InjectJavascriptData = (
case "25M": case "25M":
case "27M": case "27M":
case "29M": case "29M":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8000nr.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8000nr.png');
break; break;
//8000 アンパン //8000 アンパン
case "10M": case "10M":
case "22M": case "22M":
case "9M": case "9M":
case "21M": case "21M":
setStationIcon(e.querySelector("img"),'https://n8n.haruk.in/webhook/anpanman-pictures.png?trainNum='+,hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8000ap.png');
break; break;
@ -93,7 +90,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "11M": case "11M":
case "19M": case "19M":
case "23M": case "23M":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8600.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8600.png');
break; break;
//いしづちメイン //いしづちメイン
@ -116,7 +113,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "1025M": case "1025M":
case "1027M": case "1027M":
case "1029M": case "1029M":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8000no.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8000no.png');
break; break;
//8000 アンパン //8000 アンパン
@ -124,7 +121,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "1022M": case "1022M":
case "1009M": case "1009M":
case "1021M": case "1021M":
setStationIcon(e.querySelector("img"),'https://n8n.haruk.in/webhook/anpanman-pictures.png?trainNum='+,hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8000ap.png');
break; break;
//8600 //8600
@ -136,29 +133,29 @@ export const injectJavascriptData: InjectJavascriptData = (
case "1011M": case "1011M":
case "1019M": case "1019M":
case "1023M": case "1023M":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8600_isz.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8600_isz.png');
break; break;
//MEXP //MEXP
//8000 //8000
case "1092M": case "1092M":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8000nr.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8000nr.png');
break; break;
//8600 //8600
case "1091M": case "1091M":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8600_isz.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8600_isz.png');
break; break;
//三桁いしづち //三桁いしづち
//8000 アンパン //8000 アンパン
case "1041M": case "1041M":
case "1044M": case "1044M":
setStationIcon(e.querySelector("img"),'https://n8n.haruk.in/webhook/anpanman-pictures.png?trainNum='+,hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8000ap.png');
break; break;
//8600 //8600
case "1043M": case "1043M":
case "1042M": case "1042M":
case "1046M": case "1046M":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8600_isz.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s8600_isz.png');
break; break;
@ -181,7 +178,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "51D": case "51D":
case "53D": case "53D":
case "55D": case "55D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2700.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2700.png');
break; break;
//2700アンパン //2700アンパン
case "32D": case "32D":
@ -194,7 +191,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "45D": case "45D":
case "49D": case "49D":
case "57D": case "57D":
setStationIcon(e.querySelector("img"),'https://n8n.haruk.in/webhook/anpanman-pictures.png?trainNum='+,hasProblem); setStationIcon(e.querySelector("img"),'https://n8n.haruk.in/webhook/dosan-anpanman-pictures.png?trainNum='+);
break; break;
@ -214,7 +211,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "3019D": case "3019D":
case "3025D": case "3025D":
case "3031D": case "3031D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2700_uzu.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2700_uzu.png');
break; break;
//2700 二両編成 //2700 二両編成
@ -228,7 +225,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "3017D": case "3017D":
case "3023D": case "3023D":
case "3029D": case "3029D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2700_uzu.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2700_uzu.png');
break; break;
//2600 //2600
@ -242,7 +239,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "3021D": case "3021D":
case "3027D": case "3027D":
case "3033D": case "3033D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2600.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2600.png');
break; break;
//マリンライナー //マリンライナー
@ -314,14 +311,14 @@ export const injectJavascriptData: InjectJavascriptData = (
case "3167M": case "3167M":
case "3169M": case "3169M":
case "3175M": case "3175M":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s5001.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s5001.png');
break; break;
case "3102M": case "3102M":
case "3101M": case "3101M":
case "3103M": case "3103M":
case "3171M": case "3171M":
case "3173M": case "3173M":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s5001k.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s5001k.png');
break; break;
//サンライズ瀬戸 //サンライズ瀬戸
@ -329,7 +326,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "5031M": case "5031M":
case "8041M": //琴平延長高松迄 case "8041M": //琴平延長高松迄
case "8031M": //琴平延長高松以降 case "8031M": //琴平延長高松以降
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/w285.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/w285.png');
break; break;
//宇和海 //宇和海
@ -360,7 +357,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "1077D": case "1077D":
case "1079D": case "1079D":
case "1081D": case "1081D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2000_uwa.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2000_uwa.png');
break; break;
//2000 アンパン込み //2000 アンパン込み
case "1058D": case "1058D":
@ -369,14 +366,14 @@ export const injectJavascriptData: InjectJavascriptData = (
case "1053D": case "1053D":
case "1059D": case "1059D":
case "1067D": case "1067D":
setStationIcon(e.querySelector("img"),'https://n8n.haruk.in/webhook/anpanman-pictures.png?trainNum='+,hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2002a.png');
break; break;
//しまんと //しまんと
case "2002D": case "2002D":
case "2004D": case "2004D":
case "2001D": case "2001D":
case "2003D": case "2003D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2700_smn.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2700_smn.png');
break; break;
//あしずり 2000 //あしずり 2000
@ -388,7 +385,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "2073D": case "2073D":
case "2079D": case "2079D":
case "2081D": case "2081D":
setStationIcon(e.querySelector("img"),'https://n8n.haruk.in/webhook/anpanman-pictures.png?trainNum='+,hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2000_asi.png');
break; break;
//あしずり 2700 //あしずり 2700
@ -398,7 +395,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "2075D": case "2075D":
case "2077D": case "2077D":
case "2083D": case "2083D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2700_asi.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s2700_asi.png');
break; break;
//剣山 //剣山
case "4002D": case "4002D":
@ -408,14 +405,14 @@ export const injectJavascriptData: InjectJavascriptData = (
case "4003D": case "4003D":
case "4005D": case "4005D":
case "4007D": case "4007D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185tu.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185tu.png');
break; break;
//よしのがわトロッコ //よしのがわトロッコ
case "8452D": case "8452D":
case "8451D": case "8451D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185to_ai.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185to_ai.png');
break; break;
//岡山高松アントロ //岡山高松アントロ
@ -424,14 +421,14 @@ export const injectJavascriptData: InjectJavascriptData = (
//岡山琴平アントロ //岡山琴平アントロ
case "8277D": case "8277D":
case "8278D": case "8278D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32to4.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32to4.png');
break; break;
//千年ものがたり //千年ものがたり
case "8021D": case "8021D":
case "8022D": case "8022D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185mm1.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185mm1.png');
break; break;
//夜明けものがたり //夜明けものがたり
@ -439,12 +436,12 @@ export const injectJavascriptData: InjectJavascriptData = (
case "8083D": case "8083D":
case "8073D": case "8073D":
case "8074D": case "8074D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185ym1.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185ym1.png');
break; break;
//ラマルドボア //ラマルドボア
case "9253M": case "9253M":
case "9256M": case "9256M":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/w213w.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/w213w.png');
break; break;
// 貨物 // 貨物
@ -466,7 +463,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "8071": case "8071":
case "8072": case "8072":
case "8077": case "8077":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/ef210a.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/ef210a.png');
break; break;
// // 普通列車系統、6000系運用 // // 普通列車系統、6000系運用
@ -482,7 +479,7 @@ export const injectJavascriptData: InjectJavascriptData = (
// case "147M": // case "147M":
// //962運用 // //962運用
// case "114M": // case "114M":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s6000p.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s6000p.png');
// break; // break;
@ -490,31 +487,31 @@ export const injectJavascriptData: InjectJavascriptData = (
// // ごな線 // // ごな線
// case "5851D": //219D併結 [ToDo: 219Dとの分割対策] // case "5851D": //219D併結 [ToDo: 219Dとの分割対策]
// case "5854D": // case "5854D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/tosa9640jgr.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/tosa9640jgr.png');
// break; // break;
// //JR車両乗り入れ運用 // //JR車両乗り入れ運用
// case "5858D": // case "5858D":
// case "5869D": // case "5869D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1000.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1000.png');
// break; // break;
// //併結運用の併結される側 [ToDo: 分割対策] // //併結運用の併結される側 [ToDo: 分割対策]
// case "5845D": // case "5845D":
// case "5851D": // case "5851D":
// case "5818D": // case "5818D":
// case "5820D": // case "5820D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/tosa9640.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/tosa9640.png');
// break; // break;
// // 土讃線単体列車のキハ32運用 // // 土讃線単体列車のキハ32運用
// case "715D": // case "715D":
// case "718D": // case "718D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32ns.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32ns.png');
// break; // break;
// // サンライズに伴う気動車代走 // // サンライズに伴う気動車代走
// case "6219D": // case "6219D":
// case "6222D": // case "6222D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1000.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1000.png');
// break; // break;
// // それ以外の土讃線ごな線直通列車 // // それ以外の土讃線ごな線直通列車
// case "5811D": // case "5811D":
@ -543,7 +540,7 @@ export const injectJavascriptData: InjectJavascriptData = (
// case "5876D": // case "5876D":
// case "5880D": // case "5880D":
// case "5882D": // case "5882D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/tosa9640.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/tosa9640.png');
// break; // break;
// // それ以外の土讃線普通列車(1000) // // それ以外の土讃線普通列車(1000)
// case "4210D": // case "4210D":
@ -664,7 +661,7 @@ export const injectJavascriptData: InjectJavascriptData = (
// case "757D": // case "757D":
// case "761D": // case "761D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1000.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1000.png');
// break; // break;
// // 予讃線/土讃線普通列車運用(7000,7200) // // 予讃線/土讃線普通列車運用(7000,7200)
// // 下り列車(伊予西条-松山は全て7000系) // // 下り列車(伊予西条-松山は全て7000系)
@ -718,7 +715,7 @@ export const injectJavascriptData: InjectJavascriptData = (
// case "155M": // case "155M":
// case "1263M": // case "1263M":
// case "157M": // case "157M":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7200.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7200.png');
// break; // break;
// // 下り7000系 // // 下り7000系
// case "101M": // case "101M":
@ -730,7 +727,7 @@ export const injectJavascriptData: InjectJavascriptData = (
// case "555M": // case "555M":
// case "4565M": // case "4565M":
// case "159M": // case "159M":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7000.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7000.png');
// break; // break;
// // 上り列車 7200系 // // 上り列車 7200系
// case "5102M": // case "5102M":
@ -784,7 +781,7 @@ export const injectJavascriptData: InjectJavascriptData = (
// case "1606M": // case "1606M":
// case "5160M": // case "5160M":
// case "5256M": // case "5256M":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7200.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7200.png');
// break; // break;
// // 上り7000系 // // 上り7000系
// case "114M": // case "114M":
@ -795,7 +792,7 @@ export const injectJavascriptData: InjectJavascriptData = (
// case "4542M": // case "4542M":
// case "162M": // case "162M":
// case "4166M": // case "4166M":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7000.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7000.png');
// break; // break;
// // 松山界隈気動車運用 // // 松山界隈気動車運用
// // 上り下りの概念アリ // // 上り下りの概念アリ
@ -818,28 +815,28 @@ export const injectJavascriptData: InjectJavascriptData = (
// case "4824D": // case "4824D":
// case "4813D": // case "4813D":
// case "4664D": // case "4664D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32s.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32s.png');
// break; // break;
// // 河童うようよ号偶数 // // 河童うようよ号偶数
// case "4816D": // case "4816D":
// case "4830D": // case "4830D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32kpuy2.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32kpuy2.png');
// break; // break;
// // 河童うようよ号奇数 // // 河童うようよ号奇数
// case "4827D": // case "4827D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32kpuy1.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32kpuy1.png');
// break; // break;
// // 新幹線偶数 // // 新幹線偶数
// case "4810D": // case "4810D":
// case "4822D": // case "4822D":
// case "4826D": // case "4826D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32tht.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32tht.png');
// break; // break;
// // 新幹線奇数 // // 新幹線奇数
// case "4817D": // case "4817D":
// case "4823D": // case "4823D":
// case "4829D": // case "4829D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32thtk.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32thtk.png');
// break; // break;
// // キハ54 通常運用 // // キハ54 通常運用
// case "4632D": // case "4632D":
@ -882,30 +879,30 @@ export const injectJavascriptData: InjectJavascriptData = (
// case "4922D": // case "4922D":
// case "4923D": // case "4923D":
// case "4663D": // case "4663D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s54s.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s54s.png');
// break; // break;
// // 54しまんとろっこ // // 54しまんとろっこ
// case "4623D": // case "4623D":
// case "8814D": // case "8814D":
// case "8819D": // case "8819D":
// case "4662D": // case "4662D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s54to0ys.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s54to0ys.png');
// break; // break;
// // キハ185 通常運用 // // キハ185 通常運用
// case "911D": // case "911D":
// case "628D": // case "628D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185cm.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185cm.png');
// break;
// // 伊予灘ものがたり 赤
// case "8091D":
// case "8093D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185iyor.png');
// break;
// // 伊予灘ものがたり 黄
// case "8092D":
// case "8094D":
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185iyoy.png');
// break; // break;
// 伊予灘ものがたり 赤
case "8091D":
case "8093D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185iyor.png',hasProblem);
break;
// 伊予灘ものがたり 黄
case "8092D":
case "8094D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185iyoy.png',hasProblem);
break;
// 高徳線、徳島線、牟岐線、鳴門線普通列車系統 // 高徳線、徳島線、牟岐線、鳴門線普通列車系統
// キハ40・47 // キハ40・47
@ -930,7 +927,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "976D": case "976D":
case "980D": case "980D":
case "982D": case "982D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s40.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s40.png');
break; break;
// 1000形 // 1000形
case "4311D": case "4311D":
@ -943,7 +940,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "450D": case "450D":
case "4458D": case "4458D":
case "474D": case "474D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1000.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1000.png');
break; break;
// 1200形 // 1200形
case "4301D": case "4301D":
@ -984,64 +981,56 @@ export const injectJavascriptData: InjectJavascriptData = (
case "4958D": case "4958D":
case "4962D": case "4962D":
case "4966D": case "4966D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1200n.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1200n.png');
break;
// 半定期臨時列車
case "9174M":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s5001.png',hasProblem);
break;
case "9395D":
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1500.png',hasProblem);
break; break;
default: //指定車両でなく、Regexでの指定に移動 default: //指定車両でなく、Regexでの指定に移動
// // 琴平直通系普通電車 // // 琴平直通系普通電車
// if(new RegExp(/^(1|4|5)2\\d\\dM$/).test(列番データ)){ // if(new RegExp(/^(1|4|5)2\\d\\dM$/).test(列番データ)){
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7200.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7200.png');
// break; // break;
// } // }
// else if(new RegExp(/^(1|4|5)(1|5|6)\\d\\dM$/).test(列番データ)){ // else if(new RegExp(/^(1|4|5)(1|5|6)\\d\\dM$/).test(列番データ)){
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7000.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7000.png');
// break; // break;
// } // }
// else if(new RegExp(/^(1|5|6)\\d\\dM$/).test(列番データ)){ // else if(new RegExp(/^(1|5|6)\\d\\dM$/).test(列番データ)){
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7000.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7000.png');
// break; // break;
// }// 高徳線 普通列車系統 // }// 高徳線 普通列車系統
// else // else
if(new RegExp(/^(4|5)3\\d\\dD$/).test()){ if(new RegExp(/^(4|5)3\\d\\dD$/).test()){
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1500.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1500.png');
break; break;
} }
else if(new RegExp(/^3\\d\\dD$/).test()){ else if(new RegExp(/^3\\d\\dD$/).test()){
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1500.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1500.png');
break; break;
}// 徳島線 普通列車系統 }// 徳島線 普通列車系統
else if(new RegExp(/^(4|5)4\\d\\dD$/).test()){ else if(new RegExp(/^(4|5)4\\d\\dD$/).test()){
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1500.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1500.png');
break; break;
} }
else if(new RegExp(/^4\\d\\dD$/).test()){ else if(new RegExp(/^4\\d\\dD$/).test()){
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1500.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1500.png');
break; break;
}// 鳴門線普通列車系統 }// 鳴門線普通列車系統
else if(new RegExp(/^(4|5)9(5|6|7|8)\\dD$/).test()){ else if(new RegExp(/^(4|5)9(5|6|7|8)\\dD$/).test()){
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1500.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1500.png');
break; break;
} }
else if(new RegExp(/^9(5|6|7|8)\\dD$/).test()){ else if(new RegExp(/^9(5|6|7|8)\\dD$/).test()){
setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1500.png',hasProblem); setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1500.png');
break; break;
} }
// 牟岐線普通列車系統 一旦閉鎖 // 牟岐線普通列車系統 一旦閉鎖
// else if(new RegExp(/^(4|5)5\\d\\dD$/).test(列番データ)){ // else if(new RegExp(/^(4|5)5\\d\\dD$/).test(列番データ)){
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7200.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7200.png');
// break; // break;
// } // }
// else if(new RegExp(/^5\\d\\dD$/).test(列番データ)){ // else if(new RegExp(/^5\\d\\dD$/).test(列番データ)){
// setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7000.png',hasProblem); // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7000.png');
// break; // break;
// } // }
break; break;
@ -1050,7 +1039,7 @@ export const injectJavascriptData: InjectJavascriptData = (
`; `;
const normal_train_name = ` const normal_train_name = `
const nameReplace = (,,,hasProblem) =>{ const nameReplace = (,,) =>{
let isWanman = false; let isWanman = false;
let trainName = ""; let trainName = "";
let viaData = ""; let viaData = "";
@ -1177,7 +1166,7 @@ export const injectJavascriptData: InjectJavascriptData = (
//牟岐線発高徳線行き //牟岐線発高徳線行き
case "358D": case "358D":
viaData = "高徳線直通"; viaData = "牟岐線直通";
break; break;
case "4314D": case "4314D":
case "4326D": case "4326D":
@ -1185,31 +1174,31 @@ export const injectJavascriptData: InjectJavascriptData = (
case "4342D": case "4342D":
case "4350D": case "4350D":
case "4368D": case "4368D":
viaData = "高徳線直通"; viaData = "牟岐線直通";
isWanman = true; isWanman = true;
break; break;
//牟岐線発徳島線行き //牟岐線発徳島線行き
case "451D": case "451D":
case "475D": case "475D":
viaData = "徳島線直通"; viaData = "牟岐線直通";
break; break;
case "4447D": case "4447D":
case "4455D": case "4455D":
case "5467D": case "5467D":
case "5471D": case "5471D":
case "5479D": case "5479D":
viaData = "徳島線直通"; viaData = "牟岐線直通";
isWanman = true; isWanman = true;
break; break;
//牟岐線発鳴門線行き //牟岐線発鳴門線行き
case "952D": case "952D":
viaData = "鳴門線直通"; viaData = "牟岐線直通";
break; break;
case "4954D": case "4954D":
case "4978D": case "4978D":
viaData = "鳴門線直通"; viaData = "牟岐線直通";
isWanman = true; isWanman = true;
break; break;
@ -1231,7 +1220,7 @@ export const injectJavascriptData: InjectJavascriptData = (
case "248D": case "248D":
case "250D": case "250D":
viaData = "ごめん・なはり線[快速]"; viaData = "ごめん・なはり線[快速]";
ToData = "(後免にて解結)\\n土佐山田/奈半利"; ToData = "(後免にて解結)土佐山田/奈半利";
break; break;
case "9395D": case "9395D":
viaData = "[臨時]普通"; viaData = "[臨時]普通";
@ -1241,22 +1230,6 @@ export const injectJavascriptData: InjectJavascriptData = (
viaData = "[臨時]マリンライナー94号"; viaData = "[臨時]マリンライナー94号";
ToData = "岡山"; ToData = "岡山";
break; break;
case "9662D":
viaData = "[臨時]れんげ号";
ToData = "八幡浜";
break;
case "9665D":
viaData = "[臨時]れんげ号";
ToData = "宇和島";
break;
case "9664D":
viaData = "[臨時]わらぐろ号";
ToData = "八幡浜";
break;
case "9663D":
viaData = "[臨時]わらぐろ号";
ToData = "卯之町";
break;
default: default:
if(new RegExp(/^58[1-3][1,3,5,7,9][DM]$/).test()){ if(new RegExp(/^58[1-3][1,3,5,7,9][DM]$/).test()){
viaData = "ごめん・なはり線[快速]"; viaData = "ごめん・なはり線[快速]";
@ -1283,9 +1256,8 @@ export const injectJavascriptData: InjectJavascriptData = (
const returnText1 = (isWanman ? "ワンマン " : "") + trainName + viaData; const returnText1 = (isWanman ? "ワンマン " : "") + trainName + viaData;
const returnText2 = (ToData ? ToData+"行 " : ToData)+ TrainNumber; const returnText2 = (ToData ? ToData+"行 " : ToData)+ TrainNumber;
.innerText = ""; .innerText = "";
.insertAdjacentHTML('beforebegin', "<p style='font-size:10px;font-weight:bold;padding:0;color: black;'>" + returnText1 + "</p>"); .insertAdjacentHTML('beforebegin', "<p style='font-size:10px;font-weight:bold;padding:0;'>" + returnText1 + "</p>");
.insertAdjacentHTML('beforebegin', "<div style='display:inline-flex;flex-direction:row;'><p style='font-size:10px;font-weight: bold;padding:0;color:black;'>" + (ToData ? ToData + "行 " : ToData) + "</p><p style='font-size:10px;padding:0;color:black;'>" + TrainNumber + (JRF ? "":"レ") + "</p></div>"); .insertAdjacentHTML('beforebegin', "<div style='display:inline-flex;flex-direction:row;'><p style='font-size:10px;font-weight: bold;padding:0;'>" + (ToData ? ToData + "行 " : ToData) + "</p><p style='font-size:10px;padding:0;'>" + TrainNumber + (JRF ? "":"レ") + "</p></div>");
.insertAdjacentHTML('beforebegin', "<p style='font-size:10px;font-weight:bold;padding:0;color: "+(hasProblem ? "red":"black")+";'>" + (hasProblem ? "‼️停止中‼️" : "") + "</p>");
} }
`; `;
@ -1302,16 +1274,12 @@ const setStrings = () =>{
var = element.getElementsByTagName("p")[0]; var = element.getElementsByTagName("p")[0];
var = element.getAttribute('offclick').split('"')[1]; var = element.getAttribute('offclick').split('"')[1];
var = element.getAttribute('offclick').split('"')[3]; var = element.getAttribute('offclick').split('"')[3];
const trainData = trainPositionDatas.find(e => e.TrainNum == );
const hasProblem = probremsData.find((e)=>{
return e.TrainNum == trainData.TrainNum && e.Pos == trainData.Pos;
});
var flag=false; var flag=false;
var TrainType = undefined; var TrainType = undefined;
setTrainMenuDialog(element) setTrainMenuDialog(element)
${iconSetting == "true" ? "setTrainIcon(列番データ,element,hasProblem);" : ""} ${iconSetting == "true" ? "setTrainIcon(列番データ,element);" : ""}
nameReplace(,,,hasProblem); nameReplace(,,);
} }
try{ try{
for(let d of document.getElementById('disp').childNodes){ for(let d of document.getElementById('disp').childNodes){

View File

@ -16,13 +16,10 @@ export const AllTrainDiagramProvider = ({ children }) => {
[allTrainDiagram] [allTrainDiagram]
); );
const customData = { const customData = {
"9395D":"臨時列車,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250314_20250413_tomorrow_together_worldtour.pdf#高松,発,22:10#昭和町,発,22:13#栗林公園北口,発,22:16#栗林,発,22:19#木太町,発,22:23#屋島,発,22:36#古高松南,発,22:39#八栗口,発,22:43#讃岐牟礼,発,22:45#志度,発,22:49#オレンジタウン,発,22:53#造田,発,22:57#神前,発,23:00#讃岐津田,発,23:06#鶴羽,発,23:10#丹生,発,23:15#三本松,着,23:18#", "9395D":"WEST LIVE TOUR 2025臨,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250228_20250323_west-live-tour-2025.pdf#高松,発,22:10#昭和町,発,22:12#栗林公園北口,発,22:15#栗林,発,22:18#木太町,発,22:22#屋島,発,22:26#古高松南,発,22:38#八栗口,発,22:41#讃岐牟礼,発,22:44#志度,発,22:48#オレンジタウン,発,22:52#造田,発,22:56#神前,発,22:59#讃岐津田,発,23:05#鶴羽,発,23:09#丹生,発,23:14#三本松,着,23:18#",
"9174M":"臨時列車,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250314_20250413_tomorrow_together_worldtour.pdf#高松,発,22:00#坂出,発,22:16#児島,発,22:39#茶屋町,発,22:48#早島,発,22:55#妹尾,発,22:59#岡山,着,23:06#", "9174M":"WEST LIVE TOUR 2025臨,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250228_20250323_west-live-tour-2025.pdf#高松,発,22:00#坂出,発,22:16#児島,発,22:39#茶屋町,発,22:55#早島,発,22:59#妹尾,発,23:03#岡山,着,23:12#",
"9662D":"宇和れんげまつり臨時列車,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250124_20250629_rinji_spring.pdf#宇和島,発,10:00#北宇和島,発,10:03#高光,発,10:07#伊予吉田,発,10:21#立間,発,10:50#下宇和,発,10:36#卯之町,発,10:39#上宇和,発,10:42#伊予石城,発,10:46#双岩,発,10:53#八幡浜,着,10:58#",
"9664D":"宇和れんげまつり臨時列車,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250124_20250629_rinji_spring.pdf#卯之町,発,11:18#上宇和,発,11:21#伊予石城,発,11:25#双岩,発,11:34#八幡浜,着,11:39#", };
"9663D":"宇和れんげまつり臨時列車,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250124_20250629_rinji_spring.pdf#八幡浜,発,10:07#双岩,発,10:16#伊予石城,発,10:23#上宇和,発,10:27#卯之町,着,10:30#",
"9665D":"宇和れんげまつり臨時列車,提,https://www.jr-shikoku.co.jp/03_news/pdf/20250124_20250629_rinji_spring.pdf#八幡浜,発,13:38#双岩,発,13:45#伊予石城,発,13:52#上宇和,発,13:56#卯之町,発,14:07#下宇和,発,14:10#立間,発,14:18#伊予吉田,発,14:25#高光,発,14:31#北宇和島,発,14:35#宇和島,着,14:37#",
};
useEffect(() => { useEffect(() => {
fetch( fetch(
"https://n8n.haruk.in/webhook/CrowdTh%E2%82%AC71m3Ra7!ngLead%E2%82%ACr$" "https://n8n.haruk.in/webhook/CrowdTh%E2%82%AC71m3Ra7!ngLead%E2%82%ACr$"