PluginProbe
WPVR – 360 Panorama viewer and Virtual Tour Builder for WordPress / 8.5.69
WPVR – 360 Panorama viewer and Virtual Tour Builder for WordPress v8.5.69
9.1.3 9.1.2 9.1.1 9.1.0 9.0.3 9.0.2 9.0.1 9.0.0 8.5.79 8.5.78 8.5.77 8.5.76 8.5.75 8.5.74 8.5.73 8.5.72 8.5.71 8.5.70 8.5.69 8.5.68 8.5.35 8.5.36 8.5.37 8.5.38 8.5.39 All 222 releases
wpvr / vendor / linno / telemetry / src / Deactivation.php

Deactivation.php in WPVR – 360 Panorama viewer and Virtual Tour Builder for WordPress 8.5.69, at vendor/linno/telemetry/src/Deactivation.php

456 lines 20.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace LinnoSDK\Telemetry;
3
4 class Deactivation {
5 /**
6 * Client instance
7 *
8 * @var Client
9 */
10 private Client $client;
11
12 /**
13 * Text domain for i18n
14 *
15 * @var string
16 */
17 private string $textDomain;
18
19 /**
20 * Constructor
21 *
22 * @param Client $client
23 */
24 public function __construct( Client $client ) {
25 $this->client = $client;
26 $this->textDomain = $client->get_text_domain();
27 }
28
29 /**
30 * Initialize the deactivation functionality
31 *
32 * @return void
33 */
34 public function init(): void {
35 add_action( 'admin_footer', array( $this, 'add_deactivation_feedback_modal' ) );
36 add_filter( 'plugin_action_links_' . plugin_basename($this->client->get_plugin_file()), array( $this, 'filter_plugin_action_links' ) );
37 add_action( 'wp_ajax_' . $this->client->get_slug() . '_submit_deactivation_reason', array( $this, 'submit_deactivation_reason' ) );
38 }
39
40 /**
41 * Filter the plugin action links
42 *
43 * @param array $links
44 * @return array
45 */
46 public function filter_plugin_action_links( array $links ): array {
47 if ( isset( $links['deactivate'] ) ) {
48 $links['deactivate'] = str_replace( '<a', '<a class="' . $this->client->get_slug() . '-deactivation-link"', $links['deactivate'] );
49 }
50
51 return $links;
52 }
53
54 /**
55 * Add the deactivation feedback modal to the admin footer
56 *
57 * @return void
58 */
59 public function add_deactivation_feedback_modal(): void {
60 global $pagenow;
61
62 if ( 'plugins.php' !== $pagenow ) {
63 return;
64 }
65
66 $this->deactivation_modal_styles();
67 $reasons = $this->get_uninstall_reasons();
68 ?>
69 <div class="wd-dr-modal" id="<?php echo $this->client->get_slug(); ?>-wd-dr-modal">
70 <div class="wd-dr-modal-wrap">
71 <div class="wd-dr-modal-header">
72 <h3><?php _e( 'Goodbyes are always hard. If you have a moment, please let us know how we can improve.', $this->textDomain ); ?></h3>
73 </div>
74
75 <div class="wd-dr-modal-body">
76 <ul class="wd-de-reasons">
77 <?php foreach ( $reasons as $reason ) { ?>
78 <li data-placeholder="<?php echo esc_attr( $reason['placeholder'] ); ?>">
79 <label>
80 <input type="radio" name="selected-reason" value="<?php echo $reason['id']; ?>">
81 <div class="wd-de-reason-icon"><?php echo $reason['icon']; ?></div>
82 <div class="wd-de-reason-text"><?php echo $reason['text']; ?></div>
83 </label>
84 </li>
85 <?php } ?>
86 </ul>
87 <div class="wd-dr-modal-reason-input"><textarea></textarea></div>
88 </div>
89
90 <div class="wd-dr-modal-footer">
91 <a href="#" class="dont-bother-me wd-dr-button-secondary"><?php _e( 'Skip & Deactivate', $this->textDomain ); ?></a>
92 <button class="wd-dr-button-secondary wd-dr-cancel-modal"><?php _e( 'Cancel', $this->textDomain ); ?></button>
93 <button class="wd-dr-submit-modal"><?php _e( 'Submit & Deactivate', $this->textDomain ); ?></button>
94 </div>
95 </div>
96 </div>
97
98 <script type="text/javascript">
99 (function($) {
100 $(function() {
101 var modal = $('#<?php echo $this->client->get_slug(); ?>-wd-dr-modal');
102 var deactivateLink = '';
103
104 // Open modal
105 $('#the-list').on('click', 'a.<?php echo $this->client->get_slug(); ?>-deactivation-link', function(e) {
106 e.preventDefault();
107
108 modal.addClass('modal-active');
109 deactivateLink = $(this).attr('href');
110 modal.find('a.dont-bother-me').attr('href', deactivateLink).css('float', 'left');
111 });
112
113 // Close modal; Cancel
114 modal.on('click', 'button.wd-dr-cancel-modal', function(e) {
115 e.preventDefault();
116 modal.removeClass('modal-active');
117 });
118
119 // Reason change
120 modal.on('click', 'input[type="radio"]', function() {
121 var parent = $(this).parents('li');
122 modal.find('li').removeClass('wd-de-reason-selected');
123 parent.addClass('wd-de-reason-selected');
124 $('.wd-dr-modal-reason-input').show();
125 $('.wd-dr-modal-reason-input textarea').attr('placeholder', parent.data('placeholder')).focus();
126 });
127
128 // Submit response
129 modal.on('click', 'button.wd-dr-submit-modal', function(e) {
130 e.preventDefault();
131
132 var button = $(this);
133
134 if (button.hasClass('disabled')) {
135 return;
136 }
137
138 var $radio = $('input[type="radio"]:checked', modal);
139 var $input = $('.wd-dr-modal-reason-input textarea');
140
141 $.ajax({
142 url: ajaxurl,
143 type: 'POST',
144 data: {
145 nonce: '<?php echo wp_create_nonce( $this->client->get_slug() . '-deactivation-nonce' ); ?>',
146 action: '<?php echo $this->client->get_slug(); ?>_submit_deactivation_reason',
147 reason_id: (0 === $radio.length) ? 'none' : $radio.val(),
148 reason_info: (0 !== $input.length) ? $input.val().trim() : ''
149 },
150 beforeSend: function() {
151 button.addClass('disabled');
152 button.text('<?php _e( "Processing...", $this->textDomain ); ?>');
153 },
154 complete: function() {
155 window.location.href = deactivateLink;
156 }
157 });
158 });
159 });
160 }(jQuery));
161 </script>
162 <?php
163 }
164
165 /**
166 * Deactivation modal styles
167 */
168 private function deactivation_modal_styles() {
169 ?>
170 <style type="text/css">
171 .wd-dr-modal {
172 position: fixed;
173 z-index: 99999;
174 top: 0;
175 right: 0;
176 bottom: 0;
177 left: 0;
178 background: rgba(0, 0, 0, 0.5);
179 display: none;
180 box-sizing: border-box;
181 overflow: scroll;
182 }
183
184 .wd-dr-modal * {
185 box-sizing: border-box;
186 }
187
188 .wd-dr-modal.modal-active {
189 display: block;
190 }
191
192 .wd-dr-modal-wrap {
193 max-width: 870px;
194 width: 100%;
195 position: relative;
196 margin: 10% auto;
197 background: #fff;
198 }
199
200 .wd-dr-modal-header {
201 border-bottom: 1px solid #E8E8E8;
202 padding: 20px 20px 18px 20px;
203 }
204
205 .wd-dr-modal-header h3 {
206 line-height: 1.8;
207 margin: 0;
208 color: #4A5568;
209 }
210
211 .wd-dr-modal-body {
212 padding: 5px 20px 20px 20px;
213 }
214
215 .wd-dr-modal-body .reason-input {
216 margin-top: 5px;
217 margin-left: 20px;
218 }
219
220 .wd-dr-modal-footer {
221 border-top: 1px solid #E8E8E8;
222 padding: 20px;
223 text-align: right;
224 }
225
226 ul.wd-de-reasons {
227 display: flex;
228 margin: 0 -5px 0 -5px;
229 padding: 15px 0 20px 0;
230 flex-wrap: wrap;
231 }
232
233 ul.wd-de-reasons li {
234 padding: 0 5px;
235 margin: 0 0 10px 0;
236 width: 25%;
237 }
238
239 ul.wd-de-reasons label {
240 position: relative;
241 border: 1px solid #E8E8E8;
242 border-radius: 4px;
243 display: block;
244 text-align: center;
245 height: 100%;
246 padding: 15px 3px 8px 3px;
247 }
248
249 ul.wd-de-reasons label:after {
250 width: 0;
251 height: 0;
252 border-left: 8px solid transparent;
253 border-right: 8px solid transparent;
254 border-top: 10px solid #3B86FF;
255 position: absolute;
256 left: 50%;
257 top: 100%;
258 margin-left: -8px;
259 content: '';
260 display: none;
261 }
262
263 ul.wd-de-reasons label input[type="radio"] {
264 position: absolute;
265 left: 0;
266 right: 0;
267 visibility: hidden;
268 }
269
270 .wd-de-reason-text {
271 color: #4A5568;
272 font-size: 13px;
273 }
274
275 .wd-de-reason-icon {
276 margin-bottom: 7px;
277 }
278
279 ul.wd-de-reasons li.wd-de-reason-selected label {
280 background-color: #3B86FF;
281 border-color: #3B86FF;
282 }
283
284 li.wd-de-reason-selected .wd-de-reason-icon svg,
285 li.wd-de-reason-selected .wd-de-reason-icon svg g {
286 fill: #fff;
287 }
288
289 li.wd-de-reason-selected .wd-de-reason-text {
290 color: #fff;
291 }
292
293 ul.wd-de-reasons li.wd-de-reason-selected label:after {
294 display: block;
295 }
296
297 .wd-dr-modal-reason-input {
298 margin-bottom: 15px;
299 display: none;
300 }
301
302 .wd-dr-modal-reason-input textarea {
303 background: #FAFAFA;
304 border: 1px solid #287EB8;
305 border-radius: 4px;
306 width: 100%;
307 height: 100px;
308 color: #524242;
309 font-size: 13px;
310 line-height: 1.4;
311 padding: 11px 15px;
312 resize: none;
313 }
314
315 .wd-dr-modal-reason-input textarea:focus {
316 outline: 0 none;
317 box-shadow: 0 0 0;
318 }
319
320 .wd-dr-button-secondary,
321 .wd-dr-button-secondary:hover {
322 border: 1px solid #EBEBEB;
323 border-radius: 3px;
324 font-size: 13px;
325 line-height: 1.5;
326 color: #718096;
327 padding: 5px 12px;
328 cursor: pointer;
329 background-color: transparent;
330 text-decoration: none;
331 }
332
333 .wd-dr-submit-modal,
334 .wd-dr-submit-modal:hover {
335 border: 1px solid #3B86FF;
336 background-color: #3B86FF;
337 border-radius: 3px;
338 font-size: 13px;
339 line-height: 1.5;
340 color: #fff;
341 padding: 5px 12px;
342 cursor: pointer;
343 margin-left: 4px;
344 }
345 </style>
346 <?php
347 }
348
349 /**
350 * Submit the deactivation reason
351 *
352 * @return void
353 */
354 public function submit_deactivation_reason(): void {
355 if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['nonce'] ), $this->client->get_slug() . '-deactivation-nonce' ) ) {
356 wp_send_json_error( 'Nonce verification failed' );
357 }
358
359 if ( ! current_user_can( 'manage_options' ) ) {
360 wp_send_json_error( 'You are not allowed for this task' );
361 }
362
363 $reason_id = isset( $_POST['reason_id'] ) ? sanitize_text_field( wp_unslash( $_POST['reason_id'] ) ) : 'none';
364 $reason_info = isset( $_POST['reason_info'] ) ? sanitize_text_field( wp_unslash( $_POST['reason_info'] ) ) : '';
365 $this->track_deactivation( $reason_id, $reason_info );
366
367 wp_send_json_success();
368 }
369
370 /**
371 * Track the deactivation event
372 *
373 * @param string $reason_id
374 * @param string $reason_info
375 * @return void
376 */
377 private function track_deactivation( string $reason_id, string $reason_info ): void {
378 $payload = array(
379 'site_url' => get_site_url(),
380 'reason' => $reason_id,
381 'reason_key' => $reason_id,
382 'reason_info' => $reason_info,
383 );
384
385 // Plugins hook here to add any extra properties (e.g. time_since_install_minutes).
386 // reason and reason_key are global — plugins should not override them here.
387 $payload = apply_filters(
388 $this->client->get_slug() . '_deactivation_payload',
389 $payload,
390 $reason_id,
391 $reason_info
392 );
393
394 $this->client->track_lifecycle_event( 'activation/plugin_deactivated', $payload );
395
396 // Set a transient to indicate that a deactivation event has been sent from the feedback form.
397 // This prevents the generic deactivation hook from sending another one.
398 set_transient( $this->client->get_slug() . '_deactivation_event_sent', 'yes', MINUTE_IN_SECONDS );
399 }
400
401 /**
402 * Get the uninstall reasons
403 *
404 * @return array
405 */
406 private function get_uninstall_reasons(): array {
407 $reasons = [
408 [
409 'id' => 'could-not-understand',
410 'text' => __( "Couldn't understand", 'text-domain' ),
411 'placeholder' => __( 'Would you like us to assist you?', 'text-domain' ),
412 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="23" height="23" viewBox="0 0 23 23"><g fill="none"><g fill="#3B86FF"><path d="M11.5 0C17.9 0 23 5.1 23 11.5 23 17.9 17.9 23 11.5 23 10.6 23 9.6 22.9 8.8 22.7L8.8 22.6C9.3 22.5 9.7 22.3 10 21.9 10.3 21.6 10.4 21.3 10.4 20.9 10.8 21 11.1 21 11.5 21 16.7 21 21 16.7 21 11.5 21 6.3 16.7 2 11.5 2 6.3 2 2 6.3 2 11.5 2 13 2.3 14.3 2.9 15.6 2.7 16 2.4 16.3 2.2 16.8L2.1 17.1 2.1 17.3C2 17.5 2 17.7 2 18 0.7 16.1 0 13.9 0 11.5 0 5.1 5.1 0 11.5 0ZM6 13.6C6 13.7 6.1 13.8 6.1 13.9 6.3 14.5 6.2 15.7 6.1 16.4 6.1 16.6 6 16.9 6 17.1 6 17.1 6.1 17.1 6.1 17.1 7.1 16.9 8.2 16 9.3 15.5 9.8 15.2 10.4 15 10.9 15 11.2 15 11.4 15 11.6 15.2 11.9 15.4 12.1 16 11.6 16.4 11.5 16.5 11.3 16.6 11.1 16.7 10.5 17 9.9 17.4 9.3 17.7 9 17.9 9 18.1 9.1 18.5 9.2 18.9 9.3 19.4 9.3 19.8 9.4 20.3 9.3 20.8 9 21.2 8.8 21.5 8.5 21.6 8.1 21.7 7.9 21.8 7.6 21.9 7.3 21.9L6.5 22C6.3 22 6 21.9 5.8 21.9 5 21.8 4.4 21.5 3.9 20.9 3.3 20.4 3.1 19.6 3 18.8L3 18.5C3 18.2 3 17.9 3.1 17.7L3.1 17.6C3.2 17.1 3.5 16.7 3.7 16.3 4 15.9 4.2 15.4 4.3 15 4.4 14.6 4.4 14.5 4.6 14.2 4.6 13.9 4.7 13.7 4.9 13.6 5.2 13.2 5.7 13.2 6 13.6ZM11.7 11.2C13.1 11.2 14.3 11.7 15.2 12.9 15.3 13 15.4 13.1 15.4 13.2 15.4 13.4 15.3 13.8 15.2 13.8 15 13.9 14.9 13.8 14.8 13.7 14.6 13.5 14.4 13.2 14.1 13.1 13.5 12.6 12.8 12.3 12 12.2 10.7 12.1 9.5 12.3 8.4 12.8 8.3 12.8 8.2 12.8 8.1 12.8 7.9 12.8 7.8 12.4 7.8 12.2 7.7 12.1 7.8 11.9 8 11.8 8.4 11.7 8.8 11.5 9.2 11.4 10 11.2 10.9 11.1 11.7 11.2ZM16.3 5.9C17.3 5.9 18 6.6 18 7.6 18 8.5 17.3 9.3 16.3 9.3 15.4 9.3 14.7 8.5 14.7 7.6 14.7 6.6 15.4 5.9 16.3 5.9ZM8.3 5C9.2 5 9.9 5.8 9.9 6.7 9.9 7.7 9.2 8.4 8.2 8.4 7.3 8.4 6.6 7.7 6.6 6.7 6.6 5.8 7.3 5 8.3 5Z"/></g></g></svg>',
413 ],
414 [
415 'id' => 'found-better-plugin',
416 'text' => __( 'Found a better plugin', 'text-domain' ),
417 'placeholder' => __( 'Which plugin?', 'text-domain' ),
418 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="23" height="23" viewBox="0 0 23 23"><g fill="none"><g fill="#3B86FF"><path d="M17.1 14L22.4 19.3C23.2 20.2 23.2 21.5 22.4 22.4 21.5 23.2 20.2 23.2 19.3 22.4L19.3 22.4 14 17.1C15.3 16.3 16.3 15.3 17.1 14L17.1 14ZM8.6 0C13.4 0 17.3 3.9 17.3 8.6 17.3 13.4 13.4 17.2 8.6 17.2 3.9 17.2 0 13.4 0 8.6 0 3.9 3.9 0 8.6 0ZM8.6 2.2C5.1 2.2 2.2 5.1 2.2 8.6 2.2 12.2 5.1 15.1 8.6 15.1 12.2 15.1 15.1 12.2 15.1 8.6 15.1 5.1 12.2 2.2 8.6 2.2ZM8.6 3.6L8.6 5C6.6 5 5 6.6 5 8.6L5 8.6 3.6 8.6C3.6 5.9 5.9 3.6 8.6 3.6L8.6 3.6Z"/></g></g></svg>',
419 ],
420 [
421 'id' => 'not-have-that-feature',
422 'text' => __( 'Missing a specific feature', 'text-domain' ),
423 'placeholder' => __( 'Could you tell us more about that feature?', 'text-domain' ),
424 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="17" viewBox="0 0 24 17"><g fill="none"><g fill="#3B86FF"><path d="M19.4 0C19.7 0.6 19.8 1.3 19.8 2 19.8 3.2 19.4 4.4 18.5 5.3 17.6 6.2 16.5 6.7 15.2 6.7 15.2 6.7 15.2 6.7 15.2 6.7 14 6.7 12.9 6.2 12 5.3 11.2 4.4 10.7 3.3 10.7 2 10.7 1.3 10.8 0.6 11.1 0L7.6 0 7 0 6.5 0 6.5 5.7C6.3 5.6 5.9 5.3 5.6 5.1 5 4.6 4.3 4.3 3.5 4.3 3.5 4.3 3.5 4.3 3.4 4.3 1.6 4.4 0 5.9 0 7.9 0 8.6 0.2 9.2 0.5 9.7 1.1 10.8 2.2 11.5 3.5 11.5 4.3 11.5 5 11.2 5.6 10.8 6 10.5 6.3 10.3 6.5 10.2L6.5 10.2 6.5 17 6.5 17 7 17 7.6 17 22.5 17C23.3 17 24 16.3 24 15.5L24 0 19.4 0Z"/></g></g></svg>',
425 ],
426 [
427 'id' => 'is-not-working',
428 'text' => __( 'Not working', 'text-domain' ),
429 'placeholder' => __( 'Could you tell us a bit more whats not working?', 'text-domain' ),
430 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="23" height="23" viewBox="0 0 23 23"><g fill="none"><g fill="#3B86FF"><path d="M11.5 0C17.9 0 23 5.1 23 11.5 23 17.9 17.9 23 11.5 23 5.1 23 0 17.9 0 11.5 0 5.1 5.1 0 11.5 0ZM11.8 14.4C11.2 14.4 10.7 14.8 10.7 15.4 10.7 16 11.2 16.4 11.8 16.4 12.4 16.4 12.8 16 12.8 15.4 12.8 14.8 12.4 14.4 11.8 14.4ZM12 7C10.1 7 9.1 8.1 9 9.6L10.5 9.6C10.5 8.8 11.1 8.3 11.9 8.3 12.7 8.3 13.2 8.8 13.2 9.5 13.2 10.1 13 10.4 12.2 10.9 11.3 11.4 10.9 12 11 12.9L11 13.4 12.5 13.4 12.5 13C12.5 12.4 12.7 12.1 13.5 11.6 14.4 11.1 14.9 10.4 14.9 9.4 14.9 8 13.7 7 12 7Z"/></g></g></svg>',
431 ],
432 [
433 'id' => 'looking-for-other',
434 'text' => __( 'Not what I was looking', 'text-domain' ),
435 'placeholder' => __( 'Could you tell us a bit more?', 'text-domain' ),
436 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="17" viewBox="0 0 24 17"><g fill="none"><g fill="#3B86FF"><path d="M23.5 9C23.5 9 23.5 8.9 23.5 8.9 23.5 8.9 23.5 8.9 23.5 8.9 23.4 8.6 23.2 8.3 23 8 22.2 6.5 20.6 3.7 19.8 2.6 18.8 1.3 17.7 0 16.1 0 15.7 0 15.3 0.1 14.9 0.2 13.8 0.6 12.6 1.2 12.3 2.7L11.7 2.7C11.4 1.2 10.2 0.6 9.1 0.2 8.7 0.1 8.3 0 7.9 0 6.3 0 5.2 1.3 4.2 2.6 3.4 3.7 1.8 6.5 1 8 0.8 8.3 0.6 8.6 0.5 8.9 0.5 8.9 0.5 8.9 0.5 8.9 0.5 8.9 0.5 9 0.5 9 0.2 9.7 0 10.5 0 11.3 0 14.4 2.5 17 5.5 17 7.3 17 8.8 16.1 9.8 14.8L14.2 14.8C15.2 16.1 16.7 17 18.5 17 21.5 17 24 14.4 24 11.3 24 10.5 23.8 9.7 23.5 9ZM5.5 15C3.6 15 2 13.2 2 11 2 8.8 3.6 7 5.5 7 7.4 7 9 8.8 9 11 9 13.2 7.4 15 5.5 15ZM18.5 15C16.6 15 15 13.2 15 11 15 8.8 16.6 7 18.5 7 20.4 7 22 8.8 22 11 22 13.2 20.4 15 18.5 15Z"/></g></g></svg>',
437 ],
438 [
439 'id' => 'did-not-work-as-expected',
440 'text' => __( "Didn't work as expected", 'text-domain' ),
441 'placeholder' => __( 'What did you expect?', 'text-domain' ),
442 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="23" height="23" viewBox="0 0 23 23"><g fill="none"><g fill="#3B86FF"><path d="M11.5 0C17.9 0 23 5.1 23 11.5 23 17.9 17.9 23 11.5 23 5.1 23 0 17.9 0 11.5 0 5.1 5.1 0 11.5 0ZM11.5 2C6.3 2 2 6.3 2 11.5 2 16.7 6.3 21 11.5 21 16.7 21 21 16.7 21 11.5 21 6.3 16.7 2 11.5 2ZM12.5 12.9L12.7 5 10.2 5 10.5 12.9 12.5 12.9ZM11.5 17.4C12.4 17.4 13 16.8 13 15.9 13 15 12.4 14.4 11.5 14.4 10.6 14.4 10 15 10 15.9 10 16.8 10.6 17.4 11.5 17.4Z"/></g></g></svg>',
443 ],
444 [
445 'id' => 'other',
446 'text' => __( 'Others', 'text-domain' ),
447 'placeholder' => __( 'Could you tell us a bit more?', 'text-domain' ),
448 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="23" viewBox="0 0 24 6"><g fill="none"><g fill="#3B86FF"><path d="M3 0C4.7 0 6 1.3 6 3 6 4.7 4.7 6 3 6 1.3 6 0 4.7 0 3 0 1.3 1.3 0 3 0ZM12 0C13.7 0 15 1.3 15 3 15 4.7 13.7 6 12 6 10.3 6 9 4.7 9 3 9 1.3 10.3 0 12 0ZM21 0C22.7 0 24 1.3 24 3 24 4.7 22.7 6 21 6 19.3 6 18 4.7 18 3 18 1.3 19.3 0 21 0Z"/></g></g></svg>',
449 ],
450 ];
451
452 return apply_filters( $this->client->get_slug() . '_telemetry_deactivation_reasons', $reasons );
453 }
454 }
455
456