Current File : /home/getxxhzo/xpertbee.com/wp-content/plugins/hurrytimer/includes/Frontend.php
<?php

namespace Hurrytimer;

/**
 * The public-facing functionality of the plugin.
 *
 * @link       http://nabillemsieh.com
 * @since      1.0.0
 *
 * @package    Hurrytimer
 * @subpackage Hurrytimer/public
 */
class Frontend {
    /**
     * The ID of this plugin.
     *
     * @since    1.0.0
     * @access   private
     * @var      string $plugin_name The ID of this plugin.
     */
    private $plugin_name;

    /**
     * The version of this plugin.
     *
     * @since    1.0.0
     * @access   private
     * @var      string $version The current version of this plugin.
     */
    private $version;

    /**
     * Initialize the class and set its properties.
     *
     * @param string $plugin_name The name of the plugin.
     * @param string $version The version of this plugin.
     *
     * @since    1.0.0
     *
     */
    public function __construct($plugin_name, $version) {
        $this->plugin_name = $plugin_name;
        $this->version     = $version;
    }

    function init() {

        // Enqueue CSS and JS.
        add_action('wp_enqueue_scripts', [$this, 'enqueue_styles']);
        add_action('wp_enqueue_scripts', [$this, 'enqueue_scripts']);

        // Display campaign in sticky bar.
        add_action('wp_footer', [$this, 'render_sticky_bar']);
        add_action('wp_footer', [$this, 'run_in_background']);

        // Display campaign on product page.
        add_action('wp', [$this, 'render_on_product_page']);

        // Change stock status for recurring/onetime campaign via Ajax.
        add_action('wp_ajax_change_stock_status', [$this, 'ajax_change_stock_status']);
        add_action('wp_ajax_nopriv_change_stock_status', [$this, 'ajax_change_stock_status']);

        // Log evergreen campaign start time for each visitor.
        add_action('wp_ajax_hurryt/update_timestamp', [$this, 'ajax_save_evergreen_start_time']);
        add_action('wp_ajax_nopriv_hurryt/update_timestamp', [$this, 'ajax_save_evergreen_start_time']);

        // Return next recurrence.
        add_action('wp_ajax_next_recurrence', [$this, 'ajax_next_recurrence']);
        add_action('wp_ajax_nopriv_next_recurrence', [$this, 'ajax_next_recurrence']);

        // Check before rendering campaign.
        add_action('hurryt_pre_render', [$this, 'pre_render_shortcode']);

        // Check actions for expired recurring and onetime campaigns
        // This only concerns shortcodes inserted in post editor.
        // Fallback to shortcode callback
        add_action('wp', [$this, 'check_post_shortcode']);
    }

    function run_in_background() {

        // At this time, all campagins with the "Expire coupon" action 
        // should run in background.
        $campaigns = get_posts([
            'post_type'   => HURRYT_POST_TYPE,
            'numberposts' => -1,
            'post_status' => 'publish',
        ]);

        foreach ($campaigns as $campaign) {
            $campaign = new Campaign($campaign->ID);

            $campaign->loadSettings();
            $action_expire_coupon = $campaign->get_action(C::ACTION_EXPIRE_COUPON);
            // $action_hide_atc_button = $campaign->get_action(C::ACTION_HIDE_ADD_TO_CART_BUTTON);

            $run_in_background = !empty($action_expire_coupon);
            if ($run_in_background) {
                echo do_shortcode('[hurrytimer id=' . $campaign->get_id() . ' run_in_background=true]');
            }
        }
    }

    /**
     * Check if there is shortcode in the current post.
     */
    function check_post_shortcode() {
        global $post;
        if (
            is_singular() && is_a($post, 'WP_Post')
            && has_shortcode($post->post_content, 'hurrytimer') && !(defined('DOING_AJAX') && DOING_AJAX)
        ) {
            $campaigns_ids = hurryt_parse_campaigns($post->post_content);
            foreach ($campaigns_ids as $id) {
                do_action('hurryt_pre_render', hurryt_get_campaign($id));
            }
        }
    }

    /**
     * @param $campaign Campaign
     */
    function pre_render_shortcode($campaign) {
        if ($campaign->is_running() && $campaign->is_expired()) {
            (new ActionManager($campaign))->run();
        }
    }


    public function ajax_next_recurrence() {
        // check_ajax_referer('hurryt', 'nonce');
        $campaign_id = absint($_GET['id']);
        if (
            !get_post($campaign_id)
            || get_post_type($campaign_id) !== HURRYT_POST_TYPE
        ) {
            die(-1);
        }

        $campaign = new Campaign($campaign_id);
        $endDate  = $campaign->getRecurrenceEndDate();
        
        wp_send_json_success([
            'endTimestamp' => $endDate ? $endDate->getBrowserTimestamp() : null,
        ]);
    }

    /**
     * Uses ajax to save start time for the given visitor.
     * This used to bypass cookie cache.
     */
    public function ajax_save_evergreen_start_time() {
        check_ajax_referer('hurryt', 'nonce');
        if (!isset($_POST['timestamp']) || !isset($_POST['cid'])) {
            wp_die();
        }

        $evergreen_campaign = new EvergreenCampaign(intval($_POST['cid']));
        $evergreen_campaign->setEndDate(filter_input(INPUT_POST, 'timestamp'));
        wp_die('Success!');
    }

    public function render_sticky_bar() {
        $args = [
            'post_type'        => HURRYT_POST_TYPE,
            'numberposts'      => -1,
            'post_status'      => 'publish',
            'meta_key'         => 'enable_sticky',
            'meta_value'       => C::YES,
        ];

        if(defined( 'ICL_SITEPRESS_VERSION' )){
            $args['suppress_filters'] = false;
        }
        
        $campaigns = get_posts($args);

        foreach ($campaigns as $post) {
            echo do_shortcode(sprintf('[hurrytimer id="%d" sticky="true" ]', $post->ID));
        }
    }

    /**
     * Apply change stock status
     */
    public function ajax_change_stock_status() {
        check_ajax_referer('hurryt', 'nonce');
        if (!isset($_POST['campaign_id'], $_POST['status'])) {
            die(-1);
        }
        $id          = intval($_POST['campaign_id']);
        $status      = sanitize_key($_POST['status']);
        $wc_campaign = new WCCampaign();
        $campaign    = new Campaign($id);
        $wc_campaign->change_stock_status($campaign, $status);
        die();
    }

    /**
     * Maybe display campaign on current product page.
     */
    public function render_on_product_page() {
        global $post;
        if (hurryt_is_woocommerce_activated() && is_product()) {
            $wc_campaign = new WCCampaign();
            $wc_campaign->run($post->ID);
        }
    }

    /**
     * Register the stylesheets for the public-facing side of the site.
     *
     * @since    1.0.0
     */
    public function enqueue_styles() {
        wp_enqueue_style( 'hurrytimer', CSS_Builder::get_instance()->get_css_url());
    }

    function get_custom_css(){
        $custom_css = get_option('hurrytimer_custom_css');
        if($custom_css){
            return $custom_css;
        }
        ob_start();
        // TODO: Minify CSS
        include __DIR__ . '/includes/css_template.php';
        $custom_css =  ob_get_clean();
        update_option('hurrytimer_custom_css', $custom_css);
        return $custom_css;
    }

    /**
     * Register the JavaScript for the public-facing side of the site.
     *
     * @since    1.0.0
     */
    public function enqueue_scripts() {

        wp_enqueue_script('jquery');

        $deps = ['jquery', 'hurryt-countdown'];

        // Use woocommerce js cookie if already enqueued.
        // TODO: remove this dep in the future
        // if(! wp_script_is('js-cookie') ){
            wp_enqueue_script(
                'hurryt-cookie',
                HURRYT_URL . 'assets/js/cookie.min.js',
                [],
                '3.14.1',
                true
            );
            $deps[] = 'hurryt-cookie';
        // }
       
        wp_enqueue_script(
            'hurryt-countdown',
            HURRYT_URL . 'assets/js/jquery.countdown.min.js',
            ['jquery'],
            '2.2.0',
            true
        );

        wp_enqueue_script(
            $this->plugin_name,
            HURRYT_URL . 'assets/js/hurrytimer.js',
            $deps,
            defined('WP_DEBUG') && WP_DEBUG ? time() : $this->version,
            true
        );


        $disable_actions = hurryt_is_admin_area() && hurryt_settings()['disable_actions'];
        $disable_actions = filter_var(
            apply_filters('hurryt_disable_actions', $disable_actions),
            FILTER_VALIDATE_BOOLEAN
        );

        wp_localize_script($this->plugin_name, 'hurrytimer_ajax_object', [
            'ajax_url'              => admin_url('admin-ajax.php'),
            'ajax_nonce'            => wp_create_nonce('hurryt'),
            'disable_actions'       => $disable_actions,
            'methods'               => [
                'COOKIE'       => C::DETECTION_METHOD_COOKIE,
                'IP'           => C::DETECTION_METHOD_IP,
                'USER_SESSION' => C::DETECTION_METHOD_USER_SESSION,
            ],
            'actionsOptions'        => [
                'none'                => C::ACTION_NONE,
                'hide'                => C::ACTION_HIDE,
                'redirect'            => C::ACTION_REDIRECT,
                'stockStatus'         => C::ACTION_CHANGE_STOCK_STATUS,
                'hideAddToCartButton' => C::ACTION_HIDE_ADD_TO_CART_BUTTON,
                'displayMessage'      => C::ACTION_DISPLAY_MESSAGE,
                'expire_coupon'       => C::ACTION_EXPIRE_COUPON,
            ],
            'restartOptions'        => [
                'none'        => C::RESTART_NONE,
                'immediately' => C::RESTART_IMMEDIATELY,
                'afterReload' => C::RESTART_AFTER_RELOAD,
                'after_duration' => C::RESTART_AFTER_DURATION,
            ],
            'COOKIEPATH'            => defined('COOKIEPATH') ? COOKIEPATH : '',
            'COOKIE_DOMAIN'         => defined('COOKIE_DOMAIN') ? COOKIE_DOMAIN : '',
            'redirect_no_back'      => apply_filters('hurryt_redirect_no_back', true),
            'expire_coupon_message' => $this->get_coupon_expired_message(),
            'invalid_checkout_coupon_message'=> $this->get_checkout_invalid_coupon_message()
        ]);
    }


    /**
     * Get WooCommerce coupon expired message.
     *
     *
     * TODO: move to /integration/woocommerce
     *
     * @return string
     * @since 2.3
     */
    function get_coupon_expired_message() {

        if (!hurryt_is_woocommerce_activated()) {
            return '';
        }

        try {
            return (new \WC_Coupon())->get_coupon_error(\WC_Coupon::E_WC_COUPON_EXPIRED);
        } catch (\Exception $e) {
            return '';
        }
    }
     function get_checkout_invalid_coupon_message() {

        if (!hurryt_is_woocommerce_activated()) {
            return '';
        }

        try {
            return (new \WC_Coupon())->get_coupon_error(\WC_Coupon::E_WC_COUPON_INVALID_REMOVED);
        } catch (\Exception $e) {
            return '';
        }
    }
}