98 lines
2.5 KiB
TypeScript
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 || "",
|
|
},
|
|
];
|
|
};
|