import { Button, IconButton, Input, Checkbox, Typography } from "@mui/joy"; import React, { useEffect, useState } from "react"; import { toast } from "react-hot-toast"; import { storageServiceClient } from "@/grpcweb"; import { S3Config, Storage, Storage_Type } from "@/types/proto/api/v1/storage_service"; import { useTranslate } from "@/utils/i18n"; import { generateDialog } from "./Dialog"; import Icon from "./Icon"; import LearnMore from "./LearnMore"; import RequiredBadge from "./RequiredBadge"; interface Props extends DialogProps { storage?: Storage; confirmCallback?: () => void; } const CreateStorageServiceDialog: React.FC = (props: Props) => { const t = useTranslate(); const { destroy, storage, confirmCallback } = props; const [basicInfo, setBasicInfo] = useState({ title: "", }); const [type] = useState(Storage_Type.S3); const [s3Config, setS3Config] = useState({ endPoint: "", region: "", accessKey: "", secretKey: "", path: "", bucket: "", urlPrefix: "", urlSuffix: "", preSign: false, }); const isCreating = storage === undefined; useEffect(() => { if (storage) { setBasicInfo({ title: storage.title, }); if (storage.type === "S3") { setS3Config(S3Config.fromPartial(storage.config?.s3Config || {})); } } }, []); const handleCloseBtnClick = () => { destroy(); }; const allowConfirmAction = () => { if (basicInfo.title === "") { return false; } if (type === "S3") { if ( s3Config.endPoint === "" || s3Config.region === "" || s3Config.accessKey === "" || s3Config.secretKey === "" || s3Config.bucket === "" ) { return false; } } return true; }; const handleConfirmBtnClick = async () => { try { if (isCreating) { await storageServiceClient.createStorage({ storage: Storage.fromPartial({ title: basicInfo.title, type: type, config: { s3Config: s3Config, }, }), }); } else { await storageServiceClient.updateStorage({ storage: Storage.fromPartial({ id: storage?.id, title: basicInfo.title, type: type, config: { s3Config: s3Config, }, }), updateMask: ["title", "config"], }); } } catch (error: any) { console.error(error); toast.error(error.response.data.message); } if (confirmCallback) { confirmCallback(); } destroy(); }; const setPartialS3Config = (state: Partial) => { setS3Config({ ...s3Config, ...state, }); }; return ( <>
{t(isCreating ? "setting.storage-section.create-storage" : "setting.storage-section.update-storage")}
{t("common.name")} setBasicInfo({ ...basicInfo, title: e.target.value, }) } fullWidth /> {t("setting.storage-section.endpoint")} setPartialS3Config({ endPoint: e.target.value })} fullWidth /> {t("setting.storage-section.region")} setPartialS3Config({ region: e.target.value })} fullWidth /> {t("setting.storage-section.accesskey")} setPartialS3Config({ accessKey: e.target.value })} fullWidth /> {t("setting.storage-section.secretkey")} setPartialS3Config({ secretKey: e.target.value })} fullWidth /> {t("setting.storage-section.bucket")} setPartialS3Config({ bucket: e.target.value })} fullWidth />
{t("setting.storage-section.path")}
setPartialS3Config({ path: e.target.value })} fullWidth /> {t("setting.storage-section.url-prefix")} setPartialS3Config({ urlPrefix: e.target.value })} fullWidth /> {t("setting.storage-section.url-suffix")} setPartialS3Config({ urlSuffix: e.target.value })} fullWidth /> setPartialS3Config({ preSign: e.target.checked })} />
); }; function showCreateStorageServiceDialog(storage?: Storage, confirmCallback?: () => void) { generateDialog( { className: "create-storage-service-dialog", dialogName: "create-storage-service-dialog", }, CreateStorageServiceDialog, { storage, confirmCallback }, ); } export default showCreateStorageServiceDialog;