PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 4.18.0
GiveWP – Donation Plugin and Fundraising Platform v4.18.0
4.18.0.1 4.18.0 4.17.0 4.16.9 4.16.8.1 4.16.8 4.16.7.2 4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 All 258 releases
give / src / Donations / resources / admin / components / DonationDetailsPage / index.tsx

index.tsx in GiveWP – Donation Plugin and Fundraising Platform 4.18.0, at src/Donations/resources/admin/components/DonationDetailsPage/index.tsx

158 lines 5.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * External Dependencies
3 */
4 import { useState } from 'react';
5 import cx from 'classnames';
6
7 /**
8 * WordPress Dependencies
9 */
10 import { __, sprintf } from '@wordpress/i18n';
11 import { createInterpolateElement } from '@wordpress/element';
12
13 /**
14 * Internal Dependencies
15 */
16 import { RefundIcon, TrashIcon } from '@givewp/components/AdminDetailsPage/Icons';
17 import AdminDetailsPage from '@givewp/components/AdminDetailsPage';
18 import ConfirmationDialog from '@givewp/components/AdminDetailsPage/ConfirmationDialog';
19 import { getDonationOptionsWindowData, useDonationEntityRecord } from '@givewp/donations/utils';
20 import styles from './DonationDetailsPage.module.scss';
21 import tabDefinitions from './Tabs/definitions';
22 import useDonationRefund from '@givewp/donations/hooks/useDonationRefund';
23 import { useDonationAmounts } from '@givewp/donations/hooks';
24 import { useDispatch } from '@wordpress/data';
25 import { store as coreDataStore } from '@wordpress/core-data';
26
27 const { donationStatuses } = getDonationOptionsWindowData();
28
29 /**
30 * @since 4.6.0
31 */
32 const StatusBadge = ({ status, isTest }: { status: string, isTest: boolean }) => {
33 const statusMap = donationStatuses;
34
35 if (!statusMap[status]) {
36 return null;
37 }
38
39 return (
40 <>
41 <div className={`${styles.statusBadge} ${styles[`statusBadge--${status}`]}`}>
42 {statusMap[status]}
43 </div>
44 {isTest && (
45 <div className={`${styles.statusBadge} ${styles.testBadge}`}>
46 {__('Test Donation', 'give')}
47 </div>
48 )}
49 </>
50 );
51 };
52
53 /**
54 * @since 4.6.0
55 */
56 export default function DonationDetailsPage() {
57 const {adminUrl, donationsAdminUrl} = getDonationOptionsWindowData();
58 const [showConfirmationDialog, setShowConfirmationDialog] = useState<string | null>(null);
59 const {record: donation} = useDonationEntityRecord();
60 const {formatter} = useDonationAmounts(donation);
61 const {canRefund, refund, isRefunding, isRefunded} = useDonationRefund(donation);
62 const {deleteEntityRecord} = useDispatch( coreDataStore );
63
64 const ContextMenuItems = ({ className }: { className: string }) => {
65 return (
66 <>
67 {canRefund && (
68 <a
69 href="#"
70 className={className}
71 onClick={() => setShowConfirmationDialog('refund')}
72 >
73 <RefundIcon /> {__('Refund', 'give')}
74 </a>
75 )}
76 <a
77 href="#"
78 className={cx(className, styles.archive)}
79 onClick={() => setShowConfirmationDialog('delete')}
80 >
81 <TrashIcon /> {__('Trash donation', 'give')}
82 </a>
83 </>
84 );
85 };
86
87 /**
88 * @since 4.6.0
89 */
90 const handleRefund = async () => {
91 try {
92 await refund();
93 } catch (error) {
94 setShowConfirmationDialog(null);
95 }
96 };
97
98 /**
99 * @since 4.6.0
100 */
101 const handleDelete = async () => {
102 try {
103 await deleteEntityRecord('givewp', 'donation', donation?.id, {force: false})
104 window.location.href = donationsAdminUrl;
105 } catch (error) {
106 setShowConfirmationDialog(null);
107 }
108 };
109
110
111 return (
112 <AdminDetailsPage
113 objectId={donation?.id}
114 objectType="donation"
115 objectTypePlural="donations"
116 useObjectEntityRecord={useDonationEntityRecord}
117 tabDefinitions={tabDefinitions}
118 breadcrumbUrl={`${adminUrl}edit.php?post_type=give_forms&page=give-payment-history`}
119 breadcrumbTitle={donation?.id && sprintf('#%s', donation?.id)}
120 pageTitle={donation?.amount?.value != null ? formatter.format(donation?.amount?.value) : ''}
121 StatusBadge={() => <StatusBadge status={donation?.status} isTest={donation?.mode === 'test'} />}
122 ContextMenuItems={ContextMenuItems}
123 >
124 <ConfirmationDialog
125 title={__('Refund Donation', 'give')}
126 actionLabel={__('Refund Donation', 'give')}
127 isOpen={showConfirmationDialog === 'refund' && !isRefunded}
128 variant="regular"
129 handleClose={() => setShowConfirmationDialog(null)}
130 handleConfirm={handleRefund}
131 isConfirming={isRefunding}
132 >
133 {
134 createInterpolateElement(
135 sprintf(
136 __('Refund <strong>%s</strong> to <strong>%s</strong>', 'give'),
137 formatter.format(donation?.amount?.value),
138 donation?.firstName
139 ),
140 {
141 strong: <strong />
142 }
143 )
144 }
145 </ConfirmationDialog>
146 <ConfirmationDialog
147 title={__('Move donation to trash', 'give')}
148 actionLabel={__('Trash Donation', 'give')}
149 isOpen={showConfirmationDialog === 'delete'}
150 handleClose={() => setShowConfirmationDialog(null)}
151 handleConfirm={handleDelete}
152 >
153 {__('Are you sure you want to move this donation to the trash? You can restore it later if needed.', 'give')}
154 </ConfirmationDialog>
155 </AdminDetailsPage>
156 );
157 }
158