PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
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 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Donations / resources / admin / components / DonationDetailsPage / index.tsx
give / src / Donations / resources / admin / components / DonationDetailsPage Last commit date
Tabs 5 months ago DonationDetailsPage.module.scss 8 months ago index.tsx 8 months ago slots.ts 11 months ago
index.tsx
158 lines
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