From 9e310bf93cdea2b37eebbe55435fe44374679dd3 Mon Sep 17 00:00:00 2001 From: boojack Date: Mon, 27 Apr 2026 21:50:41 +0800 Subject: [PATCH] chore(memo): clarify displayed update time --- .../components/MemoView/MemoViewContext.tsx | 10 ++- .../MemoView/components/MemoHeader.tsx | 74 +++++++++++++------ 2 files changed, 61 insertions(+), 23 deletions(-) diff --git a/web/src/components/MemoView/MemoViewContext.tsx b/web/src/components/MemoView/MemoViewContext.tsx index a2604b835..41ef385fd 100644 --- a/web/src/components/MemoView/MemoViewContext.tsx +++ b/web/src/components/MemoView/MemoViewContext.tsx @@ -44,8 +44,11 @@ export const useMemoViewDerived = () => { const isInMemoDetailPage = location.pathname.startsWith(`/${memo.name}`) || location.pathname.startsWith("/memos/shares/"); const commentAmount = computeCommentAmount(memo); - const displayTimestamp = timeBasis === "update_time" ? memo.updateTime : memo.createTime; - const displayTime = displayTimestamp ? timestampDate(displayTimestamp) : undefined; + const createTime = memo.createTime ? timestampDate(memo.createTime) : undefined; + const updateTime = memo.updateTime ? timestampDate(memo.updateTime) : undefined; + const displayTime = timeBasis === "update_time" ? updateTime : createTime; + const isDisplayingUpdatedTime = + timeBasis === "update_time" && !!createTime && !!updateTime && updateTime.getTime() !== createTime.getTime(); const relativeTimeFormat: "datetime" | "auto" = displayTime && Date.now() - displayTime.getTime() > RELATIVE_TIME_THRESHOLD_MS ? "datetime" : "auto"; @@ -54,7 +57,10 @@ export const useMemoViewDerived = () => { readonly, isInMemoDetailPage, commentAmount, + createTime, + updateTime, displayTime, + isDisplayingUpdatedTime, relativeTimeFormat, }; }; diff --git a/web/src/components/MemoView/components/MemoHeader.tsx b/web/src/components/MemoView/components/MemoHeader.tsx index 7fd2e8d07..7ecb53812 100644 --- a/web/src/components/MemoView/components/MemoHeader.tsx +++ b/web/src/components/MemoView/components/MemoHeader.tsx @@ -22,7 +22,7 @@ const MemoHeader: React.FC = ({ showCreator, showVisibility, sh const [reactionSelectorOpen, setReactionSelectorOpen] = useState(false); const { memo, creator, currentUser, parentPage, isArchived, readonly, openEditor } = useMemoViewContext(); - const { displayTime: memoDisplayTime, relativeTimeFormat } = useMemoViewDerived(); + const { createTime, updateTime, displayTime: memoDisplayTime, isDisplayingUpdatedTime, relativeTimeFormat } = useMemoViewDerived(); const navigateTo = useNavigateTo(); const handleGotoMemoDetailPage = useCallback(() => { @@ -31,19 +31,30 @@ const MemoHeader: React.FC = ({ showCreator, showVisibility, sh const { unpinMemo } = useMemoActions(memo); - const displayTime = isArchived ? ( + const timeValue = isArchived ? ( memoDisplayTime?.toLocaleString(i18n.language) ) : ( - + ); + const displayTime = isDisplayingUpdatedTime ? ( + <> + {t("common.last-updated-at")} {timeValue} + + ) : ( + timeValue + ); + const timeTooltip = { + createdAt: createTime ? `${t("common.created-at")}: ${createTime.toLocaleString(i18n.language)}` : undefined, + updatedAt: updateTime ? `${t("common.last-updated-at")}: ${updateTime.toLocaleString(i18n.language)}` : undefined, + }; return (
{showCreator && creator ? ( - + ) : ( - + )}
@@ -93,10 +104,11 @@ const MemoHeader: React.FC = ({ showCreator, showVisibility, sh interface CreatorDisplayProps { creator: User; displayTime: React.ReactNode; + timeTooltip: TimeTooltipContent; onGotoDetail: () => void; } -const CreatorDisplay: React.FC = ({ creator, displayTime, onGotoDetail }) => ( +const CreatorDisplay: React.FC = ({ creator, displayTime, timeTooltip, onGotoDetail }) => (
@@ -109,30 +121,50 @@ const CreatorDisplay: React.FC = ({ creator, displayTime, o > {creator.displayName || creator.username} - + + +
); +interface TimeTooltipContent { + createdAt?: string; + updatedAt?: string; +} + +const TimeTooltip = ({ children, content }: { children: React.ReactElement; content: TimeTooltipContent }) => ( + + {children} + + {content.createdAt && {content.createdAt}} + {content.updatedAt && {content.updatedAt}} + + +); + interface TimeDisplayProps { displayTime: React.ReactNode; + timeTooltip: TimeTooltipContent; onGotoDetail: () => void; } -const TimeDisplay: React.FC = ({ displayTime, onGotoDetail }) => ( - +const TimeDisplay: React.FC = ({ displayTime, timeTooltip, onGotoDetail }) => ( + + + ); export default MemoHeader;