|
|
@@ -19,7 +19,6 @@ import {
|
|
|
checkIfProjectHasPayment,
|
|
|
useCustomerInvoices,
|
|
|
useCustomerPlan,
|
|
|
- useCustomerUsage,
|
|
|
usePaymentMethods,
|
|
|
usePorterCredits,
|
|
|
useReferralDetails,
|
|
|
@@ -32,7 +31,6 @@ import gift from "assets/gift.svg";
|
|
|
import trashIcon from "assets/trash.png";
|
|
|
|
|
|
import BillingModal from "../modals/BillingModal";
|
|
|
-import Bars from "./Bars";
|
|
|
|
|
|
dayjs.extend(relativeTime);
|
|
|
|
|
|
@@ -57,45 +55,10 @@ function BillingPage(): JSX.Element {
|
|
|
|
|
|
const { refetchPaymentEnabled } = checkIfProjectHasPayment();
|
|
|
|
|
|
- const { usage } = useCustomerUsage("day", true);
|
|
|
-
|
|
|
- const processedData = useMemo(() => {
|
|
|
- const before = usage;
|
|
|
- const resultMap = new Map();
|
|
|
-
|
|
|
- before?.forEach(
|
|
|
- (metric: {
|
|
|
- metric_name: string;
|
|
|
- usage_metrics: Array<{ starting_on: string; value: number }>;
|
|
|
- }) => {
|
|
|
- const metricName = metric.metric_name.toLowerCase().replace(" ", "_");
|
|
|
- metric.usage_metrics.forEach(({ starting_on, value }) => {
|
|
|
- if (resultMap.has(starting_on)) {
|
|
|
- resultMap.get(starting_on)[metricName] = value;
|
|
|
- } else {
|
|
|
- resultMap.set(starting_on, {
|
|
|
- starting_on: new Date(starting_on).toLocaleDateString("en-US", {
|
|
|
- month: "short",
|
|
|
- day: "numeric",
|
|
|
- }),
|
|
|
- [metricName]: value,
|
|
|
- });
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- );
|
|
|
-
|
|
|
- // Convert the map to an array of values
|
|
|
- const x = Array.from(resultMap.values());
|
|
|
- return x;
|
|
|
- }, [usage]);
|
|
|
-
|
|
|
const formatCredits = (credits: number): string => {
|
|
|
return (credits / 100).toFixed(2);
|
|
|
};
|
|
|
|
|
|
- const readableDate = (s: string): string => new Date(s).toLocaleDateString();
|
|
|
-
|
|
|
const onCreate = async (): Promise<void> => {
|
|
|
await refetchPaymentMethods({ throwOnError: false, cancelRefetch: false });
|
|
|
setShouldCreate(false);
|
|
|
@@ -250,107 +213,48 @@ function BillingPage(): JSX.Element {
|
|
|
</Button>
|
|
|
<Spacer y={2} />
|
|
|
|
|
|
- {currentProject?.metronome_enabled && (
|
|
|
- <div>
|
|
|
- {currentProject?.sandbox_enabled && (
|
|
|
- <div>
|
|
|
- <Text size={16}>Porter credit grants</Text>
|
|
|
- <Spacer y={1} />
|
|
|
- <Text color="helper">
|
|
|
- No usage data available for this billing period.
|
|
|
- </Text>
|
|
|
- <Spacer y={1} />
|
|
|
-
|
|
|
- <Container>
|
|
|
- <Image src={gift} style={{ marginTop: "-2px" }} />
|
|
|
- <Spacer inline x={1} />
|
|
|
- <Text size={20}>
|
|
|
- {creditGrants && creditGrants.remaining_credits > 0
|
|
|
- ? `$${formatCredits(
|
|
|
- creditGrants.remaining_credits
|
|
|
- )}/$${formatCredits(creditGrants.granted_credits)}`
|
|
|
- : "$ 0.00"}
|
|
|
- </Text>
|
|
|
- </Container>
|
|
|
- <Spacer y={2} />
|
|
|
- </div>
|
|
|
- )}
|
|
|
-
|
|
|
- <div>
|
|
|
- <Text size={16}>Plan Details</Text>
|
|
|
- <Spacer y={1} />
|
|
|
- <Text color="helper">
|
|
|
- View the details of the current billing plan of this project.
|
|
|
- </Text>
|
|
|
- <Spacer y={1} />
|
|
|
-
|
|
|
- {plan && plan.plan_name !== "" ? (
|
|
|
- <div>
|
|
|
- <Text>Active Plan</Text>
|
|
|
- <Spacer y={0.5} />
|
|
|
- <Fieldset row>
|
|
|
- <Container row spaced>
|
|
|
- <Container row>
|
|
|
- <Text color="helper">{plan.plan_name}</Text>
|
|
|
- </Container>
|
|
|
- <Container row>
|
|
|
- {plan.trial_info !== undefined &&
|
|
|
- plan.trial_info.ending_before !== "" ? (
|
|
|
- <Text>
|
|
|
- Free trial ends{" "}
|
|
|
- {dayjs().to(dayjs(plan.trial_info.ending_before))}
|
|
|
- </Text>
|
|
|
- ) : (
|
|
|
- <Text>Started on {readableDate(plan.starting_on)}</Text>
|
|
|
- )}
|
|
|
- </Container>
|
|
|
- </Container>
|
|
|
- </Fieldset>
|
|
|
- <Spacer y={2} />
|
|
|
- <Text size={16}>Current Usage</Text>
|
|
|
- <Spacer y={1} />
|
|
|
- <Text color="helper">
|
|
|
- View the current usage of this billing period.
|
|
|
- </Text>
|
|
|
- <Spacer y={1} />
|
|
|
- {usage?.length &&
|
|
|
- usage.length > 0 &&
|
|
|
- usage[0].usage_metrics.length > 0 ? (
|
|
|
- <Flex>
|
|
|
- <BarWrapper>
|
|
|
- <Bars
|
|
|
- title="GiB Hours"
|
|
|
- fill="#8784D2"
|
|
|
- yKey="gib_hours"
|
|
|
- xKey="starting_on"
|
|
|
- data={processedData}
|
|
|
- />
|
|
|
- </BarWrapper>
|
|
|
- <Spacer x={1} inline />
|
|
|
- <BarWrapper>
|
|
|
- <Bars
|
|
|
- title="CPU Hours"
|
|
|
- fill="#5886E0"
|
|
|
- yKey="cpu_hours"
|
|
|
- xKey="starting_on"
|
|
|
- data={processedData}
|
|
|
- />
|
|
|
- </BarWrapper>
|
|
|
- </Flex>
|
|
|
- ) : (
|
|
|
- <Fieldset>
|
|
|
- <Text color="helper">
|
|
|
- No usage data available for this billing period.
|
|
|
- </Text>
|
|
|
- </Fieldset>
|
|
|
- )}
|
|
|
- <Spacer y={2} />
|
|
|
- </div>
|
|
|
- ) : (
|
|
|
- <Text>This project does not have an active billing plan.</Text>
|
|
|
- )}
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ {showReferralModal && (
|
|
|
+ <Modal
|
|
|
+ closeModal={() => {
|
|
|
+ setShowReferralModal(false);
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <Text size={16}>Refer users to Porter</Text>
|
|
|
+ <Spacer y={1} />
|
|
|
+ <Text color="helper">
|
|
|
+ Earn $10 in free credits for each user you refer to Porter. Referred
|
|
|
+ users need to connect a payment method for credits to be added to
|
|
|
+ your account.
|
|
|
+ </Text>
|
|
|
+ <Spacer y={1} />
|
|
|
+ <Container row>
|
|
|
+ <ReferralCode>
|
|
|
+ Referral code:{" "}
|
|
|
+ {currentProject?.referral_code ? (
|
|
|
+ <Code>{currentProject.referral_code}</Code>
|
|
|
+ ) : (
|
|
|
+ "n/a"
|
|
|
+ )}
|
|
|
+ </ReferralCode>
|
|
|
+ <Spacer inline x={1} />
|
|
|
+ <CopyToClipboard
|
|
|
+ text={
|
|
|
+ window.location.origin +
|
|
|
+ "/register?referral=" +
|
|
|
+ currentProject?.referral_code
|
|
|
+ }
|
|
|
+ tooltip="Copied to clipboard"
|
|
|
+ >
|
|
|
+ <CopyButton>Copy referral link</CopyButton>
|
|
|
+ </CopyToClipboard>
|
|
|
+ </Container>
|
|
|
+ <Spacer y={1} />
|
|
|
+ <Text color="helper">
|
|
|
+ You have referred{" "}
|
|
|
+ {referralDetails ? referralDetails.referral_count : "?"}/
|
|
|
+ {referralDetails?.max_allowed_referrals} users.
|
|
|
+ </Text>
|
|
|
+ </Modal>
|
|
|
)}
|
|
|
</>
|
|
|
);
|
|
|
@@ -377,17 +281,6 @@ const ReferralCode = styled.div`
|
|
|
width: fit-content;
|
|
|
`;
|
|
|
|
|
|
-const Flex = styled.div`
|
|
|
- display: flex;
|
|
|
- flex-wrap: wrap;
|
|
|
-`;
|
|
|
-
|
|
|
-const BarWrapper = styled.div`
|
|
|
- flex: 1;
|
|
|
- height: 300px;
|
|
|
- min-width: 450px;
|
|
|
-`;
|
|
|
-
|
|
|
const I = styled.i`
|
|
|
font-size: 16px;
|
|
|
margin-right: 8px;
|