ultisuite-client/components/gmail/mail-date-text.tsx
R3D347HR4Y efaaf16f60
Some checks are pending
E2E / Playwright e2e (push) Waiting to run
feat: update metadata and layout for new product pages
- 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.
2026-06-19 22:11:42 +02:00

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>
)
}