import { Button, Divider, Dropdown, IconButton, Input, List, ListItem, Menu, MenuButton, MenuItem, Radio, RadioGroup, Tooltip, } from "@mui/joy"; import { useEffect, useState } from "react"; import { toast } from "react-hot-toast"; import { Link } from "react-router-dom"; import * as api from "@/helpers/api"; import { WorkspaceSettingPrefix, useWorkspaceSettingStore } from "@/store/v1"; import { WorkspaceStorageSetting, WorkspaceStorageSetting_StorageType } from "@/types/proto/api/v2/workspace_setting_service"; import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { useTranslate } from "@/utils/i18n"; import showCreateStorageServiceDialog from "../CreateStorageServiceDialog"; import { showCommonDialog } from "../Dialog/CommonDialog"; import Icon from "../Icon"; import LearnMore from "../LearnMore"; import showUpdateLocalStorageDialog from "../UpdateLocalStorageDialog"; const StorageSection = () => { const t = useTranslate(); const workspaceSettingStore = useWorkspaceSettingStore(); const [storageList, setStorageList] = useState([]); const [workspaceStorageSetting, setWorkspaceStorageSetting] = useState( WorkspaceStorageSetting.fromPartial( workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.WORKSPACE_SETTING_STORAGE)?.storageSetting || {}, ), ); useEffect(() => { fetchStorageList(); }, []); const fetchStorageList = async () => { const { data: storageList } = await api.getStorageList(); setStorageList(storageList); }; const handleMaxUploadSizeChanged = async (event: React.FocusEvent) => { let num = parseInt(event.target.value); if (Number.isNaN(num)) { num = 0; } const update: WorkspaceStorageSetting = { ...workspaceStorageSetting, uploadSizeLimitMb: num, }; setWorkspaceStorageSetting(update); workspaceSettingStore.setWorkspaceSetting({ name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.WORKSPACE_SETTING_STORAGE}`, storageSetting: update, }); }; const handleStorageTypeChanged = async (storageType: WorkspaceStorageSetting_StorageType) => { const update: WorkspaceStorageSetting = { ...workspaceStorageSetting, storageType: storageType, }; setWorkspaceStorageSetting(update); await workspaceSettingStore.setWorkspaceSetting({ name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.WORKSPACE_SETTING_STORAGE}`, storageSetting: update, }); }; const handleActivedExternalStorageIdChanged = async (activedExternalStorageId: number) => { const update: WorkspaceStorageSetting = { ...workspaceStorageSetting, activedExternalStorageId: activedExternalStorageId, }; setWorkspaceStorageSetting(update); await workspaceSettingStore.setWorkspaceSetting({ name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.WORKSPACE_SETTING_STORAGE}`, storageSetting: update, }); }; const handleDeleteStorage = (storage: ObjectStorage) => { showCommonDialog({ title: t("setting.storage-section.delete-storage"), content: t("setting.storage-section.warning-text", { name: storage.name }), style: "danger", dialogName: "delete-storage-dialog", onConfirm: async () => { try { await api.deleteStorage(storage.id); } catch (error: any) { console.error(error); toast.error(error.response.data.message); } await fetchStorageList(); }, }); }; return (
{t("setting.storage-section.current-storage")}
{ handleStorageTypeChanged(event.target.value as WorkspaceStorageSetting_StorageType); }} >
showUpdateLocalStorageDialog()}>
{ handleActivedExternalStorageIdChanged(Number(event.target.value)); }} > {storageList.map((storage) => ( ))}
{t("setting.system-section.max-upload-size")}
{t("setting.storage-section.storage-services")}
{storageList.map((storage) => (

{storage.name}

showCreateStorageServiceDialog(storage, fetchStorageList)}>{t("common.edit")} handleDeleteStorage(storage)}>{t("common.delete")}
))} {storageList.length === 0 && (

No storage service found.

)}

{t("common.learn-more")}:

Docs - Local storage Choosing a Storage for Your Resource: Database, S3 or Local Storage?
); }; export default StorageSection;