File size: 1,476 Bytes
1187856
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import { getDb } from "@/lib/db";
import { all } from "@/lib/db/helpers";
import { getDateStatus } from "@/lib/utils";
import type { ImportantDate } from "@/lib/db/schema";
import { hasLocalizedText, localized } from "@/lib/i18n";

function formatDate(value: string, locale: "en" | "zh"): string {
  const date = new Date(value);
  if (Number.isNaN(date.getTime())) return value;
  return new Intl.DateTimeFormat(locale === "zh" ? "zh-CN" : "en-US", {
    month: locale === "zh" ? "long" : "short",
    day: "2-digit",
    year: "numeric",
    timeZone: "UTC",
  }).format(date);
}

export function getImportantDates(): ImportantDate[] {
  const rows = all<ImportantDate>(
    getDb().prepare("SELECT * FROM important_dates ORDER BY sort_order, starts_at")
  );
  return rows
    .map((row) => ({
      ...row,
      status: getDateStatus(row.starts_at, row.ends_at),
      titleText: localized(row.title_en || row.title, row.title_zh),
      dateLabelText: localized(
        row.date_label_en || formatDate(row.starts_at, "en"),
        row.date_label_zh || formatDate(row.starts_at, "zh")
      ),
      bodyText: localized(row.body_en || row.body, row.body_zh),
      ctaLabelText: localized(row.cta_label_en || row.cta_label || "", row.cta_label_zh),
    }))
    .filter(
      (row) =>
        hasLocalizedText(row.titleText) ||
        hasLocalizedText(row.dateLabelText) ||
        hasLocalizedText(row.bodyText) ||
        hasLocalizedText(row.ctaLabelText)
    );
}