diff --git a/components/ActionSheetComponents/EachTrainInfo/StateBox.tsx b/components/ActionSheetComponents/EachTrainInfo/StateBox.tsx index 41cf9cb..fa5f65c 100644 --- a/components/ActionSheetComponents/EachTrainInfo/StateBox.tsx +++ b/components/ActionSheetComponents/EachTrainInfo/StateBox.tsx @@ -6,30 +6,46 @@ type stateBox = { title: string; style?: ViewStyle; mode?: number; + endText?: string; }; -export const StateBox: FC = ({ text, title, style, mode }) => ( - - {title} - - - {text?.match("~") ? ( - <> - - {text.split("~")[0]} +export const StateBox: FC = (props) => { + const { text, title, style, mode, endText } = props; + return ( + + {title} + + + {text?.match("~") ? ( + <> + + {text.split("~")[0]} + + + {mode == 2 ? "→" : "↓"} + + + {text.split("~")[1]} + + + ) : ( + {text} + )} + + {endText && ( + + + {endText} - - {mode == 2 ? "→" : "↓"} - - - {text.split("~")[1]} - - - ) : ( - {text} + )} - -); + ); +}; const boxStyle: ViewStyle = { flex: 1, backgroundColor: "white", diff --git a/components/ActionSheetComponents/EachTrainInfo/TrainDataView.js b/components/ActionSheetComponents/EachTrainInfo/TrainDataView.js index 26d7334..0aa5dcd 100644 --- a/components/ActionSheetComponents/EachTrainInfo/TrainDataView.js +++ b/components/ActionSheetComponents/EachTrainInfo/TrainDataView.js @@ -6,6 +6,12 @@ import { getStationList2 } from "../../../lib/getStationList2"; import { useCurrentTrain } from "../../../stateBox/useCurrentTrain"; import { SheetManager } from "react-native-actions-sheet"; 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 = ({ currentTrainData, @@ -15,20 +21,67 @@ export const TrainDataView = ({ mode = 0, 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 { isLandscape } = useDeviceOrientationChange(); const { inject } = useCurrentTrain(); 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(() => { getStationList2().then(setMapsStationData); }, []); const onLine = !!currentPosition?.toString().length; const trainPositionText = (trainData) => { - const { isBetween, Pos } = trainPosition(trainData); - if (isBetween === true) return `${Pos.from}~${Pos.to}`; - else return Pos.Pos == "" ? "" : `${Pos.Pos}`; + const { isBetween, Pos: PosData } = trainPosition(trainData); + const { from, to, Pos } = PosData; + 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 (<> + { + 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={() => { + if(!onLine) return; const test = []; Object.keys(mapsStationData).forEach((d) => { mapsStationData[d].forEach((x) => { @@ -67,6 +142,7 @@ export const TrainDataView = ({ mode={mode} title={`現在地 ${currentPosition?.toString()}${onLine ? "▶️" : ""}`} text={trainPositionText(currentTrainData)} + endText={platformDescription ? `${platformDescription}` : ""} style={ onLine ? { borderWidth: 1, borderColor: "red", borderStyle: "solid" } @@ -110,5 +186,6 @@ export const TrainDataView = ({ + ); }; diff --git a/components/trainMenu.js b/components/trainMenu.js index ea00fac..ef5f5d2 100644 --- a/components/trainMenu.js +++ b/components/trainMenu.js @@ -82,7 +82,7 @@ export default function TrainMenu({ style }) { d={d} navigate={navigate} webview={webview} - key={index + indexBase} + key={D.StationNumber+d} /> ))} diff --git a/components/発車時刻表/EachData.tsx b/components/発車時刻表/EachData.tsx index 275358e..0604b9b 100644 --- a/components/発車時刻表/EachData.tsx +++ b/components/発車時刻表/EachData.tsx @@ -1,5 +1,6 @@ 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 { getTrainDelayStatus } from "../../lib/getTrainDelayStatus"; import { getTrainType } from "../../lib/getTrainType"; @@ -11,7 +12,9 @@ import { LastStation } from "./LED_inside_Component/LastStation"; import { StatusAndDelay } from "./LED_inside_Component/StatusAndDelay"; import { TrainName } from "./LED_inside_Component/TrainName"; 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 = { d: { @@ -23,6 +26,7 @@ type Props = { trainDescriptionSwitch: boolean; station: { Station_JP: string; + StationNumber: string; }; navigate: (screen: string, data?: any) => void; openStationACFromEachTrainInfo: (station: string) => void; @@ -83,6 +87,7 @@ export const EachData: FC = (props) => { } return customTrainData; }; + const [train, setTrain] = useState(getTrainDataFromCurrentTrain(d.train)); useEffect(() => { setTrain(getTrainDataFromCurrentTrain(d.train)); @@ -95,29 +100,37 @@ export const EachData: FC = (props) => { currentTrainData, 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(); const [platformDescription, setPlatformDescription] = useState(); - 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 ( <> + + = (props) => { {trainDescriptionSwitch && ( - { - Linking.openURL( - "https://nexcloud.haruk.in/apps/forms/s/TEkBQW5WLcYjLyAzGxncQLtw" - ); - }} + )} {trainDescriptionSwitch && !!train.info && ( diff --git a/components/発車時刻表/LED_inside_Component/TrainPosition.tsx b/components/発車時刻表/LED_inside_Component/TrainPosition.tsx new file mode 100644 index 0000000..a3ecdbc --- /dev/null +++ b/components/発車時刻表/LED_inside_Component/TrainPosition.tsx @@ -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 = ({ + 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 ( + { + 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); + } + }} + > + + + {`${ + trainIDSwitch + ? currentTrainData?.PosNum + currentTrainData?.Line + : trainPositionText(currentTrainData) + } ${platformNumber ? platformNumber + "番線" : ""} ${ + platformDescription ? "(" + platformDescription + ")" : "" + }`} + + + + ); +}; diff --git a/components/発車時刻表/LED_inside_Component/TrainPositionDataDelete.tsx b/components/発車時刻表/LED_inside_Component/TrainPositionDataDelete.tsx new file mode 100644 index 0000000..b266d6c --- /dev/null +++ b/components/発車時刻表/LED_inside_Component/TrainPositionDataDelete.tsx @@ -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 = ({ + 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 ( + setDialog(false)}> + 以下のデータを誤情報として削除要求を出しますか? + 路線: {currentTrainData?.Line} + 地点ID: {currentTrainData?.PosNum} + 駅名: {stationInput} + 駅ナンバー: {stationNumberInput} + + ); +}; diff --git a/components/発車時刻表/LED_inside_Component/TrainPositionDataPush.tsx b/components/発車時刻表/LED_inside_Component/TrainPositionDataPush.tsx new file mode 100644 index 0000000..7bf8be2 --- /dev/null +++ b/components/発車時刻表/LED_inside_Component/TrainPositionDataPush.tsx @@ -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 = ({ + 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 ( + setDialog(false)}> + 路線: {currentTrainData?.Line} + 地点ID: {currentTrainData?.PosNum} + 駅名: {stationInput} + 駅ナンバー: {stationNumberInput} + + + + ); +}; diff --git a/components/発車時刻表/LED_vidion.js b/components/発車時刻表/LED_vidion.js index 51fa6e3..eca24ec 100644 --- a/components/発車時刻表/LED_vidion.js +++ b/components/発車時刻表/LED_vidion.js @@ -206,6 +206,7 @@ export default function LED_vision(props) { openStationACFromEachTrainInfo, }} station={station[0]} + key={d.train} /> ))} {areaString != "" && isInfoArea && ( diff --git a/menu.js b/menu.js index 260d4a8..12b9d36 100644 --- a/menu.js +++ b/menu.js @@ -362,10 +362,10 @@ const JRSTraInfoBox = () => { /> ) : delayData ? ( - delayData.map((d) => { + delayData.map((d,index,array) => { let data = d.split(" "); return ( - + {data[0].replace("\n", "")}