112 lines
3.7 KiB
TypeScript
112 lines
3.7 KiB
TypeScript
import dayjs from "dayjs";
|
|
import { trainDataType, trainPosition } from "@/lib/trainPositionTextArray";
|
|
import { eachTrainDiagramType, StationProps } from "@/lib/CommonTypes";
|
|
type trainDataProps = {
|
|
d: eachTrainDiagramType;
|
|
currentTrain: trainDataType[];
|
|
station: StationProps[];
|
|
};
|
|
export const trainTimeFiltering: (x: trainDataProps) => boolean = (props) => {
|
|
const { d, currentTrain, station } = props;
|
|
const baseTime = 2;
|
|
if (currentTrain.filter((t) => t.num == d.train).length == 0) {
|
|
const date = dayjs();
|
|
const trainTime = date
|
|
.hour(parseInt(d.time.split(":")[0]))
|
|
.minute(parseInt(d.time.split(":")[1]));
|
|
|
|
if (date.isAfter(trainTime)) {
|
|
return false;
|
|
} else if (trainTime.diff(date) < baseTime * 60 * 60 * 1000) {
|
|
return true;
|
|
}
|
|
return false;
|
|
} else {
|
|
const Pos = trainPosition(currentTrain.filter((t) => t.num == d.train)[0]);
|
|
const nextPos = Pos.isBetween ? Pos.Pos.to : Pos.Pos.Pos;
|
|
const PrePos = Pos.isBetween ? Pos.Pos.from : "";
|
|
if (station[0].Station_JP == nextPos) {
|
|
if (d.lastStation != station[0].Station_JP) return true;
|
|
} else if (station[0].Station_JP == PrePos) {
|
|
return false;
|
|
}
|
|
let [h, m] = d.time.split(":");
|
|
let delay = isNaN(currentTrain.filter((t) => t.num == d.train)[0].delay)
|
|
? 0
|
|
: currentTrain.filter((t) => t.num == d.train)[0].delay;
|
|
const date = dayjs();
|
|
let targetHour = parseInt(h);
|
|
|
|
// 4時を日付変更線として処理
|
|
if (targetHour < 4) {
|
|
targetHour += 24;
|
|
}
|
|
|
|
let currentHour = date.hour();
|
|
if (currentHour < 4) {
|
|
currentHour += 24;
|
|
}
|
|
|
|
const db = dayjs()
|
|
.hour(targetHour)
|
|
.minute(parseInt(m) + parseInt(delay));
|
|
const currentTime = dayjs().hour(currentHour);
|
|
|
|
return !currentTime.isAfter(db);
|
|
}
|
|
};
|
|
type getTimeProps = (stationDiagram: { [key: string]: string }, station: StationProps) => eachTrainDiagramType[];
|
|
export const getTime: getTimeProps = (stationDiagram, station) => {
|
|
const returnData = Object.keys(stationDiagram)
|
|
.map((trainNum) => {
|
|
let trainData: eachTrainDiagramType = {
|
|
time: "",
|
|
lastStation: "",
|
|
isThrough: false,
|
|
train: trainNum,
|
|
};
|
|
stationDiagram[trainNum].split("#").forEach((data) => {
|
|
if (data.match("着")) {
|
|
trainData.lastStation = data.split(",着,")[0];
|
|
}
|
|
if (data.match("着編")) {
|
|
trainData.lastStation = data.split(",着編,")[0];
|
|
}
|
|
if (data.split(",")[0] === station.Station_JP) {
|
|
if (data.match(",発,")) {
|
|
trainData.time = data.split(",発,")[1];
|
|
} else if (data.match(",発編,")) {
|
|
trainData.time = data.split(",発編,")[1];
|
|
} else if (data.match(",通編,")) {
|
|
trainData.time = data.split(",通編,")[1];
|
|
trainData.isThrough = true;
|
|
} else if (data.match(",着,")) {
|
|
trainData.time = data.split(",着,")[1];
|
|
} else if (data.match(",着編,")) {
|
|
trainData.time = data.split(",着編,")[1];
|
|
}
|
|
}
|
|
});
|
|
return {
|
|
train: trainNum,
|
|
time: trainData.time,
|
|
lastStation: trainData.lastStation,
|
|
isThrough: trainData.isThrough,
|
|
};
|
|
})
|
|
.filter((d) => d.time);
|
|
return returnData.sort((a, b) => {
|
|
switch (true) {
|
|
case parseInt(a.time.split(":")[0]) < parseInt(b.time.split(":")[0]):
|
|
return -1;
|
|
case parseInt(a.time.split(":")[0]) > parseInt(b.time.split(":")[0]):
|
|
return 1;
|
|
case parseInt(a.time.split(":")[1]) < parseInt(b.time.split(":")[1]):
|
|
return -1;
|
|
case parseInt(a.time.split(":")[1]) > parseInt(b.time.split(":")[1]):
|
|
return 1;
|
|
default:
|
|
return 0;
|
|
}
|
|
});
|
|
}; |