import Button from "@material-ui/core/Button"; import Collapse from "@material-ui/core/Collapse"; import FormControl from "@material-ui/core/FormControl"; import FormControlLabel from "@material-ui/core/FormControlLabel"; import Input from "@material-ui/core/Input"; import InputLabel from "@material-ui/core/InputLabel"; import Link from "@material-ui/core/Link"; import MenuItem from "@material-ui/core/MenuItem"; import Radio from "@material-ui/core/Radio"; import RadioGroup from "@material-ui/core/RadioGroup"; import Select from "@material-ui/core/Select"; import Step from "@material-ui/core/Step"; import StepLabel from "@material-ui/core/StepLabel"; import Stepper from "@material-ui/core/Stepper"; import { lighten, makeStyles } from "@material-ui/core/styles"; import Typography from "@material-ui/core/Typography"; import React, { useCallback, useState } from "react"; import { useDispatch } from "react-redux"; import { useHistory } from "react-router"; import { toggleSnackbar } from "../../../../actions"; import API from "../../../../middleware/Api"; import { getNumber } from "../../../../utils"; import DomainInput from "../../Common/DomainInput"; import SizeInput from "../../Common/SizeInput"; import MagicVar from "../../Dialogs/MagicVar"; const useStyles = makeStyles(theme => ({ stepContent: { padding: "16px 32px 16px 32px" }, form: { maxWidth: 400, marginTop: 20 }, formContainer: { [theme.breakpoints.up("md")]: { padding: "0px 24px 0 24px" } }, subStepContainer: { display: "flex", marginBottom: 20, padding: 10, transition: theme.transitions.create("background-color", { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen }), "&:focus-within": { backgroundColor: theme.palette.background.default } }, stepNumber: { width: 20, height: 20, backgroundColor: lighten(theme.palette.secondary.light, 0.2), color: theme.palette.secondary.contrastText, textAlign: "center", borderRadius: " 50%" }, stepNumberContainer: { marginRight: 10 }, stepFooter: { marginTop: 32 }, button: { marginRight: theme.spacing(1) }, viewButtonLabel: { textTransform: "none" }, "@global": { code: { color: "rgba(0, 0, 0, 0.87)", display: "inline-block", padding: "2px 6px", fontFamily: ' Consolas, "Liberation Mono", Menlo, Courier, monospace', borderRadius: "2px", backgroundColor: "rgba(255,229,100,0.1)" } } })); const steps = [ { title: "存储空间", optional: false }, { title: "上传路径", optional: false }, { title: "直链设置", optional: false }, { title: "上传限制", optional: false }, { title: "跨域策略", optional: true }, { title: "云函数回调", optional: true }, { title: "完成", optional: false } ]; export default function COSGuide(props) { const classes = useStyles(); const history = useHistory(); const [activeStep, setActiveStep] = useState(0); const [loading, setLoading] = useState(false); const [skipped, setSkipped] = React.useState(new Set()); const [magicVar, setMagicVar] = useState(""); const [useCDN, setUseCDN] = useState("false"); const [policy, setPolicy] = useState( props.policy ? props.policy : { Type: "cos", Name: "", SecretKey: "", AccessKey: "", BaseURL: "", Server: "", IsPrivate: "true", DirNameRule: "uploads/{year}/{month}/{day}", AutoRename: "true", FileNameRule: "{randomkey8}_{originname}", IsOriginLinkEnable: "false", MaxSize: "0", OptionsSerialized: { file_type: "" } } ); const [policyID, setPolicyID] = useState( props.policy ? props.policy.ID : 0 ); const [region, setRegion] = useState("ap-chengdu"); const handleChange = name => event => { setPolicy({ ...policy, [name]: event.target.value }); }; const handleOptionChange = name => event => { setPolicy({ ...policy, OptionsSerialized: { ...policy.OptionsSerialized, [name]: event.target.value } }); }; const isStepSkipped = step => { return skipped.has(step); }; const dispatch = useDispatch(); const ToggleSnackbar = useCallback( (vertical, horizontal, msg, color) => dispatch(toggleSnackbar(vertical, horizontal, msg, color)), [dispatch] ); const submitPolicy = e => { e.preventDefault(); setLoading(true); const policyCopy = { ...policy }; policyCopy.OptionsSerialized = { ...policyCopy.OptionsSerialized }; if (useCDN === "false") { policyCopy.BaseURL = policy.Server; } // 类型转换 policyCopy.AutoRename = policyCopy.AutoRename === "true"; policyCopy.IsOriginLinkEnable = policyCopy.IsOriginLinkEnable === "true"; policyCopy.IsPrivate = policyCopy.IsPrivate === "true"; policyCopy.MaxSize = parseInt(policyCopy.MaxSize); policyCopy.OptionsSerialized.file_type = policyCopy.OptionsSerialized.file_type.split( "," ); if ( policyCopy.OptionsSerialized.file_type.length === 1 && policyCopy.OptionsSerialized.file_type[0] === "" ) { policyCopy.OptionsSerialized.file_type = []; } API.post("/admin/policy", { policy: policyCopy }) .then(response => { ToggleSnackbar( "top", "right", "存储策略已" + (props.policy ? "保存" : "添加"), "success" ); setActiveStep(4); setPolicyID(response.data); }) .catch(error => { ToggleSnackbar("top", "right", error.message, "error"); }) .then(() => { setLoading(false); }); setLoading(false); }; const createCORS = () => { setLoading(true); API.post("/admin/policy/cors", { id: policyID }) .then(() => { ToggleSnackbar("top", "right", "跨域策略已添加", "success"); setActiveStep(5); }) .catch(error => { ToggleSnackbar("top", "right", error.message, "error"); }) .then(() => { setLoading(false); }); }; const creatCallback = () => { setLoading(true); API.post("/admin/policy/scf", { id: policyID, region: region }) .then(() => { ToggleSnackbar("top", "right", "回调云函数已添加", "success"); setActiveStep(6); }) .catch(error => { ToggleSnackbar("top", "right", error.message, "error"); }) .then(() => { setLoading(false); }); }; return (