Newer
Older
client_dwatch / lib / prechecks / label.ts
/**
 * アラート(事前チェック)の種別ラベルの組み立て(純粋関数)。
 *
 * ★固定ラベル(`precheck_1h` → 「1h前異常」)をやめた理由★(D-105 / D-093 項2):
 *   `clean_timetables.precheck` は ★設定値に応じた任意の分数★ を取りうる
 *   (ユーザー回答: 「20だったら20分前になります」)。分数ごとの enum も
 *   分数ごとの固定ラベルも持てないので、`precheck_minutes`(数値)から組み立てる。
 *
 * ★画面(`components/features/alerts/AlertsScreen.tsx`)から切り出してある理由★:
 *   「20分前異常」のような**設定値以外の分数**が本当にラベルになるかは
 *   本指示書の完了条件(指示書S 完了条件7)であり、目視だけでは固定できない。
 *   純粋関数にしてテストで固定する(`CLAUDE.md` §6-2)。
 */
import type { PrecheckItem } from "@/lib/types";

/** `useTheme()` が渡す翻訳関数と同じ形(`components/theme/ThemeProvider.tsx`) */
export type Translate = (text: string) => string;

/**
 * `precheck_minutes` から種別ラベル(「◯分前異常」)を作る。
 *
 * ★i18n は方式A(プレースホルダ + replace)★ — `lib/i18n.ts` はキーが日本語原文の
 *   完全一致なので、数値が混ざる文言はそのままキーにできない。
 *   前例は `"{n}分前"` / `"第{n}回チェック"`(同ファイル)。
 *
 * ★アラートは事前チェック異常だけ★(ユーザー判断 2026-10-29)— 旧「出発失敗」のラベルと、
 *   `precheck_minutes` が `null` のときの「事前チェック異常」への退避は消した
 *   (`null` は出発失敗の行にしか無く、型からも外した)。
 */
export function precheckSeverityLabel(
  t: Translate,
  item: Pick<PrecheckItem, "precheck_minutes">
): string {
  return t("{n}分前異常").replace("{n}", String(item.precheck_minutes));
}