metacubexd/src/signals/config.ts

139 lines
3.8 KiB
TypeScript
Raw Normal View History

import { makePersisted } from '@solid-primitives/storage'
import { createSignal } from 'solid-js'
2023-09-12 20:50:52 +08:00
import { toast } from 'solid-toast'
2023-09-03 03:56:04 +08:00
import {
LATENCY_QUALITY_MAP_HTTP,
LATENCY_QUALITY_MAP_HTTPS,
PROXIES_ORDERING_TYPE,
2023-09-03 03:56:04 +08:00
PROXIES_PREVIEW_TYPE,
TAILWINDCSS_SIZE,
2023-09-03 03:56:04 +08:00
} from '~/constants'
2023-09-12 20:50:52 +08:00
import { setCurTheme, useRequest } from '~/signals'
import { Config } from '~/types'
export const [proxiesPreviewType, setProxiesPreviewType] = makePersisted(
createSignal(PROXIES_PREVIEW_TYPE.Auto),
{ name: 'proxiesPreviewType', storage: localStorage },
)
export const [proxiesOrderingType, setProxiesOrderingType] = makePersisted(
createSignal(PROXIES_ORDERING_TYPE.NATURAL),
{ name: 'proxiesOrderingType', storage: localStorage },
)
2023-09-03 05:40:39 +08:00
export const [urlForLatencyTest, setUrlForLatencyTest] = makePersisted(
createSignal('https://www.gstatic.com/generate_204'),
2023-09-03 05:40:39 +08:00
{ name: 'urlForLatencyTest', storage: localStorage },
)
export const [autoCloseConns, setAutoCloseConns] = makePersisted(
createSignal(false),
{ name: 'autoCloseConns', storage: localStorage },
)
export const [useTwemoji, setTwemoji] = makePersisted(createSignal(true), {
name: 'useTwemoji',
storage: localStorage,
})
2023-09-02 19:06:02 +08:00
export const [autoSwitchTheme, setAutoSwitchTheme] = makePersisted(
createSignal(false),
{ name: 'autoSwitchTheme', storage: localStorage },
)
export const [favDayTheme, setFavDayTheme] = makePersisted(
createSignal('light'),
{ name: 'favDayTheme', storage: localStorage },
)
export const [favNightTheme, setFavNightTheme] = makePersisted(
createSignal('night'),
{ name: 'favNightTheme', storage: localStorage },
)
export const [renderInTwoColumns, setRenderInTwoColumns] = makePersisted(
2023-09-02 21:00:20 +08:00
createSignal(true),
{ name: 'renderInTwoColumn', storage: localStorage },
)
export const [tableSize, setTableSize] = makePersisted(
createSignal<TAILWINDCSS_SIZE>(TAILWINDCSS_SIZE.XS),
{ name: 'tableSize', storage: localStorage },
)
2023-09-06 03:08:18 +08:00
export const tableSizeClassName = (size: TAILWINDCSS_SIZE) => {
2023-09-06 03:08:18 +08:00
let className = 'table-xs'
switch (size) {
case TAILWINDCSS_SIZE.XS:
className = 'table-xs'
break
case TAILWINDCSS_SIZE.SM:
className = 'table-sm'
break
case TAILWINDCSS_SIZE.MD:
className = 'table-md'
break
case TAILWINDCSS_SIZE.LG:
className = 'table-lg'
break
}
return className
}
export const [latencyTestTimeoutDuration, setLatencyTestTimeoutDuration] =
2023-09-06 11:17:00 +08:00
makePersisted(createSignal(2000), {
name: 'latencyTestTimeoutDuration',
storage: localStorage,
})
2023-09-02 19:06:02 +08:00
2023-09-03 05:40:39 +08:00
export const isLatencyTestByHttps = () =>
urlForLatencyTest().startsWith('https')
2023-09-03 03:56:04 +08:00
export const latencyQualityMap = () =>
isLatencyTestByHttps() ? LATENCY_QUALITY_MAP_HTTPS : LATENCY_QUALITY_MAP_HTTP
2023-09-02 19:06:02 +08:00
const setTheme = (isDark: boolean) => {
if (autoSwitchTheme()) {
if (isDark) {
setCurTheme(favNightTheme())
} else {
setCurTheme(favDayTheme())
}
}
}
export const applyThemeByMode = () =>
2023-09-02 19:06:02 +08:00
setTheme(window.matchMedia('(prefers-color-scheme: dark)').matches)
export const useAutoSwitchTheme = () => {
2023-09-02 19:06:02 +08:00
applyThemeByMode()
2023-09-02 19:06:02 +08:00
window
.matchMedia('(prefers-color-scheme: dark)')
.addEventListener('change', (event) => setTheme(event.matches))
2023-09-02 19:06:02 +08:00
}
2023-09-12 20:50:52 +08:00
export const [backendConfig, setBackendConfig] = createSignal<Config>()
export const fetchBackendConfig = () => {
const request = useRequest()
return request.get('configs').json<Config>()
}
export const updateBackendConfig = async (
key: keyof Config,
value: Config[keyof Config],
) => {
try {
const request = useRequest()
await request
.patch('configs', {
body: JSON.stringify({
[key]: value,
}),
})
.json<Config>()
const updatedConfig = await fetchBackendConfig()
setBackendConfig(updatedConfig)
} catch (err) {
toast.error((err as Error).message)
}
}