diff --git a/src/features/dashboard/components/DashboardFrequentMenus.jsx b/src/features/dashboard/components/DashboardFrequentMenus.jsx index ace3265..4e88b23 100644 --- a/src/features/dashboard/components/DashboardFrequentMenus.jsx +++ b/src/features/dashboard/components/DashboardFrequentMenus.jsx @@ -2,7 +2,7 @@ import { useMemo } from "react"; import { useNavigate } from "react-router-dom"; import { useAuth } from "@/app/auth/AuthProvider.jsx"; import { getFrequentSecondLevelMenus } from "@/app/navigation/menuUsage.js"; -import { formatMillis } from "@/shared/utils/time.js"; +import { TimeText } from "@/shared/ui/TimeText.jsx"; export function DashboardFrequentMenus({ menus = [] }) { const { user } = useAuth(); @@ -32,7 +32,7 @@ export function DashboardFrequentMenus({ menus = [] }) { {item.parentLabel} {item.label} - 进入 {item.count || 0} 次 · {formatMillis(item.lastVisitedAtMs)} + 进入 {item.count || 0} 次 · ); diff --git a/src/features/lucky-gift/components/LuckyGiftConfigSummary.jsx b/src/features/lucky-gift/components/LuckyGiftConfigSummary.jsx index 71369f3..64b9359 100644 --- a/src/features/lucky-gift/components/LuckyGiftConfigSummary.jsx +++ b/src/features/lucky-gift/components/LuckyGiftConfigSummary.jsx @@ -5,7 +5,7 @@ import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import { AdminActionIconButton } from "@/shared/ui/AdminListLayout.jsx"; import { Button } from "@/shared/ui/Button.jsx"; -import { formatMillis } from "@/shared/utils/time.js"; +import { TimeText } from "@/shared/ui/TimeText.jsx"; import { stageOptions } from "@/features/lucky-gift/constants.js"; import { formFromConfig } from "@/features/lucky-gift/configModel.js"; import styles from "@/features/lucky-gift/lucky-gift.module.css"; @@ -44,7 +44,7 @@ export function LuckyGiftConfigSummary({ {formatNumber(config?.roomHourlyPayoutCap)} {formatStages(form.stages)} - {config?.createdAtMs ? formatMillis(config.createdAtMs) : configLoading ? "加载中" : "-"} + {config?.createdAtMs ? : configLoading ? "加载中" : "-"} diff --git a/src/features/operations/pages/CoinLedgerPage.jsx b/src/features/operations/pages/CoinLedgerPage.jsx index 91128b5..11475ee 100644 --- a/src/features/operations/pages/CoinLedgerPage.jsx +++ b/src/features/operations/pages/CoinLedgerPage.jsx @@ -12,8 +12,8 @@ import { DataTable } from "@/shared/ui/DataTable.jsx"; import { SideDrawer } from "@/shared/ui/SideDrawer.jsx"; import { usePaginatedQuery } from "@/shared/hooks/usePaginatedQuery.js"; import { TimeRangeFilter } from "@/shared/ui/TimeRangeFilter.jsx"; +import { TimeText } from "@/shared/ui/TimeText.jsx"; import { createTextColumnFilter } from "@/shared/ui/tableFilters.js"; -import { formatMillis } from "@/shared/utils/time.js"; import styles from "@/features/operations/operations.module.css"; const pageSize = 50; @@ -47,7 +47,7 @@ const columns = [ key: "createdAtMs", label: "时间", width: "minmax(170px, 0.85fr)", - render: (entry) => formatMillis(entry.createdAtMs), + render: (entry) => , }, ]; @@ -252,7 +252,7 @@ function CoinLedgerDetailDrawer({ entry, onClose, open }) { detailRow("流水 ID", entry.entryId), detailRow("业务类型", bizTypeLabel(entry.bizType)), detailRow("方向", directionLabel(entry.direction)), - detailRow("发生时间", formatMillis(entry.createdAtMs)), + detailRow("发生时间", ), ]} title="交易信息" /> diff --git a/src/features/red-packets/components/RedPacketDetailDrawer.jsx b/src/features/red-packets/components/RedPacketDetailDrawer.jsx index 21c915c..d6f8a95 100644 --- a/src/features/red-packets/components/RedPacketDetailDrawer.jsx +++ b/src/features/red-packets/components/RedPacketDetailDrawer.jsx @@ -3,7 +3,7 @@ import Drawer from "@mui/material/Drawer"; import IconButton from "@mui/material/IconButton"; import { DataState } from "@/shared/ui/DataState.jsx"; import { DataTable } from "@/shared/ui/DataTable.jsx"; -import { formatMillis } from "@/shared/utils/time.js"; +import { TimeText } from "@/shared/ui/TimeText.jsx"; import styles from "@/features/red-packets/red-packets.module.css"; const claimColumns = [ @@ -29,7 +29,7 @@ const claimColumns = [ key: "createdAt", label: "领取时间", width: "minmax(180px, 0.9fr)", - render: (claim) => formatMillis(claim.createdAtMs), + render: (claim) => , }, ]; @@ -67,8 +67,8 @@ export function RedPacketDetailDrawer({ loading, onClose, open, packet }) { : "-" } /> - - + } /> + } /> {rewardStackPolicyLabels[config?.rewardStackPolicy] || "-"} - {config?.updatedAtMs ? formatMillis(config.updatedAtMs) : configLoading ? "加载中" : "-"} + {config?.updatedAtMs ? : configLoading ? "加载中" : "-"} diff --git a/src/features/room-turnover-reward/components/RoomTurnoverRewardConfigSummary.jsx b/src/features/room-turnover-reward/components/RoomTurnoverRewardConfigSummary.jsx index 52e488d..3ed64b2 100644 --- a/src/features/room-turnover-reward/components/RoomTurnoverRewardConfigSummary.jsx +++ b/src/features/room-turnover-reward/components/RoomTurnoverRewardConfigSummary.jsx @@ -2,6 +2,7 @@ import EditOutlined from "@mui/icons-material/EditOutlined"; import RefreshOutlined from "@mui/icons-material/RefreshOutlined"; import CircularProgress from "@mui/material/CircularProgress"; import { Button } from "@/shared/ui/Button.jsx"; +import { TimeText } from "@/shared/ui/TimeText.jsx"; import styles from "@/features/room-turnover-reward/room-turnover-reward.module.css"; export function RoomTurnoverRewardConfigSummary({ canUpdate, config, configLoading, onEdit, onRefresh }) { @@ -31,7 +32,9 @@ export function RoomTurnoverRewardConfigSummary({ canUpdate, config, configLoadi
更新时间 - {config?.updatedAtMs ? config.updatedAtMs : "-"} + + {config?.updatedAtMs ? : configLoading ? "加载中" : "-"} +
diff --git a/src/features/room-turnover-reward/components/RoomTurnoverRewardConfigSummary.test.jsx b/src/features/room-turnover-reward/components/RoomTurnoverRewardConfigSummary.test.jsx new file mode 100644 index 0000000..28e9ef1 --- /dev/null +++ b/src/features/room-turnover-reward/components/RoomTurnoverRewardConfigSummary.test.jsx @@ -0,0 +1,52 @@ +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { beforeEach, expect, test } from "vitest"; +import { TimeZoneProvider, useTimeZone } from "@/app/timezone/TimeZoneProvider.jsx"; +import { RoomTurnoverRewardConfigSummary } from "./RoomTurnoverRewardConfigSummary.jsx"; + +const updatedAtMs = Date.UTC(2026, 5, 7, 5, 4, 13); + +beforeEach(() => { + window.localStorage.clear(); +}); + +test("formats summary update time through the selected admin timezone", async () => { + const user = userEvent.setup(); + + render( + + + + ); + + expect(screen.queryByText(String(updatedAtMs))).not.toBeInTheDocument(); + expect(screen.getByText("2026-06-07 13:04:13")).toBeInTheDocument(); + + await user.click(screen.getByRole("button", { name: "UTC" })); + + expect(screen.getByText("2026-06-07 05:04:13")).toBeInTheDocument(); + expect(screen.queryByText(String(updatedAtMs))).not.toBeInTheDocument(); +}); + +function SummaryFixture() { + const { setTimeZone } = useTimeZone(); + + return ( + <> + + {}} + onRefresh={() => {}} + /> + + ); +} diff --git a/src/features/room-turnover-reward/pages/RoomTurnoverRewardPage.jsx b/src/features/room-turnover-reward/pages/RoomTurnoverRewardPage.jsx index 5130d2a..63aab7c 100644 --- a/src/features/room-turnover-reward/pages/RoomTurnoverRewardPage.jsx +++ b/src/features/room-turnover-reward/pages/RoomTurnoverRewardPage.jsx @@ -7,7 +7,7 @@ import { AdminActionIconButton, AdminListBody, AdminListPage } from "@/shared/ui import { DataState } from "@/shared/ui/DataState.jsx"; import { DataTable } from "@/shared/ui/DataTable.jsx"; import { createOptionsColumnFilter, createTextColumnFilter } from "@/shared/ui/tableFilters.js"; -import { formatMillis } from "@/shared/utils/time.js"; +import { TimeText } from "@/shared/ui/TimeText.jsx"; const settlementStatusOptions = [ ["pending", "待发放"], @@ -33,8 +33,10 @@ const columnsBase = [ width: "minmax(260px, 1.1fr)", render: (item) => (
- {formatMillis(item.periodStartMs)} - 至 {formatMillis(item.periodEndMs)} + + + 至 +
), }, diff --git a/src/features/rooms/components/RoomDetailDrawer.jsx b/src/features/rooms/components/RoomDetailDrawer.jsx index dea1c8a..1f23275 100644 --- a/src/features/rooms/components/RoomDetailDrawer.jsx +++ b/src/features/rooms/components/RoomDetailDrawer.jsx @@ -3,7 +3,7 @@ import MeetingRoomOutlined from "@mui/icons-material/MeetingRoomOutlined"; import PersonOutlineOutlined from "@mui/icons-material/PersonOutlineOutlined"; import { useEffect, useState } from "react"; import { SideDrawer } from "@/shared/ui/SideDrawer.jsx"; -import { formatMillis } from "@/shared/utils/time.js"; +import { TimeText } from "@/shared/ui/TimeText.jsx"; import { roomStatusLabels } from "@/features/rooms/constants.js"; import styles from "@/features/rooms/rooms.module.css"; @@ -37,8 +37,8 @@ export function RoomDetailDrawer({ onClose, open, room }) { ["房间状态", roomStatusLabels[normalizedStatus]], ["房间模式", room.mode], ["区域", room.regionName], - ["创建时间", formatMillis(room.createdAtMs)], - ["更新时间", formatMillis(room.updatedAtMs)] + ["创建时间", ], + ["更新时间", ] ]} title="基础信息" /> @@ -47,7 +47,7 @@ export function RoomDetailDrawer({ onClose, open, room }) { ], ["关闭原因", room.closeReason] ]} title="关闭信息" diff --git a/src/features/rooms/pages/RoomConfigPage.jsx b/src/features/rooms/pages/RoomConfigPage.jsx index 4d65bf9..88db988 100644 --- a/src/features/rooms/pages/RoomConfigPage.jsx +++ b/src/features/rooms/pages/RoomConfigPage.jsx @@ -6,7 +6,7 @@ import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import { DataState } from "@/shared/ui/DataState.jsx"; import { AdminActionIconButton, AdminListBody, AdminListPage, AdminListToolbar } from "@/shared/ui/AdminListLayout.jsx"; -import { formatMillis } from "@/shared/utils/time.js"; +import { TimeText } from "@/shared/ui/TimeText.jsx"; import { useRoomConfigPage } from "@/features/rooms/hooks/useRoomConfigPage.js"; import styles from "@/features/rooms/rooms.module.css"; @@ -45,7 +45,7 @@ export function RoomConfigPage() {

座位数

- {page.form.updatedAtMs ? formatMillis(page.form.updatedAtMs) : "默认配置"} + {page.form.updatedAtMs ? : "默认配置"}
diff --git a/src/features/seven-day-checkin/components/SevenDayCheckInConfigSummary.jsx b/src/features/seven-day-checkin/components/SevenDayCheckInConfigSummary.jsx index b4eb9f6..a5b7e7f 100644 --- a/src/features/seven-day-checkin/components/SevenDayCheckInConfigSummary.jsx +++ b/src/features/seven-day-checkin/components/SevenDayCheckInConfigSummary.jsx @@ -2,7 +2,7 @@ import EditOutlined from "@mui/icons-material/EditOutlined"; import RefreshOutlined from "@mui/icons-material/RefreshOutlined"; import { Button } from "@/shared/ui/Button.jsx"; import { AdminActionIconButton } from "@/shared/ui/AdminListLayout.jsx"; -import { formatMillis } from "@/shared/utils/time.js"; +import { TimeText } from "@/shared/ui/TimeText.jsx"; import styles from "@/features/seven-day-checkin/seven-day-checkin.module.css"; export function SevenDayCheckInConfigSummary({ canUpdate, config, configLoading, onEdit, onRefresh, resourceGroups }) { @@ -16,7 +16,7 @@ export function SevenDayCheckInConfigSummary({ canUpdate, config, configLoading,
- {config?.updatedAtMs ? formatMillis(config.updatedAtMs) : configLoading ? "加载中" : "-"} + {config?.updatedAtMs ? : configLoading ? "加载中" : "-"}