diff --git a/frontend/src/components/common/DataTable.vue b/frontend/src/components/common/DataTable.vue index 8abeee0c..9c250bc2 100644 --- a/frontend/src/components/common/DataTable.vue +++ b/frontend/src/components/common/DataTable.vue @@ -211,6 +211,7 @@ const checkActionsColumnWidth = () => { // 监听尺寸变化 let resizeObserver: ResizeObserver | null = null +let resizeHandler: (() => void) | null = null onMounted(() => { checkScrollable() @@ -223,17 +224,20 @@ onMounted(() => { resizeObserver.observe(tableWrapperRef.value) } else { // 降级方案:不支持 ResizeObserver 时使用 window resize - const handleResize = () => { + resizeHandler = () => { checkScrollable() checkActionsColumnWidth() } - window.addEventListener('resize', handleResize) + window.addEventListener('resize', resizeHandler) } }) onUnmounted(() => { resizeObserver?.disconnect() - window.removeEventListener('resize', checkScrollable) + if (resizeHandler) { + window.removeEventListener('resize', resizeHandler) + resizeHandler = null + } }) interface Props { diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts index 3eb2fef3..285bb199 100644 --- a/frontend/src/i18n/locales/en.ts +++ b/frontend/src/i18n/locales/en.ts @@ -410,7 +410,8 @@ export default { subscriptionDays: '{days} days', days: ' days', codeRedeemSuccess: 'Code redeemed successfully!', - failedToRedeem: 'Failed to redeem code. Please check the code and try again.' + failedToRedeem: 'Failed to redeem code. Please check the code and try again.', + subscriptionRefreshFailed: 'Redeemed successfully, but failed to refresh subscription status.' }, // Profile diff --git a/frontend/src/i18n/locales/zh.ts b/frontend/src/i18n/locales/zh.ts index ca4ea7ac..1231ce54 100644 --- a/frontend/src/i18n/locales/zh.ts +++ b/frontend/src/i18n/locales/zh.ts @@ -406,7 +406,8 @@ export default { subscriptionDays: '{days} 天', days: '天', codeRedeemSuccess: '兑换成功!', - failedToRedeem: '兑换失败,请检查兑换码后重试。' + failedToRedeem: '兑换失败,请检查兑换码后重试。', + subscriptionRefreshFailed: '兑换成功,但订阅状态刷新失败。' }, // Profile diff --git a/frontend/src/stores/subscriptions.ts b/frontend/src/stores/subscriptions.ts index 2bda1e1a..58965914 100644 --- a/frontend/src/stores/subscriptions.ts +++ b/frontend/src/stores/subscriptions.ts @@ -48,7 +48,7 @@ export const useSubscriptionStore = defineStore('subscriptions', () => { } // Return in-flight request if exists (deduplication) - if (activePromise) { + if (activePromise && !force) { return activePromise } @@ -56,7 +56,7 @@ export const useSubscriptionStore = defineStore('subscriptions', () => { // Start new request loading.value = true - activePromise = subscriptionsAPI + const requestPromise = subscriptionsAPI .getActiveSubscriptions() .then((data) => { if (currentGeneration === requestGeneration) { @@ -71,10 +71,14 @@ export const useSubscriptionStore = defineStore('subscriptions', () => { throw error }) .finally(() => { - loading.value = false - activePromise = null + if (activePromise === requestPromise) { + loading.value = false + activePromise = null + } }) + activePromise = requestPromise + return activePromise } @@ -106,6 +110,7 @@ export const useSubscriptionStore = defineStore('subscriptions', () => { */ function clear() { requestGeneration++ + activePromise = null activeSubscriptions.value = [] loaded.value = false lastFetchedAt.value = null diff --git a/frontend/src/views/user/DashboardView.vue b/frontend/src/views/user/DashboardView.vue index 1288ac48..d660e1a0 100644 --- a/frontend/src/views/user/DashboardView.vue +++ b/frontend/src/views/user/DashboardView.vue @@ -336,6 +336,7 @@