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,