🏗️ refactor config view to improve state management and enhance visibility handling in index.vue

This commit is contained in:
刘嘉伟 2025-02-26 16:19:24 +08:00
parent dfbd9c93bd
commit e6992f4e4c

View File

@ -1,5 +1,12 @@
<script lang="ts" setup> <script lang="ts" setup>
import { defineComponent, onMounted, onUnmounted, reactive, ref } from "vue"; import {
defineComponent,
onMounted,
onUnmounted,
reactive,
ref,
watch
} from "vue";
import { ElMessage, ElMessageBox, FormInstance, FormRules } from "element-plus"; import { ElMessage, ElMessageBox, FormInstance, FormRules } from "element-plus";
import Breadcrumb from "@/layout/compoenets/Breadcrumb.vue"; import Breadcrumb from "@/layout/compoenets/Breadcrumb.vue";
import { useDebounceFn } from "@vueuse/core"; import { useDebounceFn } from "@vueuse/core";
@ -80,11 +87,8 @@ const defaultFormData: OpenSourceFrpcDesktopServer = {
}, },
user: "" user: ""
}; };
const formData = ref<OpenSourceFrpcDesktopServer>(defaultFormData); const formData = ref<OpenSourceFrpcDesktopServer>(defaultFormData);
const loading = ref(1); const loading = ref(1);
const rules = reactive<FormRules>({ const rules = reactive<FormRules>({
frpcVersion: [{ required: true, message: "请选择版本", trigger: "blur" }], frpcVersion: [{ required: true, message: "请选择版本", trigger: "blur" }],
serverAddr: [ serverAddr: [
@ -180,23 +184,27 @@ const rules = reactive<FormRules>({
{ required: true, message: "web界面端口不能为空", trigger: "change" } { required: true, message: "web界面端口不能为空", trigger: "change" }
] ]
}); });
const versions = ref<Array<FrpcVersion>>([]);
const copyServerConfigBase64 = ref(); const copyServerConfigBase64 = ref();
const pasteServerConfigBase64 = ref(); const pasteServerConfigBase64 = ref();
const formRef = ref<FormInstance>(); const formRef = ref<FormInstance>();
const protocol = ref("frp://"); const protocol = ref("frp://");
const currSelectLocalFileType = ref(); const currSelectLocalFileType = ref();
const frpcDesktopStore = useFrpcDesktopStore();
const visibles = reactive({ watch(
() => frpcDesktopStore.downloadedVersions,
(newValue, oldValue) => {
checkAndResetVersion();
}
);
const visible = reactive({
copyServerConfig: false, copyServerConfig: false,
pasteServerConfig: false, pasteServerConfig: false,
exportConfig: false exportConfig: false
}); });
const exportConfigType = ref("toml"); // const exportConfigType = ref("toml");
const frpcDesktopStore = useFrpcDesktopStore();
const handleSubmit = useDebounceFn(() => { const handleSubmit = useDebounceFn(() => {
if (!formRef.value) return; if (!formRef.value) return;
@ -228,7 +236,9 @@ const checkAndResetVersion = () => {
const currentVersion = formData.value.frpcVersion; const currentVersion = formData.value.frpcVersion;
if ( if (
currentVersion && currentVersion &&
!versions.value.some(item => item.githubReleaseId === currentVersion) !frpcDesktopStore.downloadedVersions.some(
item => item.githubReleaseId === currentVersion
)
) { ) {
formData.value.frpcVersion = null; formData.value.frpcVersion = null;
} }
@ -255,10 +265,10 @@ onMounted(() => {
loading.value--; loading.value--;
}); });
on(ipcRouters.VERSION.getDownloadedVersions, data => { // on(ipcRouters.VERSION.getDownloadedVersions, data => {
versions.value = data; // // versions.value = data;
checkAndResetVersion(); // checkAndResetVersion();
}); // });
on(ipcRouters.SERVER.saveConfig, data => { on(ipcRouters.SERVER.saveConfig, data => {
ElMessage({ ElMessage({
@ -439,14 +449,14 @@ const handleCopyServerConfig2Base64 = useDebounceFn(() => {
shareConfig.transport.tls.trustedCaFile = ""; shareConfig.transport.tls.trustedCaFile = "";
const base64str = Base64.encode(JSON.stringify(shareConfig)); const base64str = Base64.encode(JSON.stringify(shareConfig));
copyServerConfigBase64.value = protocol.value + base64str; copyServerConfigBase64.value = protocol.value + base64str;
visibles.copyServerConfig = true; visible.copyServerConfig = true;
}, 300); }, 300);
/** /**
* 导入配置 * 导入配置
*/ */
const handlePasteServerConfig4Base64 = useDebounceFn(() => { const handlePasteServerConfig4Base64 = useDebounceFn(() => {
visibles.pasteServerConfig = true; visible.pasteServerConfig = true;
}, 300); }, 300);
const handlePasteServerConfigBase64 = useDebounceFn(() => { const handlePasteServerConfigBase64 = useDebounceFn(() => {
@ -491,11 +501,11 @@ const handlePasteServerConfigBase64 = useDebounceFn(() => {
handleSubmit(); handleSubmit();
pasteServerConfigBase64.value = ""; pasteServerConfigBase64.value = "";
visibles.pasteServerConfig = false; visible.pasteServerConfig = false;
}, 300); }, 300);
const handleShowExportDialog = () => { const handleShowExportDialog = () => {
visibles.exportConfig = true; visible.exportConfig = true;
}; };
const handleExportConfig = useDebounceFn(() => { const handleExportConfig = useDebounceFn(() => {
@ -527,11 +537,11 @@ const handleOpenDataFolder = useDebounceFn(() => {
onUnmounted(() => { onUnmounted(() => {
removeRouterListeners(ipcRouters.SERVER.saveConfig); removeRouterListeners(ipcRouters.SERVER.saveConfig);
removeRouterListeners(ipcRouters.VERSION.getDownloadedVersions); // removeRouterListeners(ipcRouters.VERSION.getDownloadedVersions);
removeRouterListeners(ipcRouters.SERVER.getServerConfig); removeRouterListeners(ipcRouters.SERVER.getServerConfig);
removeRouterListeners(ipcRouters.SERVER.saveConfig); removeRouterListeners(ipcRouters.SERVER.saveConfig);
removeRouterListeners(ipcRouters.SERVER.resetAllConfig); removeRouterListeners(ipcRouters.SERVER.resetAllConfig);
removeRouterListeners(ipcRouters.VERSION.getDownloadedVersions); // removeRouterListeners(ipcRouters.VERSION.getDownloadedVersions);
removeRouterListeners(ipcRouters.SERVER.exportConfig); removeRouterListeners(ipcRouters.SERVER.exportConfig);
removeRouterListeners(ipcRouters.SYSTEM.openAppData); removeRouterListeners(ipcRouters.SYSTEM.openAppData);
removeRouterListeners(ipcRouters.SERVER.importTomlConfig); removeRouterListeners(ipcRouters.SERVER.importTomlConfig);
@ -1484,7 +1494,7 @@ onUnmounted(() => {
</div> </div>
<!-- 链接导入服务器 --> <!-- 链接导入服务器 -->
<el-dialog <el-dialog
v-model="visibles.copyServerConfig" v-model="visible.copyServerConfig"
title="复制链接" title="复制链接"
width="500" width="500"
top="5%" top="5%"
@ -1504,7 +1514,7 @@ onUnmounted(() => {
</el-dialog> </el-dialog>
<!-- 链接导出服务器--> <!-- 链接导出服务器-->
<el-dialog <el-dialog
v-model="visibles.pasteServerConfig" v-model="visible.pasteServerConfig"
title="导入链接" title="导入链接"
width="500" width="500"
top="5%" top="5%"