Live worker counts and an e621 request-history dropdown

- Status polling drops from 30s to 5s, and download start/finish/cancel
  invalidates it immediately, so the footer's Active Workers reflects
  running download tasks in near real time
- The e621 time in the status pill is now a button: it opens a dropdown
  with the session's request history (clock time, endpoint, duration,
  colour-coded) plus totals; closes on outside click or Escape
- Metrics store keeps the last 50 requests
This commit is contained in:
2026-09-17 12:20:27 -05:00
parent 6962e483fc
commit 75b7ed35eb
5 changed files with 123 additions and 22 deletions
+15 -6
View File
@@ -6,10 +6,13 @@ export interface E621RequestSample {
at: number;
}
const HISTORY_LIMIT = 50;
interface E621MetricsState {
requestCount: number;
totalMs: number;
last: E621RequestSample | null;
history: E621RequestSample[];
record: (path: string, ms: number) => void;
reset: () => void;
}
@@ -19,13 +22,19 @@ export const useE621Metrics = create<E621MetricsState>((set) => ({
requestCount: 0,
totalMs: 0,
last: null,
history: [],
record: (path, ms) =>
set((state) => ({
requestCount: state.requestCount + 1,
totalMs: state.totalMs + ms,
last: { path, ms, at: Date.now() },
})),
set((state) => {
const sample: E621RequestSample = { path, ms, at: Date.now() };
return {
requestCount: state.requestCount + 1,
totalMs: state.totalMs + ms,
last: sample,
history: [sample, ...state.history].slice(0, HISTORY_LIMIT),
};
}),
reset: () => set({ requestCount: 0, totalMs: 0, last: null }),
reset: () =>
set({ requestCount: 0, totalMs: 0, last: null, history: [] }),
}));