import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { Button, Divider, 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 { useAppDispatch } from "../../store"; import { setGlobalState } from "../../store/reducer/global"; import "@/less/settings/system-section.less"; interface State { dbSize: number; allowSignUp: boolean; disablePublicMemos: 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, disablePublicMemos: systemStatus.disablePublicMemos, }); const dispatch = useAppDispatch(); useEffect(() => { globalStore.fetchSystemStatus(); }, []); useEffect(() => { setState({ dbSize: systemStatus.dbSize, allowSignUp: systemStatus.allowSignUp, additionalStyle: systemStatus.additionalStyle, additionalScript: systemStatus.additionalScript, disablePublicMemos: systemStatus.disablePublicMemos, }); }, [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(t("message.succeed-vacuum-database")); }; const handleSaveAdditionalStyle = async () => { try { await api.upsertSystemSetting({ name: "additionalStyle", value: JSON.stringify(state.additionalStyle), }); } catch (error) { console.error(error); return; } toastHelper.success(t("message.succeed-update-additional-style")); }; const handleAdditionalScriptChanged = (value: string) => { setState({ ...state, additionalScript: value, }); }; const handleDisablePublicMemosChanged = async (value: boolean) => { setState({ ...state, disablePublicMemos: value, }); // Update global store immediately as MemoEditor/Selector is dependent on this value. dispatch(setGlobalState({ systemStatus: { ...systemStatus, disablePublicMemos: value } })); await api.upsertSystemSetting({ name: "disablePublicMemos", value: JSON.stringify(value), }); }; const handleSaveAdditionalScript = async () => { try { await api.upsertSystemSetting({ name: "additionalScript", value: JSON.stringify(state.additionalScript), }); } catch (error) { console.error(error); return; } toastHelper.success(t("message.succeed-update-additional-script")); }; return (

{t("common.basic")}

{t("setting.system-section.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.disable-public-memos")} handleDisablePublicMemosChanged(event.target.checked)} />
Storage handleDisablePublicMemosChanged(event.target.checked)} />
{t("setting.system-section.additional-style")}