Files
jrshikoku/lib/trainIconEntries.ts

98 lines
2.5 KiB
TypeScript

import type { CustomTrainData, OperationLogs } from "@/lib/CommonTypes";
import type { IconDisplayMode } from "@/lib/iconDisplayMode";
import { resolveOperationIconPair } from "@/lib/operationLogIcon";
import { resolveTrainDataIcon } from "@/lib/trainDataIcon";
export type TrainIconEntry = {
vehicle_info_img: string;
vehicle_info_right_img: string;
vehicle_info_url: string;
};
type TrainDataForIcon = Pick<
CustomTrainData,
"train_info_img" | "train_info_img_hub" | "vehicle_info_url"
>;
const extractOrderNumber = (trainId: string): number => {
const parts = trainId.split(",");
if (parts.length <= 1) return Infinity;
const num = parseInt(parts[1].trim(), 10);
return isNaN(num) ? Infinity : num;
};
const findMatchingTrainId = (
operation: OperationLogs,
trainNum: string,
): string | null => {
const allTrainIds = [
...(operation.train_ids || []),
...(operation.related_train_ids || []),
];
for (const trainId of allTrainIds) {
const prefix = trainId.split(",")[0];
if (prefix === trainNum) return trainId;
}
return null;
};
export const sortOperationsForTrainIcon = (
operations: OperationLogs[],
trainNum: string,
): OperationLogs[] =>
[...operations].sort((a, b) => {
const aTrainId = findMatchingTrainId(a, trainNum);
const bTrainId = findMatchingTrainId(b, trainNum);
if (!aTrainId || !bTrainId) {
return aTrainId ? -1 : bTrainId ? 1 : 0;
}
return extractOrderNumber(aTrainId) - extractOrderNumber(bTrainId);
});
export const resolveTrainIconEntries = ({
trainNum,
customTrainData,
todayOperation,
iconDisplayMode,
}: {
trainNum: string;
customTrainData: TrainDataForIcon;
todayOperation: OperationLogs[];
iconDisplayMode: IconDisplayMode;
}): TrainIconEntry[] => {
const fallbackIcon = resolveTrainDataIcon(customTrainData, iconDisplayMode);
if (todayOperation.length > 0) {
return sortOperationsForTrainIcon(todayOperation, trainNum)
.map((operation) => {
const { forward, rear } = resolveOperationIconPair(
operation,
iconDisplayMode,
fallbackIcon,
);
return {
vehicle_info_img: forward,
vehicle_info_right_img: rear,
vehicle_info_url: operation.vehicle_info_url,
};
})
.filter((entry) => entry.vehicle_info_img || entry.vehicle_info_right_img);
}
if (!fallbackIcon) return [];
return [
{
vehicle_info_img: fallbackIcon,
vehicle_info_right_img: fallbackIcon,
vehicle_info_url: customTrainData.vehicle_info_url || "",
},
];
};