import { createForm } from '@felte/solid'
import { validator } from '@felte/validator-zod'
import { useI18n } from '@solid-primitives/i18n'
import { useNavigate } from '@solidjs/router'
import {
For,
ParentComponent,
Show,
children,
createSignal,
onMount,
} from 'solid-js'
import { z } from 'zod'
import {
fetchBackendConfigAPI,
fetchBackendVersionAPI,
restartBackendAPI,
restartingBackend,
updateBackendConfigAPI,
updateGEODatabasesAPI,
updatingGEODatabases,
upgradeBackendAPI,
upgradingBackend,
} from '~/apis'
import { Button } from '~/components'
import {
LANG,
LOG_LEVEL,
MODE_OPTIONS,
PROXIES_ORDERING_TYPE,
PROXIES_PREVIEW_TYPE,
ROUTES,
TAILWINDCSS_SIZE,
themes,
} from '~/constants'
import {
autoCloseConns,
autoSwitchTheme,
backendConfig,
favDayTheme,
favNightTheme,
latencyTestTimeoutDuration,
logLevel,
proxiesOrderingType,
proxiesPreviewType,
renderInTwoColumns,
setAutoCloseConns,
setAutoSwitchTheme,
setBackendConfig,
setFavDayTheme,
setFavNightTheme,
setLatencyTestTimeoutDuration,
setLogLevel,
setProxiesOrderingType,
setProxiesPreviewType,
setRenderInTwoColumns,
setSelectedEndpoint,
setTableSize,
setTwemoji,
setUrlForLatencyTest,
tableSize,
urlForLatencyTest,
useRequest,
useTwemoji,
} from '~/signals'
import type { DNSQuery } from '~/types'
const dnsQueryFormSchema = z.object({
name: z.string(),
type: z.string(),
})
const ConfigTitle: ParentComponent = (props) => (
{children(() => props.children)()}
)
const DNSQueryForm = () => {
const [t] = useI18n()
const request = useRequest()
const { form, isSubmitting } = createForm>(
{
extend: validator({ schema: dnsQueryFormSchema }),
onSubmit: async (values) => {
request
.get('dns/query', {
searchParams: { name: values.name, type: values.type },
})
.json()
.then(({ Answer }) =>
setDNSQueryResult(Answer?.map(({ data }) => data) || []),
)
},
},
)
const [DNSQueryResult, setDNSQueryResult] = createSignal([])
return (
)
}
const configFormSchema = z.object({
port: z.number(),
'socks-port': z.number(),
'redir-port': z.number(),
'tproxy-port': z.number(),
'mixed-port': z.number(),
})
const ConfigForm = () => {
const [t] = useI18n()
const portsList = [
{
label: 'Http Port',
key: 'port',
},
{
label: 'Socks Port',
key: 'socks-port',
},
{
label: 'Redir Port',
key: 'redir-port',
},
{
label: 'Tproxy Port',
key: 'tproxy-port',
},
{
label: 'Mixed Port',
key: 'mixed-port',
},
]
const { form, setInitialValues, reset } = createForm<
z.infer
>({ extend: validator({ schema: configFormSchema }) })
onMount(async () => {
const configs = await fetchBackendConfigAPI()
setBackendConfig(configs)
setInitialValues(configs)
reset()
})
return (
)
}
const ConfigForXd = () => {
const [t, { locale }] = useI18n()
const navigate = useNavigate()
const onSwitchEndpointClick = () => {
setSelectedEndpoint('')
navigate(ROUTES.Setup)
}
const autoSwitchThemeSubChild = () => (
{t('favDayTheme')}
{t('favNightTheme')}
)
const checkboxList = [
{
label: t('renderInTwoColumns'),
value: renderInTwoColumns,
onChange: setRenderInTwoColumns,
},
{
label: t('autoSwitchTheme'),
value: autoSwitchTheme,
onChange: (value: boolean) => {
setAutoSwitchTheme(value)
},
subChild: autoSwitchThemeSubChild,
},
{
label: t('useTwemoji'),
value: useTwemoji,
onChange: setTwemoji,
},
]
return (
{(checkbox) => (
<>
{checkbox.label}
{
checkbox.onChange(e.target.checked)
}}
/>
{checkbox.subChild?.()}
>
)}
{t('proxiesPreviewType')}
{t('proxiesSorting')}
{t('tableSize')}
{t('logLevel')}
)
}
const Versions = () => {
const [backendVersion, setBackendVersion] = createSignal('')
onMount(async () => {
const version = await fetchBackendVersionAPI()
setBackendVersion(version)
})
return (
{import.meta.env.version}
{backendVersion()}
)
}
export default () => {
return (
)
}