ultisuite-client/lib/drive/drive-date.ts
R3D347HR4Y 6ec95262af Add OnlyOffice integration and update project configurations
- Updated .env.example to include configuration for OnlyOffice Document Server.
- Modified the workspace configuration to remove the drive-suite path.
- Adjusted TypeScript environment imports for consistency.
- Enhanced Next.js configuration to disable canvas in Webpack.
- Updated package.json to include new dependencies for OnlyOffice and PDF.js.
- Added global styles for OnlyOffice theme integration in the CSS.
- Created new layout and page components for the Drive feature, including public sharing and editing functionalities.
- Updated metadata handling across various layouts to reflect the new app structure.
2026-06-07 15:49:21 +02:00

134 lines
3.0 KiB
TypeScript

import dayjs, { type Dayjs } from "dayjs"
import localizedFormat from "dayjs/plugin/localizedFormat"
import relativeTime from "dayjs/plugin/relativeTime"
import updateLocale from "dayjs/plugin/updateLocale"
import "dayjs/locale/fr"
import "dayjs/locale/en"
dayjs.extend(localizedFormat)
dayjs.extend(relativeTime)
dayjs.extend(updateLocale)
/** Compact relative units for list column (fr). */
dayjs.updateLocale("fr", {
relativeTime: {
future: "dans %s",
past: "il y a %s",
s: "1 min",
m: "1 min",
mm: "%d min",
h: "1 h",
hh: "%d h",
d: "1 j",
dd: "%d j",
M: "1 mois",
MM: "%d mois",
y: "1 an",
yy: "%d ans",
},
})
dayjs.updateLocale("en", {
relativeTime: {
future: "in %s",
past: "%s ago",
s: "1 min",
m: "1 min",
mm: "%d min",
h: "1 h",
hh: "%d h",
d: "1 d",
dd: "%d d",
M: "1 mo",
MM: "%d mo",
y: "1 y",
yy: "%d y",
},
})
const SUPPORTED_LOCALES = new Set(["fr", "en", "de", "es", "it", "pt", "nl", "pl", "ja", "zh"])
let activeLocale: string | null = null
export function resolveDriveDateLocale(): string {
if (typeof navigator === "undefined") return "fr"
const base = navigator.language.split("-")[0]?.toLowerCase() ?? "fr"
return SUPPORTED_LOCALES.has(base) ? base : "en"
}
export function ensureDriveDateLocale(): void {
const next = resolveDriveDateLocale()
if (activeLocale === next) return
dayjs.locale(next)
activeLocale = next
}
export function parseDriveDate(iso: string): Dayjs | null {
if (!iso?.trim()) return null
const d = dayjs(iso)
return d.isValid() ? d : null
}
/** Full local datetime for tooltip / aria-label. */
export function formatDriveListDateFull(iso: string): string {
ensureDriveDateLocale()
const d = parseDriveDate(iso)
if (!d) return ""
return d.format("dddd D MMMM YYYY [à] LT")
}
/** Short label for list column (relative when recent). */
function instantLabel(): string {
return activeLocale === "en" ? "Just now" : "À l'instant"
}
function yesterdayLabel(): string {
return activeLocale === "en" ? "Yesterday" : "Hier"
}
export function formatDriveListDateShort(iso: string, now: Dayjs = dayjs()): string {
ensureDriveDateLocale()
const d = parseDriveDate(iso)
if (!d) return "—"
if (d.isAfter(now)) {
return d.format("LT")
}
const diffSec = now.diff(d, "second")
if (diffSec < 50) return instantLabel()
if (d.isSame(now, "day")) {
if (diffSec < 6 * 3600) return d.fromNow()
return d.format("LT")
}
if (d.isSame(now.subtract(1, "day"), "day")) {
return yesterdayLabel()
}
if (now.diff(d, "day") < 7) {
return d.fromNow()
}
if (d.isSame(now, "year")) {
return d.format("D MMM")
}
return d.format("D MMM YYYY")
}
export function formatDriveListDate(iso: string): {
short: string
full: string
dateTime?: string
} {
const d = parseDriveDate(iso)
if (!d) return { short: "—", full: "" }
return {
short: formatDriveListDateShort(iso),
full: formatDriveListDateFull(iso),
dateTime: d.toISOString(),
}
}