diff --git a/web/src/components/layout/app-sidebar/nav-user.tsx b/web/src/components/layout/app-sidebar/nav-user.tsx index b4b627a3..70083f31 100644 --- a/web/src/components/layout/app-sidebar/nav-user.tsx +++ b/web/src/components/layout/app-sidebar/nav-user.tsx @@ -201,3 +201,4 @@ export function NavUser() { ); } + diff --git a/web/src/components/ui/chart.tsx b/web/src/components/ui/chart.tsx index 8d4c4b28..e8c21046 100644 --- a/web/src/components/ui/chart.tsx +++ b/web/src/components/ui/chart.tsx @@ -63,7 +63,9 @@ function ChartContainer({ {...props} > - {children} + + {children} + ); diff --git a/web/src/hooks/queries/use-usage-stats.ts b/web/src/hooks/queries/use-usage-stats.ts index 60b24db1..97c2f4db 100644 --- a/web/src/hooks/queries/use-usage-stats.ts +++ b/web/src/hooks/queries/use-usage-stats.ts @@ -3,7 +3,7 @@ * 支持多层级时间粒度聚合 */ -import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; +import { keepPreviousData, useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { getTransport, type UsageStatsFilter, type StatsGranularity } from '@/lib/transport'; // Query Keys @@ -117,6 +117,7 @@ export function useUsageStats(filter?: UsageStatsFilter) { return useQuery({ queryKey: usageStatsKeys.list(filter), queryFn: () => getTransport().getUsageStats(filter), + placeholderData: keepPreviousData, }); } diff --git a/web/src/pages/projects/index.tsx b/web/src/pages/projects/index.tsx index 8b968d78..b9d6f33b 100644 --- a/web/src/pages/projects/index.tsx +++ b/web/src/pages/projects/index.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { @@ -41,6 +41,24 @@ export function ProjectsPage() { navigate(`/projects/${id}`); }; + const sortedProjects = useMemo(() => { + if (!projects) { + return undefined; + } + return projects.slice().sort((a, b) => { + const timeA = Number.isFinite(new Date(a.createdAt).getTime()) + ? new Date(a.createdAt).getTime() + : 0; + const timeB = Number.isFinite(new Date(b.createdAt).getTime()) + ? new Date(b.createdAt).getTime() + : 0; + if (timeA !== timeB) { + return timeA - timeB; + } + return a.id - b.id; + }); + }, [projects]); + return (
- ) : projects && projects.length > 0 ? ( + ) : sortedProjects && sortedProjects.length > 0 ? (
- {projects.map((project) => ( + {sortedProjects.map((project) => ( -
- +
+