Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhance OneSignal widget to reflect signup status #220

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
84 changes: 74 additions & 10 deletions onesignal-public.php
Original file line number Diff line number Diff line change
Expand Up @@ -309,17 +309,81 @@ public static function onesignal_header()
} ?>
});

function documentInitOneSignal() {
var oneSignal_elements = document.getElementsByClassName("OneSignal-prompt");
function getSubscriptionState() {
return Promise.all([
OneSignal.isPushNotificationsEnabled(),
OneSignal.isOptedOut()
]).then(function(result) {
var isPushEnabled = result[0];
var isOptedOut = result[1];
return {
isPushEnabled: isPushEnabled,
isOptedOut: isOptedOut
};
});
}

<?php
if (array_key_exists('use_modal_prompt', $onesignal_wp_settings) && $onesignal_wp_settings['use_modal_prompt'] === true) {
echo "var oneSignalLinkClickHandler = function(event) { OneSignal.push(['registerForPushNotifications', {modalPrompt: true}]); event.preventDefault(); };";
} else {
echo "var oneSignalLinkClickHandler = function(event) { OneSignal.push(['registerForPushNotifications']); event.preventDefault(); };";
} ?>
for(var i = 0; i < oneSignal_elements.length; i++)
oneSignal_elements[i].addEventListener('click', oneSignalLinkClickHandler, false);
function onManageWebPushSubscriptionButtonClicked(event) {
getSubscriptionState().then(function(state) {
if (state.isPushEnabled) {
OneSignal.setSubscription(false);
} else {
if (state.isOptedOut) {
OneSignal.setSubscription(true);
} else {
<?php
if (array_key_exists('use_modal_prompt', $onesignal_wp_settings) && $onesignal_wp_settings['use_modal_prompt'] === true) {
echo "OneSignal.registerForPushNotifications({ modalPrompt: true });";
} else {
echo "OneSignal.registerForPushNotifications();";
} ?>
}
}
});
event.preventDefault();
}

function updateMangeWebPushSubscriptionButton(buttonSelector) {
getSubscriptionState().then(function(state) {
var elements = document.querySelectorAll(buttonSelector);
if (elements === null) {
return;
}
for(var i = 0; i < elements.length; i++) {
var buttonText = !state.isPushEnabled || state.isOptedOut ?
elements[i].dataset.onesignalSubscribe :
elements[i].dataset.onesignalUnsubscribe;
elements[i].removeEventListener('click', onManageWebPushSubscriptionButtonClicked);
elements[i].addEventListener('click', onManageWebPushSubscriptionButtonClicked);
elements[i].textContent = buttonText;
}
});
}

function documentInitOneSignal() {
OneSignal.push(function() {
var buttonSelector = '.OneSignal-prompt';
var noJsSelector = '.OneSignal-prompt-no-js';

if (!OneSignal.isPushNotificationsSupported()) {
return;
}

updateMangeWebPushSubscriptionButton(buttonSelector);

var oneSignal_elements = document.querySelectorAll(buttonSelector);
var oneSignal_no_js_elements = document.querySelectorAll(noJsSelector);
for(var i = 0; i < oneSignal_elements.length; i++) {
oneSignal_elements[i].style.display = 'inherit';
}
for(var i = 0; i < oneSignal_no_js_elements.length; i++) {
oneSignal_no_js_elements[i].style.display = 'none';
}

OneSignal.on("subscriptionChange", function(isSubscribed) {
updateMangeWebPushSubscriptionButton(buttonSelector);
});
});
}

if (document.readyState === 'complete') {
Expand Down
73 changes: 53 additions & 20 deletions onesignal-widget.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,43 +3,76 @@
defined( 'ABSPATH' ) or die('This page may not be accessed directly.');

class OneSignalWidget extends WP_Widget {


/**
* Default strings for widget.
*
* @var array
*/
public $default_strings = array();

function __construct() {
parent::__construct('OneSignalWidget', 'OneSignal', array( 'description' => 'Subscribe to notifications'));
parent::__construct('OneSignalWidget', 'OneSignal', array( 'description' => 'Subscribe to notifications'));
$this->default_strings = array(
'title' => __( 'Follow' ),
'text' => __( 'Subscribe to notifications' ),
'unsub-text' => __( 'Unsubscribe from notifications' ),
);
}
// Admin editor

// Admin editor
function form($instance) {
$title = ! empty( $instance['title'] ) ? $instance['title'] : 'Follow';
$text = ! empty( $instance['text'] ) ? $instance['text'] : 'Subscribe to notifications';
$title = ! empty( $instance['title'] ) ? $instance['title'] : $this->default_strings['title'];
$text = ! empty( $instance['text'] ) ? $instance['text'] : $this->default_strings['text'];
$unsub_text = ! empty( $instance['unsub-text'] ) ? $instance['unsub-text'] : $this->default_strings['unsub-text'];
?>
<p>
<label for="<?php echo esc_attr($this->get_field_id( 'title' )); ?>"><?php esc_attr_e( 'Title:' ); ?></label>
<input class="widefat" id="<?php echo esc_attr($this->get_field_id( 'title' )); ?>" name="<?php echo esc_attr($this->get_field_name( 'title' )); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
<label for="<?php echo esc_attr($this->get_field_id( 'text' )); ?>"><?php esc_attr_e( 'Body:' ); ?></label>
<input class="widefat" id="<?php echo esc_attr($this->get_field_id( 'text' )); ?>" name="<?php echo esc_attr($this->get_field_name( 'text' )); ?>" type="text" value="<?php echo esc_attr( $text ); ?>">
<label for="<?php echo esc_attr($this->get_field_id( 'title' )); ?>"><?php esc_attr_e( 'Title:' ); ?></label>
<input class="widefat" id="<?php echo esc_attr($this->get_field_id( 'title' )); ?>" name="<?php echo esc_attr($this->get_field_name( 'title' )); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
<label for="<?php echo esc_attr($this->get_field_id( 'text' )); ?>"><?php esc_attr_e( 'Body (Subscribe):' ); ?></label>
<input class="widefat" id="<?php echo esc_attr($this->get_field_id( 'text' )); ?>" name="<?php echo esc_attr($this->get_field_name( 'text' )); ?>" type="text" value="<?php echo esc_attr( $text ); ?>">
<label for="<?php echo esc_attr($this->get_field_id( 'unsub-text' )); ?>"><?php esc_attr_e( 'Body (Change/Unsubscribe):' ); ?></label>
<input class="widefat" id="<?php echo esc_attr($this->get_field_id( 'unsub-text' )); ?>" name="<?php echo esc_attr($this->get_field_name( 'unsub-text' )); ?>" type="text" value="<?php echo esc_attr( $unsub_text ); ?>">
</p>
<?php
}

function update($new_instance, $old_instance) {
$instance = array();
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? wp_strip_all_tags( $new_instance['title'] ) : '';
$instance['text'] = ( ! empty( $new_instance['text'] ) ) ? wp_strip_all_tags( $new_instance['text'] ) : '';


$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? wp_strip_all_tags( $new_instance['title'] ) : '';
$instance['text'] = ( ! empty( $new_instance['text'] ) ) ? wp_strip_all_tags( $new_instance['text'] ) : '';
$instance['unsub-text'] = ( ! empty( $new_instance['unsub-text'] ) ) ? wp_strip_all_tags( $new_instance['unsub-text'] ) : '';

return $instance;
}

// Public display
function widget($args, $instance) {
echo wp_kses_post($args['before_widget']);
$strings = wp_parse_args(
$instance,
$this->default_strings
);
$loading_service = __( 'Loading notification service...' );
$loading_status = __( 'Loading notification status...' );
echo wp_kses_post( $args['before_widget'] );
if ( ! empty( $instance['title'] ) ) {
echo wp_kses_post($args['before_title']) . wp_kses_post(apply_filters( 'widget_title', $instance['title'])). wp_kses_post($args['after_title']);
}
if ( ! empty( $instance['text'] ) ) {
echo '<a href="#" class="OneSignal-prompt">' . wp_kses_post($instance['text']) . '</a>';
echo wp_kses_post( $args['before_title'] . apply_filters( 'widget_title', $strings['title'] ). $args['after_title'] );
}
echo wp_kses_post($args['after_widget']);
echo '<div class="textwidget">';
printf(
'<div class="OneSignal-prompt-no-js">%s</div>',
esc_html( $loading_service )
);
$pattern = '<a href="#" class="OneSignal-prompt" style="display: none;" data-onesignal-subscribe="%1$s" data-onesignal-unsubscribe="%2$s">%3$s</a>';
printf(
$pattern,
esc_attr( $strings['text'] ),
esc_attr( $strings['unsub-text'] ),
esc_html( $loading_status )
);
echo '</div>';
echo wp_kses_post( $args['after_widget'] );
}
}

Expand Down