import Stack from "@mui/material/Stack"; import TextField from "@mui/material/TextField"; import { useCallback, useEffect, useState } from "react"; import { useI18n } from "../../hooks/I18n"; import Typography from "@mui/material/Typography"; import Accordion from "@mui/material/Accordion"; import AccordionSummary from "@mui/material/AccordionSummary"; import AccordionDetails from "@mui/material/AccordionDetails"; import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; import Alert from "@mui/material/Alert"; import Box from "@mui/material/Box"; import FormControlLabel from "@mui/material/FormControlLabel"; import Switch from "@mui/material/Switch"; import { useSetting } from "../../hooks/Setting"; import CircularProgress from "@mui/material/CircularProgress"; import { syncWebfix, loadOrFetchWebfix, FIXER_ALL } from "../../libs/webfix"; import Button from "@mui/material/Button"; import SyncIcon from "@mui/icons-material/Sync"; import { useAlert } from "../../hooks/Alert"; import HelpButton from "./HelpButton"; import { URL_KISS_RULES_NEW_ISSUE } from "../../config"; import MenuItem from "@mui/material/MenuItem"; import { useWebfixRules } from "../../hooks/WebfixRules"; function WebfixFields({ rule, webfix, setShow }) { const editMode = !!rule; const initFormValues = rule || { pattern: "", selector: "", rootSelector: "", fixer: FIXER_ALL[0], }; const i18n = useI18n(); const [disabled, setDisabled] = useState(editMode); const [errors, setErrors] = useState({}); const [formValues, setFormValues] = useState(initFormValues); const { pattern, selector, rootSelector, fixer } = formValues; const hasSamePattern = (str) => { for (const item of webfix.list || []) { if (item.pattern === str && rule?.pattern !== str) { return true; } } return false; }; const handleFocus = (e) => { e.preventDefault(); const { name } = e.target; setErrors((pre) => ({ ...pre, [name]: "" })); }; const handleChange = (e) => { e.preventDefault(); const { name, value } = e.target; setFormValues((pre) => ({ ...pre, [name]: value })); }; const handleCancel = (e) => { e.preventDefault(); if (editMode) { setDisabled(true); } else { setShow(false); } setFormValues(initFormValues); }; const handleSubmit = (e) => { e.preventDefault(); const errors = {}; if (!pattern.trim()) { errors.pattern = i18n("error_cant_be_blank"); } if (hasSamePattern(pattern)) { errors.pattern = i18n("error_duplicate_values"); } if (!selector.trim()) { errors.selector = i18n("error_cant_be_blank"); } if (Object.keys(errors).length > 0) { setErrors(errors); return; } if (editMode) { // 编辑 setDisabled(true); webfix.put(rule.pattern, formValues); } else { // 添加 webfix.add(formValues); setShow(false); setFormValues(initFormValues); } }; return (
); } function WebfixAccordion({ rule, webfix }) { const [expanded, setExpanded] = useState(false); const handleChange = (e) => { setExpanded((pre) => !pre); }; return (