From 9ec7613ee5ce6a4da8cb3c2333b5a34907dbbf02 Mon Sep 17 00:00:00 2001 From: OpenClaw Date: Fri, 13 Mar 2026 05:58:06 +0000 Subject: [PATCH] feat: Add subscription UI components - Add Subscription interface to auth store - Add subscription computed properties (isTrialActive, isExpired, etc.) - Add SubscriptionBanner component (trial warning, expired notice) - Add SubscriptionExpiredView (blocked access screen) - Update AppLayout to show banner - Update router to redirect expired subscriptions --- src/components/SubscriptionBanner.vue | 58 ++++++++++++++++++++++++ src/components/layout/AppLayout.vue | 4 ++ src/router/index.ts | 12 ++++- src/stores/auth.ts | 28 ++++++++++++ src/views/SubscriptionExpiredView.vue | 63 +++++++++++++++++++++++++++ 5 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 src/components/SubscriptionBanner.vue create mode 100644 src/views/SubscriptionExpiredView.vue diff --git a/src/components/SubscriptionBanner.vue b/src/components/SubscriptionBanner.vue new file mode 100644 index 0000000..31454f3 --- /dev/null +++ b/src/components/SubscriptionBanner.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/components/layout/AppLayout.vue b/src/components/layout/AppLayout.vue index c01bbea..499614c 100644 --- a/src/components/layout/AppLayout.vue +++ b/src/components/layout/AppLayout.vue @@ -4,6 +4,7 @@ import { useRouter } from 'vue-router' import { useAuthStore } from '@/stores/auth' import AppSidebar from './AppSidebar.vue' import AppHeader from './AppHeader.vue' +import SubscriptionBanner from '@/components/SubscriptionBanner.vue' const authStore = useAuthStore() const router = useRouter() @@ -17,6 +18,9 @@ async function handleLogout() {