feat: plugin deleting

This commit is contained in:
Junyan Qin
2025-05-09 19:19:01 +08:00
parent da1f7050a6
commit 5371431be6

View File

@@ -13,6 +13,12 @@ import {
DialogFooter,
} from "@/components/ui/dialog";
enum PluginRemoveStatus {
WAIT_INPUT = 'WAIT_INPUT',
REMOVING = 'REMOVING',
ERROR = 'ERROR',
}
export default function PluginForm({
pluginAuthor,
pluginName,
@@ -28,6 +34,10 @@ export default function PluginForm({
const [pluginConfig, setPluginConfig] = useState<ApiRespPluginConfig>();
const [isSaving, setIsLoading] = useState(false);
const [showDeleteConfirmModal, setShowDeleteConfirmModal] = useState(false);
const [pluginRemoveStatus, setPluginRemoveStatus] = useState<PluginRemoveStatus>(PluginRemoveStatus.WAIT_INPUT);
const [pluginRemoveError, setPluginRemoveError] = useState<string | null>(null);
useEffect(() => {
// 获取插件信息
httpClient.getPlugin(pluginAuthor, pluginName).then((res) => {
@@ -55,8 +65,92 @@ export default function PluginForm({
return <div>...</div>;
}
function deletePlugin() {
setPluginRemoveStatus(PluginRemoveStatus.REMOVING);
httpClient.removePlugin(pluginAuthor, pluginName).then((res) => {
const taskId = res.task_id;
const interval = setInterval(() => {
httpClient.getAsyncTask(taskId).then((res) => {
if (res.runtime.done) {
clearInterval(interval);
if (res.runtime.exception) {
setPluginRemoveError(res.runtime.exception);
setPluginRemoveStatus(PluginRemoveStatus.ERROR);
} else {
setPluginRemoveStatus(PluginRemoveStatus.WAIT_INPUT);
setShowDeleteConfirmModal(false);
onFormSubmit();
}
}
});
}, 1000);
}).catch((error) => {
setPluginRemoveError(error.message);
setPluginRemoveStatus(PluginRemoveStatus.ERROR);
})
}
return (
<div>
<Dialog open={showDeleteConfirmModal} onOpenChange={setShowDeleteConfirmModal}>
<DialogContent>
<DialogHeader>
<DialogTitle></DialogTitle>
</DialogHeader>
<DialogDescription>
{pluginRemoveStatus === PluginRemoveStatus.WAIT_INPUT && (
<div>
{pluginAuthor}/{pluginName}
</div>
)}
{pluginRemoveStatus === PluginRemoveStatus.REMOVING && (
<div>...</div>
)}
{pluginRemoveStatus === PluginRemoveStatus.ERROR && (
<div>
<div className="text-red-500">{pluginRemoveError}</div>
</div>
)}
</DialogDescription>
<DialogFooter>
{pluginRemoveStatus === PluginRemoveStatus.WAIT_INPUT && (
<Button variant="outline" onClick={() => {
setShowDeleteConfirmModal(false);
setPluginRemoveStatus(PluginRemoveStatus.WAIT_INPUT);
}}>
</Button>
)}
{pluginRemoveStatus === PluginRemoveStatus.WAIT_INPUT && (
<Button variant="destructive" onClick={() => {
deletePlugin();
}}>
</Button>
)}
{pluginRemoveStatus === PluginRemoveStatus.REMOVING && (
<Button variant="destructive" disabled>
...
</Button>
)}
{pluginRemoveStatus === PluginRemoveStatus.ERROR && (
<Button variant="default" onClick={() => {
setShowDeleteConfirmModal(false);
// setPluginRemoveStatus(PluginRemoveStatus.WAIT_INPUT);
}}>
</Button>
)}
</DialogFooter>
</DialogContent>
</Dialog>
<div className="space-y-2">
<div className="text-lg font-medium">{pluginInfo.name}</div>
<div className="text-sm text-gray-500 pb-2">
@@ -66,13 +160,13 @@ export default function PluginForm({
<DynamicFormComponent
itemConfigList={pluginInfo.config_schema}
initialValues={pluginConfig.config}
onSubmit={(values) => {
let config = pluginConfig.config;
config = {
...config,
...values,
};
setPluginConfig({
onSubmit={(values) => {
let config = pluginConfig.config;
config = {
...config,
...values,
};
setPluginConfig({
config: config,
});
}}
@@ -87,6 +181,18 @@ export default function PluginForm({
<div className="sticky bottom-0 left-0 right-0 bg-background border-t p-4 mt-4">
<div className="flex justify-end gap-2">
<Button
variant="destructive"
onClick={() => {
setShowDeleteConfirmModal(true);
setPluginRemoveStatus(PluginRemoveStatus.WAIT_INPUT);
}}
disabled={pluginRemoveStatus === PluginRemoveStatus.REMOVING}
>
{pluginRemoveStatus === PluginRemoveStatus.REMOVING ? '删除中...' : '删除插件'}
</Button>
<Button
type="submit"
onClick={() => handleSubmit(pluginConfig.config)}