import React, { useEffect } from 'react' import { useTranslation } from 'react-i18next' import i18next from 'i18next' import { Header, Card, Row, Col, Switch, ButtonSelect, ButtonSelectOptions, Input, Icon } from '@components' import { APIInfo, Data, ClashXData } from '@stores' import { updateConfig } from '@lib/request' import { useObject } from '@lib/hook' import { to } from '@lib/helper' import { isClashX, jsBridge } from '@lib/jsBridge' import './style.scss' const languageOptions: ButtonSelectOptions[] = [{ label: '中文', value: 'zh' }, { label: 'English', value: 'en' }] function changeLanguage (language: string) { i18next.changeLanguage(language) } async function handleStartAtLoginChange (state: boolean) { await jsBridge.setStartAtLogin(state) } async function handleSetSystemProxy (state: boolean) { await jsBridge.setSystemProxy(state) } export default function Settings () { const { data: clashXData, fetch: fetchClashXData } = ClashXData.useContainer() const { data, fetch, unauthorized: { show } } = Data.useContainer() const { data: apiInfo } = APIInfo.useContainer() const { t, i18n } = useTranslation(['Settings']) const { value: info, change } = useObject({ socks5ProxyPort: 7891, httpProxyPort: 7890, isClashX: false }) useEffect(() => { fetch() if (isClashX()) { fetchClashXData().then(() => change('isClashX', true)) } }, []) useEffect(() => { change('socks5ProxyPort', data.general.socksPort) change('httpProxyPort', data.general.port) }, [data]) async function handleProxyModeChange (mode: string) { const [, err] = await to(updateConfig({ mode })) if (!err) { fetch() } } async function handleHttpPortSave () { const [, err] = await to(updateConfig({ 'port': info.httpProxyPort })) if (!err) { await fetch() change('httpProxyPort', data.general.port) } } async function handleSocksPortSave () { const [, err] = await to(updateConfig({ 'socks-port': info.socks5ProxyPort })) if (!err) { await fetch() change('socks5ProxyPort', data.general.socksPort) } } async function handleAllowLanChange (state: boolean) { const [, err] = await to(updateConfig({ 'allow-lan': state })) if (!err) { await fetch() } } const { hostname: externalControllerHost, port: externalControllerPort } = apiInfo const { allowLan, mode } = data.general const { startAtLogin, systemProxy } = clashXData const proxyModeOptions: ButtonSelectOptions[] = [ { label: t('values.global'), value: 'Global' }, { label: t('values.rules'), value: 'Rule' }, { label: t('values.direct'), value: 'Direct' } ] return (
{t('labels.startAtLogin')} {t('labels.language')} {t('labels.setAsSystemProxy')} {t('labels.allowConnectFromLan')} {t('labels.proxyMode')} {t('labels.socks5ProxyPort')} change('socks5ProxyPort', parseInt(socks5ProxyPort, 10))} onBlur={handleSocksPortSave} /> {t('labels.httpProxyPort')} change('httpProxyPort', parseInt(httpProxyPort, 10))} onBlur={handleHttpPortSave} /> {t('labels.externalController')} {`${externalControllerHost}:${externalControllerPort}`}

{t('versionString', { version: 'unknown' })}

{t('checkUpdate')}
) }