diff --git a/packages/web/src/components/UsageDataInformation/index.ee.tsx b/packages/web/src/components/UsageDataInformation/index.ee.tsx
new file mode 100644
index 00000000..9bc85b92
--- /dev/null
+++ b/packages/web/src/components/UsageDataInformation/index.ee.tsx
@@ -0,0 +1,49 @@
+import * as React from 'react';
+import { DateTime } from 'luxon';
+
+import Paper from '@mui/material/Paper';
+import Table from '@mui/material/Table';
+import TableBody from '@mui/material/TableBody';
+import TableCell from '@mui/material/TableCell';
+import TableContainer from '@mui/material/TableContainer';
+import TableRow from '@mui/material/TableRow';
+
+import useUsageData from 'hooks/useUsageData.ee';
+
+export default function UsageDataInformation() {
+ const usageData = useUsageData();
+
+ return (
+
+
+
+
+
+
+ Total allowed task count
+
+
+ {usageData.allowedTaskCount}
+
+
+
+
+ Consumed task count
+
+
+ {usageData.consumedTaskCount}
+
+
+
+
+ Next billing date
+
+
+ {usageData.nextResetAt?.toLocaleString(DateTime.DATE_FULL)}
+
+
+
+
+
+ );
+}
diff --git a/packages/web/src/graphql/queries/get-usage-data.ee.ts b/packages/web/src/graphql/queries/get-usage-data.ee.ts
new file mode 100644
index 00000000..7f410ca2
--- /dev/null
+++ b/packages/web/src/graphql/queries/get-usage-data.ee.ts
@@ -0,0 +1,13 @@
+import { gql } from '@apollo/client';
+
+export const GET_USAGE_DATA = gql`
+ query GetUsageData {
+ getUsageData {
+ allowedTaskCount
+ consumedTaskCount
+ remainingTaskCount
+ nextResetAt
+ }
+ }
+`;
+
diff --git a/packages/web/src/hooks/useUsageData.ee.ts b/packages/web/src/hooks/useUsageData.ee.ts
new file mode 100644
index 00000000..7880dc19
--- /dev/null
+++ b/packages/web/src/hooks/useUsageData.ee.ts
@@ -0,0 +1,28 @@
+import { useQuery } from '@apollo/client';
+import { DateTime } from 'luxon';
+
+import { GET_USAGE_DATA } from 'graphql/queries/get-usage-data.ee';
+
+type UseUsageDataReturn = {
+ allowedTaskCount: number;
+ consumedTaskCount: number;
+ remainingTaskCount: number;
+ nextResetAt: DateTime;
+ loading: boolean;
+};
+
+export default function useUsageData(): UseUsageDataReturn {
+ const { data, loading } = useQuery(GET_USAGE_DATA);
+
+ const usageData = data?.getUsageData;
+ const nextResetAt = usageData?.nextResetAt;
+ const nextResetAtDateTimeObject = nextResetAt && DateTime.fromMillis(Number(nextResetAt));
+
+ return {
+ allowedTaskCount: usageData?.allowedTaskCount,
+ consumedTaskCount: usageData?.consumedTaskCount,
+ remainingTaskCount: usageData?.remainingTaskCount,
+ nextResetAt: nextResetAtDateTimeObject,
+ loading
+ };
+}
diff --git a/packages/web/src/pages/BillingAndUsageSettings/index.ee.tsx b/packages/web/src/pages/BillingAndUsageSettings/index.ee.tsx
index 0386fc68..af12fbdf 100644
--- a/packages/web/src/pages/BillingAndUsageSettings/index.ee.tsx
+++ b/packages/web/src/pages/BillingAndUsageSettings/index.ee.tsx
@@ -4,6 +4,7 @@ import Grid from '@mui/material/Grid';
import * as URLS from 'config/urls'
import PaymentInformation from 'components/PaymentInformation/index.ee';
+import UsageDataInformation from 'components/UsageDataInformation/index.ee';
import PageTitle from 'components/PageTitle';
import Container from 'components/Container';
import useFormatMessage from 'hooks/useFormatMessage';
@@ -29,7 +30,11 @@ function BillingAndUsageSettings() {
{formatMessage('billingAndUsageSettings.title')}
-
+
+
+
+
+