feat: make invoices dynamic

This commit is contained in:
Ali BARIN
2023-03-27 08:22:24 +00:00
parent fd24dbee21
commit 372cdb10d6
5 changed files with 91 additions and 145 deletions

View File

@@ -368,6 +368,14 @@ type TBillingLinkCardAction = {
src: string; src: string;
} }
type TInvoice = {
id: number
amount: number
currency: string
payout_date: string
receipt_url: string
}
declare module 'axios' { declare module 'axios' {
interface AxiosResponse { interface AxiosResponse {
httpError?: IJSONObject; httpError?: IJSONObject;

View File

@@ -1,95 +1,19 @@
import * as React from 'react'; import * as React from 'react';
import { Link } from 'react-router-dom'; import { DateTime } from 'luxon';
import Box from '@mui/material/Box'; import Box from '@mui/material/Box';
import Button from '@mui/material/Button'; import Link from '@mui/material/Link';
import Chip from '@mui/material/Chip';
import Card from '@mui/material/Card'; import Card from '@mui/material/Card';
import CardActions from '@mui/material/CardActions';
import CardContent from '@mui/material/CardContent'; import CardContent from '@mui/material/CardContent';
import Divider from '@mui/material/Divider'; import Divider from '@mui/material/Divider';
import Grid from '@mui/material/Grid'; import Grid from '@mui/material/Grid';
import Typography from '@mui/material/Typography'; import Typography from '@mui/material/Typography';
import { TBillingCardAction } from '@automatisch/types'; import useInvoices from 'hooks/useInvoices.ee';
import * as URLS from 'config/urls';
import useBillingAndUsageData from 'hooks/useBillingAndUsageData.ee';
import useFormatMessage from 'hooks/useFormatMessage'; import useFormatMessage from 'hooks/useFormatMessage';
const capitalize = (str: string) =>
str[0].toUpperCase() + str.slice(1, str.length);
type BillingCardProps = {
name: string;
title?: string;
action?: TBillingCardAction;
};
function BillingCard(props: BillingCardProps) {
const { name, title = '', action } = props;
return (
<Card
sx={{
height: '100%',
display: 'flex',
flexDirection: 'column',
justifyContent: 'space-between',
backgroundColor: (theme) => theme.palette.background.default,
}}
>
<CardContent>
<Typography variant="subtitle2" sx={{ pb: 0.5 }}>
{name}
</Typography>
<Typography variant="h6" fontWeight="bold">
{title}
</Typography>
</CardContent>
<CardActions>
<Action action={action} />
</CardActions>
</Card>
);
}
function Action(props: { action?: TBillingCardAction }) {
const { action } = props;
if (!action) return <React.Fragment />;
const { text, type } = action;
if (type === 'link') {
if (action.src.startsWith('http')) {
return (
<Button size="small" href={action.src} target="_blank">
{text}
</Button>
);
} else {
return (
<Button size="small" component={Link} to={action.src}>
{text}
</Button>
);
}
}
if (type === 'text') {
return (
<Typography variant="subtitle2" pb={1}>
{text}
</Typography>
);
}
return <React.Fragment />;
}
export default function Invoices() { export default function Invoices() {
const formatMessage = useFormatMessage(); const formatMessage = useFormatMessage();
const billingAndUsageData = useBillingAndUsageData(); const { invoices } = useInvoices();
return ( return (
<React.Fragment> <React.Fragment>
@@ -97,33 +21,38 @@ export default function Invoices() {
<CardContent sx={{ display: 'flex', flexDirection: 'column' }}> <CardContent sx={{ display: 'flex', flexDirection: 'column' }}>
<Box sx={{ mb: 2, display: 'flex', justifyContent: 'space-between' }}> <Box sx={{ mb: 2, display: 'flex', justifyContent: 'space-between' }}>
<Typography variant="h6" fontWeight="bold"> <Typography variant="h6" fontWeight="bold">
Invoices {formatMessage('invoices.invoices')}
</Typography> </Typography>
</Box> </Box>
<Divider sx={{ mb: 2 }} /> <Divider sx={{ mb: 2 }} />
<Grid container item xs={12} spacing={1} alignItems="stretch"> <Grid container item xs={12} spacing={1} alignItems="stretch">
<Grid item xs={12} md={5}> <Grid item xs={5}>
<Typography variant="subtitle1" sx={{ color: 'text.secondary' }}> <Typography variant="subtitle1" sx={{ color: 'text.secondary' }}>
Date {formatMessage('invoices.date')}
</Typography> </Typography>
</Grid> </Grid>
<Grid item xs={12} md={5}> <Grid item xs={5}>
<Typography variant="subtitle1" sx={{ color: 'text.secondary' }}> <Typography variant="subtitle1" sx={{ color: 'text.secondary' }}>
Amount {formatMessage('invoices.amount')}
</Typography> </Typography>
</Grid> </Grid>
<Grid item xs={12} md={2}> <Grid item xs={2}>
<Typography variant="subtitle1" sx={{ color: 'text.secondary' }}> <Typography variant="subtitle1" sx={{ color: 'text.secondary' }}>
Invoice {formatMessage('invoices.invoice')}
</Typography> </Typography>
</Grid> </Grid>
</Grid> </Grid>
<Divider sx={{ mt: 2 }} /> <Divider sx={{ mt: 2 }} />
{invoices.map((invoice, invoiceIndex) => (
<React.Fragment key={invoice.id}>
{invoiceIndex !== 0 && <Divider sx={{ mt: 2 }} />}
<Grid <Grid
container container
item item
@@ -132,58 +61,30 @@ export default function Invoices() {
alignItems="stretch" alignItems="stretch"
sx={{ mt: 1 }} sx={{ mt: 1 }}
> >
<Grid item xs={12} md={5}> <Grid item xs={5}>
<Typography <Typography
variant="subtitle2" variant="subtitle2"
fontWeight="500" fontWeight="500"
sx={{ color: 'text.secondary' }} sx={{ color: 'text.secondary' }}
> >
Mar 16, 2023 {DateTime.fromISO(invoice.payout_date).toFormat('LLL dd, yyyy')}
</Typography> </Typography>
</Grid> </Grid>
<Grid item xs={12} md={5}> <Grid item xs={5}>
<Typography variant="subtitle2">20.00</Typography> <Typography variant="subtitle2">{invoice.amount}</Typography>
</Grid> </Grid>
<Grid item xs={12} md={2}> <Grid item xs={2}>
<Typography variant="subtitle2"> <Typography variant="subtitle2">
<Link target="_blank" to="https://sample.com"> <Link target="_blank" href={invoice.receipt_url}>
Link {formatMessage('invoices.link')}
</Link> </Link>
</Typography> </Typography>
</Grid> </Grid>
</Grid> </Grid>
<Divider sx={{ mt: 2 }} /> </React.Fragment>
))}
<Grid
container
item
xs={12}
spacing={1}
alignItems="stretch"
sx={{ mt: 1 }}
>
<Grid item xs={12} md={5}>
<Typography
variant="subtitle2"
fontWeight="500"
sx={{ color: 'text.secondary' }}
>
Mar 16, 2023
</Typography>
</Grid>
<Grid item xs={12} md={5}>
<Typography variant="subtitle2">20.00</Typography>
</Grid>
<Grid item xs={12} md={2}>
<Typography variant="subtitle2">
<Link to="https://sample.com">Link</Link>
</Typography>
</Grid>
</Grid>
</CardContent> </CardContent>
</Card> </Card>
</React.Fragment> </React.Fragment>

View File

@@ -0,0 +1,14 @@
import { gql } from '@apollo/client';
export const GET_INVOICES = gql`
query GetInvoices {
getInvoices {
id
amount
currency
payout_date
receipt_url
}
}
`;

View File

@@ -0,0 +1,18 @@
import { useQuery } from '@apollo/client';
import { TInvoice } from '@automatisch/types';
import { GET_INVOICES } from 'graphql/queries/get-invoices.ee';
type UseInvoicesReturn = {
invoices: TInvoice[],
loading: boolean;
};
export default function useInvoices(): UseInvoicesReturn {
const { data, loading } = useQuery(GET_INVOICES);
return {
invoices: data?.getInvoices || [],
loading: loading
};
}

View File

@@ -148,5 +148,10 @@
"usageDataInformation.yourUsage": "Your usage", "usageDataInformation.yourUsage": "Your usage",
"usageDataInformation.yourUsageDescription": "Last 30 days total usage", "usageDataInformation.yourUsageDescription": "Last 30 days total usage",
"usageDataInformation.yourUsageTasks": "Tasks", "usageDataInformation.yourUsageTasks": "Tasks",
"usageDataInformation.upgrade": "Upgrade" "usageDataInformation.upgrade": "Upgrade",
"invoices.invoices": "Invoices",
"invoices.date": "Date",
"invoices.amount": "Amount",
"invoices.invoice": "Invoice",
"invoices.link": "Link"
} }