Merge commit '9d1ef5681a503c8af795119c425957e7bf9ffe4b' into develop

This commit is contained in:
harukin-expo-dev-env 2024-12-20 13:08:11 +00:00
commit 72b82e84fe
9 changed files with 418 additions and 60 deletions

View File

@ -6,30 +6,46 @@ type stateBox = {
title: string; title: string;
style?: ViewStyle; style?: ViewStyle;
mode?: number; mode?: number;
endText?: string;
}; };
export const StateBox: FC<stateBox> = ({ text, title, style, mode }) => ( export const StateBox: FC<stateBox> = (props) => {
<View style={{ ...(mode == 2 ? boxStyle2 : boxStyle), ...style }}> const { text, title, style, mode, endText } = props;
<Text style={{ fontSize: 12, color: "#0099CC" }}>{title}</Text> return (
<View style={{ flex: 1 }} /> <View style={{ ...(mode == 2 ? boxStyle2 : boxStyle), ...style }}>
<View style={{ flexDirection: mode == 2 ? "row" : "column" }}> <Text style={{ fontSize: 12, color: "#0099CC" }}>{title}</Text>
{text?.match("") ? ( <View style={{ flex: 1 }} />
<> <View style={{ flexDirection: mode == 2 ? "row" : "column" }}>
<Text style={mode == 2 ? boxTextStyle2 : boxTextStyle}> {text?.match("") ? (
{text.split("")[0]} <>
<Text style={mode == 2 ? boxTextStyle2 : boxTextStyle}>
{text.split("")[0]}
</Text>
<Text style={{ color: "#0099CC", textAlign: "right" }}>
{mode == 2 ? "→" : "↓"}
</Text>
<Text style={mode == 2 ? boxTextStyle2 : boxTextStyle}>
{text.split("")[1]}
</Text>
</>
) : (
<Text style={mode == 2 ? boxTextStyle2 : boxTextStyle}>{text}</Text>
)}
</View>
{endText && (
<View style={{ flexDirection: mode == 2 ? "row" : "column" }}>
<Text
style={{
...{ ...(mode == 2 ? boxTextStyle2 : boxTextStyle) },
fontSize: 10,
}}
>
{endText}
</Text> </Text>
<Text style={{ color: "#0099CC", textAlign: "right" }}> </View>
{mode == 2 ? "→" : "↓"}
</Text>
<Text style={mode == 2 ? boxTextStyle2 : boxTextStyle}>
{text.split("")[1]}
</Text>
</>
) : (
<Text style={mode == 2 ? boxTextStyle2 : boxTextStyle}>{text}</Text>
)} )}
</View> </View>
</View> );
); };
const boxStyle: ViewStyle = { const boxStyle: ViewStyle = {
flex: 1, flex: 1,
backgroundColor: "white", backgroundColor: "white",

View File

@ -6,6 +6,12 @@ import { getStationList2 } from "../../../lib/getStationList2";
import { useCurrentTrain } from "../../../stateBox/useCurrentTrain"; import { useCurrentTrain } from "../../../stateBox/useCurrentTrain";
import { SheetManager } from "react-native-actions-sheet"; import { SheetManager } from "react-native-actions-sheet";
import { trainPosition } from "../../../lib/trainPositionTextArray"; import { trainPosition } from "../../../lib/trainPositionTextArray";
import { TrainPositionDataPush } from "../../発車時刻表/LED_inside_Component/TrainPositionDataPush";
import { getStationID } from "../../../lib/eachTrainInfoCoreLib/getStationData";
import { useStationList } from "../../../stateBox/useStationList";
import { lineList } from "../../../lib/getStationList";
export const TrainDataView = ({ export const TrainDataView = ({
currentTrainData, currentTrainData,
@ -15,20 +21,67 @@ export const TrainDataView = ({
mode = 0, mode = 0,
navigate, navigate,
}) => { }) => {
const { originalStationList } = useStationList();
const stationList =
originalStationList &&
lineList.map((d) =>
originalStationList[d].map((a) => ({
StationNumber: a.StationNumber,
StationName: a.Station_JP,
}))
);
const { width, height } = useWindowDimensions(); const { width, height } = useWindowDimensions();
const { isLandscape } = useDeviceOrientationChange(); const { isLandscape } = useDeviceOrientationChange();
const { inject } = useCurrentTrain(); const { inject } = useCurrentTrain();
const [mapsStationData, setMapsStationData] = useState(undefined); const [mapsStationData, setMapsStationData] = useState(undefined);
const [platformNumber, setPlatformNumber] = useState();
const [platformDescription, setPlatformDescription] = useState();
useEffect(() => {
//currentTrainData.Pos = "鴨川~端岡"; //test
if (!currentTrainData) return;
fetch(
`https://n8n.haruk.in/webhook/JR-shikoku-PosID?PosNum=${currentTrainData?.PosNum}&Line=${currentTrainData?.Line}`
)
.then((res) => res.json())
.then((data) => {
setPlatformNumber(data?.type == "Station" ? data?.platform : undefined);
setPlatformDescription(
data?.type == "Station" ? data?.description : undefined
);
});
}, [currentTrainData]);
useEffect(() => { useEffect(() => {
getStationList2().then(setMapsStationData); getStationList2().then(setMapsStationData);
}, []); }, []);
const onLine = !!currentPosition?.toString().length; const onLine = !!currentPosition?.toString().length;
const trainPositionText = (trainData) => { const trainPositionText = (trainData) => {
const { isBetween, Pos } = trainPosition(trainData); const { isBetween, Pos: PosData } = trainPosition(trainData);
if (isBetween === true) return `${Pos.from}${Pos.to}`; const { from, to, Pos } = PosData;
else return Pos.Pos == "" ? "" : `${Pos.Pos}`; if (isBetween === true) return `${from}${to}`;
if (Pos == "") return "";
return `${Pos}${platformNumber ? ` ${platformNumber}番線` : ""}`;
}; };
return ( const [dialog, setDialog] = useState(false);
const [deleteDialog, setDeleteDialog] = useState(false);
const [posInput, setPosInput] = useState("");
const [descInput, setDescInput] = useState("");
const [stationInput, setStationInput] = useState("");
const [stationNumberInput, setStationNumberInput] = useState("");
return (<>
<TrainPositionDataPush
dialog={dialog}
setDialog={setDialog}
currentTrainData={currentTrainData}
stationInput={stationInput}
stationNumberInput={stationNumberInput}
posInput={posInput}
descInput={descInput}
setPosInput={setPosInput}
setDescInput={setDescInput}
station={{Station_JP:trainPositionText(currentTrainData),StationNumber:currentPosition[0]}} />
<View <View
style={{ style={{
flexDirection: "row", flexDirection: "row",
@ -40,8 +93,30 @@ export const TrainDataView = ({
> >
<TouchableOpacity <TouchableOpacity
style={{ flex: 1, flexDirection: "row" }} style={{ flex: 1, flexDirection: "row" }}
disabled={!onLine} //disabled={!onLine}
onLongPress={() => {
const { isBetween, Pos } = trainPosition(currentTrainData);
if (isBetween === true) {
if (platformNumber == undefined && platformDescription == undefined)
return;
setStationInput(`${Pos.from}${Pos.to}`);
setStationNumberInput(
getStationID(currentTrainData?.Pos, stationList)
);
setPosInput(platformNumber?.toString() || "");
setDeleteDialog(true);
} else {
setStationInput(Pos.Pos);
setStationNumberInput(
getStationID(currentTrainData?.Pos, stationList)
);
setDescInput(platformDescription || "");
setPosInput(platformNumber?.toString() || "");
setDialog(true);
}
}}
onPress={() => { onPress={() => {
if(!onLine) return;
const test = []; const test = [];
Object.keys(mapsStationData).forEach((d) => { Object.keys(mapsStationData).forEach((d) => {
mapsStationData[d].forEach((x) => { mapsStationData[d].forEach((x) => {
@ -67,6 +142,7 @@ export const TrainDataView = ({
mode={mode} mode={mode}
title={`現在地 ${currentPosition?.toString()}${onLine ? "▶️" : ""}`} title={`現在地 ${currentPosition?.toString()}${onLine ? "▶️" : ""}`}
text={trainPositionText(currentTrainData)} text={trainPositionText(currentTrainData)}
endText={platformDescription ? `${platformDescription}` : ""}
style={ style={
onLine onLine
? { borderWidth: 1, borderColor: "red", borderStyle: "solid" } ? { borderWidth: 1, borderColor: "red", borderStyle: "solid" }
@ -110,5 +186,6 @@ export const TrainDataView = ({
</TouchableOpacity> </TouchableOpacity>
</View> </View>
</View> </View>
</>
); );
}; };

View File

@ -82,7 +82,7 @@ export default function TrainMenu({ style }) {
d={d} d={d}
navigate={navigate} navigate={navigate}
webview={webview} webview={webview}
key={index + indexBase} key={D.StationNumber+d}
/> />
))} ))}
</MapView> </MapView>

View File

@ -1,5 +1,6 @@
import React, { FC, useEffect, useState } from "react"; import React, { FC, useEffect, useState } from "react";
import { Linking, TouchableOpacity } from "react-native"; import { Linking, TouchableOpacity, Text } from "react-native";
import { Dialog, Button, Input } from "react-native-elements";
import { checkDuplicateTrainData } from "../../lib/checkDuplicateTrainData"; import { checkDuplicateTrainData } from "../../lib/checkDuplicateTrainData";
import { getTrainDelayStatus } from "../../lib/getTrainDelayStatus"; import { getTrainDelayStatus } from "../../lib/getTrainDelayStatus";
import { getTrainType } from "../../lib/getTrainType"; import { getTrainType } from "../../lib/getTrainType";
@ -11,7 +12,9 @@ import { LastStation } from "./LED_inside_Component/LastStation";
import { StatusAndDelay } from "./LED_inside_Component/StatusAndDelay"; import { StatusAndDelay } from "./LED_inside_Component/StatusAndDelay";
import { TrainName } from "./LED_inside_Component/TrainName"; import { TrainName } from "./LED_inside_Component/TrainName";
import { customTrainDataDetector } from "../custom-train-data"; import { customTrainDataDetector } from "../custom-train-data";
import { trainDataType, trainPosition } from "../../lib/trainPositionTextArray"; import { TrainPosition } from "./LED_inside_Component/TrainPosition";
import { TrainPositionDataPush } from "./LED_inside_Component/TrainPositionDataPush";
import { TrainPositionDataDelete } from "./LED_inside_Component/TrainPositionDataDelete";
type Props = { type Props = {
d: { d: {
@ -23,6 +26,7 @@ type Props = {
trainDescriptionSwitch: boolean; trainDescriptionSwitch: boolean;
station: { station: {
Station_JP: string; Station_JP: string;
StationNumber: string;
}; };
navigate: (screen: string, data?: any) => void; navigate: (screen: string, data?: any) => void;
openStationACFromEachTrainInfo: (station: string) => void; openStationACFromEachTrainInfo: (station: string) => void;
@ -83,6 +87,7 @@ export const EachData: FC<Props> = (props) => {
} }
return customTrainData; return customTrainData;
}; };
const [train, setTrain] = useState(getTrainDataFromCurrentTrain(d.train)); const [train, setTrain] = useState(getTrainDataFromCurrentTrain(d.train));
useEffect(() => { useEffect(() => {
setTrain(getTrainDataFromCurrentTrain(d.train)); setTrain(getTrainDataFromCurrentTrain(d.train));
@ -95,29 +100,37 @@ export const EachData: FC<Props> = (props) => {
currentTrainData, currentTrainData,
station.Station_JP station.Station_JP
)}`; )}`;
const trainPositionText = (trainData: trainDataType) => {
const { isBetween, Pos } = trainPosition(trainData);
if (isBetween === true) return `現在地:${Pos.from}${Pos.to}間を走行中`;
else return Pos.Pos == "" ? "" : `現在地:${Pos.Pos}`;
};
const [platformNumber, setPlatformNumber] = useState<number>(); const [platformNumber, setPlatformNumber] = useState<number>();
const [platformDescription, setPlatformDescription] = useState<string>(); const [platformDescription, setPlatformDescription] = useState<string>();
useEffect(() => {
fetch(
`https://n8n.haruk.in/webhook/JR-shikoku-PosID?PosNum=${currentTrainData?.PosNum}&Line=${currentTrainData?.Line}`
)
.then((res) => res.json())
.then((data) => {
setPlatformNumber(data?.type == "Station" ? data?.platform : undefined);
setPlatformDescription(
data?.type == "Station" ? data?.description : undefined
);
});
}, [currentTrainData, currentTrain]);
const [dialog, setDialog] = useState(false);
const [deleteDialog, setDeleteDialog] = useState(false);
const [posInput, setPosInput] = useState("");
const [descInput, setDescInput] = useState("");
const [stationInput, setStationInput] = useState("");
const [stationNumberInput, setStationNumberInput] = useState("");
return ( return (
<> <>
<TrainPositionDataDelete
dialog={deleteDialog}
setDialog={setDeleteDialog}
currentTrainData={currentTrainData}
stationInput={stationInput}
stationNumberInput={stationNumberInput}
/>
<TrainPositionDataPush
dialog={dialog}
setDialog={setDialog}
currentTrainData={currentTrainData}
stationInput={stationInput}
stationNumberInput={stationNumberInput}
posInput={posInput}
descInput={descInput}
setPosInput={setPosInput}
setDescInput={setDescInput}
station={station}
/>
<TouchableOpacity <TouchableOpacity
style={{ style={{
alignContent: "center", alignContent: "center",
@ -142,19 +155,20 @@ export const EachData: FC<Props> = (props) => {
<StatusAndDelay trainDelayStatus={trainDelayStatus} /> <StatusAndDelay trainDelayStatus={trainDelayStatus} />
</TouchableOpacity> </TouchableOpacity>
{trainDescriptionSwitch && ( {trainDescriptionSwitch && (
<Description <TrainPosition
info={`${ trainIDSwitch={trainIDSwitch}
trainIDSwitch currentTrainData={currentTrainData}
? currentTrainData?.PosNum + currentTrainData?.Line setStationInput={setStationInput}
: trainPositionText(currentTrainData) setStationNumberInput={setStationNumberInput}
} ${platformNumber ? platformNumber + "番線" : ""} ${ setDescInput={setDescInput}
platformDescription ? "("+platformDescription+")" : "" setPosInput={setPosInput}
}`} setDialog={setDialog}
onLongClick={() => { setDeleteDialog={setDeleteDialog}
Linking.openURL( setPlatformDescription={setPlatformDescription}
"https://nexcloud.haruk.in/apps/forms/s/TEkBQW5WLcYjLyAzGxncQLtw" setPlatformNumber={setPlatformNumber}
); platformDescription={platformDescription}
}} platformNumber={platformNumber}
key={d.train+"-trainPosition"}
/> />
)} )}
{trainDescriptionSwitch && !!train.info && ( {trainDescriptionSwitch && !!train.info && (

View File

@ -0,0 +1,127 @@
import React, { FC, useEffect } from "react";
import { Text, TextStyle, View, TouchableOpacity } from "react-native";
import { useStationList } from "../../../stateBox/useStationList";
import {
trainDataType,
trainPosition,
} from "../../../lib/trainPositionTextArray";
import { lineList } from "../../../lib/getStationList";
import { getStationID } from "../../../lib/eachTrainInfoCoreLib/getStationData";
import { useCurrentTrain } from "../../../stateBox/useCurrentTrain";
const descriptionStyle: TextStyle = {
fontSize: parseInt("16%"),
fontWeight: "bold",
};
type Props = {
numberOfLines?: number;
trainIDSwitch: boolean;
currentTrainData: trainDataType;
setStationInput: (station: string) => void;
setStationNumberInput: (station: string) => void;
setDescInput: (desc: string) => void;
setPosInput: (pos: string) => void;
setDialog: (dialog: boolean) => void;
setDeleteDialog: (dialog: boolean) => void;
platformDescription: string;
platformNumber: number;
setPlatformDescription: (desc: string) => void;
setPlatformNumber: (num: number) => void;
};
export const TrainPosition: FC<Props> = ({
numberOfLines = 0,
trainIDSwitch,
currentTrainData,
setStationInput,
setStationNumberInput,
setDescInput,
setPosInput,
setDialog,
setDeleteDialog,
setPlatformDescription,
setPlatformNumber,
platformDescription,
platformNumber,
}) => {
const { currentTrain } = useCurrentTrain();
const { originalStationList } = useStationList();
const stationList =
originalStationList &&
lineList.map((d) =>
originalStationList[d].map((a) => ({
StationNumber: a.StationNumber,
StationName: a.Station_JP,
}))
);
useEffect(() => {
fetch(
`https://n8n.haruk.in/webhook/JR-shikoku-PosID?PosNum=${currentTrainData?.PosNum}&Line=${currentTrainData?.Line}`
)
.then((res) => res.json())
.then((data: { type: string; platform: number; description: string }) => {
setPlatformNumber(data?.type == "Station" ? data?.platform : undefined);
setPlatformDescription(
data?.type == "Station" ? data?.description : undefined
);
});
}, [currentTrainData, currentTrain]);
const trainPositionText = (trainData: trainDataType) => {
const { isBetween, Pos } = trainPosition(trainData);
if (isBetween === true) return `現在地:${Pos.from}${Pos.to}間を走行中`;
else return Pos.Pos == "" ? "" : `現在地:${Pos.Pos}`;
};
return (
<TouchableOpacity
style={{
alignContent: "center",
alignItems: "center",
width: "94%",
marginVertical: 5,
marginHorizontal: "3%",
backgroundColor: "#000",
flexDirection: "row",
overflow: "hidden",
}}
onLongPress={() => {
const { isBetween, Pos } = trainPosition(currentTrainData);
if (isBetween === true) {
if (platformNumber == undefined && platformDescription == undefined)
return;
setStationInput(`${Pos.from}${Pos.to}`);
setStationNumberInput(
getStationID(currentTrainData?.Pos, stationList)
);
setPosInput(platformNumber?.toString() || "");
setDeleteDialog(true);
} else {
setStationInput(Pos.Pos);
setStationNumberInput(
getStationID(currentTrainData?.Pos, stationList)
);
setDescInput(platformDescription || "");
setPosInput(platformNumber?.toString() || "");
setDialog(true);
}
}}
>
<View style={{ flex: 4, flexDirection: "row" }}>
<Text
style={{ ...descriptionStyle, color: "green" }}
numberOfLines={numberOfLines}
>
{`${
trainIDSwitch
? currentTrainData?.PosNum + currentTrainData?.Line
: trainPositionText(currentTrainData)
} ${platformNumber ? platformNumber + "番線" : ""} ${
platformDescription ? "(" + platformDescription + ")" : ""
}`}
</Text>
</View>
</TouchableOpacity>
);
};

View File

@ -0,0 +1,46 @@
import React, { FC } from "react";
import { Text } from "react-native";
import { Dialog, Button } from "react-native-elements";
import { trainDataType } from "../../../lib/trainPositionTextArray";
type Props = {
dialog: boolean;
setDialog: (dialog: boolean) => void;
currentTrainData: trainDataType;
stationInput: string;
stationNumberInput: string;
};
export const TrainPositionDataDelete: FC<Props> = ({
dialog,
setDialog,
currentTrainData,
stationInput,
stationNumberInput,
}) => {
const sendPlatformData = () => {
fetch(`https://n8n.haruk.in/webhook/JR-shikoku-PosID`, {
method: "DELETE",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
PosId: currentTrainData?.PosNum,
lineName: currentTrainData?.Line,
}),
})
.then(() => {
alert("位置情報データ削除要求を送信しました。");
setDialog(false);
})
.catch(() => {
alert("位置情報データ削除要求の送信に失敗しました。");
});
};
return (
<Dialog isVisible={dialog} onBackdropPress={() => setDialog(false)}>
<Text></Text>
<Text>: {currentTrainData?.Line}</Text>
<Text>ID: {currentTrainData?.PosNum}</Text>
<Text>: {stationInput}</Text>
<Text>: {stationNumberInput}</Text>
<Button title="送信" onPress={sendPlatformData} />
</Dialog>
);
};

View File

@ -0,0 +1,77 @@
import React, { FC, useState } from "react";
import { Text } from "react-native";
import { Dialog, Input, Button } from "react-native-elements";
import { trainDataType } from "../../../lib/trainPositionTextArray";
import { useCurrentTrain } from "../../../stateBox/useCurrentTrain";
type Props = {
dialog: boolean;
setDialog: (dialog: boolean) => void;
currentTrainData: trainDataType;
stationInput: string;
stationNumberInput: string;
posInput: string;
descInput: string;
setPosInput: (pos: string) => void;
setDescInput: (desc: string) => void;
station: {
Station_JP: string;
StationNumber: string;
};
};
export const TrainPositionDataPush: FC<Props> = ({
dialog,
setDialog,
currentTrainData,
stationInput,
stationNumberInput,
posInput,
descInput,
setPosInput,
setDescInput,
station,
}) => {
const sendPlatformData = () => {
fetch(`https://n8n.haruk.in/webhook/JR-shikoku-PosID`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
PosId: currentTrainData?.PosNum,
lineName: currentTrainData?.Line,
PlatformNum: parseInt(posInput),
Description: descInput,
StationName: station.Station_JP,
StationId: station.StationNumber,
}),
})
.then(() => {
alert("位置情報データを送信しました。");
setDialog(false);
setPosInput("");
setDescInput("");
})
.catch(() => {
alert("位置情報データの送信に失敗しました。");
});
};
return (
<Dialog isVisible={dialog} onBackdropPress={() => setDialog(false)}>
<Text>: {currentTrainData?.Line}</Text>
<Text>ID: {currentTrainData?.PosNum}</Text>
<Text>: {stationInput}</Text>
<Text>: {stationNumberInput}</Text>
<Input
label="番線"
inputMode="numeric"
value={posInput}
onChangeText={setPosInput}
/>
<Input
label="参考情報"
inputMode="text"
value={descInput}
onChangeText={setDescInput}
/>
<Button title="送信" onPress={sendPlatformData} />
</Dialog>
);
};

View File

@ -206,6 +206,7 @@ export default function LED_vision(props) {
openStationACFromEachTrainInfo, openStationACFromEachTrainInfo,
}} }}
station={station[0]} station={station[0]}
key={d.train}
/> />
))} ))}
{areaString != "" && isInfoArea && ( {areaString != "" && isInfoArea && (

View File

@ -362,10 +362,10 @@ const JRSTraInfoBox = () => {
/> />
</View> </View>
) : delayData ? ( ) : delayData ? (
delayData.map((d) => { delayData.map((d,index,array) => {
let data = d.split(" "); let data = d.split(" ");
return ( return (
<View style={{ flexDirection: "row" }} key={data[1] + "key"}> <View style={{ flexDirection: "row" }} key={data[1] + "key"+index}>
<Text style={{ flex: 15, fontSize: 18 }}> <Text style={{ flex: 15, fontSize: 18 }}>
{data[0].replace("\n", "")} {data[0].replace("\n", "")}
</Text> </Text>