zhouhongshuo ca9430f82c 初始化
2024-08-25 23:46:05 +08:00

123 lines
3.3 KiB
Vue

<script lang="ts" setup>
import AppDownloadAlert from "@/components/common/AppDownloadAlert.vue";
import type { Plugin } from "@halo-dev/api-client";
import { consoleApiClient } from "@halo-dev/api-client";
import { Dialog, Toast } from "@halo-dev/components";
import { useQueryClient } from "@tanstack/vue-query";
import type { ErrorResponse, SuccessResponse, UppyFile } from "@uppy/core";
import { computed, inject, ref, type Ref } from "vue";
import { useI18n } from "vue-i18n";
import { PLUGIN_ALREADY_EXISTS_TYPE } from "../../constants";
import type { PluginInstallationErrorResponse } from "../../types";
const emit = defineEmits<{
(event: "close-modal"): void;
}>();
const { t } = useI18n();
const queryClient = useQueryClient();
const pluginToUpgrade = inject<Ref<Plugin | undefined>>(
"pluginToUpgrade",
ref()
);
const endpoint = computed(() => {
if (pluginToUpgrade.value) {
return `/apis/api.console.halo.run/v1alpha1/plugins/${pluginToUpgrade.value.metadata.name}/upgrade`;
}
return "/apis/api.console.halo.run/v1alpha1/plugins/install";
});
const onUploaded = async (response: SuccessResponse) => {
if (pluginToUpgrade.value) {
Toast.success(t("core.common.toast.upgrade_success"));
window.location.reload();
return;
}
emit("close-modal");
queryClient.invalidateQueries({ queryKey: ["plugins"] });
handleShowActiveModalAfterInstall(response.body as Plugin);
};
const onError = (file: UppyFile, response: ErrorResponse) => {
const body = response.body as PluginInstallationErrorResponse;
if (body.type === PLUGIN_ALREADY_EXISTS_TYPE) {
handleCatchExistsException(body, file.data as File);
}
};
const handleShowActiveModalAfterInstall = (plugin: Plugin) => {
Dialog.success({
title: t("core.plugin.upload_modal.operations.active_after_install.title"),
description: t(
"core.plugin.upload_modal.operations.active_after_install.description"
),
confirmText: t("core.common.buttons.confirm"),
cancelText: t("core.common.buttons.cancel"),
onConfirm: async () => {
try {
await consoleApiClient.plugin.plugin.changePluginRunningState({
name: plugin.metadata.name,
pluginRunningStateRequest: {
enable: true,
},
});
window.location.reload();
} catch (e) {
console.error(e);
}
},
});
};
const handleCatchExistsException = async (
error: PluginInstallationErrorResponse,
file?: File
) => {
Dialog.info({
title: t(
"core.plugin.upload_modal.operations.existed_during_installation.title"
),
description: t(
"core.plugin.upload_modal.operations.existed_during_installation.description"
),
confirmText: t("core.common.buttons.confirm"),
cancelText: t("core.common.buttons.cancel"),
onConfirm: async () => {
await consoleApiClient.plugin.plugin.upgradePlugin({
name: error.pluginName,
file: file,
});
Toast.success(t("core.common.toast.upgrade_success"));
window.location.reload();
},
});
};
</script>
<template>
<div class="mb-3">
<AppDownloadAlert />
</div>
<UppyUpload
:restrictions="{
maxNumberOfFiles: 1,
allowedFileTypes: ['.jar'],
}"
:endpoint="endpoint"
width="100%"
auto-proceed
@uploaded="onUploaded"
@error="onError"
/>
</template>