Files
torebki-fabiola.pl/wp-content/plugins/email-subscribers/lite/includes/feedback/class-ig-feedback.php
2026-03-05 13:07:40 +01:00

2002 lines
60 KiB
PHP

<?php
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
if ( ! class_exists( 'IG_Feedback_V_1_2_8' ) ) {
/**
* IG Feedback
*
* The IG Feedback class adds functionality to get quick interactive feedback from users.
* There are different types of feedabck widget like Stars, Emoji, Thubms Up/ Down, Number etc.
*
* @class IG_Feedback_V_1_2_8
* @since 1.0.0
* @copyright Copyright (c) 2019, Icegram
* @license https://opensource.org/licenses/gpl-license GNU Public License
* @package feedback
*/
class IG_Feedback_V_1_2_8 {
/**
* Version of Feedback Library
*
* @since 1.0.13
* @var string
*/
public $version = '1.2.8';
/**
* The API URL where we will send feedback data.
*
* @since 1.0.0
* @var string
*/
public $api_url = 'https://api.icegram.com/store/feedback/'; // Production
/**
* Name for this plugin.
*
* @since 1.0.0
* @var string
*/
public $name;
/**
* Unique slug for this plugin.
*
* @since 1.0.0
* @var string
*/
public $plugin;
/**
* Unique slug for this plugin.
*
* @since 1.0.0
* @var string
*/
public $ajax_action;
/**
* Plugin Abbreviation
*
* @since 1.0.0
* @var string
*/
public $plugin_abbr;
/**
* Enable/Disable Dev Mode
*
* @var bool
*/
public $is_dev_mode = true;
/**
* Set feedback event
*
* @var string
*/
public $event_prefix;
/**
* Footer HTML
*/
public $footer = '<span class="ig-powered-by">Made With&nbsp;💜&nbsp;by&nbsp;<a href="https://www.icegram.com/" target="_blank">Icegram</a></span>';
/**
* Primary class constructor.
*
* @param string $name Plugin name.
* @param string $plugin Plugin slug.
*
* @since 1.0.0
*/
public function __construct( $name = '', $plugin = '', $plugin_abbr = 'ig_fb', $event_prefix = 'igfb.', $is_dev_mode = false ) {
$this->name = $name;
$this->plugin = $plugin;
$this->plugin_abbr = $plugin_abbr;
$this->event_prefix = $event_prefix;
$this->ajax_action = $this->plugin_abbr . '_submit-feedback';
$this->is_dev_mode = $is_dev_mode;
// Don't run deactivation survey on dev sites.
if ( ! $this->can_show_feedback_widget() ) {
return;
}
add_action( 'wp_ajax_' . $this->ajax_action, array( $this, 'submit_feedback' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
/**
* Show 5 star review notice to user
*
* @since 1.0.12
*/
add_action( 'admin_notices', array( &$this, 'show_review_notice' ) );
}
/**
* Ask for user review
*
* @since 1.0.12
*/
public function show_review_notice() {
if ( ! defined( 'DOING_AJAX' ) && is_admin() ) {
$enable_review_notice = apply_filters( $this->plugin_abbr . '_enable_review_notice', true );
$can_ask_user_for_review = true;
if ( $enable_review_notice ) {
$current_user_id = get_current_user_id();
$review_done_option = $this->plugin_abbr . '_feedback_review_done';
$no_bug_option = $this->plugin_abbr . '_feedback_do_not_ask_again';
$already_did_option = $this->plugin_abbr . '_feedback_already_did';
$maybe_later_option = $this->plugin_abbr . '_feedback_maybe_later';
$review_done_time_option = $review_done_option . '_time';
$no_bug_time_option = $no_bug_option . '_time';
$already_did_time_option = $already_did_option . '_time';
$maybe_later_time_option = $maybe_later_option . '_time';
$no_bug_days_before = 1;
$no_bug_value = get_user_meta( $current_user_id, $no_bug_option, true );
$no_bug_time_value = get_user_meta( $current_user_id, $no_bug_time_option, true );
$review_done_value = get_user_meta( $current_user_id, $review_done_option, true );
$review_done_time_value = get_user_meta( $current_user_id, $review_done_time_option, true );
if ( ! empty( $no_bug_time_value ) && 0 !== $no_bug_time_value ) {
$no_bug_time_diff = time() - $no_bug_time_value;
$no_bug_days_before = floor( $no_bug_time_diff / 86400 ); // 86400 seconds == 1 day
}
$already_did_value = get_user_meta( $current_user_id, $already_did_option, true );
$already_did_time_value = get_user_meta( $current_user_id, $already_did_time_option, true );
$maybe_later_days_before = 1;
$maybe_later_value = get_user_meta( $current_user_id, $maybe_later_option, true );
$maybe_later_time_value = get_user_meta( $current_user_id, $maybe_later_time_option, true );
if ( $maybe_later_value && ! empty( $maybe_later_time_value ) && 0 !== $maybe_later_time_value ) {
$maybe_later_time_diff = time() - $maybe_later_time_value;
$maybe_later_days_before = floor( $maybe_later_time_diff / 86400 ); // 86400 seconds == 1 day
}
// Is user fall in love with our plugin in 15 days after when they said may be later?
// But, make sure we are asking user only after 15 days.
// We are good people. Respect the user decision.
if ( $review_done_value || $no_bug_value || $already_did_value || ( $maybe_later_value && $maybe_later_days_before < 15 ) || $already_did_value ) {
$can_ask_user_for_review = false;
}
$review_data = array(
'review_done_value' => $review_done_value,
'review_done_time_value' => $review_done_time_value,
'no_bug_value' => $no_bug_value,
'no_bug_time_value' => $no_bug_time_value,
'maybe_later_value' => $maybe_later_value,
'maybe_later_time_value' => $maybe_later_time_value,
'already_did_value' => $already_did_value,
'already_did_time_value' => $already_did_time_value,
);
$can_ask_user_for_review = apply_filters( $this->plugin_abbr . '_can_ask_user_for_review', $can_ask_user_for_review, $review_data );
if ( $can_ask_user_for_review ) {
$current_page_url = '';
if ( ! empty( $_SERVER['HTTP_HOST'] ) && ! empty( $_SERVER['REQUEST_URI'] ) ) {
$current_page_url = esc_url_raw( '//' . wp_unslash( $_SERVER['HTTP_HOST'] ) . wp_unslash( $_SERVER['REQUEST_URI'] ) );
}
$got_feedback = false;
/************** Update Review Status */
$nonce = ! empty( $_GET['ig_feedback_nonce'] ) ? sanitize_text_field( wp_unslash( $_GET['ig_feedback_nonce'] ) ) : '';
$nonce_verified = wp_verify_nonce( $nonce, 'review' );
$action = '';
if ( $nonce_verified ) {
$action = ! empty( $_GET['ig_feedback_action'] ) ? sanitize_text_field( wp_unslash( $_GET['ig_feedback_action'] ) ) : '';
if ( ! empty( $action ) && $this->is_valid_action( $action ) ) {
update_user_meta( $current_user_id, $action, 1 );
update_user_meta( $current_user_id, $action . '_time', time() );
// Got the review request?
// Redirect them to review page
if ( $action === $review_done_option ) {
$url = ! empty( $_GET['review_url'] ) ? esc_url_raw( wp_unslash( $_GET['review_url'] ) ) : '';
if ( ! empty( $url ) ) {
?>
<meta http-equiv="refresh" content="0; url=<?php echo esc_url( $url ); ?>"/>
<?php
}
}
}
$got_feedback = true;
}
/************** Update Review Status (End) */
if ( ! $got_feedback ) {
$review_url = "https://wordpress.org/support/plugin/{$this->plugin}/reviews/";
$icon_url = plugin_dir_url( __FILE__ ) . 'assets/images/icon-64.png';
/* translators: %s: Plugin name */
$message = __( sprintf( "<span><p>We hope you're enjoying <b>%s</b> plugin! Could you please do us a BIG favor and give us a 5-star rating on WordPress to help us spread the word and boost our motivation?</p>", $this->name ), $this->plugin );
$message_data = array(
'review_url' => $review_url,
'icon_url' => $icon_url,
'message' => $message,
);
$message_data = apply_filters( $this->plugin_abbr . '_review_message_data', $message_data );
$message = ! empty( $message_data['message'] ) ? $message_data['message'] : '';
$review_url = ! empty( $message_data['review_url'] ) ? $message_data['review_url'] : '';
$icon_url = ! empty( $message_data['icon_url'] ) ? $message_data['icon_url'] : '';
$nonce = wp_create_nonce( 'review' );
$review_url = add_query_arg( 'review_url', $review_url, add_query_arg( 'ig_feedback_nonce', $nonce, add_query_arg( 'ig_feedback_action', $review_done_option, $current_page_url ) ) );
$maybe_later_url = add_query_arg( 'ig_feedback_nonce', $nonce, add_query_arg( 'ig_feedback_action', $maybe_later_option, $current_page_url ) );
$already_did_url = add_query_arg( 'ig_feedback_nonce', $nonce, add_query_arg( 'ig_feedback_action', $already_did_option, $current_page_url ) );
$no_bug_url = add_query_arg( 'ig_feedback_nonce', $nonce, add_query_arg( 'ig_feedback_action', $no_bug_option, $current_page_url ) );
?>
<style type="text/css">
.ig-feedback-notice-links li {
display: inline-block;
margin-right: 15px;
}
.ig-feedback-notice-links li a {
display: inline-block;
color: #5850EC;
text-decoration: none;
padding-left: 26px;
position: relative;
}
.ig-feedback-notice {
display: flex;
align-items: center;
}
.ig-feedback-plugin-icon {
float: left;
margin-right: 0.5em;
}
</style>
<?php
echo '<div class="notice notice-success ig-feedback-notice">';
echo '<span class="ig-feedback-plugin-icon"> <img src="' . esc_url( $icon_url ) . '" alt="Logo"/></span>';
echo wp_kses_post( $message );
echo "<ul class='ig-feedback-notice-links'>";
echo sprintf(
'<li><a href="%s" class="px-4 py-2 ml-6 mr-2 align-middle cursor-pointer button button-primary bg-indigo-600" target="_blank" data-rated="' . esc_attr__(
'Thank You :) ',
$this->plugin
) . '"><span class="dashicons dashicons-external"></span>&nbsp;&nbsp;Ok, you deserve it</a></li> <li><a href="%s"><span class="dashicons dashicons-calendar-alt"></span>&nbsp;&nbsp;Maybe later</a></li><li><a href="%s"><span class="dashicons dashicons-smiley"></span>&nbsp;&nbsp;I already did!</a></li><li><a href="%s"><span class="dashicons dashicons-no"></span>&nbsp;&nbsp;Don\'t ask me again</a></li>',
esc_url( $review_url ),
esc_url( $maybe_later_url ),
esc_url( $already_did_url ),
esc_url( $no_bug_url )
);
echo '</ul></span>';
echo '</div>';
}
}
}
}
}
/**
* Is valid action?
*
* @param string $action
*
* @return bool
*
* @since 1.0.14
*/
public function is_valid_action( $action = '' ) {
if ( empty( $action ) ) {
return false;
}
$available_actions = array(
'_feedback_review_done',
'_feedback_already_did',
'_feedback_maybe_later',
'_feedback_do_not_ask_again',
);
foreach ( $available_actions as $available_action ) {
if ( strpos( $action, $available_action ) !== false ) {
return true;
}
}
return false;
}
/**
* Render Deactivation Feedback
*
* @since 1.0.0
*/
public function render_deactivate_feedback() {
add_action( 'admin_print_footer_scripts', array( $this, 'js' ), 20 );
add_action( 'admin_print_scripts', array( $this, 'css' ) );
add_action( 'admin_footer', array( $this, 'modal' ) );
}
/**
* Load Javascripts
*
* @since 1.0.1
*
* @modify 1.1.0
*/
public function enqueue_scripts() {
$can_load = apply_filters( $this->plugin_abbr . '_can_load_sweetalert_js', false );
if ( $can_load ) {
wp_enqueue_script( 'sweetalert', plugin_dir_url( __FILE__ ) . 'assets/js/sweetalert2.min.js', array( 'jquery' ) );
}
}
/**
* Load Styles
*
* @since 1.0.1
*/
public function enqueue_styles() {
$can_load = apply_filters( $this->plugin_abbr . '_can_load_sweetalert_css', false );
if ( $can_load ) {
wp_register_style( "sweetalert_{$this->version}", plugin_dir_url( __FILE__ ) . 'assets/css/sweetalert2.min.css', array(), $this->version );
wp_enqueue_style( "sweetalert_{$this->version}" );
wp_register_style( "animate_{$this->version}", plugin_dir_url( __FILE__ ) . 'assets/css/animate.min.css', array(), $this->version );
wp_enqueue_style( "animate_{$this->version}" );
wp_register_style( "ig-feedback-star-rating_{$this->version}", plugin_dir_url( __FILE__ ) . 'assets/css/star-rating.min.css', array(), $this->version );
wp_enqueue_style( "ig-feedback-star-rating_{$this->version}" );
wp_register_style( "ig-feedback-emoji_{$this->version}", plugin_dir_url( __FILE__ ) . 'assets/css/emoji.min.css', array(), $this->version );
wp_enqueue_style( "ig-feedback-emoji_{$this->version}" );
wp_register_style( "ig-feedback_{$this->version}", plugin_dir_url( __FILE__ ) . 'assets/css/feedback.min.css', array(), $this->version );
wp_enqueue_style( "ig-feedback_{$this->version}" );
}
}
/**
* Prepare Widget Params
*
* @param array $params
*
* @return array
*
* @since 1.0.3
*/
public function prepare_widget_params( $params = array() ) {
$default_params = array(
'event' => 'feedback',
'title' => 'How do you rate ' . $this->plugin,
'position' => 'top-end',
'width' => 300,
'set_transient' => true,
'allowOutsideClick' => false,
'allowEscapeKey' => true,
'showCloseButton' => true,
'confirmButtonText' => 'Ok',
'backdrop' => true,
'delay' => 3, // In Seconds
'consent_text' => 'You are agree to our terms and condition',
'email' => $this->get_contact_email(),
'name' => '',
'consent' => false,
);
$params = wp_parse_args( $params, $default_params );
return $params;
}
/**
* Render Widget
*
* @param array $params
*
* @since 1.0.0
*/
public function render_widget( $params = array() ) {
$params = $this->prepare_widget_params( $params );
$title = $params['title'];
$slug = sanitize_title( $title );
$event = $this->event_prefix . $params['event'];
$html = ! empty( $params['html'] ) ? $params['html'] : '';
?>
<script>
function doSend(rating, details) {
var data = {
action: '<?php echo esc_js( $this->ajax_action ); ?>',
feedback: {
type: '<?php echo esc_js( $params['type'] ); ?>',
slug: '<?php echo esc_js( $slug ); ?>',
title: '<?php echo esc_js( $title ); ?>',
value: rating,
details: details
},
event: '<?php echo esc_js( $event ); ?>',
// Add additional information
misc: {
plugin: '<?php echo esc_js( $this->plugin ); ?>',
plugin_abbr: '<?php echo esc_js( $this->plugin_abbr ); ?>',
is_dev_mode: '<?php echo esc_js( $this->is_dev_mode ); ?>',
set_transient: '<?php echo esc_js( $params['set_transient'] ); ?>'
//system_info: enable_system_info
},
security: '<?php echo esc_js( wp_create_nonce( $this->plugin_abbr . '-admin-ajax-nonce' ) ); ?>'
};
return jQuery.post(ajaxurl, data);
}
function showWidget(delay) {
setTimeout(function () {
Swal.mixin({
footer: '<?php echo wp_kses_post( $this->footer ); ?>',
position: '<?php echo esc_js( $params['position'] ); ?>',
width: <?php echo esc_js( $params['width'] ); ?>,
animation: false,
focusConfirm: false,
allowEscapeKey: '<?php echo esc_js( $params['allowEscapeKey'] ); ?>',
showCloseButton: '<?php echo esc_js( $params['showCloseButton'] ); ?>',
allowOutsideClick: '<?php echo esc_js( $params['allowOutsideClick'] ); ?>',
showLoaderOnConfirm: true,
confirmButtonText: '<?php echo wp_kses_post( $params['confirmButtonText'] ); ?>',
backdrop: '<?php echo (int) esc_js( $params['backdrop'] ); ?>'
}).queue([
{
title: '<p class="ig-feedback-title"><?php echo esc_js( $params['title'] ); ?></p>',
html: '<?php echo wp_kses_post( $html ); ?>',
customClass: {
popup: 'animated fadeInUpBig'
},
onOpen: () => {
var clicked = false;
var selectedReaction = '';
jQuery('.ig-emoji').hover(function () {
reaction = jQuery(this).attr('data-reaction');
jQuery('#emoji-info').text(reaction);
}, function () {
if (!clicked) {
jQuery('#emoji-info').text('');
} else {
jQuery('#emoji-info').text(selectedReaction);
}
});
jQuery('.ig-emoji').on('click', function () {
clicked = true;
jQuery('.ig-emoji').removeClass('active');
jQuery(this).addClass('active');
selectedReaction = jQuery(this).attr('data-reaction');
jQuery('#emoji-info').text(reaction);
});
},
preConfirm: () => {
var rating = jQuery("input[name='rating']:checked").val();
var details = '';
if (rating === undefined) {
Swal.showValidationMessage('Please give your input');
return;
}
return doSend(rating, details);
}
},
]).then(response => {
if (response.hasOwnProperty('value')) {
Swal.fire({
type: 'success',
width: <?php echo esc_js( $params['width'] ); ?>,
title: '<?php echo esc_attr__( 'Thank You!', $this->plugin ); ?>',
showConfirmButton: false,
position: '<?php echo esc_js( $params['position'] ); ?>',
timer: 1500,
animation: false
});
}
});
}, delay * 1000);
}
var delay = <?php echo esc_js( $params['delay'] ); ?>;
showWidget(delay);
</script>
<?php
}
/**
* Render star feedback widget
*
* @param array $params
*
* @since 1.0.1
*/
public function render_stars( $params = array() ) {
ob_start();
?>
<div class="rating">
<!--elements are in reversed order, to allow "previous sibling selectors" in CSS-->
<input class="ratings" type="radio" name="rating" value="5" id="5"><label for="5">☆</label>
<input class="ratings" type="radio" name="rating" value="4" id="4"><label for="4">☆</label>
<input class="ratings" type="radio" name="rating" value="3" id="3"><label for="3">☆</label>
<input class="ratings" type="radio" name="rating" value="2" id="2"><label for="2">☆</label>
<input class="ratings" type="radio" name="rating" value="1" id="1"><label for="1">☆</label>
</div>
<?php
$html = str_replace( array( "\r", "\n" ), '', trim( ob_get_clean() ) );
$params['html'] = $html;
$this->render_widget( $params );
}
/**
* Render Emoji Widget
*
* @param array $params
*
* @since 1.0.1
*/
public function render_emoji( $params = array() ) {
ob_start();
?>
<div class="emoji">
<!--elements are in reversed order, to allow "previous sibling selectors" in CSS-->
<input class="emojis" type="radio" name="rating" value="love" id="5"/><label for="5" class="ig-emoji" data-reaction="Love">😍</label>
<input class="emojis" type="radio" name="rating" value="smile" id="4"/><label for="4" class="ig-emoji" data-reaction="Smile">😊</label>
<input class="emojis" type="radio" name="rating" value="neutral" id="3"/><label for="3" class="ig-emoji" data-reaction="Neutral">😐</label>
<input class="emojis" type="radio" name="rating" value="sad" id="1"/><label for="2" class="ig-emoji" data-reaction="Sad">😠</label>
<input class="emojis" type="radio" name="rating" value="angry" id="1"/><label for="1" class="ig-emoji" data-reaction="Angry">😡</label>
</div>
<div id="emoji-info"></div>
<?php
$html = str_replace( array( "\r", "\n" ), '', trim( ob_get_clean() ) );
$params['html'] = $html;
$this->render_widget( $params );
}
/**
* Render General Feedback Sidebar Button Widget
*
* @since 1.0.3
*/
public function render_general_feedback( $params = array() ) {
$params = $this->prepare_widget_params( $params );
ob_start();
?>
<div class="ig-general-feedback" id="ig-general-feedback-<?php echo esc_attr( $this->plugin ); ?>">
<form class="ig-general-feedback" id="ig-general-feedback">
<p class="ig-feedback-data-name">
<label class="ig-label">Name</label><br/>
<input type="text" name="feedback_data[name]" id="ig-feedback-data-name" value="<?php echo esc_attr( $params['name'] ); ?>"/>
</p>
<p class="ig-feedback-data-email">
<label class="ig-label"">Email</label><br/>
<input type="email" name="feedback_data[email]" id="ig-feedback-data-email" value="<?php echo esc_attr( $params['email'] ); ?>"/>
</p>
<p class="ig-feedback-data-message">
<label class="ig-label"">Feedback</label><br/>
<textarea name="feedback_data[details]" id="ig-feedback-data-message"></textarea>
</p>
<?php if ( isset( $params['consent'] ) && true === $params['consent'] ) { ?>
<p>
<input type="checkbox" name="feedback_data[collect_system_info]" checked="checked" id="ig-feedback-data-consent"/><?php echo esc_html( $params['consent_text'] ); ?>
</p>
<?php } ?>
</form>
</div>
<?php
$html = str_replace( array( "\r", "\n" ), '', trim( ob_get_clean() ) );
$params['html'] = $html;
$title = $params['title'];
$slug = sanitize_title( $title );
$event = $this->event_prefix . $params['event'];
$html = ! empty( $params['html'] ) ? $params['html'] : '';
$escape_allowed_tags = $this->get_escape_allowed_tags();
ob_start();
?>
<script type="text/javascript">
jQuery(document).ready(function ($) {
function doSend(details, meta, system_info) {
var data = {
action: '<?php echo esc_js( $this->ajax_action ); ?>',
feedback: {
type: '<?php echo esc_js( $params['type'] ); ?>',
slug: '<?php echo esc_js( $slug ); ?>',
title: '<?php echo esc_js( $title ); ?>',
details: details
},
event: '<?php echo esc_js( $event ); ?>',
// Add additional information
misc: {
plugin: '<?php echo esc_js( $this->plugin ); ?>',
plugin_abbr: '<?php echo esc_js( $this->plugin_abbr ); ?>',
is_dev_mode: '<?php echo esc_js( $this->is_dev_mode ); ?>',
set_transient: '<?php echo esc_js( $params['set_transient'] ); ?>',
meta_info: meta,
system_info: system_info
},
security: '<?php echo esc_js( wp_create_nonce( $this->plugin_abbr . '-admin-ajax-nonce' ) ); ?>'
};
return jQuery.post(ajaxurl, data);
}
function validateEmail(email) {
var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
if (!emailReg.test(email)) {
return false;
} else {
return true;
}
}
var feedbackButtonClass = 'ig-feedback-button-<?php echo esc_js( $this->plugin ); ?>';
$('#wpwrap').append('<div class="ig-es-feedback-button ' + feedbackButtonClass + '">Feedback</div>');
$('.' + feedbackButtonClass).on('click', function () {
Swal.mixin({
footer: '<?php echo wp_kses_post( $this->footer ); ?>',
position: '<?php echo esc_js( $params['position'] ); ?>',
width: <?php echo esc_js( $params['width'] ); ?>,
animation: false,
focusConfirm: false,
allowEscapeKey: true,
showCloseButton: '<?php echo esc_js( $params['showCloseButton'] ); ?>',
allowOutsideClick: '<?php echo esc_js( $params['allowOutsideClick'] ); ?>',
showLoaderOnConfirm: true,
confirmButtonText: '<?php echo wp_kses_post( $params['confirmButtonText'] ); ?>',
backdrop: '<?php echo (int) $params['backdrop']; ?>'
}).queue([
{
title: '<p class="ig-feedback-title"><?php echo esc_js( $params['title'] ); ?></p>',
html: '<?php echo wp_kses( $html, $escape_allowed_tags ); ?>',
customClass: {
popup: 'animated fadeInUpBig'
},
onOpen: () => {
},
preConfirm: () => {
var $overlay = $('#ig-general-feedback-<?php echo esc_js( $this->plugin ); ?>');
var $form = $overlay.find('form');
var email = $form.find('#ig-feedback-data-email').val();
var name = $form.find('#ig-feedback-data-name').val();
var message = $form.find('#ig-feedback-data-message').val();
var consent = $form.find('#ig-feedback-data-consent').attr('checked');
if (email !== '' && !validateEmail(email)) {
Swal.showValidationMessage('Please enter valid email');
return;
}
if (message === '') {
Swal.showValidationMessage('Please enter your message');
return;
}
var system_info = true;
if (consent === 'checked') {
system_info = true;
}
var meta = {
name: name,
email: email
};
return doSend(message, meta, system_info);
}
},
]).then(response => {
if (response.hasOwnProperty('value')) {
Swal.fire({
type: 'success',
width: <?php echo esc_js( $params['width'] ); ?>,
title: '<?php echo esc_attr__( 'Thank You!', $this->plugin ); ?>',
showConfirmButton: false,
position: '<?php echo esc_js( $params['position'] ); ?>',
timer: 1500,
animation: false
});
}
});
});
});
</script>
<?php
}
/**
* Render Facebook Widget
*
* @since 1.0.9
*/
public function render_fb_widget( $params ) {
$params = $this->prepare_widget_params( $params );
$title = $params['title'];
$widget_tyoe = ! empty( $params['widget_tyoe'] ) ? $params['widget_tyoe'] : 'question';
$slug = sanitize_title( $title );
$event = $this->event_prefix . $params['event'];
$html = ! empty( $params['html'] ) ? $params['html'] : '';
$confirm_button_link = ! empty( $params['confirmButtonLink'] ) ? $params['confirmButtonLink'] : '';
$cancel_button_link = ! empty( $params['cancelButtonLink'] ) ? $params['cancelButtonLink'] : '';
$show_cancel_button = ! empty( $params['showCancelButton'] ) ? 'true' : 'false';
$cancel_button_text = ! empty( $params['cancelButtonText'] ) ? $params['cancelButtonText'] : 'Cancel';
?>
<script>
Swal.mixin({
type: '<?php echo esc_js( $widget_tyoe ); ?>',
position: '<?php echo esc_js( $params['position'] ); ?>',
width: <?php echo esc_js( $params['width'] ); ?>,
animation: false,
focusConfirm: true,
allowEscapeKey: true,
showCancelButton: <?php echo esc_js( $show_cancel_button ); ?>,
confirmButtonColor: '#0e9f6e',
cancelButtonColor: '#5850ec',
cancelButtonText: '<?php echo wp_kses_post( $cancel_button_text ); ?>',
showCloseButton: '<?php echo esc_js( $params['showCloseButton'] ); ?>',
allowOutsideClick: '<?php echo esc_js( $params['allowOutsideClick'] ); ?>',
showLoaderOnConfirm: true,
confirmButtonText: '<?php echo wp_kses_post( $params['confirmButtonText'] ); ?>',
backdrop: '<?php echo (int) $params['backdrop']; ?>'
}).queue([
{
title: '<p class="ig-feedback-title"><?php echo esc_js( $params['title'] ); ?></p>',
html: '<?php echo wp_kses_post( $html ); ?>',
customClass: {
popup: 'animated fadeInUpBig'
},
preConfirm: () => {
window.open(
'<?php echo esc_url( $confirm_button_link ); ?>',
'_blank' // <- This is what makes it open in a new window.
);
}
}
]).then(response => {
if (response.hasOwnProperty('value')) {
Swal.fire({
type: 'success',
width: <?php echo esc_js( $params['width'] ); ?>,
title: "Thank You!",
showConfirmButton: false,
position: '<?php echo esc_js( $params['position'] ); ?>',
timer: 1500,
animation: false
});
} else if(response.dismiss == 'cancel') {
window.open(
'<?php echo esc_url( $cancel_button_link ); ?>',
'_blank' // <- This is what makes it open in a new window.
);
}
});
</script>
<?php
}
/**
* Render Poll widget
*
* @param array $params
*
* @since 1.1.0
*/
public function render_poll_widget( $params = array() ) {
$params = $this->prepare_widget_params( $params );
$fields = ! empty( $params['fields'] ) ? $params['fields'] : array();
if ( empty( $fields ) ) {
return;
}
$default_values = ! empty( $params['default_values'] ) ? $params['default_values'] : array();
$allow_multiple = ! empty( $params['allow_multiple'] ) ? $params['allow_multiple'] : false;
$title = $params['title'];
if ( ! empty( $params['slug'] ) ) {
$slug = $params['slug'];
} else {
$slug = sanitize_title( $title );
}
$event = $this->event_prefix . $params['event'];
$desc = ! empty( $params['desc'] ) ? $params['desc'] : '';
$display_as = ! empty( $params['display_as'] ) ? $params['display_as'] : 'inline';
$system_info = isset( $params['system_info'] ) ? $params['system_info'] : true;
ob_start();
?>
<div class="ig-general-feedback" id="ig-general-feedback-<?php echo esc_attr( $this->plugin ); ?>">
<form class="ig-general-feedback" id="ig-general-feedback">
<?php
if ( ! empty( $title ) ) {
?>
<h2><?php echo wp_kses_post( $title ); ?></h2>
<?php
}
?>
<?php
if ( ! empty( $desc ) ) {
?>
<p><?php echo wp_kses_post( $desc ); ?></p>
<?php
}
?>
<p class="ig-general-feedback mb-3">
<?php
foreach ( $fields as $index => $field ) {
$field_type = $field['type'];
$field_name = $field['name'];
$field_value = ! empty( $field['value'] ) ? $field['value'] : '';
$field_placeholder = ! empty( $field['placeholder'] ) ? $field['placeholder'] : '';
$field_required = isset ( $field['required'] ) ? $field['required'] : false;
switch ( $field_type ) {
case 'textarea':
?>
<p class="ig-feedback-data-poll-message mb-3" id="ig-feedback-data-poll-message">
<textarea name="feedback_data[<?php echo esc_attr( $field_name ); ?>]" id="ig-feedback-data-poll-additional-message" placeholder="<?php echo esc_attr( $field_placeholder ); ?>"></textarea>
</p>
<br/>
<?php
break;
case 'radio':
case 'checkbox':
?>
<label>
<input
type="<?php echo esc_attr( $field_type ); ?>"
name="feedback_data[<?php echo esc_attr( $field_name ); ?>]"
value="<?php echo esc_attr( $field_value ); ?>"
<?php echo ( ! empty( $default_values[ $field_name ] ) && $field_value === $default_values[ $field_name ] ) ? 'checked' : ''; ?>
class="<?php echo esc_attr( $this->plugin_abbr ); ?>-feedback-field"
<?php echo $field_required ? 'required' : ''; ?>>
<?php echo wp_kses_post( $field['label'] ); ?>
</label>
<br/>
<?php
break;
default:
?>
<label>
<input
type="<?php echo esc_attr( $field_type ); ?>"
name="feedback_data[<?php echo esc_attr( $field_name ); ?>]"
value="<?php echo esc_attr( $field['value'] ); ?>"
class="<?php echo esc_attr( $this->plugin_abbr ); ?>-feedback-field">
<?php echo wp_kses_post( $field['label'] ); ?>
</label>
<br/>
<?php
}
?>
<?php
if ( 'other' === $field['value'] ) {
?>
<div class="ig_feedback_text_wrapper">
<textarea
id="feedback_text"
name="feedback[feedback_text]"
class="form-textarea text-sm w-2/3 mt-3 mb-1 border-gray-400 w-3/5 hidden"
placeholder="<?php echo esc_attr__( 'Tell us more about your desired feature', $this->plugin ); ?>"></textarea>
</div>
<?php
}
}
?>
</p>
<?php
if ( 'inline' === $display_as ) {
?>
<button type="submit" class="button">
<?php
echo esc_html__( 'Submit your feedback', $this->plugin );
?>
</button>
<br/>
<br/>
<?php
}
?>
</form>
</div>
<?php
$html = str_replace( array( "\r", "\n" ), '', trim( ob_get_clean() ) );
$event = $this->event_prefix . $params['event'];
if ( 'inline' === $display_as ) {
$this->render_inline_feedback_widget( $html, $params );
} elseif ( 'popup' === $display_as ) {
$this->render_popup_feedback_widget( $html, $params );
}
?>
<script type="text/javascript">
function doSend(data) {
var system_info = <?php echo $system_info ? 'true' : 'false'; ?>;
var requestData = {
action: '<?php echo esc_js( $this->ajax_action ); ?>',
feedback: {
type: '<?php echo esc_js( $params['type'] ); ?>',
slug: '<?php echo esc_js( $slug ); ?>',
data: data
},
event: '<?php echo esc_js( $event ); ?>',
// Add additional information
misc: {
plugin: '<?php echo esc_js( $this->plugin ); ?>',
plugin_abbr: '<?php echo esc_js( $this->plugin_abbr ); ?>',
is_dev_mode: '<?php echo esc_js( $this->is_dev_mode ); ?>',
set_transient: '<?php echo esc_js( $params['set_transient'] ); ?>',
system_info: system_info
},
security: '<?php echo esc_js( wp_create_nonce( $this->plugin_abbr . '-admin-ajax-nonce' ) ); ?>'
};
return jQuery.post(ajaxurl, requestData, null, 'json');
}
</script>
<?php
}
/**
* Render inline feedback widget
*
* @since 1.2.7
*
* @param string $html
* @param array $params
* @return void
*/
public function render_inline_feedback_widget( $html, $params ) {
$escape_allowed_tags = $this->get_escape_allowed_tags();
?>
<style type="text/css">
.ig-feedback-inline h2{
font-size:2em;
padding: 0.5em 0;
}
.ig-feedback-inline{
border:none;
width:90%;
margin: 1em auto !important;
/* background:#fbe2597d; */
}
.ig-feedback-inline button{
background: green !important;
color: #FFF !important;
}
.ig-feedback-inline radio{
line-height:1em;
}
.ig-feedback-logo{
float:right;
}
.ig-feedback-inline label{
font-size: 1.1em;
padding-bottom: 0.5em;
}
.ig-feedback-inline .button{
padding: 0.7em;
font-size: 1.2em;
border-radius: 0;
}
</style>
<div class="notice ig-feedback-notice ig-feedback-inline">
<?php
if ( $params['logo_img_url'] ) {
?>
<div class="ig-feedback-logo">
<img src="<?php echo esc_url( $params['logo_img_url'] ); ?>">
</div>
<?php
}
?>
<?php echo wp_kses( $html, $escape_allowed_tags ); ?>
</div>
<script type="text/javascript">
jQuery(document).ready(function ($) {
$('.<?php echo esc_attr( $this->plugin_abbr ); ?>-feedback-field').on('change', function(){
let value = $(this).val();
if ( 'other' === value ) {
$('#feedback_text').removeClass('hidden');
} else {
$('#feedback_text').addClass('hidden');
}
});
var $overlay = $('#ig-general-feedback-<?php echo esc_js( $this->plugin ); ?>');
var $form = $overlay.find('form');
$($form).on('submit', function(e){
e.preventDefault();
let selected_feature = $form.find("input[name='feedback_data[feature]']:checked").val();
let form_data = {
questions_response : {
selected_feature: selected_feature
}
}
if ( selected_feature === 'other' ) {
form_data.other_feature = $form.find('textarea[name="feedback[feedback_text]"]').val();
}
var request = doSend( form_data );
request.done(response => {
if (response.status && response.status === 'success') {
let success_text = '<?php echo esc_html__( 'Your feedback submitted successfully.', $this->plugin ); ?>';
$('.ig-feedback-notice').html('<p>' + success_text + '</p>');
} else {
let error_text = '<?php echo esc_html__( 'An error has occured. Please try again.', $this->plugin ); ?>';
$('.ig-feedback-notice').removeClass('notice-success').addClass('notice-error').append('<p>' + error_text + '</p>');
}
}).fail( response => {
let error_text = '<?php echo esc_html__( 'An error has occured. Please try again.', $this->plugin ); ?>';
$('.ig-feedback-notice').removeClass('notice-success').addClass('notice-error').append('<p>' + error_text + '</p>');
});
});
});
</script>
<?php
}
/**
* Render popup feedback widget
*
* @since 1.2.7
*
* @param string $html
* @param array $params
* @return void
*/
public function render_popup_feedback_widget( $html, $params ) {
$escape_allowed_tags = $this->get_escape_allowed_tags();
?>
<script type="text/javascript">
jQuery(document).ready(function ($) {
Swal.mixin({
footer: '',
position: '<?php echo esc_js( $params['position'] ); ?>',
width: <?php echo esc_js( $params['width'] ); ?>,
animation: false,
focusConfirm: false,
allowEscapeKey: true,
showCloseButton: '<?php echo esc_js( $params['showCloseButton'] ); ?>',
allowOutsideClick: '<?php echo esc_js( $params['allowOutsideClick'] ); ?>',
showLoaderOnConfirm: true,
confirmButtonText: '<?php echo wp_kses_post( $params['confirmButtonText'] ); ?>',
backdrop: '<?php echo (int) $params['backdrop']; ?>'
}).queue([
{
title: '<p class="ig-feedback-title"><?php echo esc_js( $params['title'] ); ?></p>',
html: '<?php echo wp_kses( $html, $escape_allowed_tags ); ?>',
customClass: {
popup: 'animated fadeInUpBig'
},
onOpen: () => {
},
preConfirm: () => {
var $overlay = $('#ig-general-feedback-<?php echo esc_js( $this->plugin ); ?>');
var $form = $overlay.find('form');
if ( ! jQuery($form)[0].checkValidity()) {
Swal.showValidationMessage('<?php echo esc_html__( 'Please select option', $this->plugin ); ?>');
return;
}
var poll_options = $form.find("input[name='feedback_data[poll_options]']:checked").val();
var message = $form.find("#ig-feedback-data-poll-additional-message").val();
var data = {
poll_option: poll_options,
additional_feedback: message
};
var meta = {};
return doSend(data);
}
},
]).then(response => {
if (response.hasOwnProperty('value')) {
Swal.fire({
type: 'success',
width: <?php echo esc_js( $params['width'] ); ?>,
title: '<?php echo esc_attr__( 'Thank You!', $this->plugin ); ?>',
showConfirmButton: false,
position: '<?php echo esc_js( $params['position'] ); ?>',
timer: 1500,
animation: false
});
}
});
});
</script>
<?php
}
/**
* Get Feedback API url
*
* @param $is_dev_mode
*
* @return string
*
* @since 1.0.1
*/
public function get_api_url( $is_dev_mode ) {
if ( $is_dev_mode ) {
$this->api_url = 'http://192.168.0.130:9094/store/feedback/';
}
return $this->api_url;
}
/**
* Deactivation Survey javascript.
*
* @since 1.0.0
*/
public function js() {
if ( ! $this->is_plugin_page() ) {
return;
}
$title = 'Why are you deactivating ' . $this->name . '?';
$slug = sanitize_title( $title );
$event = $this->event_prefix . 'plugin.deactivation';
?>
<script type="text/javascript">
jQuery(function ($) {
var $deactivateLink = $('#the-list').find('[data-slug="<?php echo esc_js( $this->plugin ); ?>"] span.deactivate a'),
$overlay = $('#ig-deactivate-survey-<?php echo esc_js( $this->plugin ); ?>'),
$form = $overlay.find('form'),
formOpen = false,
consent = $('#ig-deactivate-survey-help-consent-<?php echo esc_js( $this->plugin ); ?>');
function togglePersonalInfoFields(show) {
if (show) {
$form.find('#ig-deactivate-survey-info-name').show();
$form.find('#ig-deactivate-survey-info-email-address').show();
$form.find('#ig-deactivate-survey-consent-additional-data').show();
} else {
$form.find('#ig-deactivate-survey-info-name').hide();
$form.find('#ig-deactivate-survey-info-email-address').hide();
$form.find('#ig-deactivate-survey-consent-additional-data').hide();
}
};
function loader($show) {
if ($show) {
$form.find('#ig-deactivate-survey-loader').show();
} else {
$form.find('#ig-deactivate-survey-loader').hide();
}
}
function validateEmail(email) {
var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
if (!emailReg.test(email)) {
return false;
} else {
return true;
}
};
// Plugin listing table deactivate link.
$deactivateLink.on('click', function (event) {
event.preventDefault();
$overlay.css('display', 'table');
formOpen = true;
$form.find('.ig-deactivate-survey-option:first-of-type input[type=radio]').focus();
});
// Survey radio option selected.
$form.on('change', 'input[type=radio]', function (event) {
event.preventDefault();
$form.find('input[type=text], .error').hide();
$form.find('.ig-deactivate-survey-option').removeClass('selected');
$(this).closest('.ig-deactivate-survey-option').addClass('selected').find('input[type=text]').show();
if (consent.attr('checked') === 'checked') {
togglePersonalInfoFields(true);
}
});
// Survey Skip & Deactivate.
$form.on('click', '.ig-deactivate-survey-deactivate', function (event) {
event.preventDefault();
let deactivationURL = $deactivateLink.attr('href');
let skipSurveyURL = deactivationURL + '&survey_status=skipped';
location.href = skipSurveyURL;
});
// Help Consent
togglePersonalInfoFields(false);
loader(false);
consent.on('click', function () {
if (consent.attr('checked') === 'checked') {
togglePersonalInfoFields(true);
} else {
togglePersonalInfoFields(false);
}
});
// Survey submit.
$form.submit(function (event) {
event.preventDefault();
loader(true);
if (!$form.find('input[type=radio]:checked').val()) {
$form.find('.ig-deactivate-survey-footer').prepend('<span class="error"><?php echo esc_js( __( 'Please select an option', $this->plugin ) ); ?></span>');
return;
}
var system_info = false;
var name = '';
var email = '';
if (consent.attr('checked') === 'checked') {
name = $form.find('#ig-deactivate-survey-info-name').val();
email = $form.find('#ig-deactivate-survey-info-email-address').val();
if (email === '' || !validateEmail(email)) {
alert('Please enter valid email');
return;
}
system_info = true;
}
var meta = {
name: name,
email: email
};
var data = {
action: '<?php echo esc_js( $this->ajax_action ); ?>',
feedback: {
type: 'radio',
title: '<?php echo esc_js( $title ); ?>',
slug: '<?php echo esc_js( $slug ); ?>',
value: $form.find('.selected input[type=radio]').attr('data-option-slug'),
details: $form.find('.selected input[type=text]').val()
},
event: '<?php echo esc_js( $event ); ?>',
// Add additional information
misc: {
plugin: '<?php echo esc_js( $this->plugin ); ?>',
plugin_abbr: '<?php echo esc_js( $this->plugin_abbr ); ?>',
is_dev_mode: '<?php echo esc_js( $this->is_dev_mode ); ?>',
set_cookie: '',
meta_info: meta,
system_info: system_info
},
security: '<?php echo esc_js( wp_create_nonce( $this->plugin_abbr . '-admin-ajax-nonce' ) ); ?>'
};
var submitSurvey = $.post(ajaxurl, data);
submitSurvey.always(function () {
location.href = $deactivateLink.attr('href');
});
});
// Exit key closes survey when open.
$(document).keyup(function (event) {
if (27 === event.keyCode && formOpen) {
$overlay.hide();
formOpen = false;
$deactivateLink.focus();
}
});
});
</script>
<?php
}
/**
* Survey CSS.
*
* @since 1.0.0
*/
public function css() {
if ( ! $this->is_plugin_page() ) {
return;
}
?>
<style type="text/css">
.ig-deactivate-survey-modal {
display: none;
table-layout: fixed;
position: fixed;
z-index: 9999;
width: 100%;
height: 100%;
text-align: center;
font-size: 14px;
top: 0;
left: 0;
background: rgba(0, 0, 0, 0.8);
}
.ig-deactivate-survey-wrap {
display: table-cell;
vertical-align: middle;
}
.ig-deactivate-survey {
background-color: #fff;
max-width: 550px;
margin: 0 auto;
padding: 30px;
text-align: left;
}
.ig-deactivate-survey .error {
display: block;
color: red;
margin: 0 0 10px 0;
}
.ig-deactivate-survey-title {
display: block;
font-size: 18px;
font-weight: 700;
text-transform: uppercase;
border-bottom: 1px solid #ddd;
padding: 0 0 18px 0;
margin: 0 0 18px 0;
}
.ig-deactivate-survey-options {
border-bottom: 1px solid #ddd;
padding: 0 0 18px 0;
margin: 0 0 18px 0;
}
.ig-deactivate-survey-info-data {
padding: 0 0 18px 0;
margin: 10px 10px 10px 30px;
}
.ig-deactivate-survey-info-name, .ig-deactivate-survey-info-email-address {
width: 230px;
margin: 10px;
}
.ig-deactivate-survey-title span {
color: #999;
margin-right: 10px;
}
.ig-deactivate-survey-desc {
display: block;
font-weight: 600;
margin: 0 0 18px 0;
}
.ig-deactivate-survey-option {
margin: 0 0 10px 0;
}
.ig-deactivate-survey-option-input {
margin-right: 10px !important;
}
.ig-deactivate-survey-option-details {
display: none;
width: 90%;
margin: 10px 0 0 30px;
}
.ig-deactivate-survey-footer {
margin-top: 18px;
}
.ig-deactivate-survey-deactivate {
float: right;
font-size: 13px;
color: #ccc;
text-decoration: none;
padding-top: 7px;
}
.ig-deactivate-survey-loader {
vertical-align: middle;
padding: 10px;
}
</style>
<?php
}
/**
* Survey modal.
*
* @since 1.0.0
*/
public function modal() {
if ( ! $this->is_plugin_page() ) {
return;
}
$email = $this->get_contact_email();
$options = array(
1 => array(
'title' => esc_html__( 'I no longer need the plugin', $this->plugin ),
'slug' => 'i-no-longer-need-the-plugin',
),
2 => array(
'title' => esc_html__( 'I\'m switching to a different plugin', $this->plugin ),
'slug' => 'i-am-switching-to-a-different-plugin',
'details' => esc_html__( 'Please share which plugin', $this->plugin ),
),
3 => array(
'title' => esc_html__( 'I couldn\'t get the plugin to work', $this->plugin ),
'slug' => 'i-could-not-get-the-plugin-to-work',
),
4 => array(
'title' => esc_html__( 'It\'s a temporary deactivation', $this->plugin ),
'slug' => 'it-is-a-temporary-deactivation',
),
5 => array(
'title' => esc_html__( 'Other', $this->plugin ),
'slug' => 'other',
'details' => esc_html__( 'Please share the reason', $this->plugin ),
),
);
?>
<div class="ig-deactivate-survey-modal" id="ig-deactivate-survey-<?php echo esc_js( $this->plugin ); ?>">
<div class="ig-deactivate-survey-wrap">
<form class="ig-deactivate-survey" method="post">
<span class="ig-deactivate-survey-title"><span class="dashicons dashicons-testimonial"></span><?php echo ' ' . esc_html__( 'Quick Feedback', $this->plugin ); ?></span>
<span class="ig-deactivate-survey-desc"><?php echo esc_html__( sprintf( 'If you have a moment, please share why you are deactivating %s:', $this->name ), $this->plugin ); ?></span>
<div class="ig-deactivate-survey-options">
<?php foreach ( $options as $id => $option ) : ?>
<div class="ig-deactivate-survey-option">
<label for="ig-deactivate-survey-option-<?php echo esc_attr( $this->plugin ); ?>-<?php echo esc_attr( $id ); ?>" class="ig-deactivate-survey-option-label">
<input id="ig-deactivate-survey-option-<?php echo esc_attr( $this->plugin ); ?>-<?php echo esc_attr( $id ); ?>" class="ig-deactivate-survey-option-input" type="radio" name="code" value="<?php echo esc_attr( $id ); ?>" data-option-slug="<?php echo esc_attr( $option['slug'] ); ?>"/>
<span class="ig-deactivate-survey-option-reason"><?php echo esc_attr( $option['title'] ); ?></span>
</label>
<?php if ( ! empty( $option['details'] ) ) : ?>
<input class="ig-deactivate-survey-option-details" type="text" placeholder="<?php echo esc_attr( $option['details'] ); ?>"/>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
<div class="ig-deactivate-survey-help-consent">
<input id="ig-deactivate-survey-help-consent-<?php echo esc_attr( $this->plugin ); ?>" class="ig-deactivate-survey-option-input" type="checkbox" name="code" data-option-slug="<?php echo esc_attr( $option['slug'] ); ?>"/><b><?php echo esc_html__( 'Yes, I give my consent to track plugin usage and contact me back to make this plugin works!', $this->plugin ); ?></b>
</div>
<div class="ig-deactivate-survey-info-data">
<input type="text" class="ig-deactivate-survey-info-name" id="ig-deactivate-survey-info-name" placeholder="Enter Name" name="ig-deactivate-survey-info-name" value=""/>
<input type="text" class="ig-deactivate-survey-info-email-address" id="ig-deactivate-survey-info-email-address" name="ig-deactivate-survey-info-email-address" value="<?php echo esc_js( $email ); ?>"/>
</div>
<div class="ig-deactivate-survey-footer">
<button type="submit" class="ig-deactivate-survey-submit button button-primary button-large"><?php echo sprintf( esc_html__( 'Submit %s Deactivate', $this->plugin ), '&amp;' ); ?></button>
<img class="ig-deactivate-survey-loader" id="ig-deactivate-survey-loader" src="<?php echo esc_url( plugin_dir_url( __FILE__ ) ); ?>/assets/images/loading.gif"/>
<a href="#" class="ig-deactivate-survey-deactivate"><?php echo sprintf( esc_html__( 'Skip %s Deactivate', $this->plugin ), '&amp;' ); ?></a>
</div>
</form>
</div>
</div>
<?php
}
/**
* Can we show feedback widget in this environment
*
* @return bool
*/
public function can_show_feedback_widget() {
// Is development mode? Enable it.
if ( $this->is_dev_mode ) {
return true;
}
// Don't show on dev setup if dev mode is off.
if ( $this->is_dev_url() ) {
return false;
}
return true;
}
/**
* Checks if current admin screen is the plugins page.
*
* @return bool
* @since 1.0.0
*/
public function is_plugin_page() {
$screen = function_exists( 'get_current_screen' ) ? get_current_screen() : false;
if ( empty( $screen ) ) {
return false;
}
return ( ! empty( $screen->id ) && in_array( $screen->id, array( 'plugins', 'plugins-network' ), true ) );
}
/**
* Checks if current site is a development one.
*
* @return bool
*
* @since 1.0.0
*/
public function is_dev_url() {
$url = network_site_url( '/' );
$is_local_url = false;
// Trim it up
$url = strtolower( trim( $url ) );
// Need to get the host...so let's add the scheme so we can use parse_url
if ( false === strpos( $url, 'http://' ) && false === strpos( $url, 'https://' ) ) {
$url = 'http://' . $url;
}
$url_parts = parse_url( $url );
$host = ! empty( $url_parts['host'] ) ? $url_parts['host'] : false;
// Discard our development environment
if ( '192.168.0.112' === $host ) {
return false;
}
if ( ! empty( $url ) && ! empty( $host ) ) {
if ( false !== ip2long( $host ) ) {
if ( ! filter_var( $host, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) ) {
$is_local_url = true;
}
} elseif ( 'localhost' === $host ) {
$is_local_url = true;
}
$tlds_to_check = array( '.dev', '.local', ':8888' );
foreach ( $tlds_to_check as $tld ) {
if ( false !== strpos( $host, $tld ) ) {
$is_local_url = true;
continue;
}
}
if ( substr_count( $host, '.' ) > 1 ) {
$subdomains_to_check = array( 'dev.', '*.staging.', 'beta.', 'test.' );
foreach ( $subdomains_to_check as $subdomain ) {
$subdomain = str_replace( '.', '(.)', $subdomain );
$subdomain = str_replace( array( '*', '(.)' ), '(.*)', $subdomain );
if ( preg_match( '/^(' . $subdomain . ')/', $host ) ) {
$is_local_url = true;
continue;
}
}
}
}
return $is_local_url;
}
/**
* Store plugin feedback data into option
*
* @param $plugin_abbr
* @param $event
* @param $data
*
* @since 1.0.1
*/
public function set_feedback_data( $plugin_abbr, $event, $data = array() ) {
$feedback_option = $plugin_abbr . '_feedback_data';
$feedback_data = maybe_unserialize( get_option( $feedback_option, array() ) );
$data['created_on'] = gmdate( 'Y-m-d H:i:s' );
$feedback_data[ $event ][] = $data;
update_option( $feedback_option, $feedback_data );
}
/**
* Get plugin feedback data
*
* @param $plugin_abbr
*
* @return mixed|void
*
* @since 1.0.1
*/
public function get_feedback_data( $plugin_abbr ) {
$feedback_option = $plugin_abbr . '_feedback_data';
return get_option( $feedback_option, array() );
}
/**
* Get event specific feedback data
*
* @param $plugin_abbr
* @param $event
*
* @return array|mixed
*/
public function get_event_feedback_data( $plugin_abbr, $event ) {
$feedback_data = $this->get_feedback_data( $plugin_abbr );
$event_feedback_data = ! empty( $feedback_data[ $event ] ) ? $feedback_data[ $event ] : array();
return $event_feedback_data;
}
/**
* Check whether event tracked or not.
*
* @param $plugin_abbr
* @param $event
*
* @return bool
*
* @since 1.1.0
*/
public function is_event_tracked( $plugin_abbr = '', $event = '' ) {
if ( empty( $plugin_abbr ) || empty( $event ) ) {
return false;
}
$feedback_data = $this->get_feedback_data( $plugin_abbr );
if ( count( $feedback_data ) > 0 ) {
$events = array_keys( $feedback_data );
foreach ( $events as $key => $value ) {
if ( strpos( $value, $event ) ) {
return true;
}
}
}
return false;
}
/**
* Set event into transient
*
* @param $event
* @param int $expiry in days
*/
public function set_event_transient( $event, $expiry = 45 ) {
set_transient( $event, 1, time() + ( 86400 * $expiry ) );
}
/**
* Check whether event transient is set or not.
*
* @param $event
*
* @return bool
*
* @since 1.0.1
*/
public function is_event_transient_set( $event ) {
return get_transient( $event );
}
/**
* Get contact email
*
* @return string
*
* @since 1.0.8
*/
public function get_contact_email() {
$email = '';
// Get logged in User Email Address
$current_user = wp_get_current_user();
if ( $current_user instanceof WP_User ) {
$email = $current_user->user_email;
}
// If email empty, get admin email
if ( empty( $email ) ) {
$email = get_option( 'admin_email' );
}
return $email;
}
/**
* Hook to ajax_action
*
* Send feedback to server
*/
public function submit_feedback() {
check_ajax_referer( $this->plugin_abbr . '-admin-ajax-nonce', 'security' );
$data = ! empty( $_POST ) ? $_POST : array();
$data['site'] = esc_url( home_url() );
$plugin = ! empty( $data['misc']['plugin'] ) ? $data['misc']['plugin'] : 'ig_feedback';
$plugin_abbr = ! empty( $data['misc']['plugin_abbr'] ) ? $data['misc']['plugin_abbr'] : 'ig_feedback';
$is_dev_mode = ! empty( $data['misc']['is_dev_mode'] ) ? $data['misc']['is_dev_mode'] : false;
$set_transient = ! empty( $data['misc']['set_transient'] ) ? $data['misc']['set_transient'] : false;
$system_info = ( isset( $data['misc']['system_info'] ) && $data['misc']['system_info'] === 'true' ) ? true : false;
$meta_info = ! empty( $data['misc']['meta_info'] ) ? $data['misc']['meta_info'] : array();
unset( $data['misc'] );
$default_meta_info = array(
'plugin' => sanitize_key( $plugin ),
'locale' => get_locale(),
'wp_version' => get_bloginfo( 'version' ),
'php_version' => PHP_VERSION,
);
$meta_info = wp_parse_args( $meta_info, $default_meta_info );
$additional_info = array();
$additional_info = apply_filters( $plugin_abbr . '_additional_feedback_meta_info', $additional_info, $system_info ); // Get Additional meta information
if ( is_array( $additional_info ) && count( $additional_info ) > 0 ) {
$meta_info = array_merge( $meta_info, $additional_info );
}
$data['meta'] = $meta_info;
$data = wp_unslash( $data );
$args = array(
'timeout' => 15,
'sslverify' => false,
'body' => $data,
'blocking' => false,
);
$this->set_feedback_data( $plugin_abbr, $data['event'], $data['feedback'] );
// Set Cookie
if ( $set_transient ) {
$this->set_event_transient( $data['event'] );
}
$response = wp_remote_post( $this->get_api_url( $is_dev_mode ), $args );
$result['status'] = 'success';
if ( $response instanceof WP_Error ) {
$error_message = $response->get_error_message();
$result['status'] = 'error';
$result['message'] = $error_message;
}
die( json_encode( $result ) );
}
/**
* Get list of tags allowed in escaping
*
* @return array $ig_es_escape_allowed_tags
*/
public function get_escape_allowed_tags() {
$ig_es_escape_allowed_tags = apply_filters( $this->plugin_abbr . '_escape_allowed_tags', array() );
return $ig_es_escape_allowed_tags;
}
/**
* Render Quick Feedback Widget
*
* @param $params
*
* @since 4.1.0
*/
public function render_feedback_widget( $params ) {
if ( ! $this->can_show_feedback_widget() ) {
return;
}
$default_params = array(
'set_transient' => true,
'force' => false,
'show_once' => false,
);
$params = wp_parse_args( $params, $default_params );
if ( ! empty( $params['event'] ) ) {
$event = $this->event_prefix . $params['event'];
$force = ! empty( $params['force'] ) ? $params['force'] : false;
$can_show = false;
if ( $force ) {
$can_show = true;
} else {
if ( ! $this->is_event_transient_set( $event ) ) {
$can_show = true;
$feedback_data = $this->get_event_feedback_data( $this->plugin_abbr, $event );
if ( count( $feedback_data ) > 0 ) {
$show_once = $params['show_once'];
$feedback_data = array_reverse( $feedback_data );
$last_feedback_given_on = $feedback_data[0]['created_on'];
// If event feedback given within 45 days or show event only once?
// Don't show now
if ( $show_once || ( strtotime( $last_feedback_given_on ) > strtotime( '-45 days' ) ) ) {
$can_show = false;
}
}
}
}
if ( $can_show ) {
if ( 'star' === $params['type'] ) {
$this->render_stars( $params );
} elseif ( 'emoji' === $params['type'] ) {
$this->render_emoji( $params );
} elseif ( 'feedback' === $params['type'] ) {
$this->render_general_feedback( $params );
} elseif ( 'fb' === $params['type'] ) {
/**
* We are not calling home for this event and we want to show
* this Widget only once. So, we are storing feedback data now.
*/
$this->set_feedback_data( $this->plugin_abbr, $event );
$this->render_fb_widget( $params );
} elseif ( 'poll' === $params['type'] ) {
if ( $params['show_once'] ) {
$this->set_feedback_data( $this->plugin_abbr, $event );
}
$this->render_poll_widget( $params );
}
}
}
}
}
} // End if().