import { Button, Heading, HStack, Text, Textarea } from "@hope-ui/solid" import { createSignal, Index, onCleanup, Show } from "solid-js" import { createStore } from "solid-js/store" import { MaybeLoading } from "~/components" import { useFetch, useManageTitle, useT } from "~/hooks" import { Group, PResp, SettingItem } from "~/types" import { getTarget, handleResp, notify, r } from "~/utils" import { ResponsiveGrid } from "../common/ResponsiveGrid" import { Item } from "./SettingItem" interface FRPRuntime { status: string logs: string[] } const POLL_INTERVAL_MS = 3000 const LOG_LIMIT = 200 const FrpSettings = () => { const t = useT() useManageTitle("manage.sidemenu.frp") const [settings, setSettings] = createStore([]) const [status, setStatus] = createSignal("") const [logs, setLogs] = createSignal([]) const [loadingSettings, fetchSettings] = useFetch( (): PResp => r.get(`/admin/setting/list?group=${Group.FRP}`), ) const [, fetchRuntime] = useFetch( (): PResp => r.get(`/admin/setting/frp_runtime?limit=${LOG_LIMIT}`), ) const refreshSettings = async () => { const resp = await fetchSettings() handleResp(resp, (data) => { setSettings(data.filter((i) => i.key !== "frp_status")) }) } const refreshRuntimeInfo = async () => { const resp = await fetchRuntime() handleResp(resp, (data) => { setStatus(data.status || "") setLogs(data.logs || []) }) } const refresh = async () => { await refreshSettings() await refreshRuntimeInfo() } refresh() const pollTimer = setInterval(refreshRuntimeInfo, POLL_INTERVAL_MS) onCleanup(() => clearInterval(pollTimer)) const [applyLoading, applyFRP] = useFetch( (): PResp => r.post("/admin/setting/set_frp", getTarget(settings) as SettingItem[]), ) const [stopLoading, stopFRP] = useFetch( (): PResp => r.post("/admin/setting/stop_frp"), ) return ( {t("settings_other.frp")} {t("settings_other.frp_status_label")}{" "} {status()} {(item, i) => ( { setSettings(i, "value", val) }} /> )} {t("settings_other.frp_logs")}