fix: bw/stats 404, gateway links, history crash

- swr.ts: remove useBandwidth(), drop bw from useDashboard()
- events/route.ts: skip bandwidth SSE (Kubo 0.28.0 unsupported)
- usage/page.tsx: remove getBWStats call + bw references
- helpers.ts: gatewayLink -> ipfs.maos.dedyn.io (subdomain only)
- upload/page.tsx: fix local gatewayLink (subdomain only)
- storage.ts: update default gatewayUrl, add defensive getHistory()
This commit is contained in:
maikrolf
2026-07-05 16:57:29 +02:00
parent c9432a16ba
commit 99c113b6f5
42 changed files with 10081 additions and 263 deletions
+4 -26
View File
@@ -8,7 +8,7 @@
import useSWR from 'swr';
import useSWRInfinite from 'swr/infinite';
import type { IPFSPin, RepoStats, BWStats, IPFSNodeInfo, IPFSUser } from './api';
import type { IPFSPin, RepoStats, IPFSNodeInfo, IPFSUser } from './api';
/* ════════════════════════════ Fetcher ════════════════════════════ */
@@ -88,38 +88,19 @@ export function useRepoStats(refreshInterval = DEFAULT_REFRESH) {
});
}
/* ════════════════════════════ Bandwidth ════════════════════════════ */
export function useBandwidth(refreshInterval = DEFAULT_REFRESH) {
return useSWR<BWStats>('/api/bw/stats', async (path) => {
const raw = await fetcher<{
TotalIn?: number; TotalOut?: number; RateIn?: number; RateOut?: number;
}>(path);
return {
totalIn: raw.TotalIn ?? 0,
totalOut: raw.TotalOut ?? 0,
rateIn: raw.RateIn ?? 0,
rateOut: raw.RateOut ?? 0,
};
}, {
refreshInterval,
revalidateOnFocus: true,
});
}
/* ════════════════════════════ Dashboard (alles-in-1) ════════════════════════════ */
export interface DashboardData {
peers: Peer[];
pins: IPFSPin[];
repo: RepoStats | null;
bw: BWStats | null;
bw: null;
health: { status: string; node: string } | null;
}
export function useDashboard(refreshInterval = DEFAULT_REFRESH) {
return useSWR<DashboardData>('/api/health', async (healthPath) => {
const [health, peers, pins, repo, bw] = await Promise.all([
const [health, peers, pins, repo] = await Promise.all([
fetcher<{ status: string; node: string }>(healthPath).catch(() => null as any),
fetcher<{ Peers?: { Peer: string; Addr: string; Latency: string }[] }>('/api/peers')
.then((raw) => (raw.Peers || []).map((p) => ({ id: p.Peer, addr: p.Addr, latency: p.Latency || '—' })))
@@ -130,12 +111,9 @@ export function useDashboard(refreshInterval = DEFAULT_REFRESH) {
fetcher<{ RepoSize?: number; StorageMax?: number; NumObjects?: number }>('/api/repo/stats')
.then((raw) => ({ repoSize: raw.RepoSize ?? 0, storageMax: raw.StorageMax ?? 0, numObjects: raw.NumObjects ?? 0, repoPath: '', version: '' }))
.catch(() => null),
fetcher<{ TotalIn?: number; TotalOut?: number }>('/api/bw/stats')
.then((raw) => ({ totalIn: raw.TotalIn ?? 0, totalOut: raw.TotalOut ?? 0, rateIn: 0, rateOut: 0 }))
.catch(() => null),
]);
return { peers, pins, repo, bw, health };
return { peers, pins, repo, bw: null, health };
}, {
refreshInterval,
revalidateOnFocus: true,