Feat/perf dashboard (#770)

This commit is contained in:
paisley
2026-04-07 11:04:57 +08:00
committed by GitHub
parent 413244522e
commit d8750e135b
9 changed files with 135 additions and 39 deletions

View File

@@ -80,7 +80,7 @@ export const useChannelsStore = create<ChannelsState>((set, get) => ({
} | null;
}>>;
channelDefaultAccountId?: Record<string, string>;
}>('channels.status', { probe: true });
}>('channels.status', { probe: false });
if (data) {
const channels: Channel[] = [];

View File

@@ -27,12 +27,19 @@ export const useCronStore = create<CronState>((set) => ({
error: null,
fetchJobs: async () => {
set({ loading: true, error: null });
const currentJobs = useCronStore.getState().jobs;
// Only show loading spinner when there's no data yet (stale-while-revalidate).
if (currentJobs.length === 0) {
set({ loading: true, error: null });
} else {
set({ error: null });
}
try {
const result = await hostApiFetch<CronJob[]>('/api/cron/jobs');
set({ jobs: result, loading: false });
} catch (error) {
// Preserve previous jobs on error so the user sees stale data instead of nothing.
set({ error: String(error), loading: false });
}
},

View File

@@ -171,7 +171,8 @@ export const useSkillsStore = create<SkillsState>((set, get) => ({
} catch (error) {
console.error('Failed to fetch skills:', error);
const appError = normalizeAppError(error, { module: 'skills', operation: 'fetch' });
set({ loading: false, error: mapErrorCodeToSkillErrorKey(appError.code, 'fetch') });
// Preserve previous skills on error (stale-while-revalidate).
set((prev) => ({ loading: false, error: mapErrorCodeToSkillErrorKey(appError.code, 'fetch'), skills: prev.skills }));
}
},