import { Button, Divider, Input, Switch, Textarea, Tooltip } from "@mui/joy"; import { useEffect, useState } from "react"; import { toast } from "react-hot-toast"; import { Link } from "react-router-dom"; import { workspaceSettingServiceClient } from "@/grpcweb"; import * as api from "@/helpers/api"; import { useGlobalStore } from "@/store/module"; import { WorkspaceSettingPrefix } from "@/store/v1"; import { WorkspaceGeneralSetting } from "@/types/proto/api/v2/workspace_setting_service"; import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { useTranslate } from "@/utils/i18n"; import Icon from "../Icon"; import showUpdateCustomizedProfileDialog from "../UpdateCustomizedProfileDialog"; interface State { disablePublicMemos: boolean; maxUploadSizeMiB: number; memoDisplayWithUpdatedTs: boolean; } const SystemSection = () => { const t = useTranslate(); const globalStore = useGlobalStore(); const systemStatus = globalStore.state.systemStatus; const [state, setState] = useState({ disablePublicMemos: systemStatus.disablePublicMemos, maxUploadSizeMiB: systemStatus.maxUploadSizeMiB, memoDisplayWithUpdatedTs: systemStatus.memoDisplayWithUpdatedTs, }); const [workspaceGeneralSetting, setWorkspaceGeneralSetting] = useState(WorkspaceGeneralSetting.fromPartial({})); const [telegramBotToken, setTelegramBotToken] = useState(""); useEffect(() => { (async () => { await globalStore.fetchSystemStatus(); const { setting } = await workspaceSettingServiceClient.getWorkspaceSetting({ name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.WORKSPACE_SETTING_GENERAL}`, }); if (setting && setting.generalSetting) { setWorkspaceGeneralSetting(WorkspaceGeneralSetting.fromPartial(setting.generalSetting)); } })(); }, []); useEffect(() => { api.getSystemSetting().then(({ data: systemSettings }) => { const telegramBotSetting = systemSettings.find((setting) => setting.name === "telegram-bot-token"); if (telegramBotSetting) { setTelegramBotToken(telegramBotSetting.value); } }); }, []); useEffect(() => { setState({ ...state, disablePublicMemos: systemStatus.disablePublicMemos, maxUploadSizeMiB: systemStatus.maxUploadSizeMiB, memoDisplayWithUpdatedTs: systemStatus.memoDisplayWithUpdatedTs, }); }, [systemStatus]); const handleAllowSignUpChanged = async (value: boolean) => { const setting = { ...workspaceGeneralSetting, disallowSignup: !value }; await workspaceSettingServiceClient.setWorkspaceSetting({ setting: { name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.WORKSPACE_SETTING_GENERAL}`, generalSetting: setting, }, }); setWorkspaceGeneralSetting(setting); }; const handleDisablePasswordLoginChanged = async (value: boolean) => { setWorkspaceGeneralSetting({ ...workspaceGeneralSetting, disallowPasswordLogin: value }); await workspaceSettingServiceClient.setWorkspaceSetting({ setting: { name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.WORKSPACE_SETTING_GENERAL}`, generalSetting: workspaceGeneralSetting, }, }); }; const handleUpdateCustomizedProfileButtonClick = () => { showUpdateCustomizedProfileDialog(); }; const handleInstanceUrlChanged = (value: string) => { setWorkspaceGeneralSetting({ ...workspaceGeneralSetting, instanceUrl: value }); }; const handleSaveInstanceUrl = async () => { try { await workspaceSettingServiceClient.setWorkspaceSetting({ setting: { name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.WORKSPACE_SETTING_GENERAL}`, generalSetting: workspaceGeneralSetting, }, }); } catch (error: any) { console.error(error); toast.error(error.response.data.message); return; } toast.success("Instance URL updated"); }; const handleTelegramBotTokenChanged = (value: string) => { setTelegramBotToken(value); }; const handleSaveTelegramBotToken = async () => { try { await api.upsertSystemSetting({ name: "telegram-bot-token", value: telegramBotToken, }); } catch (error: any) { console.error(error); toast.error(error.response.data.message); return; } toast.success("Telegram Bot Token updated"); }; const handleAdditionalStyleChanged = (value: string) => { setWorkspaceGeneralSetting({ ...workspaceGeneralSetting, additionalStyle: value }); }; const handleSaveAdditionalStyle = async () => { try { await workspaceSettingServiceClient.setWorkspaceSetting({ setting: { name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.WORKSPACE_SETTING_GENERAL}`, generalSetting: workspaceGeneralSetting, }, }); } catch (error: any) { toast.error(error.response.data.message); console.error(error); return; } toast.success(t("message.succeed-update-additional-style")); }; const handleAdditionalScriptChanged = (value: string) => { setWorkspaceGeneralSetting({ ...workspaceGeneralSetting, additionalScript: value }); }; const handleSaveAdditionalScript = async () => { try { await workspaceSettingServiceClient.setWorkspaceSetting({ setting: { name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.WORKSPACE_SETTING_GENERAL}`, generalSetting: workspaceGeneralSetting, }, }); } catch (error: any) { toast.error(error.response.data.message); console.error(error); return; } toast.success(t("message.succeed-update-additional-script")); }; const handleDisablePublicMemosChanged = async (value: boolean) => { setState({ ...state, disablePublicMemos: value, }); globalStore.setSystemStatus({ disablePublicMemos: value }); await api.upsertSystemSetting({ name: "disable-public-memos", value: JSON.stringify(value), }); }; const handleMemoDisplayWithUpdatedTs = async (value: boolean) => { setState({ ...state, memoDisplayWithUpdatedTs: value, }); globalStore.setSystemStatus({ memoDisplayWithUpdatedTs: value }); await api.upsertSystemSetting({ name: "memo-display-with-updated-ts", value: JSON.stringify(value), }); }; const handleMaxUploadSizeChanged = async (event: React.FocusEvent) => { // fixes cursor skipping position on mobile event.target.selectionEnd = event.target.value.length; let num = parseInt(event.target.value); if (Number.isNaN(num)) { num = 0; } setState({ ...state, maxUploadSizeMiB: num, }); event.target.value = num.toString(); globalStore.setSystemStatus({ maxUploadSizeMiB: num }); await api.upsertSystemSetting({ name: "max-upload-size-mib", value: JSON.stringify(num), }); }; const handleMaxUploadSizeFocus = (event: React.FocusEvent) => { event.target.select(); }; return (

{t("common.basic")}

{t("setting.system-section.server-name")}: {systemStatus.customizedProfile.name}

{t("common.settings")}

{t("setting.system-section.allow-user-signup")} handleAllowSignUpChanged(event.target.checked)} />
{t("setting.system-section.disable-password-login")} handleDisablePasswordLoginChanged(event.target.checked)} />
{t("setting.system-section.disable-public-memos")} handleDisablePublicMemosChanged(event.target.checked)} />
{t("setting.system-section.display-with-updated-time")} handleMemoDisplayWithUpdatedTs(event.target.checked)} />
{t("setting.system-section.max-upload-size")}
Instance URL
handleInstanceUrlChanged(event.target.value)} />
{t("common.learn-more")}
{t("setting.system-section.telegram-bot-token")}
handleTelegramBotTokenChanged(event.target.value)} />
{t("common.learn-more")}
{t("setting.system-section.additional-style")}