mirror of
https://github.com/woodchen-ink/clash-and-dashboard.git
synced 2025-07-18 14:01:56 +08:00
Update: proxy page
This commit is contained in:
parent
d18ca26bad
commit
77525e3f5a
@ -11,4 +11,4 @@ export * from './Select'
|
|||||||
export * from './Modal'
|
export * from './Modal'
|
||||||
export * from './Alert'
|
export * from './Alert'
|
||||||
export * from './Button'
|
export * from './Button'
|
||||||
export { default as Message } from './Message'
|
export * from './Message'
|
||||||
|
@ -1,28 +1,45 @@
|
|||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
import { BaseComponentProps, ProxyType } from '@models'
|
|
||||||
import classnames from 'classnames'
|
import classnames from 'classnames'
|
||||||
|
import { BaseComponentProps, Proxy as IProxy } from '@models'
|
||||||
|
import { getProxyDelay } from '@lib/request'
|
||||||
|
import { to } from '@lib/helper'
|
||||||
import './style.scss'
|
import './style.scss'
|
||||||
const shadowsocks = require('@assets/proxy/shadowsocks.svg')
|
|
||||||
const vmess = require('@assets/proxy/vmess.svg')
|
interface ProxyProps extends BaseComponentProps, IProxy {}
|
||||||
const iconMapping = {
|
|
||||||
[ProxyType.Shadowsocks]: shadowsocks,
|
interface ProxyState {
|
||||||
[ProxyType.Shadowsocks]: shadowsocks,
|
delay: number
|
||||||
[ProxyType.Vmess]: vmess
|
hasError: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ProxyProps extends BaseComponentProps {
|
export class Proxy extends React.Component<ProxyProps, ProxyState> {
|
||||||
type: ProxyType
|
|
||||||
name: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export const Proxy: React.SFC<ProxyProps> = props => {
|
state = {
|
||||||
const { type, name, className } = props
|
delay: -1,
|
||||||
const icon = iconMapping[type]
|
hasError: false
|
||||||
return (
|
}
|
||||||
<div className={classnames('proxy', className)}>
|
|
||||||
<img className="proxy-icon" src={icon}/>
|
async componentDidMount () {
|
||||||
<span className="proxy-name">{ name }</span>
|
const { name } = this.props
|
||||||
</div>
|
const [res, err] = await to(getProxyDelay(name))
|
||||||
)
|
|
||||||
|
if (err) {
|
||||||
|
return this.setState({ hasError: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data: { delay } } = res
|
||||||
|
this.setState({ delay })
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
const { name, className } = this.props
|
||||||
|
const { delay, hasError } = this.state
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={classnames('proxy-item', { 'proxy-error': hasError }, className)}>
|
||||||
|
<span className="proxy-name">{name}</span>
|
||||||
|
<span className="proxy-delay">{delay === -1 ? '-' : `${delay}s`}</span>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
@import '~@styles/variables';
|
@import '~@styles/variables';
|
||||||
|
|
||||||
.proxy {
|
.proxy-item {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -9,19 +9,29 @@
|
|||||||
width: 100px;
|
width: 100px;
|
||||||
box-shadow: 0 0 20px rgba($color-primary-dark, 0.2);
|
box-shadow: 0 0 20px rgba($color-primary-dark, 0.2);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
|
||||||
|
|
||||||
.proxy-icon {
|
.proxy-icon {
|
||||||
height: 40px;
|
height: 40px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.proxy-name {
|
.proxy-name {
|
||||||
width: 80%;
|
width: 80%;
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
color: $color-primary-dark;
|
color: $color-primary-dark;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.proxy-delay {
|
||||||
|
width: 80%;
|
||||||
|
margin-top: 8px;
|
||||||
|
color: $color-primary-dark;
|
||||||
|
font-size: 12px;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,25 @@
|
|||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
import { translate } from 'react-i18next'
|
import { translate } from 'react-i18next'
|
||||||
|
import { inject, observer } from 'mobx-react'
|
||||||
|
import { storeKeys } from '@lib/createStore'
|
||||||
import { Header, Icon } from '@components'
|
import { Header, Icon } from '@components'
|
||||||
import { ProxyType, I18nProps } from '@models'
|
import { I18nProps, BaseRouterProps } from '@models'
|
||||||
|
|
||||||
import { Proxy } from './components'
|
import { Proxy } from './components'
|
||||||
import './style.scss'
|
import './style.scss'
|
||||||
|
|
||||||
class Proxies extends React.Component<I18nProps, {}> {
|
interface ProxiesProps extends BaseRouterProps, I18nProps {}
|
||||||
|
|
||||||
|
@inject(...storeKeys)
|
||||||
|
@observer
|
||||||
|
class Proxies extends React.Component<ProxiesProps, {}> {
|
||||||
|
|
||||||
|
componentDidMount () {
|
||||||
|
this.props.config.fetchAndParseConfig()
|
||||||
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { t } = this.props
|
const { t, config } = this.props
|
||||||
const proxies: { type: ProxyType, name: string }[] = [
|
|
||||||
{ type: ProxyType.Shadowsocks, name: 'shadowsocks' },
|
|
||||||
{ type: ProxyType.Vmess, name: 'vmess' }
|
|
||||||
]
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="page">
|
<div className="page">
|
||||||
@ -20,17 +27,19 @@ class Proxies extends React.Component<I18nProps, {}> {
|
|||||||
<Header title={t('title')} >
|
<Header title={t('title')} >
|
||||||
<Icon type="plus" size={20} style={{ fontWeight: 'bold' }} />
|
<Icon type="plus" size={20} style={{ fontWeight: 'bold' }} />
|
||||||
</Header>
|
</Header>
|
||||||
<ul className="proxies-list">
|
{
|
||||||
{
|
config.state === 'ok' && <ul className="proxies-list">
|
||||||
proxies.map(
|
{
|
||||||
proxy => (
|
config.config.proxy.map(
|
||||||
<li>
|
(p, index) => (
|
||||||
<Proxy type={proxy.type} name={proxy.name} />
|
<li key={index}>
|
||||||
</li>
|
<Proxy name={p.name} config={p.config} />
|
||||||
|
</li>
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
}
|
||||||
}
|
</ul>
|
||||||
</ul>
|
}
|
||||||
</div>
|
</div>
|
||||||
<div className="proxies-container">
|
<div className="proxies-container">
|
||||||
<Header title={t('groupTitle')} />
|
<Header title={t('groupTitle')} />
|
||||||
|
@ -14,7 +14,7 @@ export function removeLocalStorageItem (key: string) {
|
|||||||
* to return Promise<[T, Error]>
|
* to return Promise<[T, Error]>
|
||||||
* @param {Promise<T>} promise
|
* @param {Promise<T>} promise
|
||||||
*/
|
*/
|
||||||
export async function to <T, E = Error> (promise: any): Promise<[T, E]> {
|
export async function to <T, E = Error> (promise: Promise<T>): Promise<[T, E]> {
|
||||||
try {
|
try {
|
||||||
const ret = await promise
|
const ret = await promise
|
||||||
return [ret, null as E]
|
return [ret, null as E]
|
||||||
|
@ -57,17 +57,22 @@ export async function getProxies () {
|
|||||||
|
|
||||||
export async function getProxy (name: string) {
|
export async function getProxy (name: string) {
|
||||||
const req = await getInstance()
|
const req = await getInstance()
|
||||||
return req.get<Proxy>('proxies/:name', { params: { name } })
|
return req.get<Proxy>(`proxies/${name}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getProxyDelay (name: string) {
|
export async function getProxyDelay (name: string) {
|
||||||
const req = await getInstance()
|
const req = await getInstance()
|
||||||
return req.get<{ delay: number }>('proxies/:name/delay', { params: { name } })
|
return req.get<{ delay: number }>(`proxies/${name}/delay`, {
|
||||||
|
params: {
|
||||||
|
timeout: 2000,
|
||||||
|
url: 'http://www.gstatic.com/generate_204'
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function changeProxySelected (name: string, select: string) {
|
export async function changeProxySelected (name: string, select: string) {
|
||||||
const req = await getInstance()
|
const req = await getInstance()
|
||||||
return req.get<void>('proxies/:name', { params: { name }, data: { name: select } })
|
return req.get<void>(`proxies/${name}`, { data: { name: select } })
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getInstance () {
|
export async function getInstance () {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user