From 7c5933bc228823466f5e328961d57bfc4eaf38b1 Mon Sep 17 00:00:00 2001 From: Lan Date: Mon, 7 Oct 2024 15:20:31 +0800 Subject: [PATCH] 1 --- src/App.vue | 28 +---- src/components/AlertComponent.vue | 167 ++++++++++---------------- src/stores/alertStore.ts | 45 +++++++ src/views/RetrievewFileView.vue | 33 ++---- src/views/SendFileView.vue | 191 +++++++++++++++++------------- 5 files changed, 226 insertions(+), 238 deletions(-) create mode 100644 src/stores/alertStore.ts diff --git a/src/App.vue b/src/App.vue index 9349a45..3f6cc0b 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,27 +2,15 @@ import { ref, watchEffect, provide, onMounted } from 'vue' import { RouterView } from 'vue-router' import ThemeToggle from './components/ThemeToggle.vue' -import AlertComponent from './components/AlertComponent.vue' import { useRouter } from 'vue-router' import api from './utils/api' const isDarkMode = ref(false) const isLoading = ref(false) const router = useRouter() +import AlertComponent from '@/components/AlertComponent.vue' +import { useAlertStore } from '@/stores/alertStore' -const showAlert = ref(false) -const alertMessage = ref('') -const alertType = ref('success') -const closeAlert = () => { - showAlert.value = false -} -const showAlertMessage = ( - message: string, - type: 'success' | 'error' | 'warning' | 'info' = 'success' -) => { - alertMessage.value = message - alertType.value = type - showAlert.value = true -} +const alertStore = useAlertStore() // 检查系统颜色模式 const checkSystemColorScheme = () => { return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches @@ -59,7 +47,7 @@ onMounted(() => { localStorage.getItem('notify') !== res.detail.notify_title + res.detail.notify_content ) { localStorage.setItem('notify', res.detail.notify_title + res.detail.notify_content) - showAlertMessage(res.detail.notify_title + ': ' + res.detail.notify_content, 'success') + alertStore.showAlert(res.detail.notify_title + ': ' + res.detail.notify_content, 'success') } } }) @@ -96,12 +84,8 @@ provide('isLoading', isLoading) - + + diff --git a/src/components/AlertComponent.vue b/src/components/AlertComponent.vue index 0361c06..cdc0a1b 100644 --- a/src/components/AlertComponent.vue +++ b/src/components/AlertComponent.vue @@ -1,137 +1,94 @@ diff --git a/src/stores/alertStore.ts b/src/stores/alertStore.ts new file mode 100644 index 0000000..a25d102 --- /dev/null +++ b/src/stores/alertStore.ts @@ -0,0 +1,45 @@ +import { defineStore } from 'pinia' + +interface Alert { + id: number + message: string + type: 'success' | 'error' | 'warning' | 'info' + progress: number + duration: number + startTime: number +} + +export const useAlertStore = defineStore('alert', { + state: () => ({ + alerts: [] as Alert[] + }), + actions: { + showAlert( + message: string, + type: 'success' | 'error' | 'warning' | 'info' = 'info', + duration = 5000 + ) { + const id = Date.now() + const startTime = Date.now() + this.alerts.push({ id, message, type, progress: 100, duration, startTime }) + setTimeout(() => this.removeAlert(id), duration) + }, + removeAlert(id: number) { + const index = this.alerts.findIndex((alert) => alert.id === id) + if (index > -1) { + this.alerts.splice(index, 1) + } + }, + updateAlertProgress(id: number) { + const alert = this.alerts.find((a) => a.id === id) + if (alert) { + const elapsedTime = Date.now() - alert.startTime + const progress = 100 - (elapsedTime / alert.duration) * 100 + alert.progress = Math.max(0, progress) + if (alert.progress <= 0) { + this.removeAlert(id) + } + } + } + } +}) diff --git a/src/views/RetrievewFileView.vue b/src/views/RetrievewFileView.vue index b59f9f3..664639f 100644 --- a/src/views/RetrievewFileView.vue +++ b/src/views/RetrievewFileView.vue @@ -330,13 +330,6 @@ - - @@ -358,12 +351,13 @@ import { import { useRouter, useRoute } from 'vue-router' import QRCode from 'qrcode.vue' import { useFileDataStore } from '@/stores/fileData' -import AlertComponent from '@/components/AlertComponent.vue' import { storeToRefs } from 'pinia' import api from '@/utils/api' import { saveAs } from 'file-saver' import { marked } from 'marked' +import { useAlertStore } from '@/stores/alertStore' +const alertStore = useAlertStore() const baseUrl = import.meta.env.MODE === 'production' ? import.meta.env.VITE_API_BASE_URL_PROD @@ -373,19 +367,6 @@ const router = useRouter() const isDarkMode = inject('isDarkMode') const fileStore = useFileDataStore() const { receiveData } = storeToRefs(fileStore) -const showAlert = ref(false) -const alertMessage = ref('') -const alertType = ref('success') - -const showAlertMessage = (message, type) => { - alertMessage.value = message - alertType.value = type - showAlert.value = true -} - -const closeAlert = () => { - showAlert.value = false -} const code = ref('') const inputStatus = ref({ readonly: false, @@ -414,7 +395,7 @@ watch(code, (newVal) => { const handleSubmit = async () => { if (code.value.length !== 5) { - showAlertMessage('请输入5位取件码', 'error') + alertStore.showAlert('请输入5位取件码', 'error') return } @@ -449,16 +430,16 @@ const handleSubmit = async () => { fileStore.addReceiveData(newFileData) } showDrawer.value = true - showAlertMessage('文件获取成功', 'success') + alertStore.showAlert('文件获取成功', 'success') } else { - showAlertMessage('无效的取件码', 'error') + alertStore.showAlert('无效的取件码', 'error') } } else { - showAlertMessage(res.message || '获取文件失败', 'error') + alertStore.showAlert(res.detail || '获取文件失败', 'error') } } catch (err) { console.error('取件失败:', err) - showAlertMessage('取件失败,请稍后重试', 'error') + alertStore.showAlert('取件失败,请稍后重试', 'error') } finally { inputStatus.value.readonly = false inputStatus.value.loading = false diff --git a/src/views/SendFileView.vue b/src/views/SendFileView.vue index d59ebd8..4c3c964 100644 --- a/src/views/SendFileView.vue +++ b/src/views/SendFileView.vue @@ -95,7 +95,7 @@
- +