feat: tooltip with concrete date on relative timestamps in SPA

This commit is contained in:
2026-07-10 00:22:14 +02:00
parent 2e2adef5e0
commit 5d4622e046
4 changed files with 25 additions and 5 deletions

View File

@@ -8,7 +8,7 @@ type MovieCardProps = {
movie: MovieDto movie: MovieDto
rating?: number rating?: number
comment?: string comment?: string
subtitle?: string subtitle?: React.ReactNode
variant?: "compact" | "full" variant?: "compact" | "full"
action?: React.ReactNode action?: React.ReactNode
} }

View File

@@ -13,7 +13,7 @@ import { EmptyState } from "@/components/empty-state"
import { SwipeTabs } from "@/components/swipe-tabs" import { SwipeTabs } from "@/components/swipe-tabs"
import { VirtualList } from "@/components/virtual-list" import { VirtualList } from "@/components/virtual-list"
import { useInfiniteDiary } from "@/hooks/use-diary" import { useInfiniteDiary } from "@/hooks/use-diary"
import { timeAgo } from "@/lib/date" import { TimeAgo } from "@/components/time-ago"
import type { UserProfileResponse } from "@/lib/api/users" import type { UserProfileResponse } from "@/lib/api/users"
type ProfileViewProps = { type ProfileViewProps = {
@@ -168,7 +168,7 @@ function DiaryTab({ sortBy, userId, search }: { sortBy: string; userId?: string;
movie={e.movie} movie={e.movie}
rating={e.review.rating} rating={e.review.rating}
comment={e.review.comment} comment={e.review.comment}
subtitle={t("profile.watchedAgo", { when: timeAgo(e.review.watched_at) })} subtitle={<><TimeAgo date={e.review.watched_at} /></>}
variant="compact" variant="compact"
/> />
)} )}

View File

@@ -1,6 +1,6 @@
import { Link } from "@tanstack/react-router" import { Link } from "@tanstack/react-router"
import { Globe, Pencil } from "lucide-react" import { Globe, Pencil } from "lucide-react"
import { timeAgo } from "@/lib/date" import { TimeAgo } from "@/components/time-ago"
import { StarDisplay } from "@/components/star-display" import { StarDisplay } from "@/components/star-display"
import { WatchMediumBadge } from "@/components/watch-medium-badge" import { WatchMediumBadge } from "@/components/watch-medium-badge"
import { EditableContextMenu } from "@/components/editable-context-menu" import { EditableContextMenu } from "@/components/editable-context-menu"
@@ -42,7 +42,7 @@ export function ReviewCard({ movie, review, userName, userId, isFederated, actor
)} )}
{isFederated && <Globe className="size-3 text-muted-foreground/60" />} {isFederated && <Globe className="size-3 text-muted-foreground/60" />}
<span>·</span> <span>·</span>
<span>{timeAgo(review.watched_at)}</span> <TimeAgo date={review.watched_at} />
</div> </div>
)} )}
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">

View File

@@ -0,0 +1,20 @@
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"
import { timeAgo, shortDate } from "@/lib/date"
type TimeAgoProps = {
date: string
className?: string
}
export function TimeAgo({ date, className }: TimeAgoProps) {
return (
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<time dateTime={date} className={className}>{timeAgo(date)}</time>
</TooltipTrigger>
<TooltipContent>{shortDate(date)}</TooltipContent>
</Tooltip>
</TooltipProvider>
)
}