Some checks are pending
E2E / Playwright e2e (push) Waiting to run
- Refactored metadata for contacts, administration, and Ulticards pages to utilize dynamic app names and descriptions. - Introduced new product pages for Ultiai, Ultical, Ulticards, Ultidrive, Ultimail, and Ultimeet with appropriate metadata. - Enhanced layout components to ensure consistent styling and functionality across new product sections. - Updated various components to replace hardcoded labels with dynamic references to improve maintainability and consistency.
64 lines
1.5 KiB
TypeScript
64 lines
1.5 KiB
TypeScript
"use client"
|
|
|
|
import { useEffect, useState } from "react"
|
|
import {
|
|
formatMailDate,
|
|
formatMailPreviewDatePrimary,
|
|
formatMailPreviewDateRelative,
|
|
type MailDateDisplayVariant,
|
|
} from "@/lib/mail-date"
|
|
import { cn } from "@/lib/utils"
|
|
|
|
type MailDateTextProps = {
|
|
iso: string | undefined
|
|
variant: MailDateDisplayVariant
|
|
className?: string
|
|
}
|
|
|
|
type PreviewDateLines = {
|
|
primary: string
|
|
relative: string | null
|
|
}
|
|
|
|
/** Date mail formatée côté client (fuseau navigateur, évite mismatch SSR). */
|
|
export function MailDateText({ iso, variant, className }: MailDateTextProps) {
|
|
const [text, setText] = useState("\u00a0")
|
|
const [previewLines, setPreviewLines] = useState<PreviewDateLines | null>(null)
|
|
|
|
useEffect(() => {
|
|
if (!iso?.trim()) {
|
|
setText("—")
|
|
setPreviewLines(null)
|
|
return
|
|
}
|
|
if (variant === "preview") {
|
|
setPreviewLines({
|
|
primary: formatMailPreviewDatePrimary(iso),
|
|
relative: formatMailPreviewDateRelative(iso),
|
|
})
|
|
setText("\u00a0")
|
|
return
|
|
}
|
|
setPreviewLines(null)
|
|
setText(formatMailDate(iso, variant))
|
|
}, [iso, variant])
|
|
|
|
if (variant === "preview" && previewLines) {
|
|
return (
|
|
<span
|
|
className={cn("inline-flex flex-col items-end leading-tight", className)}
|
|
suppressHydrationWarning
|
|
>
|
|
<span>{previewLines.primary}</span>
|
|
{previewLines.relative ? <span>{previewLines.relative}</span> : null}
|
|
</span>
|
|
)
|
|
}
|
|
|
|
return (
|
|
<span className={cn(className)} suppressHydrationWarning>
|
|
{text}
|
|
</span>
|
|
)
|
|
}
|