diff --git a/packages/webapp/src/containers/Sales/Estimates/EstimateSendMailDrawer/EstimateSendMailReceipt.tsx b/packages/webapp/src/containers/Sales/Estimates/EstimateSendMailDrawer/EstimateSendMailReceipt.tsx index d548019eb..69ad4af44 100644 --- a/packages/webapp/src/containers/Sales/Estimates/EstimateSendMailDrawer/EstimateSendMailReceipt.tsx +++ b/packages/webapp/src/containers/Sales/Estimates/EstimateSendMailDrawer/EstimateSendMailReceipt.tsx @@ -1,6 +1,9 @@ import { x } from '@xstyled/emotion'; import { Group, Stack } from '@/components'; -import { SendMailReceipt, SendMailReceiptProps } from '../SendMailViewDrawer/SendMailViewReceiptPreview'; +import { + SendMailReceipt, + SendMailReceiptProps, +} from '../SendMailViewDrawer/SendMailViewReceiptPreview'; interface EstimateSendMailReceiptProps extends SendMailReceiptProps { // # Company name. diff --git a/packages/webapp/src/containers/Sales/Estimates/EstimateSendMailDrawer/EstimateSendMailReceiptPreview.tsx b/packages/webapp/src/containers/Sales/Estimates/EstimateSendMailDrawer/EstimateSendMailReceiptPreview.tsx index e33ad7aad..2dca97041 100644 --- a/packages/webapp/src/containers/Sales/Estimates/EstimateSendMailDrawer/EstimateSendMailReceiptPreview.tsx +++ b/packages/webapp/src/containers/Sales/Estimates/EstimateSendMailDrawer/EstimateSendMailReceiptPreview.tsx @@ -3,19 +3,17 @@ import { EstimateSendMailReceipt } from './EstimateSendMailReceipt'; import { EstimateSendMailPreviewHeader } from './EstimateSendMailPreviewHeader'; import { Stack } from '@/components'; -export const EstimateSendMailReceiptPreview = () => { - const props = { - companyName: 'Bigcapital Technology, Inc.', - companyLogoUri: ' ', +const defaultEstimateMailReceiptProps = { + companyName: 'Bigcapital Technology, Inc.', + companyLogoUri: ' ', - message: '', - total: '$1,000.00', - subtotal: '$1,000.00', - estimateNumber: 'INV-0001', - expirationDate: '2 Oct 2024', - dueAmount: '$1,000.00', - items: [{ label: 'Web development', total: '$1000.00', quantity: 1 }], - message: `Hi Ahmed Bouhuolia, + total: '$1,000.00', + subtotal: '$1,000.00', + estimateNumber: 'INV-0001', + expirationDate: '2 Oct 2024', + dueAmount: '$1,000.00', + items: [{ label: 'Web development', total: '$1000.00', quantity: 1 }], + message: `Hi Ahmed Bouhuolia, Here's invoice # INV-00002 for $738.30 @@ -27,15 +25,15 @@ If you have any questions, please let us know. Thanks, Bigcapital`, - }; - +}; +export const EstimateSendMailReceiptPreview = () => { return ( ({} as ReceiptSendMailBootValues); -export const ReceiptSendMailBoot = ({ - children, -}: ReceiptSendMailBootProps) => { +export const ReceiptSendMailBoot = ({ children }: ReceiptSendMailBootProps) => { const { payload: { receiptId }, } = useDrawerContext(); // Receipt mail options. const { data: receiptMailState, isLoading: isReceiptMailState } = - useSaleReceiptMailState(receiptId); + useSaleInvoiceMailState(receiptId); const isLoading = isReceiptMailState; - if (isLoading) { - return ; - } + // if (isLoading) { + // return ; + // } const value = { receiptId, diff --git a/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailFormFields.tsx b/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailFormFields.tsx index b28ae160c..95f1ac2af 100644 --- a/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailFormFields.tsx +++ b/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailFormFields.tsx @@ -1,6 +1,73 @@ +import { FCheckbox, FFormGroup, FInputGroup, Group, Stack } from "@/components"; +import { SendMailViewToAddressField } from "../../Estimates/SendMailViewDrawer/SendMailViewToAddressField"; +import { SendMailViewMessageField } from "../../Estimates/SendMailViewDrawer/SendMailViewMessageField"; +import { Button, Intent } from "@blueprintjs/core"; +import { useDrawerActions } from "@/hooks/state"; +import { useDrawerContext } from "@/components/Drawer/DrawerProvider"; +import { useFormikContext } from "formik"; - +const items: Array = []; +const argsOptions: Array = []; export function ReceiptSendMailFormFields() { - return null; + return ( + + + + + + + + + + + + + + + + + ); +} + +function ReceiptSendMailFooter() { + const { isSubmitting } = useFormikContext(); + const { name } = useDrawerContext(); + const { closeDrawer } = useDrawerActions(); + + const handleClose = () => { + closeDrawer(name); + }; + + return ( + + + + + + + + ); } \ No newline at end of file diff --git a/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailPdfPreview.tsx b/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailPdfPreview.tsx new file mode 100644 index 000000000..54d81ab37 --- /dev/null +++ b/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailPdfPreview.tsx @@ -0,0 +1,32 @@ +import { Stack } from '@/components'; +import { ReceiptSendMailPreviewHeader } from './ReceiptSendMailPreviewHeader'; +import { useDrawerContext } from '@/components/Drawer/DrawerProvider'; +import { useGetSaleReceiptHtml } from '@/hooks/query'; +import { Spinner } from '@blueprintjs/core'; +import { SendMailViewPreviewPdfIframe } from '../../Estimates/SendMailViewDrawer/SendMailViewPreviewPdfIframe'; + +export function ReceiptSendMailPdfPreview() { + return ( + + + + + + + + ); +} + +function ReceiptSendPdfPreviewIframe() { + const { payload } = useDrawerContext(); + const { data, isLoading } = useGetSaleReceiptHtml(payload?.receiptId); + + if (isLoading && data) { + return ; + } + const iframeSrcDoc = data?.htmlContent; + + console.log(data, 'data'); + + return ; +} diff --git a/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailPreview.tsx b/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailPreview.tsx new file mode 100644 index 000000000..112c70213 --- /dev/null +++ b/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailPreview.tsx @@ -0,0 +1,40 @@ +import { Stack } from '@/components'; +import { ReceiptSendMailPreviewHeader } from './ReceiptSendMailPreviewHeader'; +import { ReceiptSendMailReceipt } from './ReceiptSendMailReceipt'; +import { css } from '@emotion/css'; + +const defaultReceiptMailProps = { + companyLogoUri: 'https://via.placeholder.com/150', + companyName: 'Company Name', + receiptNumber: '1234', + total: '1000', + message: 'Thank you for your business!', + items: [ + { label: 'Item 1', quantity: 1, total: '500' }, + { label: 'Item 2', quantity: 2, total: '500' }, + ], + subtotal: '1000', + showViewReceiptButton: true, + viewReceiptButtonLabel: 'View Receipt', +}; + +export function ReceiptSendMailPreview() { + return ( + + + + + + + + ); +} diff --git a/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailPreviewHeader.tsx b/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailPreviewHeader.tsx new file mode 100644 index 000000000..7c30ebbb3 --- /dev/null +++ b/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailPreviewHeader.tsx @@ -0,0 +1,13 @@ +import { SendViewPreviewHeader } from '../../Estimates/SendMailViewDrawer/SendMailViewPreviewHeader'; + +export function ReceiptSendMailPreviewHeader() { + return ( + + ); +} diff --git a/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailPreviewTabs.tsx b/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailPreviewTabs.tsx index bd43988cc..7b8112e79 100644 --- a/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailPreviewTabs.tsx +++ b/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailPreviewTabs.tsx @@ -1,3 +1,30 @@ +import { Suspense } from 'react'; +import { Tab } from '@blueprintjs/core'; +import { SendMailViewPreviewTabs } from '../../Estimates/SendMailViewDrawer/SendMailViewPreviewTabs'; +import { ReceiptSendMailPreview } from './ReceiptSendMailPreview'; +import { ReceiptSendMailPdfPreview } from './ReceiptSendMailPdfPreview'; + export function ReceiptSendMailPreviewTabs() { - return null; + return ( + + + + + } + /> + + + + } + /> + + ); } diff --git a/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailReceipt.tsx b/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailReceipt.tsx new file mode 100644 index 000000000..bd0517a96 --- /dev/null +++ b/packages/webapp/src/containers/Sales/Receipts/ReceiptSendMailDrawer/ReceiptSendMailReceipt.tsx @@ -0,0 +1,142 @@ +import { x } from '@xstyled/emotion'; +import { Group, Stack } from '@/components'; +import { + SendMailReceipt, + SendMailReceiptProps, +} from '../../Estimates/SendMailViewDrawer/SendMailViewReceiptPreview'; + +interface ReceiptSendMailReceiptProps extends SendMailReceiptProps { + // # Company name. + companyLogoUri?: string; + companyName: string; + + // # Receipt number. + receiptNumberLabel?: string; + receiptNumber: string; + + // # Total. + total: string; + totalLabel?: string; + + // # Message + message: string; + + // # Receipt items. + items?: Array<{ label: string; total: string; quantity: string | number }>; + + // # Subtotal + subtotal: string; + subtotalLabel?: string; + + // # View receipt button + showViewReceiptButton?: boolean; + viewReceiptButtonLabel?: string; + viewReceiptButtonOnClick?: () => void; +} + +export function ReceiptSendMailReceipt({ + // # Company name. + companyLogoUri, + companyName, + + // # Receipt number. + receiptNumberLabel = 'Receipt #', + receiptNumber, + + // # Total. + total, + totalLabel = 'Total', + + // # Message + message, + + // # Items + items, + subtotal, + subtotalLabel = 'Subtotal', + + // # View receipt button + showViewReceiptButton, + viewReceiptButtonLabel, + viewReceiptButtonOnClick, + + ...rest +}: ReceiptSendMailReceiptProps) { + return ( + + + {companyLogoUri && } + + + + {companyName} + + + + {total} + + + + {receiptNumberLabel} {receiptNumber} + + + + {showViewReceiptButton && ( + + {viewReceiptButtonLabel} + + )} + + + {items?.map((item, key) => ( + + {item.label} + + {item.quantity} x {item.total} + + + ))} + + + {subtotalLabel} + + {subtotal} + + + + + {totalLabel} + + {total} + + + + + + ); +} diff --git a/packages/webapp/src/containers/Sales/Receipts/ReceiptsLanding/ReceiptsTable.tsx b/packages/webapp/src/containers/Sales/Receipts/ReceiptsLanding/ReceiptsTable.tsx index 2147bac5f..0d9dc661e 100644 --- a/packages/webapp/src/containers/Sales/Receipts/ReceiptsLanding/ReceiptsTable.tsx +++ b/packages/webapp/src/containers/Sales/Receipts/ReceiptsLanding/ReceiptsTable.tsx @@ -89,7 +89,7 @@ function ReceiptsDataTable({ // Handle send mail receipt. const handleSendMailReceipt = ({ id }) => { - openDialog(DialogsName.ReceiptMail, { receiptId: id }); + openDrawer(DRAWERS.RECEIPT_SEND_MAIL, { receiptId: id }); }; // Local storage memorizing columns widths. diff --git a/packages/webapp/src/hooks/query/receipts.tsx b/packages/webapp/src/hooks/query/receipts.tsx index ad85c0342..dc2f027fd 100644 --- a/packages/webapp/src/hooks/query/receipts.tsx +++ b/packages/webapp/src/hooks/query/receipts.tsx @@ -269,3 +269,33 @@ export function useGetReceiptState( { ...options }, ); } + +interface GetReceiptHtmlResponse { + htmlContent: string; +} + +/** + * Retrieves the sale receipt html content. + * @param {number} receiptId + * @param {UseQueryOptions} options + * @returns {UseQueryResult} + */ +export const useGetSaleReceiptHtml = ( + receiptId: number, + options?: UseQueryOptions, +): UseQueryResult => { + const apiRequest = useApiRequest(); + + return useQuery( + ['SALE_RECEIPT_HTML', receiptId], + () => + apiRequest + .get(`sales/receipts/${receiptId}`, { + headers: { + Accept: 'application/json+html', + }, + }) + .then((res) => transformToCamelCase(res.data)), + { ...options }, + ); +};