import { Button, Divider, Dropdown, Input, List, ListItem, Menu, MenuButton, MenuItem, Radio, RadioGroup, Select, Tooltip, Option, } from "@mui/joy"; import { isEqual } from "lodash-es"; import { useEffect, useMemo, useState } from "react"; import { toast } from "react-hot-toast"; import { Link } from "react-router-dom"; import { storageServiceClient } from "@/grpcweb"; import { WorkspaceSettingPrefix, useWorkspaceSettingStore } from "@/store/v1"; import { Storage } from "@/types/proto/api/v2/storage_service"; 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"; 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 || {}, ), ); const allowSaveStorageSetting = useMemo(() => { if (workspaceStorageSetting.uploadSizeLimitMb <= 0) { return false; } const origin = WorkspaceStorageSetting.fromPartial( workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.WORKSPACE_SETTING_STORAGE)?.storageSetting || {}, ); if (workspaceStorageSetting.storageType === WorkspaceStorageSetting_StorageType.STORAGE_TYPE_LOCAL) { if (workspaceStorageSetting.localStoragePathTemplate.length === 0) { return false; } } else if (workspaceStorageSetting.storageType === WorkspaceStorageSetting_StorageType.STORAGE_TYPE_EXTERNAL) { if (!workspaceStorageSetting.activedExternalStorageId || workspaceStorageSetting.activedExternalStorageId === 0) { return false; } } return !isEqual(origin, workspaceStorageSetting); }, [workspaceStorageSetting, workspaceSettingStore.getState()]); useEffect(() => { fetchStorageList(); }, []); const fetchStorageList = async () => { const { storages } = await storageServiceClient.listStorages({}); setStorageList(storages); }; 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); }; const handleLocalStoragePathTemplateChanged = async (event: React.FocusEvent) => { const update: WorkspaceStorageSetting = { ...workspaceStorageSetting, localStoragePathTemplate: event.target.value, }; setWorkspaceStorageSetting(update); }; const handleStorageTypeChanged = async (storageType: WorkspaceStorageSetting_StorageType) => { const update: WorkspaceStorageSetting = { ...workspaceStorageSetting, storageType: storageType, }; setWorkspaceStorageSetting(update); }; const handleActivedExternalStorageIdChanged = async (activedExternalStorageId: number) => { const update: WorkspaceStorageSetting = { ...workspaceStorageSetting, activedExternalStorageId: activedExternalStorageId, }; setWorkspaceStorageSetting(update); }; const saveWorkspaceStorageSetting = async () => { await workspaceSettingStore.setWorkspaceSetting({ name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.WORKSPACE_SETTING_STORAGE}`, storageSetting: workspaceStorageSetting, }); toast.success("Updated"); }; const handleDeleteStorage = (storage: Storage) => { showCommonDialog({ title: t("setting.storage-section.delete-storage"), content: t("setting.storage-section.warning-text", { name: storage.title }), style: "danger", dialogName: "delete-storage-dialog", onConfirm: async () => { try { await storageServiceClient.deleteStorage({ id: 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); }} >
{t("setting.system-section.max-upload-size")}
{workspaceStorageSetting.storageType === WorkspaceStorageSetting_StorageType.STORAGE_TYPE_LOCAL && (
Local file path template
)} {workspaceStorageSetting.storageType === WorkspaceStorageSetting_StorageType.STORAGE_TYPE_EXTERNAL && (
Actived storage
)}
{t("setting.storage-section.storage-services")}
{storageList.map((storage) => (

{storage.title}

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;