From d420c2cec7fc3591a5afeb9815b4b598905effbd Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 21 Jan 2025 17:38:15 +0530 Subject: [PATCH] feat: new billing page --- .../dashboard/i18n/locale/en/settings.json | 15 +- .../dashboard/settings/billing/Index.vue | 181 ++++++++++++------ .../settings/billing/billing.routes.js | 4 +- .../billing/components/BillingCard.vue | 25 +++ .../billing/components/BillingHeader.vue | 26 +++ .../billing/components/BillingItem.vue | 4 +- .../billing/components/BillingMeter.vue | 45 +++++ .../billing/components/DetailItem.vue | 23 +++ .../enterprise/api/v1/accounts_controller.rb | 3 +- 9 files changed, 256 insertions(+), 70 deletions(-) create mode 100644 app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingCard.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingHeader.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingMeter.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/billing/components/DetailItem.vue diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json index e532f8e8f..d52edac81 100644 --- a/app/javascript/dashboard/i18n/locale/en/settings.json +++ b/app/javascript/dashboard/i18n/locale/en/settings.json @@ -265,7 +265,7 @@ "CAPTAIN": "Captain", "CAPTAIN_ASSISTANTS": "Assistants", "CAPTAIN_DOCUMENTS": "Documents", - "CAPTAIN_RESPONSES" : "FAQs", + "CAPTAIN_RESPONSES": "FAQs", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", @@ -327,15 +327,26 @@ }, "BILLING_SETTINGS": { "TITLE": "Billing", + "DESCRIPTION": "Manage your subscription here, upgrade your plan and get more for your team.", "CURRENT_PLAN": { "TITLE": "Current Plan", - "PLAN_NOTE": "You are currently subscribed to the **{plan}** plan with **{quantity}** licenses" + "PLAN_NOTE": "You are currently subscribed to the **{plan}** plan with **{quantity}** licenses", + "SEAT_COUNT": "Number of seats", + "RENEWS_ON": "Renews on" }, + "VIEW_PRICING": "View Pricing", "MANAGE_SUBSCRIPTION": { "TITLE": "Manage your subscription", "DESCRIPTION": "View your previous invoices, edit your billing details, or cancel your subscription.", "BUTTON_TXT": "Go to the billing portal" }, + "CAPTAIN": { + "TITLE": "Captain", + "DESCRIPTION": "Manage usage and credits for Captain AI.", + "BUTTON_TXT": "Buy more credits", + "DOCUMENTS": "Documents", + "RESPONSES": "Responses" + }, "CHAT_WITH_US": { "TITLE": "Need help?", "DESCRIPTION": "Do you face any issues in billing? We are here to help.", diff --git a/app/javascript/dashboard/routes/dashboard/settings/billing/Index.vue b/app/javascript/dashboard/routes/dashboard/settings/billing/Index.vue index ea85fd7d6..a86e1301e 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/billing/Index.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/billing/Index.vue @@ -2,12 +2,19 @@ import { computed, onMounted } from 'vue'; import { useMapGetter, useStore } from 'dashboard/composables/store.js'; import { useAccount } from 'dashboard/composables/useAccount'; -import { useMessageFormatter } from 'shared/composables/useMessageFormatter'; +import { useCamelCase } from 'dashboard/composables/useTransformKeys'; +import { format } from 'date-fns'; import BillingItem from './components/BillingItem.vue'; +import BillingMeter from './components/BillingMeter.vue'; +import BillingCard from './components/BillingCard.vue'; +import BillingHeader from './components/BillingHeader.vue'; +import DetailItem from './components/DetailItem.vue'; +import BaseSettingsHeader from '../components/BaseSettingsHeader.vue'; +import SettingsLayout from '../SettingsLayout.vue'; +import ButtonV4 from 'next/button/Button.vue'; const { currentAccount } = useAccount(); -const { formatMessage } = useMessageFormatter(); const uiFlags = useMapGetter('accounts/getUIFlags'); const store = useStore(); @@ -31,6 +38,33 @@ const subscribedQuantity = computed(() => { return customAttributes.value.subscribed_quantity; }); +const subscriptionRenewsOn = computed(() => { + if (!customAttributes.value.subscription_ends_on) return ''; + const endDate = new Date(customAttributes.value.subscription_ends_on); + // return date as 12 Jan, 2034 + return format(endDate, 'dd MMM, yyyy'); +}); + +const captainLimits = computed(() => { + return currentAccount.value?.limits?.captain; +}); + +const documentLimits = computed(() => { + if (captainLimits.value?.documents) { + return useCamelCase(captainLimits.value.documents); + } + + return null; +}); + +const responseLimits = computed(() => { + if (captainLimits.value?.responses) { + return useCamelCase(captainLimits.value.responses); + } + + return null; +}); + /** * Computed property indicating if user has a billing plan * @returns {boolean} @@ -42,6 +76,7 @@ const hasABillingPlan = computed(() => { const fetchAccountDetails = async () => { if (!hasABillingPlan.value) { store.dispatch('accounts/subscription'); + store.dispatch('accounts/limits'); } }; @@ -59,66 +94,86 @@ onMounted(fetchAccountDetails); - - diff --git a/app/javascript/dashboard/routes/dashboard/settings/billing/billing.routes.js b/app/javascript/dashboard/routes/dashboard/settings/billing/billing.routes.js index 9fc09a00a..26b441c75 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/billing/billing.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/billing/billing.routes.js @@ -1,5 +1,5 @@ import { frontendURL } from '../../../../helper/URLHelper'; -import SettingsContent from '../Wrapper.vue'; +import SettingsWrapper from '../SettingsWrapper.vue'; import Index from './Index.vue'; export default { @@ -9,7 +9,7 @@ export default { meta: { permissions: ['administrator'], }, - component: SettingsContent, + component: SettingsWrapper, props: { headerTitle: 'BILLING_SETTINGS.TITLE', icon: 'credit-card-person', diff --git a/app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingCard.vue b/app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingCard.vue new file mode 100644 index 000000000..d9179b76c --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingCard.vue @@ -0,0 +1,25 @@ + + + diff --git a/app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingHeader.vue b/app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingHeader.vue new file mode 100644 index 000000000..ef0b8d9cd --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingHeader.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingItem.vue b/app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingItem.vue index a63744655..d5f7cfb58 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingItem.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingItem.vue @@ -26,8 +26,8 @@ export default {