PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.14.6
GiveWP – Donation Plugin and Fundraising Platform v4.14.6
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 / Subscriptions / resources / admin / components / SubscriptionSyncList / index.tsx
give / src / Subscriptions / resources / admin / components / SubscriptionSyncList Last commit date
Details.tsx 9 months ago icons.tsx 9 months ago index.tsx 9 months ago styles.module.scss 9 months ago
index.tsx
119 lines
1 import { useState } from "react";
2 import { __ } from "@wordpress/i18n";
3 import classnames from 'classnames';
4 import SyncDetails,{ SyncPaymentDetails } from "./Details";
5 import { SubscriptionSyncResponse } from "../../../hooks/useSubscriptionSync";
6 import styles from './styles.module.scss';
7
8 /**
9 * @since 4.8.0
10 */
11 type SubscriptionSyncListProps = {
12 syncResult: SubscriptionSyncResponse;
13 }
14
15 /**
16 * @since 4.8.0
17 */
18 export default function SubscriptionSyncList({ syncResult }: SubscriptionSyncListProps) {
19 const { details, missingTransactions } = syncResult;
20 const [openItem, setOpenItem] = useState<string | null>(null);
21
22 const statusUpdated = details?.currentStatus !== details?.gatewayStatus;
23 const periodUpdated = details?.currentPeriod !== details?.gatewayPeriod;
24 const createdAtUpdated = details?.currentCreatedAt !== details?.gatewayCreatedAt;
25 const paymentsUpdated = missingTransactions?.length > 0;
26 const transactions = paymentsUpdated ? missingTransactions : [null];
27
28 const handleItemToggle = (itemId: string) => {
29 setOpenItem(openItem === itemId ? null : itemId);
30 };
31
32 return (
33 <div className={styles.list}>
34 <SyncItem
35 id="status"
36 title="Subscription status"
37 isAccurate={!statusUpdated}
38 isOpen={openItem === "status"}
39 onToggle={() => handleItemToggle("status")}
40 >
41 <SyncDetails isAccurate={!statusUpdated} platform={details?.currentStatus} gateway={details?.gatewayStatus} />
42 </SyncItem>
43 <SyncItem
44 id="period"
45 title="Billing period"
46 isAccurate={!periodUpdated}
47 isOpen={openItem === "period"}
48 onToggle={() => handleItemToggle("period")}
49 >
50 <SyncDetails isAccurate={!periodUpdated} platform={details?.currentPeriod} gateway={details?.gatewayPeriod} />
51 </SyncItem>
52 <SyncItem
53 id="created"
54 title="Date created"
55 isAccurate={!createdAtUpdated}
56 isOpen={openItem === "created"}
57 onToggle={() => handleItemToggle("created")}
58 >
59 <SyncDetails isAccurate={!createdAtUpdated} platform={details?.currentCreatedAt} gateway={details?.gatewayCreatedAt} />
60 </SyncItem>
61 <SyncItem
62 id="payments"
63 title="Subscription payments"
64 isAccurate={!paymentsUpdated}
65 isOpen={openItem === "payments"}
66 onToggle={() => handleItemToggle("payments")}
67 >
68 {transactions?.map((transaction, index) => (<SyncPaymentDetails key={transaction?.id ?? `sync-payment-${index}`} isAccurate={!paymentsUpdated} payment={transaction} />))}
69 </SyncItem>
70 </div>
71 );
72 }
73
74 /**
75 * @since 4.8.0
76 */
77 type SyncItemProps = {
78 id: string;
79 title: string;
80 isAccurate: boolean | null;
81 isOpen: boolean;
82 onToggle: () => void;
83 children: React.ReactNode;
84 }
85
86 /**
87 * @since 4.8.0
88 */
89 function SyncItem({ id, title, isAccurate, isOpen, onToggle, children }: SyncItemProps) {
90 return (
91 <div id={id} className={styles.item}>
92 <div className={styles.itemContent}>
93 <div className={styles.itemHeader}>
94 <div>
95 <span
96 className={classnames(styles.itemPill, {
97 [styles.itemAccurate]: isAccurate,
98 })}
99 role="status"
100 aria-label={isAccurate ? __('ACCURATE', 'give') : __('UPDATED', 'give')}
101 >
102 {isAccurate ? __('ACCURATE', 'give') : __('UPDATED', 'give')}
103 </span>
104 <h2 className={styles.itemTitle}>{title}</h2>
105 </div>
106 <button
107 className={styles.itemButton}
108 onClick={onToggle}
109 >
110 {isOpen ? __('Close', 'give') : __('View details', 'give')}
111 </button>
112 </div>
113
114 {isOpen && children}
115 </div>
116 </div>
117 );
118 }
119