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