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) => (
-