feat(usage-logs): 添加滚动日志快照检查和日期解析功能

This commit is contained in:
Jeff Gu committed 2026-04-12 16:03:18 +08:00
1 parent 2be28923d5
commit ea6465d079
1 file changed
+46
+46
View File
@@ -56,6 +56,8 @@ const RESULT_OPTIONS: Array<{ value: "all" | "success" | "failure"; label: strin
const PAGINATION_WINDOW_SIZE = 5; const PAGINATION_WINDOW_SIZE = 5;
const USAGE_LOGS_PAGE_CACHE_KEY = "usage-logs:page"; const USAGE_LOGS_PAGE_CACHE_KEY = "usage-logs:page";
const ROLLING_USAGE_LOG_WINDOW_MS = 24 * 60 * 60 * 1000;
const ROLLING_USAGE_LOG_WINDOW_TOLERANCE_MS = 15 * 60 * 1000;
const toDateTimeLocalValue = (date: Date): string => { const toDateTimeLocalValue = (date: Date): string => {
const offset = date.getTimezoneOffset() * 60_000; const offset = date.getTimezoneOffset() * 60_000;
@@ -140,6 +142,41 @@ const isSameUsageLogFilterState = (left: UsageLogFilterState, right: UsageLogFil
); );
}; };
const isSameUsageLogFilterIntent = (left: UsageLogFilterState, right: UsageLogFilterState): boolean => {
return (
left.dimension === right.dimension &&
left.keyword === right.keyword &&
left.result === right.result
);
};
const parseLocalDateTimeValue = (value: string): number | null => {
if (!value) {
return null;
}
const date = new Date(value);
return Number.isNaN(date.getTime()) ? null : date.getTime();
};
const isRollingLatest24hSnapshot = (snapshot: UsageLogPageCacheSnapshot, updatedAt: number | undefined): boolean => {
if (!updatedAt) {
return false;
}
const startTime = parseLocalDateTimeValue(snapshot.appliedFilters.start);
const endTime = parseLocalDateTimeValue(snapshot.appliedFilters.end);
if (startTime === null || endTime === null) {
return false;
}
const duration = endTime - startTime;
return (
Math.abs(duration - ROLLING_USAGE_LOG_WINDOW_MS) <= ROLLING_USAGE_LOG_WINDOW_TOLERANCE_MS &&
Math.abs(updatedAt - endTime) <= ROLLING_USAGE_LOG_WINDOW_TOLERANCE_MS
);
};
const ClientSummary = ({ item }: { item: AnalyticsEventItem }) => { const ClientSummary = ({ item }: { item: AnalyticsEventItem }) => {
const locationParts = [item.country, item.region, item.city].filter(Boolean); const locationParts = [item.country, item.region, item.city].filter(Boolean);
@@ -192,6 +229,14 @@ export function UsageLogs() {
isSameUsageLogFilterState(cachedLogsSnapshot.data.appliedFilters, appliedFilters) isSameUsageLogFilterState(cachedLogsSnapshot.data.appliedFilters, appliedFilters)
? cachedLogsSnapshot.data.data ? cachedLogsSnapshot.data.data
: undefined; : undefined;
const placeholderLogsData =
!initialLogsData &&
cachedLogsSnapshot?.data &&
cachedLogsSnapshot.data.currentPage === currentPage &&
isSameUsageLogFilterIntent(cachedLogsSnapshot.data.appliedFilters, appliedFilters) &&
isRollingLatest24hSnapshot(cachedLogsSnapshot.data, cachedLogsSnapshot.updatedAt)
? cachedLogsSnapshot.data.data
: undefined;
const logsQuery = useQuery({ const logsQuery = useQuery({
queryKey: ["usage-logs", appliedFilters, currentPage], queryKey: ["usage-logs", appliedFilters, currentPage],
@@ -208,6 +253,7 @@ export function UsageLogs() {
}, },
initialData: initialLogsData, initialData: initialLogsData,
initialDataUpdatedAt: initialLogsData ? cachedLogsSnapshot?.updatedAt : undefined, initialDataUpdatedAt: initialLogsData ? cachedLogsSnapshot?.updatedAt : undefined,
placeholderData: placeholderLogsData,
}); });
const activePage = logsQuery.data?.page ?? currentPage; const activePage = logsQuery.data?.page ?? currentPage;