| 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 |
|
| 366 |
$this->track_deactivation( $reason_id, $reason_info ); |
| 367 |
|
| 368 |
wp_send_json_success(); |
| 369 |
} |
| 370 |
|
| 371 |
/** |
| 372 |
* Track the deactivation event |
| 373 |
* |
| 374 |
* @param string $reason_id |
| 375 |
* @param string $reason_info |
| 376 |
* @return void |
| 377 |
*/ |
| 378 |
private function track_deactivation( string $reason_id, string $reason_info ): void { |
| 379 |
$payload = array( |
| 380 |
'site_url' => get_site_url(), |
| 381 |
'reason' => $reason_id, |
| 382 |
'reason_key' => $reason_id, |
| 383 |
'reason_info' => $reason_info, |
| 384 |
); |
| 385 |
|
| 386 |
// Plugins hook here to add any extra properties (e.g. time_since_install_minutes). |
| 387 |
// reason and reason_key are global — plugins should not override them here. |
| 388 |
$payload = apply_filters( |
| 389 |
$this->client->get_slug() . '_deactivation_payload', |
| 390 |
$payload, |
| 391 |
$reason_id, |
| 392 |
$reason_info |
| 393 |
); |
| 394 |
|
| 395 |
$this->client->track_lifecycle_event( 'activation/plugin_deactivated', $payload ); |
| 396 |
|
| 397 |
// Set a transient to indicate that a deactivation event has been sent from the feedback form. |
| 398 |
// This prevents the generic deactivation hook from sending another one. |
| 399 |
set_transient( $this->client->get_slug() . '_deactivation_event_sent', 'yes', MINUTE_IN_SECONDS ); |
| 400 |
} |
| 401 |
|
| 402 |
/** |
| 403 |
* Get the uninstall reasons |
| 404 |
* |
| 405 |
* @return array |
| 406 |
*/ |
| 407 |
private function get_uninstall_reasons(): array { |
| 408 |
$reasons = [ |
| 409 |
[ |
| 410 |
'id' => 'could-not-understand', |
| 411 |
'text' => __( "Couldn't understand", 'text-domain' ), |
| 412 |
'placeholder' => __( 'Would you like us to assist you?', 'text-domain' ), |
| 413 |
'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>', |
| 414 |
], |
| 415 |
[ |
| 416 |
'id' => 'found-better-plugin', |
| 417 |
'text' => __( 'Found a better plugin', 'text-domain' ), |
| 418 |
'placeholder' => __( 'Which plugin?', 'text-domain' ), |
| 419 |
'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>', |
| 420 |
], |
| 421 |
[ |
| 422 |
'id' => 'not-have-that-feature', |
| 423 |
'text' => __( 'Missing a specific feature', 'text-domain' ), |
| 424 |
'placeholder' => __( 'Could you tell us more about that feature?', 'text-domain' ), |
| 425 |
'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>', |
| 426 |
], |
| 427 |
[ |
| 428 |
'id' => 'is-not-working', |
| 429 |
'text' => __( 'Not working', 'text-domain' ), |
| 430 |
'placeholder' => __( 'Could you tell us a bit more whats not working?', 'text-domain' ), |
| 431 |
'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>', |
| 432 |
], |
| 433 |
[ |
| 434 |
'id' => 'looking-for-other', |
| 435 |
'text' => __( 'Not what I was looking', 'text-domain' ), |
| 436 |
'placeholder' => __( 'Could you tell us a bit more?', 'text-domain' ), |
| 437 |
'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>', |
| 438 |
], |
| 439 |
[ |
| 440 |
'id' => 'did-not-work-as-expected', |
| 441 |
'text' => __( "Didn't work as expected", 'text-domain' ), |
| 442 |
'placeholder' => __( 'What did you expect?', 'text-domain' ), |
| 443 |
'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>', |
| 444 |
], |
| 445 |
[ |
| 446 |
'id' => 'other', |
| 447 |
'text' => __( 'Others', 'text-domain' ), |
| 448 |
'placeholder' => __( 'Could you tell us a bit more?', 'text-domain' ), |
| 449 |
'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>', |
| 450 |
], |
| 451 |
]; |
| 452 |
|
| 453 |
return apply_filters( $this->client->get_slug() . '_telemetry_deactivation_reasons', $reasons ); |
| 454 |
} |
| 455 |
} |
| 456 |
|
| 457 |
|