import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { Button, Switch, Textarea } from "@mui/joy"; import { useGlobalStore } from "../../store/module"; import * as api from "../../helpers/api"; import toastHelper from "../Toast"; import showUpdateCustomizedProfileDialog from "../UpdateCustomizedProfileDialog"; import "@/less/settings/system-section.less"; interface State { dbSize: number; allowSignUp: boolean; additionalStyle: string; additionalScript: string; } const formatBytes = (bytes: number) => { if (bytes <= 0) return "0 Bytes"; const k = 1024, dm = 2, sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i]; }; const SystemSection = () => { const { t } = useTranslation(); const globalStore = useGlobalStore(); const systemStatus = globalStore.state.systemStatus; const [state, setState] = useState({ dbSize: systemStatus.dbSize, allowSignUp: systemStatus.allowSignUp, additionalStyle: systemStatus.additionalStyle, additionalScript: systemStatus.additionalScript, }); useEffect(() => { globalStore.fetchSystemStatus(); }, []); useEffect(() => { setState({ dbSize: systemStatus.dbSize, allowSignUp: systemStatus.allowSignUp, additionalStyle: systemStatus.additionalStyle, additionalScript: systemStatus.additionalScript, }); }, [systemStatus]); const handleAllowSignUpChanged = async (value: boolean) => { setState({ ...state, allowSignUp: value, }); await api.upsertSystemSetting({ name: "allowSignUp", value: JSON.stringify(value), }); }; const handleAdditionalStyleChanged = (value: string) => { setState({ ...state, additionalStyle: value, }); }; const handleUpdateCustomizedProfileButtonClick = () => { showUpdateCustomizedProfileDialog(); }; const handleVacuumBtnClick = async () => { try { await api.vacuumDatabase(); await globalStore.fetchSystemStatus(); } catch (error) { console.error(error); return; } toastHelper.success("Succeed to vacuum database"); }; const handleSaveAdditionalStyle = async () => { try { await api.upsertSystemSetting({ name: "additionalStyle", value: JSON.stringify(state.additionalStyle), }); } catch (error) { console.error(error); return; } toastHelper.success("Succeed to update additional style"); }; const handleAdditionalScriptChanged = (value: string) => { setState({ ...state, additionalScript: value, }); }; const handleSaveAdditionalScript = async () => { try { await api.upsertSystemSetting({ name: "additionalScript", value: JSON.stringify(state.additionalScript), }); } catch (error) { console.error(error); return; } toastHelper.success("Succeed to update additional script"); }; return (

{t("common.basic")}

Server name: {systemStatus.customizedProfile.name}
{t("setting.system-section.database-file-size")}: {formatBytes(state.dbSize)}

{t("sidebar.setting")}

{t("setting.system-section.allow-user-signup")} handleAllowSignUpChanged(event.target.checked)} />
{t("setting.system-section.additional-style")}