1import type { EnvironmentConnectionPresentation } from "@t3tools/client-runtime/connection";
2import type { EnvironmentId } from "@t3tools/contracts";
3import {
4 collectLimitAccounts,
5 isUsageLimitWindowVisible,
6 limitsNotice,
7 remainingPercent,
8 type LimitPresentation,
9} from "@t3tools/shared/usageLimits";
10
11export function sidebarUsageProfiles(
12 presentations: ReadonlyMap<
13 EnvironmentId,
14 LimitPresentation & {
15 readonly connection: Pick<EnvironmentConnectionPresentation, "phase">;
16 }
17 >,
18) {
19 const snapshots = new Map(
20 [...presentations].map(([environmentId, presentation]) => {
21 const config = presentation.serverConfig;
22 const connected = presentation.connection.phase === "connected";
23
24 return [
25 environmentId,
26 {
27 ...presentation,
28 serverConfig: config && {
29 ...config,
30 providers: config.providers?.map((provider) =>
31 connected || !provider.usageLimits
32 ? provider
33 : { ...provider, usageLimits: { ...provider.usageLimits, windows: [] } },
34 ),
35 usageLimitSources: config.usageLimitSources?.map((source) => ({
36 ...source,
37 accounts:
38 connected && !source.error
39 ? source.accounts
40 : source.accounts.map((account) => ({
41 ...account,
42 usageLimits: { ...account.usageLimits, windows: [] },
43 })),
44 })),
45 },
46 },
47 ] as const;
48 }),
49 );
50
51 return collectLimitAccounts(snapshots, { includeUnavailable: true }).map((account) => {
52 const windows =
53 limitsNotice(account.limits) === null
54 ? account.limits.windows.filter((window) =>
55 isUsageLimitWindowVisible(account.driver, window),
56 )
57 : [];
58 const window = windows.reduce<(typeof windows)[number] | null>(
59 (mostUsed, candidate) =>
60 mostUsed === null || candidate.usedPercent > mostUsed.usedPercent ? candidate : mostUsed,
61 null,
62 );
63
64 return { account, window, remainingPercent: window ? remainingPercent(window) : null };
65 });
66}