mirror of
https://github.com/woodchen-ink/clash-and-dashboard.git
synced 2025-07-18 05:51:56 +08:00
70 lines
2.5 KiB
TypeScript
70 lines
2.5 KiB
TypeScript
import { useMemo } from 'react'
|
|
|
|
import { Card, Tag, Icon, Loading } from '@components'
|
|
import { compareDesc } from '@containers/Proxies'
|
|
import { Proxy } from '@containers/Proxies/components/Proxy'
|
|
import { fromNow } from '@lib/date'
|
|
import { useVisible } from '@lib/hook'
|
|
import { type Provider as IProvider, type Proxy as IProxy } from '@lib/request'
|
|
import { useClient, useI18n, useProxyProviders } from '@stores'
|
|
|
|
import './style.scss'
|
|
|
|
interface ProvidersProps {
|
|
provider: IProvider
|
|
}
|
|
|
|
export function Provider (props: ProvidersProps) {
|
|
const { update } = useProxyProviders()
|
|
const { translation, lang } = useI18n()
|
|
const client = useClient()
|
|
|
|
const { provider } = props
|
|
const { t } = translation('Proxies')
|
|
|
|
const { visible, hide, show } = useVisible()
|
|
|
|
function handleHealthChech () {
|
|
show()
|
|
client.healthCheckProvider(provider.name).then(async () => await update()).finally(() => hide())
|
|
}
|
|
|
|
function handleUpdate () {
|
|
show()
|
|
client.updateProvider(provider.name).then(async () => await update()).finally(() => hide())
|
|
}
|
|
|
|
const proxies = useMemo(() => {
|
|
return (provider.proxies as IProxy[]).slice().sort((a, b) => -1 * compareDesc(a, b))
|
|
}, [provider.proxies])
|
|
|
|
return (
|
|
<Card className="proxy-provider">
|
|
<Loading visible={visible} />
|
|
<div className="flex flex-col justify-between md:flex-row md:items-center">
|
|
<div className="flex items-center">
|
|
<span className="mr-6">{ provider.name }</span>
|
|
<Tag>{ provider.vehicleType }</Tag>
|
|
</div>
|
|
<div className="flex items-center md:pt-0 pt-3">
|
|
{
|
|
provider.updatedAt &&
|
|
<span className="text-sm">{ `${t('providerUpdateTime')}: ${fromNow(new Date(provider.updatedAt), lang)}`}</span>
|
|
}
|
|
<Icon className="cursor-pointer text-red pl-5" type="healthcheck" size={18} onClick={handleHealthChech} />
|
|
<Icon className="cursor-pointer pl-5" type="update" size={18} onClick={handleUpdate} />
|
|
</div>
|
|
</div>
|
|
<ul className="proxies-list">
|
|
{
|
|
proxies.map((p: IProxy) => (
|
|
<li key={p.name}>
|
|
<Proxy className="proxy-provider-item" config={p} />
|
|
</li>
|
|
))
|
|
}
|
|
</ul>
|
|
</Card>
|
|
)
|
|
}
|