File size: 1,952 Bytes
cd8bd0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { useEffect, useMemo, useState } from "react";

import { collectHiddenQuotaModelIds, filterHiddenModelQuotas } from "./utils";

function getProviderKey(connections: any[]): string {
  const providers = new Set<string>();
  for (const conn of connections) {
    if (typeof conn?.provider === "string" && conn.provider) providers.add(conn.provider);
  }
  return Array.from(providers).sort().join("|");
}

export function useVisibleQuotaData(
  connections: any[],
  quotaData: Record<string, any>
): Record<string, any> {
  const [hiddenModelsByProvider, setHiddenModelsByProvider] = useState<Record<string, string[]>>(
    {}
  );
  const providerKey = useMemo(() => getProviderKey(connections), [connections]);

  useEffect(() => {
    if (!providerKey) return;

    let alive = true;
    const providers = providerKey.split("|").filter(Boolean);

    Promise.all(
      providers.map(async (provider) => {
        try {
          const response = await fetch(
            `/api/provider-models?provider=${encodeURIComponent(provider)}`
          );
          if (!response.ok) return [provider, []] as const;
          const data = await response.json();
          return [provider, collectHiddenQuotaModelIds(provider, data)] as const;
        } catch {
          return [provider, []] as const;
        }
      })
    ).then((entries) => {
      if (alive) setHiddenModelsByProvider(Object.fromEntries(entries));
    });

    return () => {
      alive = false;
    };
  }, [providerKey]);

  return useMemo(() => {
    const next: Record<string, any> = {};
    for (const conn of connections) {
      const data = quotaData[conn.id];
      if (!data) continue;
      next[conn.id] = {
        ...data,
        quotas: filterHiddenModelQuotas(
          conn.provider,
          data.quotas,
          hiddenModelsByProvider[conn.provider]
        ),
      };
    }
    return next;
  }, [connections, hiddenModelsByProvider, quotaData]);
}