diff --git a/src/components/ProxyNodeCard.tsx b/src/components/ProxyNodeCard.tsx index 92271e7..2bdb33f 100644 --- a/src/components/ProxyNodeCard.tsx +++ b/src/components/ProxyNodeCard.tsx @@ -8,12 +8,10 @@ export default (props: { onClick?: () => void }) => { const { proxyName, isSelected, onClick } = props - const { delayMap, proxyNodeMap } = useProxies() + const { proxyNodeMap } = useProxies() const proxyNode = createMemo(() => proxyNodeMap()[proxyName]) - const Delay = (proxyname: string) => { - const delay = delayMap()[proxyname] - + const Delay = (delay: number | undefined) => { if (typeof delay !== 'number' || delay === 0) { return '' } @@ -29,7 +27,7 @@ export default (props: { return {delay}ms } - const formatProxyType = (type: string) => { + const formatProxyType = (type = '') => { const t = type.toLowerCase() if (t.includes('shadowsocks')) { @@ -57,10 +55,10 @@ export default (props: { isSelected && 'text-primary', )} > - {formatProxyType(proxyNode().type)} - {proxyNode().udp && ' :: udp'} + {formatProxyType(proxyNode()?.type)} + {proxyNode()?.udp && ' :: udp'} -
{Delay(proxyName)}
+
{Delay(proxyNode()?.delay)}
) diff --git a/src/signals/proxies.ts b/src/signals/proxies.ts index 7d58fb0..e234b00 100644 --- a/src/signals/proxies.ts +++ b/src/signals/proxies.ts @@ -1,22 +1,45 @@ import { createSignal } from 'solid-js' import { useRequest } from '~/signals' -import type { Proxy, ProxyProvider } from '~/types' +import type { Proxy, ProxyNode, ProxyProvider } from '~/types' +type ProxyInfo = { + name: string + udp: boolean + type: string + delay?: number +} // these signals should be global state const [proxies, setProxies] = createSignal([]) const [proxyProviders, setProxyProviders] = createSignal([]) -const [delayMap, setDelayMap] = createSignal>({}) -const [proxyNodeMap, setProxyNodeMap] = createSignal>({}) +const [proxyNodeMap, setProxyNodeMap] = createSignal>( + {}, +) export function useProxies() { const request = useRequest() - + const setProxyInfoByProixes = (proxies: Proxy[] | ProxyNode[]) => { + proxies.forEach((proxy) => { + setProxyNodeMap({ + ...proxyNodeMap(), + [proxy.name]: { + udp: proxy.udp, + type: proxy.type, + delay: proxy.history.at(-1)?.delay ?? 0, + name: proxy.name, + }, + }) + }) + } const updateProxy = async () => { const { providers } = await request .get('providers/proxies') .json<{ providers: Record }>() + Object.values(providers).forEach((provider) => { + setProxyInfoByProixes(provider.proxies) + }) + setProxyProviders( Object.values(providers).filter( (provider) => @@ -28,14 +51,8 @@ export function useProxies() { .get('proxies') .json<{ proxies: Record }>() const sortIndex = [...(proxies['GLOBAL'].all ?? []), 'GLOBAL'] - const delay = delayMap() - Object.values(proxies).forEach((proxy) => { - setProxyNodeMap({ ...proxyNodeMap(), [proxy.name]: proxy }) - delay[proxy.name] = proxy.history.at(-1)?.delay ?? 0 - }) - - setDelayMap(delay) + setProxyInfoByProixes(Object.values(proxies)) setProxies( Object.values(proxies) .filter((proxy) => proxy.all?.length) @@ -62,7 +79,15 @@ export function useProxies() { ) .json() - setDelayMap({ ...delayMap(), ...data }) + Object.entries(data).forEach(([name, delay]) => { + setProxyNodeMap({ + ...proxyNodeMap(), + [name]: { + ...proxyNodeMap()[name], + delay: delay, + }, + }) + }) } const updateProviderByProviderName = async (proxyProviderName: string) => { @@ -82,7 +107,6 @@ export function useProxies() { proxyProviders, delayTestByProxyGroupName, proxyNodeMap, - delayMap, updateProxy, setProxyGroupByProxyName, updateProviderByProviderName,