PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 2.0.25
Advanced Ads – Ad Manager & AdSense v2.0.25
2.0.25 2.0.24 2.0.23 2.0.22 2.0.21 1.38.0 1.39.0 1.39.1 1.39.2 1.39.3 1.39.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.40.0 1.40.1 1.40.2 1.41.0 1.42.0 1.42.1 1.42.2 1.43.0 1.44.0 1.44.1 1.45.0 1.45.1 1.46.0 1.47.0 1.47.1 1.47.2 1.47.3 1.47.4 1.47.5 1.48.0 1.48.1 1.49.0 1.5.0 1.5.0.1 1.5.1 1.5.2 1.5.2.1 1.5.4 1.5.4.1 1.5.5 1.50.0 1.51.0 1.51.1 1.51.2 1.51.3 1.52.0 1.52.1 1.52.2 1.52.3 1.52.4 1.53.0 1.53.1 1.53.2 1.54.0 1.54.1 1.55.0 1.56.0 1.56.1 1.56.2 1.56.3 1.56.4 1.6 1.6.1 1.6.10 1.6.10.1 1.6.10.2 1.6.11 1.6.11.1 1.6.12 1.6.13 1.6.14 1.6.15 1.6.16 1.6.17 1.6.17.1 1.6.17.2 1.6.2 1.6.2.1 1.6.3 1.6.4 1.6.4.1 1.6.5 1.6.6 1.6.6.1 1.6.7 1.6.7.1 1.6.8 1.6.8.1 1.6.8.2 1.6.8.3 1.6.9 1.6.9.1 1.6.9.2 1.6.9.3 1.6.9.4 1.7 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.1.1 1.7.1.2 1.7.1.3 1.7.1.4 1.7.1.5 1.7.10 trunk 1.7.11 1.0.1 1.7.12 1.0.2 1.7.13 1.0.3 1.7.14 1.1.0 1.7.15 1.1.1 1.7.16 1.1.2 1.7.17 1.1.3 1.7.18 1.10 1.7.19 1.10.1 1.7.2 1.10.10 1.7.2.1 1.10.11 1.7.20 1.10.12 1.7.21 1.10.2 1.7.22 1.10.3 1.7.23 1.10.4 1.7.24 1.10.5 1.7.25 1.10.6 1.7.3 1.10.7 1.7.4 1.10.8 1.7.4.1 1.10.9 1.7.4.2 1.11 1.7.4.3 1.11.1 1.7.4.4 1.11.2 1.7.4.5 1.12 1.7.5 1.13 1.7.5.1 1.13.1 1.7.6 1.13.2 1.7.7 1.13.3 1.7.8 1.13.4 1.7.9 1.13.5 1.7.9.1 1.13.6 1.7.9.2 1.13.7 1.7.9.3 1.13.8 1.8 1.14 1.8.1 1.14.1 1.8.10 1.14.10 1.8.11 1.14.11 1.8.12 1.14.2 1.8.13 1.14.3 1.8.14 1.14.4 1.8.15 1.14.5 1.8.16 1.14.6 1.8.17 1.14.7 1.8.18 1.14.8 1.8.19 1.14.9 1.8.2 1.15 1.8.20 1.16 1.8.21 1.16.1 1.8.22 1.17 1.8.23 1.17.1 1.8.24 1.17.10 1.8.25 1.17.10-rc.1 1.8.26 1.17.11 1.8.27 1.17.12 1.8.28 1.17.12-rc.1 1.8.29 1.17.2 1.8.3 1.17.3 1.8.30 1.17.4 1.8.4 1.17.5 1.8.5 1.17.6 1.8.6 1.17.7 1.8.7 1.17.8 1.8.8 1.17.9 1.8.9 1.17.9-beta.1 1.9 1.18.0 2.0.0 1.19.0 2.0.1 1.19.1 2.0.10 1.2 2.0.11 1.2.1 2.0.12 1.2.2 2.0.13 1.2.3 2.0.14 1.2.4 2.0.15 1.2.5 2.0.16 1.2.6 2.0.17 1.2.7 2.0.18 1.20.0 2.0.19 1.20.0-rc.1 2.0.2 1.20.0-rc.2 2.0.20 1.20.1 2.0.3 1.20.2 2.0.4 1.20.3 2.0.5 1.21.0 2.0.6 1.21.1 2.0.7 1.22.0 2.0.8 1.22.1 2.0.9 1.22.2 1.23.0 1.23.1 1.23.2 1.24.0 1.24.1 1.24.2 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.29.0 1.29.1 1.3 1.3.1 1.3.10 1.3.11 1.3.12 1.3.13 1.3.14 1.3.15 1.3.16 1.3.17 1.3.18 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.30.0 1.30.1 1.30.2 1.30.2-rc.1 1.30.3 1.30.4 1.30.4-rc.1 1.30.5 1.31.0 1.31.1 1.32.0 1.32.0-rc.1 1.33.0 1.33.1 1.33.2 1.34.0 1.35.0 1.35.1 1.36.0 1.36.1 1.36.2 1.36.3 1.37.0 1.37.1 1.37.2
advanced-ads / src / admin / screen-licenses / components / DownloadActivateButton.jsx
advanced-ads / src / admin / screen-licenses / components Last commit date
AddonRowActions.jsx 1 week ago AddonsList.jsx 1 week ago AllAccessAddonsSummary.jsx 1 week ago AutoUpdateModal.jsx 1 week ago DownloadActivateButton.jsx 1 week ago EmptyState.jsx 1 week ago FeatureList.jsx 1 week ago LicenseField.jsx 1 week ago LicenseItem.jsx 1 week ago LicenseNotices.jsx 1 week ago LicenseStatus.jsx 1 week ago Loader.jsx 1 week ago PricingModal.jsx 1 week ago PricingTable.jsx 1 week ago PricingTableItem.jsx 1 week ago SitesModal.jsx 1 week ago
DownloadActivateButton.jsx
227 lines
1 /**
2 * WordPress Dependencies
3 */
4 import { __ } from '@wordpress/i18n';
5 import { useEffect, useRef, useState } from '@wordpress/element';
6 import { useDispatch, useSelect } from '@wordpress/data';
7 import { store as noticesStore } from '@wordpress/notices';
8
9 /**
10 * Internal Dependencies
11 */
12 import { STORE_NAME } from '@admin/store';
13 import { getManualInstallGuideUrl } from '../addon-catalog';
14 import {
15 activateLicenseOnShop,
16 deactivateLicenseOnSite,
17 extractApiErrorMessage,
18 extractApiMessage,
19 } from '../hooks/licenses-api';
20 import {
21 clearLicenseNoticeDisplayMeta,
22 publishLicenseSuccessNotice,
23 publishLicenseWarningNotice,
24 } from './LicenseNotices';
25
26 const ACTIVATION_NOTICE_ID = 'advanced-ads/license-activation';
27
28 export function DownloadActivateButton( {
29 licenseKey,
30 isActivated = false,
31 canActivate = true,
32 noticesContext,
33 downloadUrl = '',
34 addonId = '',
35 } ) {
36 const [ isSubmitting, setIsSubmitting ] = useState( false );
37 const [ installFailed, setInstallFailed ] = useState( false );
38 const abortRef = useRef( null );
39 const dismissTimerRef = useRef( null );
40 const { createSuccessNotice, createErrorNotice, removeNotice } =
41 useDispatch( noticesStore );
42 const licensesFromStore = useSelect(
43 ( select ) => select( STORE_NAME ).getLicenses(),
44 []
45 );
46
47 useEffect( () => {
48 return () => {
49 if ( abortRef.current ) {
50 abortRef.current.abort();
51 }
52 if ( dismissTimerRef.current ) {
53 clearTimeout( dismissTimerRef.current );
54 }
55 };
56 }, [] );
57
58 function hasNoticeMessage( value ) {
59 return (
60 value !== undefined &&
61 value !== null &&
62 String( value ).trim() !== ''
63 );
64 }
65
66 function showNotice( type, apiMessage ) {
67 removeNotice( ACTIVATION_NOTICE_ID, noticesContext );
68 clearLicenseNoticeDisplayMeta( ACTIVATION_NOTICE_ID );
69
70 if ( type === 'error' ) {
71 const title = __(
72 "Automatic setup didn't complete",
73 'advanced-ads'
74 );
75 const message = hasNoticeMessage( apiMessage )
76 ? String( apiMessage ).trim()
77 : __( 'Failed to activate license.', 'advanced-ads' );
78
79 publishLicenseWarningNotice( createErrorNotice, {
80 id: ACTIVATION_NOTICE_ID,
81 context: noticesContext,
82 title,
83 message,
84 } );
85 } else {
86 const title = __( 'All set', 'advanced-ads' );
87 const message = hasNoticeMessage( apiMessage )
88 ? String( apiMessage ).trim()
89 : __(
90 'Your license and plugin are fully set up and ready to use.',
91 'advanced-ads'
92 );
93 const icon = hasNoticeMessage( apiMessage ) ? 'loading' : 'success';
94
95 publishLicenseSuccessNotice( createSuccessNotice, {
96 id: ACTIVATION_NOTICE_ID,
97 context: noticesContext,
98 title,
99 message,
100 icon,
101 } );
102 }
103
104 if ( dismissTimerRef.current ) {
105 clearTimeout( dismissTimerRef.current );
106 }
107 dismissTimerRef.current = setTimeout( () => {
108 clearLicenseNoticeDisplayMeta( ACTIVATION_NOTICE_ID );
109 removeNotice( ACTIVATION_NOTICE_ID, noticesContext );
110 }, 6500 );
111 }
112
113 async function handleActivate() {
114 if ( isSubmitting || isActivated || ! canActivate ) {
115 return;
116 }
117
118 const utmUrl = `${ advancedAds.endpoints.shopUrl }/?utm_source=advancedads&utm_medium=in-plugin&utm_campaign=a2-in_plugin-licenses_addons-download_activate`;
119 fetch( utmUrl, { mode: 'no-cors', keepalive: true } );
120
121 if ( abortRef.current ) {
122 abortRef.current.abort();
123 }
124
125 const controller = new AbortController();
126 abortRef.current = controller;
127
128 setIsSubmitting( true );
129 setInstallFailed( false );
130
131 try {
132 const result = await activateLicenseOnShop(
133 licenseKey,
134 controller.signal
135 );
136 showNotice( 'success', extractApiMessage( result ) );
137 } catch ( err ) {
138 if ( err?.name === 'AbortError' ) {
139 return;
140 }
141 const errorMessage = extractApiErrorMessage( err );
142 setInstallFailed( true );
143 showNotice( 'error', errorMessage );
144 } finally {
145 setIsSubmitting( false );
146 }
147 }
148
149 async function handleDeactivate() {
150 if ( isSubmitting || ! isActivated || ! licenseKey ) {
151 return;
152 }
153
154 setIsSubmitting( true );
155
156 try {
157 await deactivateLicenseOnSite( licenseKey, licensesFromStore );
158 } catch ( err ) {
159 const errorMessage =
160 err instanceof Error
161 ? err.message
162 : __( 'Deactivation failed.', 'advanced-ads' );
163 const noticeId = 'advanced-ads/license-deactivation';
164
165 removeNotice( noticeId, noticesContext );
166 publishLicenseWarningNotice( createErrorNotice, {
167 id: noticeId,
168 context: noticesContext,
169 message: errorMessage,
170 } );
171 } finally {
172 setIsSubmitting( false );
173 }
174 }
175
176 // eslint-disable-next-line no-unused-vars
177 function handleManualInstall() {
178 const packageUrl = String( downloadUrl ?? '' ).trim();
179 const guideUrl = getManualInstallGuideUrl( addonId );
180
181 if ( packageUrl ) {
182 window.open( packageUrl, '_blank', 'noopener,noreferrer' );
183 }
184
185 window.open( guideUrl, '_blank', 'noopener,noreferrer' );
186 }
187
188 if ( isActivated ) {
189 return (
190 <div className="flex flex-col items-end">
191 <button
192 type="button"
193 className="button advads-button-secondary whitespace-nowrap px-4 py-2"
194 onClick={ handleDeactivate }
195 disabled={ isSubmitting }
196 aria-busy={ isSubmitting }
197 >
198 { isSubmitting
199 ? __( 'Deactivating…', 'advanced-ads' )
200 : __( 'Deactivate', 'advanced-ads' ) }
201 </button>
202 </div>
203 );
204 }
205
206 const isDisabled = isSubmitting || ! licenseKey || ! canActivate;
207
208 const buttonLabel = isSubmitting
209 ? __( 'Activating…', 'advanced-ads' )
210 : __( 'Download and activate', 'advanced-ads' );
211
212 return (
213 <div className="flex flex-col items-end gap-2">
214 <button
215 type="button"
216 className="button advads-button-neutral whitespace-nowrap px-4 py-2"
217 onClick={ handleActivate }
218 disabled={ isDisabled }
219 aria-busy={ isSubmitting }
220 aria-disabled={ isDisabled }
221 >
222 { buttonLabel }
223 </button>
224 </div>
225 );
226 }
227