From 1669708041c1fa5ca6ed6135135e62f00ca73091 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Wed, 8 Mar 2023 18:37:32 +0000 Subject: [PATCH] feat: show usage alert as of threshold --- packages/web/src/components/AppBar/index.tsx | 3 + .../src/components/UsageAlert/index.ee.tsx | 57 +++++++++++++++++++ packages/web/src/config/app.ts | 1 + packages/web/src/hooks/useUsageAlert.ee.ts | 46 +++++++++++++++ packages/web/src/locales/en.json | 6 +- 5 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 packages/web/src/components/UsageAlert/index.ee.tsx create mode 100644 packages/web/src/hooks/useUsageAlert.ee.ts diff --git a/packages/web/src/components/AppBar/index.tsx b/packages/web/src/components/AppBar/index.tsx index cf32768a..dfb4f4d1 100644 --- a/packages/web/src/components/AppBar/index.tsx +++ b/packages/web/src/components/AppBar/index.tsx @@ -12,6 +12,7 @@ import AccountCircleIcon from '@mui/icons-material/AccountCircle'; import * as URLS from 'config/urls'; import AccountDropdownMenu from 'components/AccountDropdownMenu'; +import UsageAlert from 'components/UsageAlert/index.ee'; import Container from 'components/Container'; import { FormattedMessage } from 'react-intl'; import { Link } from './style'; @@ -81,6 +82,8 @@ export default function AppBar(props: AppBarProps): React.ReactElement { + + ( + (props, ref) => , +); + +export default function UsageAlert() { + const formatMessage = useFormatMessage(); + const usageAlert = useUsageAlert(); + + if (!usageAlert.showAlert) return (); + + return ( + + + + + {usageAlert.alertMessage} + + + + + + + + + ); +} diff --git a/packages/web/src/config/app.ts b/packages/web/src/config/app.ts index 184dbe2b..ea01596c 100644 --- a/packages/web/src/config/app.ts +++ b/packages/web/src/config/app.ts @@ -7,6 +7,7 @@ const config: Config = { graphqlUrl: process.env.REACT_APP_GRAPHQL_URL as string, notificationsUrl: process.env.REACT_APP_NOTIFICATIONS_URL as string, chatwootBaseUrl: 'https://app.chatwoot.com', + supportEmailAddress: 'support@automatisch.io' }; export default config; diff --git a/packages/web/src/hooks/useUsageAlert.ee.ts b/packages/web/src/hooks/useUsageAlert.ee.ts new file mode 100644 index 00000000..2bfd802a --- /dev/null +++ b/packages/web/src/hooks/useUsageAlert.ee.ts @@ -0,0 +1,46 @@ +import useFormatMessage from './useFormatMessage'; +import useUsageData from './useUsageData.ee'; +import usePaymentPortalUrl from './usePaymentPortalUrl.ee'; + +type UseUsageAlertReturn = { + showAlert: boolean; + hasExceededLimit?: boolean; + alertMessage?: string; + url?: string; + consumptionPercentage?: number; +}; + +export default function useUsageAlert(): UseUsageAlertReturn { + const { url, loading: paymentPortalUrlLoading } = usePaymentPortalUrl(); + const { + allowedTaskCount, + consumedTaskCount, + nextResetAt, + loading: usageDataLoading + } = useUsageData(); + const formatMessage = useFormatMessage(); + + if (paymentPortalUrlLoading || usageDataLoading) { + return { showAlert: false }; + } + + const hasLoaded = !paymentPortalUrlLoading || usageDataLoading; + const withinUsageThreshold = consumedTaskCount > allowedTaskCount * 0.7; + const consumptionPercentage = consumedTaskCount / allowedTaskCount * 100; + const showAlert = hasLoaded && withinUsageThreshold; + const hasExceededLimit = consumedTaskCount >= allowedTaskCount; + + const alertMessage = formatMessage('usageAlert.informationText', { + allowedTaskCount, + consumedTaskCount, + relativeResetDate: nextResetAt?.toRelative(), + }); + + return { + showAlert, + hasExceededLimit, + alertMessage, + consumptionPercentage, + url, + }; +} diff --git a/packages/web/src/locales/en.json b/packages/web/src/locales/en.json index ddfda549..dee7e9cd 100644 --- a/packages/web/src/locales/en.json +++ b/packages/web/src/locales/en.json @@ -136,5 +136,7 @@ "resetPasswordForm.submit": "Reset password", "resetPasswordForm.passwordFieldLabel": "Password", "resetPasswordForm.confirmPasswordFieldLabel": "Confirm password", - "resetPasswordForm.passwordUpdated": "The password has been updated. Now, you can login." -} + "resetPasswordForm.passwordUpdated": "The password has been updated. Now, you can login.", + "usageAlert.informationText": "Tasks: {consumedTaskCount}/{allowedTaskCount} (Resets {relativeResetDate})", + "usageAlert.viewPlans": "View plans" +} \ No newline at end of file