diff --git a/src/components/Collpase.tsx b/src/components/Collpase.tsx new file mode 100644 index 00000000..e23d4d85 --- /dev/null +++ b/src/components/Collpase.tsx @@ -0,0 +1,46 @@ +import { JSX, ParentComponent } from 'solid-js' +import { twMerge } from 'tailwind-merge' + +type Props = { + title: JSX.Element + content: JSX.Element + isOpen: boolean | undefined + onCollapse: (collapsed: boolean) => void +} + +const Collapse: ParentComponent = (props) => { + const { title, content, onCollapse } = props + + const getCollapseClassName = () => { + return props.isOpen ? 'collapse-open' : 'collapse-close' + } + const getCollapseContentClassName = () => { + return props.isOpen ? 'opacity-100' : 'opacity-0 scale-y-0' + } + + return ( +
+
onCollapse(!props.isOpen)} + > + {title} +
+
+ {content} +
+
+ ) +} + +export default Collapse diff --git a/src/components/ProxyNodeCard.tsx b/src/components/ProxyNodeCard.tsx new file mode 100644 index 00000000..3fbea99e --- /dev/null +++ b/src/components/ProxyNodeCard.tsx @@ -0,0 +1,36 @@ +import { twMerge } from 'tailwind-merge' +import { useProxies } from '~/signals/proxies' + +export default (props: { + proxyName: string + isSelected?: boolean + onClick?: () => void +}) => { + const { proxyName, isSelected, onClick } = props + const { delayMap } = useProxies() + const Delay = (proxyname: string) => { + const delay = delayMap()[proxyname] + + if (typeof delay !== 'number' || delay === 0) { + return '' + } + + return {delay}ms + } + + return ( +
onClick?.()} + > + {proxyName} + {Delay(proxyName)} +
+ ) +} diff --git a/src/pages/Proxies.tsx b/src/pages/Proxies.tsx index f5fb7f5c..8178e625 100644 --- a/src/pages/Proxies.tsx +++ b/src/pages/Proxies.tsx @@ -1,6 +1,7 @@ import { IconBrandSpeedtest } from '@tabler/icons-solidjs' import { For, createSignal, onMount } from 'solid-js' -import { twMerge } from 'tailwind-merge' +import Collapse from '~/components/Collpase' +import ProxyNodeCard from '~/components/ProxyNodeCard' import { useProxies } from '~/signals/proxies' import type { Proxy } from '~/types' @@ -8,25 +9,15 @@ export default () => { const { proxies, proxyProviders, - delayMap, updateProxy, setProxiesByProxyName, delayTestByProxyGroupName, } = useProxies() - const [collapseMap, setCollapseMap] = createSignal>( + + const [collapsedMap, setCollapsedMap] = createSignal>( {}, ) - const renderDelay = (proxyname: string) => { - const delay = delayMap()[proxyname] - - if (typeof delay !== 'number' || delay === 0) { - return '' - } - - return {delay}ms - } - onMount(async () => { await updateProxy() }) @@ -35,22 +26,11 @@ export default () => { setProxiesByProxyName(proxy, proxyName) } - const onCollapseTitleClick = (name: string) => { - const cMap = collapseMap() - - cMap[name] = !cMap[name] - setCollapseMap({ ...cMap }) - } - const onSpeedTestClick = (e: MouseEvent, name: string) => { e.stopPropagation() delayTestByProxyGroupName(name) } - const getCollapseClassName = (name: string) => { - return collapseMap()[name] ? 'collapse-open' : 'collapse-close' - } - return (
@@ -58,42 +38,47 @@ export default () => {
- {(proxy) => ( -
-
onCollapseTitleClick(proxy.name)} - > - {proxy.name} {proxy.type} - onSpeedTestClick(e, proxy.name)} - /> -
-
- - {(proxyName) => ( -
onProxyNodeClick(proxy, proxyName)} - > - {proxyName} {renderDelay(proxyName)} -
- )} -
-
-
- )} + {(proxy) => { + const title = ( + <> +
+ {proxy.name} + onSpeedTestClick(e, proxy.name)} + /> +
+
+ {proxy.type} :: {proxy.now} +
+ + ) + const content = ( + + {(proxyName) => ( + onProxyNodeClick(proxy, proxyName)} + /> + )} + + ) + + return ( + + setCollapsedMap({ + ...collapsedMap(), + [`group-${proxy.name}`]: val, + }) + } + > + ) + }}
@@ -103,30 +88,28 @@ export default () => {
- {(proxy) => ( -
-
onCollapseTitleClick(proxy.name)} - > - {proxy.name} -
-
- - {(proxyNode) => ( -
- {proxyNode.name} {renderDelay(proxyNode.name)} -
- )} -
-
-
- )} + {(proxyProvider) => { + const title = <>{proxyProvider.name} + const content = ( + + {(proxy) => } + + ) + + return ( + + setCollapsedMap({ + ...collapsedMap(), + [`provider-${proxyProvider.name}`]: val, + }) + } + /> + ) + }}
diff --git a/src/signals/proxies.ts b/src/signals/proxies.ts index fb6bf79c..20dbc6c4 100644 --- a/src/signals/proxies.ts +++ b/src/signals/proxies.ts @@ -2,11 +2,13 @@ import { createSignal } from 'solid-js' import { useRequest } from '~/signals' import type { Proxy, ProxyProvider } from '~/types' +// these signals should be global state +const [proxies, setProxies] = createSignal([]) +const [delayMap, setDelayMap] = createSignal>({}) +const [proxyProviders, setProxyProviders] = createSignal([]) + export function useProxies() { const request = useRequest() - const [proxies, setProxies] = createSignal([]) - const [proxyProviders, setProxyProviders] = createSignal([]) - const [delayMap, setDelayMap] = createSignal>({}) const updateProxy = async () => { const { providers } = await request