PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 2.0.26
Advanced Ads – Ad Manager & AdSense v2.0.26
2.0.26 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 / hooks / licenses-api.js
advanced-ads / src / admin / screen-licenses / hooks Last commit date
licenses-api.js 4 weeks ago useLicenseData.js 4 weeks ago
licenses-api.js
274 lines
1 import { dispatch, select } from '@wordpress/data';
2
3 import { STORE_NAME } from '@admin/store';
4 import { licensesApiRequest } from '../utils';
5
6 const API_PATH = '/advanced-ads/v1/licenses';
7 const AUTOUPDATE_API_PATH = '/advanced-ads/v1/plugin-autoupdate';
8
9 export function extractApiMessage( payload ) {
10 if (
11 ! payload ||
12 typeof payload !== 'object' ||
13 Array.isArray( payload )
14 ) {
15 return null;
16 }
17
18 const message = payload.message ?? payload.data?.message;
19
20 if ( message === undefined || message === null ) {
21 return null;
22 }
23
24 const text = String( message ).trim();
25 if ( text === '' ) {
26 return null;
27 }
28
29 return text;
30 }
31
32 /**
33 * Pull a user-facing message from a failed apiFetch / REST error.
34 *
35 * @param {unknown} err Error from apiFetch.
36 * @return {string|null} Message text or null when none is available.
37 */
38 export function extractApiErrorMessage( err ) {
39 if ( ! err || typeof err !== 'object' ) {
40 return null;
41 }
42
43 const dataMessage = err.data?.message;
44 if ( dataMessage !== undefined && dataMessage !== null ) {
45 const text = String( dataMessage ).trim();
46 if ( text !== '' ) {
47 return text;
48 }
49 }
50
51 if ( err instanceof Error ) {
52 const text = String( err.message ?? '' ).trim();
53 if ( text !== '' ) {
54 return text;
55 }
56 }
57
58 const message = err.message;
59 if ( message !== undefined && message !== null ) {
60 const text = String( message ).trim();
61 if ( text !== '' ) {
62 return text;
63 }
64 }
65
66 return null;
67 }
68
69 function safeObject( val ) {
70 return val && typeof val === 'object' ? val : {};
71 }
72
73 /**
74 * Normalize GET/POST licenses REST payload (array legacy or object with map).
75 *
76 * @param {Array|Object} payload REST licenses payload.
77 * @return {{ licenses: Array, appliedAddonKeyMap: Object, autoUpdateStates: Object, addonInstallStates: Object }} Normalized licenses response object.
78 */
79 export function normalizeLicensesResponse( payload ) {
80 if ( Array.isArray( payload ) ) {
81 return {
82 licenses: payload,
83 appliedAddonKeyMap: {},
84 currentActiveLicenses: '',
85 autoUpdateStates: {},
86 addonInstallStates: {},
87 lastSyncAt: 0,
88 expiryNoticeFlags: {},
89 };
90 }
91
92 return {
93 licenses: Array.isArray( payload?.licenses ) ? payload.licenses : [],
94 appliedAddonKeyMap: safeObject( payload?.appliedAddonKeyMap ),
95 currentActiveLicenses: String( payload?.currentActiveLicenses ?? '' ),
96 autoUpdateStates: safeObject( payload?.autoUpdateStates ),
97 addonInstallStates: safeObject( payload?.addonInstallStates ),
98 lastSyncAt: payload?.lastSyncAt ?? 0,
99 expiryNoticeFlags: safeObject( payload?.expiryNoticeFlags ),
100 };
101 }
102
103 function applyLicensesPayloadToStore( payload ) {
104 const {
105 licenses,
106 appliedAddonKeyMap,
107 currentActiveLicenses,
108 autoUpdateStates,
109 addonInstallStates,
110 lastSyncAt,
111 expiryNoticeFlags,
112 } = normalizeLicensesResponse( payload );
113 dispatch( STORE_NAME ).setLicenses(
114 licenses,
115 appliedAddonKeyMap,
116 autoUpdateStates,
117 addonInstallStates,
118 lastSyncAt,
119 expiryNoticeFlags,
120 currentActiveLicenses
121 );
122 return licenses;
123 }
124
125 /**
126 * Toggle per-plugin auto-update (advanced-ads-{addon}-autoupdate).
127 *
128 * @param {string} addonId Short id (pro, tracking, …) or "main" for base plugin.
129 * @param {string} state "on" or "off".
130 */
131 export async function togglePluginAutoUpdate( addonId, state ) {
132 const response = await licensesApiRequest( AUTOUPDATE_API_PATH, {
133 method: 'POST',
134 data: {
135 addonId: addonId || 'main',
136 state,
137 },
138 } );
139
140 if (
141 response?.autoUpdateStates &&
142 typeof response.autoUpdateStates === 'object'
143 ) {
144 dispatch( STORE_NAME ).setAutoUpdateStates( response.autoUpdateStates );
145 }
146
147 return response;
148 }
149
150 // ----------- Internal Api call --------------- //
151
152 export function fetchLicenses() {
153 return licensesApiRequest( API_PATH, { method: 'GET' } );
154 }
155
156 export function saveLicenses(
157 licenses,
158 {
159 activate = false,
160 activatingLicenseKey = '',
161 activatingAddonId = '',
162 installOnly = false,
163 deactivatingAddonId = '',
164 deactivatingLicenseKey = '',
165 signal = undefined,
166 } = {}
167 ) {
168 return licensesApiRequest( API_PATH, {
169 method: 'POST',
170 signal,
171 data: {
172 licenses: Array.isArray( licenses ) ? licenses : [],
173 activate,
174 activatingLicenseKey: activatingLicenseKey || '',
175 activatingAddonId: activatingAddonId || '',
176 installOnly,
177 deactivatingAddonId: deactivatingAddonId || '',
178 deactivatingLicenseKey: deactivatingLicenseKey || '',
179 },
180 } );
181 }
182
183 /**
184 * Remove one license from the current site (Tracking, Pro, All Access, …).
185 *
186 * @param {string} licenseKey License key for the card being deactivated.
187 * @param {Array} licenses Current license list for POST body.
188 */
189 export async function deactivateLicenseOnSite( licenseKey, licenses ) {
190 const saved = await saveLicenses( licenses, {
191 deactivatingLicenseKey: licenseKey,
192 } );
193 applyLicensesPayloadToStore( saved );
194 return saved;
195 }
196
197 /**
198 * Apply license and activate one All Access add-on on this site.
199 *
200 * @param {string} licenseKey All Access license key.
201 * @param {string} addonId Short add-on id (pro, tracking, …).
202 * @param {Array} licenses Current license list for POST body.
203 */
204 export async function activateAddonFromLicense(
205 licenseKey,
206 addonId,
207 licenses
208 ) {
209 const saved = await saveLicenses( licenses, {
210 activatingLicenseKey: licenseKey,
211 activatingAddonId: addonId,
212 } );
213 applyLicensesPayloadToStore( saved );
214 return saved;
215 }
216
217 /**
218 * Deactivate one All Access add-on plugin on this site (keeps package on disk).
219 *
220 * @param {string} addonId Short add-on id (pro, tracking, …).
221 * @param {Array} licenses Current license list for POST body.
222 */
223 export async function deactivateAddonFromLicense( addonId, licenses ) {
224 const saved = await saveLicenses( licenses, {
225 deactivatingAddonId: addonId,
226 } );
227 applyLicensesPayloadToStore( saved );
228 return saved;
229 }
230
231 // ----------- Store Helpers --------------- //
232
233 export async function initLicenses() {
234 const payload = await fetchLicenses();
235 applyLicensesPayloadToStore( payload );
236 }
237
238 export async function setLicensesAndSave( licenses, options = {} ) {
239 dispatch( STORE_NAME ).setLicenses( licenses );
240 const saved = await saveLicenses( licenses, options );
241 applyLicensesPayloadToStore( saved );
242 }
243
244 export async function addLicenseAndSave( license ) {
245 dispatch( STORE_NAME ).addLicense( license );
246 const current = select( STORE_NAME ).getLicenses();
247 const saved = await saveLicenses( current );
248 applyLicensesPayloadToStore( saved );
249 }
250
251 export async function removeLicenseAndSave( licenseId ) {
252 dispatch( STORE_NAME ).removeLicense( licenseId );
253 const current = select( STORE_NAME ).getLicenses();
254 const saved = await saveLicenses( current );
255 applyLicensesPayloadToStore( saved );
256 }
257
258 /**
259 * Activate a license on the shop via plugin REST (shop-first on the server).
260 *
261 * @param {string} licenseKey License key.
262 * @param {AbortSignal} [signal] Optional abort signal.
263 * @return {Object} Licenses REST payload.
264 */
265 export async function activateLicenseOnShop( licenseKey, signal ) {
266 const licenses = select( STORE_NAME ).getLicenses();
267 const saved = await saveLicenses( licenses, {
268 activatingLicenseKey: licenseKey,
269 signal,
270 } );
271 applyLicensesPayloadToStore( saved );
272 return saved;
273 }
274