Skip to content

Commit 605f36e

Browse files
authored
refactor(web): unify local datetime formatting across governance and review pages (#73)
1 parent 07f2b8a commit 605f36e

File tree

11 files changed

+23
-12
lines changed

11 files changed

+23
-12
lines changed

web/src/features/governance/governance-activity.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useTranslation } from 'react-i18next'
22
import type { GovernanceActivityItem } from '@/api/types'
3+
import { formatLocalDateTime } from '@/shared/lib/date-time'
34
import { Card } from '@/shared/ui/card'
45

56
interface GovernanceActivityProps {
@@ -25,7 +26,7 @@ export function GovernanceActivity({ items, isLoading }: GovernanceActivityProps
2526
<div className="flex items-center justify-between gap-3">
2627
<div className="font-medium">{item.action}</div>
2728
<div className="text-xs text-muted-foreground">
28-
{item.timestamp ? new Date(item.timestamp).toLocaleString(i18n.language) : '-'}
29+
{item.timestamp ? formatLocalDateTime(item.timestamp, i18n.language) : '-'}
2930
</div>
3031
</div>
3132
<div className="text-sm text-muted-foreground">

web/src/features/governance/governance-inbox.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useNavigate } from '@tanstack/react-router'
22
import { useTranslation } from 'react-i18next'
33
import type { GovernanceInboxItem } from '@/api/types'
4+
import { formatLocalDateTime } from '@/shared/lib/date-time'
45
import { Card } from '@/shared/ui/card'
56
import { Button } from '@/shared/ui/button'
67

@@ -54,7 +55,7 @@ export function GovernanceInbox({ items, isLoading }: GovernanceInboxProps) {
5455
{item.subtitle ? <div className="text-sm text-muted-foreground">{item.subtitle}</div> : null}
5556
</div>
5657
<div className="text-xs text-muted-foreground">
57-
{item.timestamp ? new Date(item.timestamp).toLocaleString(i18n.language) : '-'}
58+
{item.timestamp ? formatLocalDateTime(item.timestamp, i18n.language) : '-'}
5859
</div>
5960
</div>
6061
<div className="flex justify-end">

web/src/features/governance/governance-notifications.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useTranslation } from 'react-i18next'
22
import type { GovernanceNotification } from '@/api/types'
3+
import { formatLocalDateTime } from '@/shared/lib/date-time'
34
import { Card } from '@/shared/ui/card'
45
import { Button } from '@/shared/ui/button'
56

@@ -33,7 +34,7 @@ export function GovernanceNotifications({ items, isLoading, onMarkRead, isMarkin
3334
</div>
3435
{item.createdAt ? (
3536
<div className="text-xs text-muted-foreground">
36-
{new Date(item.createdAt).toLocaleString(i18n.language)}
37+
{formatLocalDateTime(item.createdAt, i18n.language)}
3738
</div>
3839
) : null}
3940
{item.bodyJson ? <div className="text-sm text-muted-foreground break-all">{item.bodyJson}</div> : null}

web/src/pages/admin/audit-log.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useState } from 'react'
22
import { useTranslation } from 'react-i18next'
3+
import { formatLocalDateTime } from '@/shared/lib/date-time'
34
import { Card } from '@/shared/ui/card'
45
import { Input } from '@/shared/ui/input'
56
import { Button } from '@/shared/ui/button'
@@ -60,7 +61,7 @@ export function AuditLogPage() {
6061
})
6162

6263
const formatDate = (dateString: string) => {
63-
return new Date(dateString).toLocaleString(i18n.language)
64+
return formatLocalDateTime(dateString, i18n.language)
6465
}
6566

6667
return (

web/src/pages/admin/users.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { KeyboardEvent, useEffect, useState } from 'react'
22
import { useTranslation } from 'react-i18next'
3+
import { formatLocalDateTime } from '@/shared/lib/date-time'
34
import { Card } from '@/shared/ui/card'
45
import { Input } from '@/shared/ui/input'
56
import { Button } from '@/shared/ui/button'
@@ -56,7 +57,7 @@ export function AdminUsersPage() {
5657
const enableUserMutation = useEnableUser()
5758

5859
const formatDate = (dateString: string) => {
59-
return new Date(dateString).toLocaleString(i18n.language)
60+
return formatLocalDateTime(dateString, i18n.language)
6061
}
6162

6263
useEffect(() => {

web/src/pages/dashboard/namespace-members.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useState } from 'react'
22
import { useParams } from '@tanstack/react-router'
33
import { useTranslation } from 'react-i18next'
4+
import { formatLocalDateTime } from '@/shared/lib/date-time'
45
import { AddNamespaceMemberDialog } from '@/features/namespace/add-namespace-member-dialog'
56
import { NamespaceHeader } from '@/features/namespace/namespace-header'
67
import { ConfirmDialog } from '@/shared/components/confirm-dialog'
@@ -217,7 +218,7 @@ export function NamespaceMembersPage() {
217218
)}
218219
</td>
219220
<td className="p-4 text-sm text-muted-foreground">
220-
{new Date(member.createdAt).toLocaleDateString(i18n.language)}
221+
{formatLocalDateTime(member.createdAt, i18n.language, { dateStyle: 'medium' })}
221222
</td>
222223
<td className="p-4 text-right">
223224
<Button

web/src/pages/dashboard/namespace-reviews.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useParams } from '@tanstack/react-router'
22
import { useTranslation } from 'react-i18next'
3+
import { formatLocalDateTime } from '@/shared/lib/date-time'
34
import { Card } from '@/shared/ui/card'
45
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/shared/ui/tabs'
56
import { useNamespaceDetail } from '@/shared/hooks/use-skill-queries'
@@ -8,7 +9,7 @@ import { DashboardPageHeader } from '@/shared/components/dashboard-page-header'
89
import { NamespaceHeader } from '@/features/namespace/namespace-header'
910

1011
function ReviewListSection({ namespaceId }: { namespaceId?: number }) {
11-
const { t } = useTranslation()
12+
const { t, i18n } = useTranslation()
1213
const { data: pending } = useReviewList('PENDING', namespaceId)
1314
const { data: approved } = useReviewList('APPROVED', namespaceId)
1415
const { data: rejected } = useReviewList('REJECTED', namespaceId)
@@ -26,7 +27,7 @@ function ReviewListSection({ namespaceId }: { namespaceId?: number }) {
2627
<div className="font-semibold font-heading">{review.namespace}/{review.skillSlug}</div>
2728
<div className="text-sm text-muted-foreground">{t('nsReviews.version', { version: review.version })}</div>
2829
</div>
29-
<div className="text-sm text-muted-foreground">{new Date(review.submittedAt).toLocaleString('zh-CN')}</div>
30+
<div className="text-sm text-muted-foreground">{formatLocalDateTime(review.submittedAt, i18n.language)}</div>
3031
</div>
3132
{review.reviewComment ? (
3233
<p className="mt-3 text-sm text-muted-foreground">{review.reviewComment}</p>

web/src/pages/dashboard/promotions.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useState } from 'react'
22
import { useTranslation } from 'react-i18next'
33
import { useApprovePromotion, usePromotionList, useRejectPromotion } from '@/features/promotion/use-promotion-list'
4+
import { formatLocalDateTime } from '@/shared/lib/date-time'
45
import { Button } from '@/shared/ui/button'
56
import { Card } from '@/shared/ui/card'
67
import { Input } from '@/shared/ui/input'
@@ -33,7 +34,7 @@ function PromotionSection({ status }: { status: 'PENDING' | 'APPROVED' | 'REJECT
3334
{item.sourceVersion} {'->'} @{item.targetNamespace}
3435
</div>
3536
</div>
36-
<div className="text-sm text-muted-foreground">{new Date(item.submittedAt).toLocaleString(i18n.language)}</div>
37+
<div className="text-sm text-muted-foreground">{formatLocalDateTime(item.submittedAt, i18n.language)}</div>
3738
</div>
3839
{status === 'PENDING' ? (
3940
<>

web/src/pages/dashboard/reports.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useState } from 'react'
22
import { useNavigate } from '@tanstack/react-router'
33
import { useTranslation } from 'react-i18next'
4+
import { formatLocalDateTime } from '@/shared/lib/date-time'
45
import { DashboardPageHeader } from '@/shared/components/dashboard-page-header'
56
import { Card } from '@/shared/ui/card'
67
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/shared/ui/tabs'
@@ -26,7 +27,7 @@ export function ReportsPage() {
2627
const resolveMutation = useResolveSkillReport()
2728
const dismissMutation = useDismissSkillReport()
2829

29-
const formatDate = (dateString: string) => new Date(dateString).toLocaleString(i18n.language)
30+
const formatDate = (dateString: string) => formatLocalDateTime(dateString, i18n.language)
3031

3132
const handleOpenSkill = (namespace?: string, skillSlug?: string) => {
3233
if (!namespace || !skillSlug) {

web/src/pages/dashboard/review-detail.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useState } from 'react'
22
import { useNavigate, useParams } from '@tanstack/react-router'
33
import { useTranslation } from 'react-i18next'
4+
import { formatLocalDateTime } from '@/shared/lib/date-time'
45
import { Button } from '@/shared/ui/button'
56
import { Card } from '@/shared/ui/card'
67
import { Textarea } from '@/shared/ui/textarea'
@@ -42,7 +43,7 @@ export function ReviewDetailPage() {
4243
const [rejectDialog, setRejectDialog] = useState(false)
4344

4445
const formatDate = (dateString: string) => {
45-
return new Date(dateString).toLocaleString(i18n.language)
46+
return formatLocalDateTime(dateString, i18n.language)
4647
}
4748

4849
const handleApprove = async () => {

0 commit comments

Comments
 (0)