PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.10.8
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.10.8
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 3.10.4 All 148 releases
visualizer / vendor / codeinwp / themeisle-sdk / src / Modules / Uninstall_feedback.php

Uninstall_feedback.php in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.10.8, at vendor/codeinwp/themeisle-sdk/src/Modules/Uninstall_feedback.php

861 lines 24.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * The deactivate feedback model class for ThemeIsle SDK
4 *
5 * @package ThemeIsleSDK
6 * @subpackage Feedback
7 * @copyright Copyright (c) 2017, Marius Cristea
8 * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9 * @since 1.0.0
10 */
11
12 namespace ThemeisleSDK\Modules;
13
14 use ThemeisleSDK\Common\Abstract_Module;
15 use ThemeisleSDK\Product;
16
17 // Exit if accessed directly.
18 if ( ! defined( 'ABSPATH' ) ) {
19 exit;
20 }
21
22 /**
23 * Uninstall feedback module for ThemeIsle SDK.
24 */
25 class Uninstall_Feedback extends Abstract_Module {
26 /**
27 * How many seconds before the deactivation window is triggered for themes?
28 *
29 * @var int Number of days.
30 */
31 const AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS = 3;
32 /**
33 * How many days before the deactivation window pops up again for the theme?
34 *
35 * @var int Number of days.
36 */
37 const PAUSE_DEACTIVATE_WINDOW_DAYS = 100;
38 /**
39 * Where to send the data.
40 *
41 * @var string Endpoint url.
42 */
43 const FEEDBACK_ENDPOINT = 'https://api.themeisle.com/tracking/uninstall';
44
45 /**
46 * Default options for plugins.
47 *
48 * @var array $options_plugin The main options list for plugins.
49 */
50 private $options_plugin = array(
51 'I found a better plugin' => array(
52 'id' => 3,
53 'type' => 'text',
54 'placeholder' => 'What\'s the plugin\'s name?',
55 ),
56 'I could not get the plugin to work' => array(
57 'type' => 'textarea',
58 'placeholder' => 'What problem are you experiencing?',
59 'id' => 4,
60 ),
61 'I no longer need the plugin' => array(
62 'id' => 5,
63 'type' => 'textarea',
64 'placeholder' => 'If you could improve one thing about our product, what would it be?',
65 ),
66 'It\'s a temporary deactivation. I\'m just debugging an issue.' => array(
67 'type' => 'textarea',
68 'placeholder' => 'What problem are you experiencing?',
69 'id' => 6,
70 ),
71 );
72 /**
73 * Default options for theme.
74 *
75 * @var array $options_theme The main options list for themes.
76 */
77 private $options_theme = array(
78 'I don\'t know how to make it look like demo' => array(
79 'id' => 7,
80 ),
81 'It lacks options' => array(
82 'placeholder' => 'What option is missing?',
83 'type' => 'text',
84 'id' => 8,
85 ),
86 'Is not working with a plugin that I need' => array(
87 'id' => 9,
88 'type' => 'text',
89 'placeholder' => 'What is the name of the plugin',
90 ),
91 'I want to try a new design, I don\'t like {theme} style' => array(
92 'id' => 10,
93 ),
94 );
95 /**
96 * Default other option.
97 *
98 * @var array $other The other option
99 */
100 private $other = array(
101 'Other' => array(
102 'id' => 999,
103 'type' => 'textarea',
104 'placeholder' => 'What can we do better?',
105 ),
106 );
107 /**
108 * Default heading for plugin.
109 *
110 * @var string $heading_plugin The heading of the modal
111 */
112 private $heading_plugin = 'What\'s wrong?';
113 /**
114 * Default heading for theme.
115 *
116 * @var string $heading_theme The heading of the modal
117 */
118 private $heading_theme = 'What does not work for you in {theme}?';
119 /**
120 * Default submit button action text.
121 *
122 * @var string $button_submit The text of the deactivate button
123 */
124 private $button_submit = 'Submit &amp; Deactivate';
125 /**
126 * Default cancel button.
127 *
128 * @var string $button_cancel The text of the cancel button
129 */
130 private $button_cancel = 'Skip &amp; Deactivate';
131
132 /**
133 * Loads the additional resources
134 */
135 public function load_resources() {
136 $screen = get_current_screen();
137
138 if ( ! $screen || ! in_array( $screen->id, array( 'theme-install', 'plugins' ) ) ) {
139 return;
140 }
141
142 $this->add_feedback_popup_style();
143
144 if ( $this->product->get_type() === 'theme' ) {
145 $this->add_theme_feedback_drawer_js();
146 $this->render_theme_feedback_popup();
147
148 return;
149 }
150 $this->add_plugin_feedback_popup_js();
151 $this->render_plugin_feedback_popup();
152 }
153
154 /**
155 * Render theme feedback drawer.
156 */
157 private function render_theme_feedback_popup() {
158 $heading = str_replace( '{theme}', $this->product->get_name(), $this->heading_theme );
159 $button_submit = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit', 'Submit' );
160 $options = $this->options_theme;
161 $options = $this->randomize_options( apply_filters( $this->product->get_key() . '_feedback_deactivate_options', $options ) );
162 $info_disclosure_link = '<a href="#" class="info-disclosure-link">' . apply_filters( $this->product->get_slug() . '_themeisle_sdk_info_collect_cta', 'What info do we collect?' ) . '</a>';
163
164 $options += $this->other;
165
166 ?>
167 <div class="ti-theme-uninstall-feedback-drawer ti-feedback">
168 <div class="popup--header">
169 <h5><?php echo wp_kses( $heading, array( 'span' => true ) ); ?> </h5>
170 <button class="toggle"><span>&times;</span></button>
171 </div><!--/.popup--header-->
172 <div class="popup--body">
173 <?php $this->render_options_list( $options ); ?>
174 </div><!--/.popup--body-->
175 <div class="popup--footer">
176 <div class="actions">
177 <?php
178 echo wp_kses_post( $info_disclosure_link );
179 echo wp_kses_post( $this->get_disclosure_labels() );
180 echo '<div class="buttons">';
181 echo get_submit_button( //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, Function has an internal sanitization.
182 $button_submit,
183 'secondary',
184 $this->product->get_key() . 'ti-deactivate-yes',
185 false,
186 array(
187 'data-after-text' => $button_submit,
188 'disabled' => true,
189 )
190 );
191 echo '</div>';
192 ?>
193 </div><!--/.actions-->
194 </div><!--/.popup--footer-->
195 </div>
196 <?php
197 }
198
199 /**
200 * Add feedback styles.
201 */
202 private function add_feedback_popup_style() {
203 ?>
204 <style>
205 .ti-feedback {
206 background: #fff;
207 max-width: 400px;
208 z-index: 10000;
209 box-shadow: 0 0 15px -5px rgba(0, 0, 0, .5);
210 transition: all .3s ease-out;
211 }
212
213
214 .ti-feedback .popup--header {
215 position: relative;
216 background-color: #23A1CE;
217 }
218
219 .ti-feedback .popup--header h5 {
220 margin: 0;
221 font-size: 16px;
222 padding: 15px;
223 color: #fff;
224 font-weight: 600;
225 text-align: center;
226 letter-spacing: .3px;
227 }
228
229 .ti-feedback .popup--body {
230 padding: 15px;
231 }
232
233 .ti-feedback .popup--form {
234 margin: 0;
235 font-size: 13px;
236 }
237
238 .ti-feedback .popup--form input[type="radio"] {
239 <?php echo is_rtl() ? 'margin: 0 0 0 10px;' : 'margin: 0 10px 0 0;'; ?>
240 }
241
242 .ti-feedback .popup--form input[type="radio"]:checked ~ textarea {
243 display: block;
244 }
245
246 .ti-feedback .popup--form textarea {
247 width: 100%;
248 margin: 10px 0 0;
249 display: none;
250 max-height: 150px;
251 }
252
253 .ti-feedback li {
254 display: flex;
255 align-items: center;
256 margin-bottom: 15px;
257 flex-wrap: wrap;
258 }
259
260 .ti-feedback li label {
261 max-width: 90%;
262 }
263
264 .ti-feedback li:last-child {
265 margin-bottom: 0;
266 }
267
268 .ti-feedback .popup--footer {
269 padding: 0 15px 15px;
270 }
271
272 .ti-feedback .actions {
273 display: flex;
274 flex-wrap: wrap;
275 }
276
277 .info-disclosure-link {
278 width: 100%;
279 margin-bottom: 15px;
280 }
281
282 .ti-feedback .info-disclosure-content {
283 max-height: 0;
284 overflow: hidden;
285 width: 100%;
286 transition: .3s ease;
287 }
288
289 .ti-feedback .info-disclosure-content.active {
290 max-height: 300px;
291 }
292
293 .ti-feedback .info-disclosure-content p {
294 margin: 0;
295 }
296
297 .ti-feedback .info-disclosure-content ul {
298 margin: 10px 0;
299 border-radius: 3px;
300 }
301
302 .ti-feedback .info-disclosure-content ul li {
303 display: flex;
304 align-items: center;
305 justify-content: space-between;
306 margin-bottom: 0;
307 padding: 5px 0;
308 border-bottom: 1px solid #ccc;
309 }
310
311 .ti-feedback .buttons {
312 display: flex;
313 width: 100%;
314 }
315
316 .ti-feedback .buttons input:last-child {
317 <?php echo is_rtl() ? 'margin-right: auto;' : 'margin-left: auto;'; ?>
318 }
319
320 .ti-theme-uninstall-feedback-drawer {
321 border-top-left-radius: 5px;
322 position: fixed;
323 top: 100%;
324 right: 15px;
325 }
326
327 .ti-theme-uninstall-feedback-drawer.active {
328 transform: translateY(-100%);
329 }
330
331 .ti-theme-uninstall-feedback-drawer .popup--header {
332 border-top-left-radius: 5px;
333 }
334
335 .ti-theme-uninstall-feedback-drawer .popup--header .toggle {
336 position: absolute;
337 padding: 3px 0;
338 width: 30px;
339 top: -26px;
340 right: 0;
341 cursor: pointer;
342 border-top-left-radius: 5px;
343 border-top-right-radius: 5px;
344 font-size: 20px;
345 background-color: #23A1CE;
346 color: #fff;
347 border: none;
348 line-height: 20px;
349 }
350
351 .ti-theme-uninstall-feedback-drawer .toggle span {
352 margin: 0;
353 display: inline-block;
354 }
355
356 .ti-theme-uninstall-feedback-drawer:not(.active) .toggle span {
357 transform: rotate(45deg);
358 }
359
360 .ti-theme-uninstall-feedback-drawer .popup--header .toggle:hover {
361 background-color: #1880a5;
362 }
363
364
365 .ti-plugin-uninstall-feedback-popup .popup--header:before {
366 content: "";
367 display: block;
368 position: absolute;
369 top: 50%;
370 transform: translateY(-50%);
371 <?php
372 echo is_rtl() ?
373 'right: -10px;
374 border-top: 20px solid transparent;
375 border-left: 20px solid #23A1CE;
376 border-bottom: 20px solid transparent;' :
377 'left: -10px;
378 border-top: 20px solid transparent;
379 border-right: 20px solid #23A1CE;
380 border-bottom: 20px solid transparent;';
381 ?>
382 }
383
384 .ti-plugin-uninstall-feedback-popup {
385 display: none;
386 position: absolute;
387 white-space: normal;
388 width: 400px;
389 <?php echo is_rtl() ? 'right: calc( 100% + 15px );' : 'left: calc( 100% + 15px );'; ?>
390 top: -15px;
391 }
392
393 .ti-plugin-uninstall-feedback-popup.sending-feedback .popup--body i {
394 animation: rotation 2s infinite linear;
395 display: block;
396 float: none;
397 align-items: center;
398 width: 100%;
399 margin: 0 auto;
400 height: 100%;
401 background: transparent;
402 padding: 0;
403 }
404
405 .ti-plugin-uninstall-feedback-popup.sending-feedback .popup--body i:before {
406 padding: 0;
407 background: transparent;
408 box-shadow: none;
409 color: #b4b9be
410 }
411
412
413 .ti-plugin-uninstall-feedback-popup.active {
414 display: block;
415 }
416
417 tr[data-plugin^="<?php echo esc_attr( $this->product->get_slug() ); ?>"] .deactivate {
418 position: relative;
419 }
420
421 body.ti-feedback-open .ti-feedback-overlay {
422 content: "";
423 display: block;
424 background-color: rgba(0, 0, 0, 0.5);
425 top: 0;
426 bottom: 0;
427 right: 0;
428 left: 0;
429 z-index: 10000;
430 position: fixed;
431 }
432
433 @media (max-width: 768px) {
434 .ti-plugin-uninstall-feedback-popup {
435 position: fixed;
436 max-width: 100%;
437 margin: 0 auto;
438 left: 50%;
439 top: 50px;
440 transform: translateX(-50%);
441 }
442
443 .ti-plugin-uninstall-feedback-popup .popup--header:before {
444 display: none;
445 }
446 }
447 </style>
448 <?php
449 }
450
451 /**
452 * Theme feedback drawer JS.
453 */
454 private function add_theme_feedback_drawer_js() {
455 $key = $this->product->get_key();
456 ?>
457 <script type="text/javascript" id="ti-deactivate-js">
458 (function ($) {
459 $(document).ready(function () {
460 setTimeout(function () {
461 $('.ti-theme-uninstall-feedback-drawer').addClass('active');
462 }, <?php echo absint( self::AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS * 1000 ); ?> );
463
464 $('.ti-theme-uninstall-feedback-drawer .toggle').on('click', function (e) {
465 e.preventDefault();
466 $('.ti-theme-uninstall-feedback-drawer').toggleClass('active');
467 });
468
469 $('.info-disclosure-link').on('click', function (e) {
470 e.preventDefault();
471 $('.info-disclosure-content').toggleClass('active');
472 });
473
474 $('.ti-theme-uninstall-feedback-drawer input[type="radio"]').on('change', function () {
475 var radio = $(this);
476 if (radio.parent().find('textarea').length > 0 &&
477 radio.parent().find('textarea').val().length === 0) {
478 $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').attr('disabled', 'disabled');
479 radio.parent().find('textarea').on('keyup', function (e) {
480 if ($(this).val().length === 0) {
481 $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').attr('disabled', 'disabled');
482 } else {
483 $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').removeAttr('disabled');
484 }
485 });
486 } else {
487 $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').removeAttr('disabled');
488 }
489 });
490
491 $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').on('click', function (e) {
492 e.preventDefault();
493 e.stopPropagation();
494
495 var selectedOption = $(
496 '.ti-theme-uninstall-feedback-drawer input[name="ti-deactivate-option"]:checked');
497 $.post(ajaxurl, {
498 'action': '<?php echo esc_attr( $key ) . '_uninstall_feedback'; ?>',
499 'nonce': '<?php echo esc_attr( wp_create_nonce( (string) __CLASS__ ) ); ?>',
500 'id': selectedOption.parent().attr('ti-option-id'),
501 'msg': selectedOption.parent().find('textarea').val(),
502 'type': 'theme',
503 'key': '<?php echo esc_attr( $key ); ?>'
504 });
505 $('.ti-theme-uninstall-feedback-drawer').fadeOut();
506 });
507 });
508 })(jQuery);
509
510 </script>
511 <?php
512 do_action( $this->product->get_key() . '_uninstall_feedback_after_js' );
513 }
514
515 /**
516 * Render the options list.
517 *
518 * @param array $options the options for the feedback form.
519 */
520 private function render_options_list( $options ) {
521 $key = $this->product->get_key();
522 $inputs_row_map = [
523 'text' => 1,
524 'textarea' => 2,
525 ];
526 ?>
527 <ul class="popup--form">
528 <?php foreach ( $options as $title => $attributes ) { ?>
529 <li ti-option-id="<?php echo esc_attr( $attributes['id'] ); ?>">
530 <input type="radio" name="ti-deactivate-option" id="<?php echo esc_attr( $key . $attributes['id'] ); ?>">
531 <label for="<?php echo esc_attr( $key . $attributes['id'] ); ?>">
532 <?php echo esc_attr( str_replace( '{theme}', $this->product->get_name(), $title ) ); ?>
533 </label>
534 <?php
535 if ( array_key_exists( 'type', $attributes ) ) {
536 $placeholder = array_key_exists( 'placeholder', $attributes ) ? $attributes['placeholder'] : '';
537 echo '<textarea width="100%" rows="' . esc_attr( $inputs_row_map[ $attributes['type'] ] ) . '" name="comments" placeholder="' . esc_attr( $placeholder ) . '"></textarea>';
538 }
539 ?>
540 </li>
541 <?php } ?>
542 </ul>
543 <?php
544 }
545
546 /**
547 * Render plugin feedback popup.
548 */
549 private function render_plugin_feedback_popup() {
550 $button_cancel = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_cancel', $this->button_cancel );
551 $button_submit = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit', $this->button_submit );
552 $options = $this->randomize_options( apply_filters( $this->product->get_key() . '_feedback_deactivate_options', $this->options_plugin ) );
553 $info_disclosure_link = '<a href="#" class="info-disclosure-link">' . apply_filters( $this->product->get_slug() . '_themeisle_sdk_info_collect_cta', 'What info do we collect?' ) . '</a>';
554
555 $options += $this->other;
556 ?>
557 <div class="ti-plugin-uninstall-feedback-popup ti-feedback" id="<?php echo esc_attr( $this->product->get_slug() . '_uninstall_feedback_popup' ); ?>">
558 <div class="popup--header">
559 <h5><?php echo wp_kses( $this->heading_plugin, array( 'span' => true ) ); ?> </h5>
560 </div><!--/.popup--header-->
561 <div class="popup--body">
562 <?php $this->render_options_list( $options ); ?>
563 </div><!--/.popup--body-->
564 <div class="popup--footer">
565 <div class="actions">
566 <?php
567 echo wp_kses_post( $info_disclosure_link );
568 echo wp_kses_post( $this->get_disclosure_labels() );
569 echo '<div class="buttons">';
570 echo get_submit_button( //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, Function internals are escaped.
571 $button_cancel,
572 'secondary',
573 $this->product->get_key() . 'ti-deactivate-no',
574 false
575 );
576 echo get_submit_button( //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, Function internals are escaped.
577 $button_submit,
578 'primary',
579 $this->product->get_key() . 'ti-deactivate-yes',
580 false,
581 array(
582 'data-after-text' => $button_submit,
583 'disabled' => true,
584 )
585 );
586 echo '</div>';
587 ?>
588 </div><!--/.actions-->
589 </div><!--/.popup--footer-->
590 </div>
591
592 <?php
593 }
594
595 /**
596 * Add plugin feedback popup JS
597 */
598 private function add_plugin_feedback_popup_js() {
599 $popup_id = '#' . $this->product->get_slug() . '_uninstall_feedback_popup';
600 $key = $this->product->get_key();
601 ?>
602 <script type="text/javascript" id="ti-deactivate-js">
603 (function ($) {
604 $(document).ready(function () {
605 var targetElement = 'tr[data-plugin^="<?php echo esc_attr( $this->product->get_slug() ); ?>/"] span.deactivate a';
606 var redirectUrl = $(targetElement).attr('href');
607 if ($('.ti-feedback-overlay').length === 0) {
608 $('body').prepend('<div class="ti-feedback-overlay"></div>');
609 }
610 $('<?php echo esc_attr( $popup_id ); ?> ').appendTo($(targetElement).parent());
611
612 $(targetElement).on('click', function (e) {
613 e.preventDefault();
614 $('<?php echo esc_attr( $popup_id ); ?> ').addClass('active');
615 $('body').addClass('ti-feedback-open');
616 $('.ti-feedback-overlay').on('click', function () {
617 $('<?php echo esc_attr( $popup_id ); ?> ').removeClass('active');
618 $('body').removeClass('ti-feedback-open');
619 });
620 });
621
622 $('<?php echo esc_attr( $popup_id ); ?> .info-disclosure-link').on('click', function (e) {
623 e.preventDefault();
624 $(this).parent().find('.info-disclosure-content').toggleClass('active');
625 });
626
627 $('<?php echo esc_attr( $popup_id ); ?> input[type="radio"]').on('change', function () {
628 var radio = $(this);
629 if (radio.parent().find('textarea').length > 0 &&
630 radio.parent().find('textarea').val().length === 0) {
631 $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').attr('disabled', 'disabled');
632 radio.parent().find('textarea').on('keyup', function (e) {
633 if ($(this).val().length === 0) {
634 $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').attr('disabled', 'disabled');
635 } else {
636 $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').removeAttr('disabled');
637 }
638 });
639 } else {
640 $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').removeAttr('disabled');
641 }
642 });
643
644 $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-no').on('click', function (e) {
645 e.preventDefault();
646 e.stopPropagation();
647 $(targetElement).unbind('click');
648 $('body').removeClass('ti-feedback-open');
649 $('<?php echo esc_attr( $popup_id ); ?>').remove();
650 if (redirectUrl !== '') {
651 location.href = redirectUrl;
652 }
653 });
654
655 $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').on('click', function (e) {
656 e.preventDefault();
657 e.stopPropagation();
658 $(targetElement).unbind('click');
659 var selectedOption = $(
660 '<?php echo esc_attr( $popup_id ); ?> input[name="ti-deactivate-option"]:checked');
661 var data = {
662 'action': '<?php echo esc_attr( $key ) . '_uninstall_feedback'; ?>',
663 'nonce': '<?php echo esc_attr( wp_create_nonce( (string) __CLASS__ ) ); ?>',
664 'id': selectedOption.parent().attr('ti-option-id'),
665 'msg': selectedOption.parent().find('textarea').val(),
666 'type': 'plugin',
667 'key': '<?php echo esc_attr( $key ); ?>'
668 };
669 $.ajax({
670 type: 'POST',
671 url: ajaxurl,
672 data: data,
673 complete() {
674 $('body').removeClass('ti-feedback-open');
675 $('<?php echo esc_attr( $popup_id ); ?>').remove();
676 if (redirectUrl !== '') {
677 location.href = redirectUrl;
678 }
679 },
680 beforeSend() {
681 $('<?php echo esc_attr( $popup_id ); ?>').addClass('sending-feedback');
682 $('<?php echo esc_attr( $popup_id ); ?> .popup--footer').remove();
683 $('<?php echo esc_attr( $popup_id ); ?> .popup--body').html('<i class="dashicons dashicons-update-alt"></i>');
684 }
685 });
686 });
687 });
688 })(jQuery);
689
690 </script>
691 <?php
692 do_action( $this->product->get_key() . '_uninstall_feedback_after_js' );
693 }
694
695 /**
696 * Get the disclosure labels markup.
697 *
698 * @return string
699 */
700 private function get_disclosure_labels() {
701 $disclosure_new_labels = apply_filters( $this->product->get_slug() . '_themeisle_sdk_disclosure_content_labels', [], $this->product );
702 $disclosure_labels = array_merge(
703 [
704 'title' => 'Below is a detailed view of all data that ThemeIsle will receive if you fill in this survey. No email address or IP addresses are transmitted after you submit the survey.',
705 'items' => [
706 sprintf( '%s %s version %s %s %s %s', '<strong>', ucwords( $this->product->get_type() ), '</strong>', '<code>', $this->product->get_version(), '</code>' ),
707 sprintf( '%sCurrent website:%s %s %s %s', '<strong>', '</strong>', '<code>', get_site_url(), '</code>' ),
708 sprintf( '%sUsage time:%s %s %s%s', '<strong>', '</strong>', '<code>', ( time() - $this->product->get_install_time() ), 's</code>' ),
709 sprintf( '%s Uninstall reason %s %s Selected reason from the above survey %s ', '<strong>', '</strong>', '<i>', '</i>' ),
710 ],
711 ],
712 $disclosure_new_labels
713 );
714
715 $info_disclosure_content = '<div class="info-disclosure-content"><p>' . wp_kses_post( $disclosure_labels['title'] ) . '</p><ul>';
716 foreach ( $disclosure_labels['items'] as $disclosure_item ) {
717 $info_disclosure_content .= sprintf( '<li>%s</li>', wp_kses_post( $disclosure_item ) );
718 }
719 $info_disclosure_content .= '</ul></div>';
720
721 return $info_disclosure_content;
722 }
723
724 /**
725 * Randomizes the options array.
726 *
727 * @param array $options The options array.
728 */
729 public function randomize_options( $options ) {
730 $new = array();
731 $keys = array_keys( $options );
732 shuffle( $keys );
733
734 foreach ( $keys as $key ) {
735 $new[ $key ] = $options[ $key ];
736 }
737
738 return $new;
739 }
740
741 /**
742 * Called when the deactivate button is clicked.
743 */
744 public function post_deactivate() {
745 check_ajax_referer( (string) __CLASS__, 'nonce' );
746
747 $this->post_deactivate_or_cancel();
748
749 if ( empty( $_POST['id'] ) ) {
750
751 wp_send_json( [] );
752
753 return;
754 }
755 $this->call_api(
756 array(
757 'type' => 'deactivate',
758 'id' => sanitize_key( $_POST['id'] ),
759 'comment' => isset( $_POST['msg'] ) ? sanitize_textarea_field( $_POST['msg'] ) : '',
760 )
761 );
762 wp_send_json( [] );
763
764 }
765
766 /**
767 * Called when the deactivate/cancel button is clicked.
768 */
769 private function post_deactivate_or_cancel() {
770 if ( ! isset( $_POST['type'] ) || ! isset( $_POST['key'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing, Nonce already present in caller function.
771 return;
772 }
773 if ( 'theme' !== $_POST['type'] ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing, Nonce already present in caller function.
774 return;
775 }
776
777 set_transient( 'ti_sdk_pause_' . sanitize_text_field( $_POST['key'] ), true, self::PAUSE_DEACTIVATE_WINDOW_DAYS * DAY_IN_SECONDS );//phpcs:ignore WordPress.Security.NonceVerification.Missing, Nonce already present in caller function.
778
779 }
780
781 /**
782 * Calls the API
783 *
784 * @param array $attributes The attributes of the post body.
785 *
786 * @return bool Is the request succesfull?
787 */
788 protected function call_api( $attributes ) {
789 $slug = $this->product->get_slug();
790 $version = $this->product->get_version();
791 $attributes['slug'] = $slug;
792 $attributes['version'] = $version;
793 $attributes['url'] = get_site_url();
794 $attributes['active_time'] = ( time() - $this->product->get_install_time() );
795
796 $response = wp_remote_post(
797 self::FEEDBACK_ENDPOINT,
798 array(
799 'body' => $attributes,
800 )
801 );
802
803 return is_wp_error( $response );
804 }
805
806 /**
807 * Should we load this object?.
808 *
809 * @param Product $product Product object.
810 *
811 * @return bool Should we load the module?
812 */
813 public function can_load( $product ) {
814 if ( $this->is_from_partner( $product ) ) {
815 return false;
816 }
817 if ( $product->is_theme() && ( false !== get_transient( 'ti_sdk_pause_' . $product->get_key(), false ) ) ) {
818 return false;
819 }
820
821 if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
822 return true;
823 }
824 global $pagenow;
825
826 if ( ! isset( $pagenow ) || empty( $pagenow ) ) {
827 return false;
828 }
829
830 if ( $product->is_plugin() && 'plugins.php' !== $pagenow ) {
831 return false;
832
833 }
834 if ( $product->is_theme() && 'theme-install.php' !== $pagenow ) {
835 return false;
836 }
837
838 return true;
839 }
840
841 /**
842 * Loads module hooks.
843 *
844 * @param Product $product Product details.
845 *
846 * @return Uninstall_Feedback Current module instance.
847 */
848 public function load( $product ) {
849
850 if ( apply_filters( $product->get_key() . '_hide_uninstall_feedback', false ) ) {
851 return;
852 }
853
854 $this->product = $product;
855 add_action( 'admin_head', array( $this, 'load_resources' ) );
856 add_action( 'wp_ajax_' . $this->product->get_key() . '_uninstall_feedback', array( $this, 'post_deactivate' ) );
857
858 return $this;
859 }
860 }
861