From 4cf87dac1065f3da4a35b865f50cfd734c5c5b7e Mon Sep 17 00:00:00 2001 From: "Soare Robert Daniel (Mac 2023)" Date: Tue, 30 Jan 2024 12:35:24 +0200 Subject: [PATCH 01/15] feat: add black friday 2024 campaign --- img/black-friday-banner.png | Bin 27947 -> 27984 bytes includes/feedzy-rss-feeds-limited-offers.php | 8 ++++---- includes/feedzy-rss-feeds.php | 3 --- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/img/black-friday-banner.png b/img/black-friday-banner.png index 66af6ad346c188c9004819475fb510c1081ee7e1..44936dc3a2e4ff93218eba9e076aeb9bc88bc7fe 100644 GIT binary patch literal 27984 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 MSyh=@sjngb52B!3F8}}l diff --git a/includes/feedzy-rss-feeds-limited-offers.php b/includes/feedzy-rss-feeds-limited-offers.php index 678e9e9b..be833355 100644 --- a/includes/feedzy-rss-feeds-limited-offers.php +++ b/includes/feedzy-rss-feeds-limited-offers.php @@ -42,8 +42,8 @@ class Feedzy_Rss_Feeds_Limited_Offers { */ public $timelines = array( 'bf' => array( - 'start' => '2023-11-20 00:00:00', - 'end' => '2023-11-27 23:59:00', + 'start' => '2024-11-25 00:00:00', + 'end' => '2024-12-3 23:59:00', ), ); @@ -93,8 +93,8 @@ public function activate_bff() { $this->offer_metadata = array( 'bannerUrl' => FEEDZY_ABSURL . 'img/black-friday-banner.png', 'bannerAlt' => 'Feedzy Black Friday Sale', - 'linkDashboard' => tsdk_utmify( 'https://themeisle.com/plugins/feedzy-rss-feeds/blackfriday/', 'blackfridayltd23', 'dashboard' ), - 'linkGlobal' => tsdk_utmify( 'https://themeisle.com/plugins/feedzy-rss-feeds/blackfriday/', 'blackfridayltd23', 'globalnotice' ), + 'linkDashboard' => tsdk_utmify( 'https://themeisle.com/plugins/feedzy-rss-feeds/blackfriday/', 'bfcm24', 'dashboard' ), + 'linkGlobal' => '', 'urgencyText' => 'Hurry Up! Only ' . $this->get_remaining_time_for_deal( $this->get_active_deal() ) . ' left', ); } diff --git a/includes/feedzy-rss-feeds.php b/includes/feedzy-rss-feeds.php index 233dc164..efb6f926 100644 --- a/includes/feedzy-rss-feeds.php +++ b/includes/feedzy-rss-feeds.php @@ -298,9 +298,6 @@ function () { if ( ! feedzy_is_pro() ) { $offer = new Feedzy_Rss_Feeds_Limited_Offers(); $offer->load_banner(); - if ( $offer->is_active() && $offer->can_show_dashboard_banner() ) { - $offer->load_dashboard_hooks(); - } } } From 3ce87b1117312c94ea550b0318d2664e6be5b61f Mon Sep 17 00:00:00 2001 From: "Soare Robert Daniel (Mac 2023)" Date: Tue, 30 Jan 2024 14:42:01 +0200 Subject: [PATCH 02/15] feat: get black friday data from SDK --- includes/feedzy-rss-feeds-limited-offers.php | 113 ++++--------------- 1 file changed, 25 insertions(+), 88 deletions(-) diff --git a/includes/feedzy-rss-feeds-limited-offers.php b/includes/feedzy-rss-feeds-limited-offers.php index be833355..100a78a1 100644 --- a/includes/feedzy-rss-feeds-limited-offers.php +++ b/includes/feedzy-rss-feeds-limited-offers.php @@ -40,20 +40,32 @@ class Feedzy_Rss_Feeds_Limited_Offers { * * @var array[] */ - public $timelines = array( - 'bf' => array( - 'start' => '2024-11-25 00:00:00', - 'end' => '2024-12-3 23:59:00', - ), - ); + public $announcements = array(); /** * LimitedOffers constructor. */ public function __construct() { + + $this->announcements = apply_filters( 'themeisle_sdk_announcements', array() ); + try { - if ( $this->is_deal_active( 'bf' ) ) { - $this->activate_bff(); + foreach ( $this->announcements as $announcement => $event_data ) { + if ( false !== strpos( $slug, 'black_friday' ) ) { + if ( + empty( $event_data ) || + ! is_array( $event_data ) || + empty( $event_data['active'] ) || + empty( $event_data['feedzy_dashboard_url'] ) || + ! isset( $event_data['urgency_text'] ) + ) { + continue; + } + + $this->active = $announcement; + $this->prepare_black_friday_assets( $event_data ); + break; + } } } catch ( Exception $e ) { if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { @@ -85,17 +97,17 @@ public function is_active() { /** * Activate the Black Friday deal. * + * @param array $data Event data. + * * @return void */ - public function activate_bff() { - $this->active = 'bf'; - + public function prepare_black_friday_assets( $data ) { $this->offer_metadata = array( 'bannerUrl' => FEEDZY_ABSURL . 'img/black-friday-banner.png', 'bannerAlt' => 'Feedzy Black Friday Sale', - 'linkDashboard' => tsdk_utmify( 'https://themeisle.com/plugins/feedzy-rss-feeds/blackfriday/', 'bfcm24', 'dashboard' ), + 'linkDashboard' => esc_url_raw( $data['feedzy_dashboard_url'] ), 'linkGlobal' => '', - 'urgencyText' => 'Hurry Up! Only ' . $this->get_remaining_time_for_deal( $this->get_active_deal() ) . ' left', + 'urgencyText' => esc_html( $data['urgency_text'] ), ); } @@ -108,79 +120,6 @@ public function get_active_deal() { return $this->active; } - /** - * Check if the deal is active with the given slug. - * - * @param string $slug Slug of the deal. - * - * @throws Exception When date is invalid. - */ - public function is_deal_active( $slug ) { - - if ( empty( $slug ) || ! array_key_exists( $slug, $this->timelines ) ) { - return false; - } - - return $this->check_date_range( $this->timelines[ $slug ]['start'], $this->timelines[ $slug ]['end'] ); - } - - /** - * Get the remaining time for the deal in a human readable format. - * - * @param string $slug Slug of the deal. - * @return string Remaining time for the deal. - */ - public function get_remaining_time_for_deal( $slug ) { - if ( empty( $slug ) || ! array_key_exists( $slug, $this->timelines ) ) { - return ''; - } - - try { - $end_date = new DateTime( $this->timelines[ $slug ]['end'], new DateTimeZone( 'GMT' ) ); - $current_date = new DateTime( 'now', new DateTimeZone( 'GMT' ) ); - $diff = $end_date->diff( $current_date ); - - if ( $diff->days > 0 ) { - return $diff->days === 1 ? $diff->format( '%a day' ) : $diff->format( '%a days' ); - } - - if ( $diff->h > 0 ) { - return $diff->h === 1 ? $diff->format( '%h hour' ) : $diff->format( '%h hours' ); - } - - if ( $diff->i > 0 ) { - return $diff->i === 1 ? $diff->format( '%i minute' ) : $diff->format( '%i minutes' ); - } - - return $diff->s === 1 ? $diff->format( '%s second' ) : $diff->format( '%s seconds' ); - } catch ( Exception $e ) { - if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { - error_log( $e->getMessage() ); // phpcs:ignore - } - } - - return ''; - } - - /** - * Check if the current date is in the range of the offer. - * - * @param string $start Start date. - * @param string $end End date. - * - * @return bool True if the current date is in the range of the offer. - * - * @throws Exception When date is invalid. - */ - public function check_date_range( $start, $end ) { - - $start_date = new DateTime( $start, new DateTimeZone( 'GMT' ) ); - $end_date = new DateTime( $end, new DateTimeZone( 'GMT' ) ); - $current_date = new DateTime( 'now', new DateTimeZone( 'GMT' ) ); - - return $start_date <= $current_date && $current_date <= $end_date; - } - /** * Get the localized data for the plugin. * @@ -191,8 +130,6 @@ public function get_localized_data() { array( 'active' => $this->is_active(), 'dealSlug' => $this->get_active_deal(), - 'remainingTime' => $this->get_remaining_time_for_deal( $this->get_active_deal() ), - 'urgencyText' => 'Hurry Up! Only ' . $this->get_remaining_time_for_deal( $this->get_active_deal() ) . ' left', ), $this->offer_metadata ); From bc8c37b09a1601d29d06b620b239aec953ecf8cc Mon Sep 17 00:00:00 2001 From: "Soare Robert Daniel (Mac 2023)" Date: Tue, 30 Jan 2024 15:05:54 +0200 Subject: [PATCH 03/15] chore: typo --- includes/feedzy-rss-feeds-limited-offers.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/feedzy-rss-feeds-limited-offers.php b/includes/feedzy-rss-feeds-limited-offers.php index 100a78a1..8102d81d 100644 --- a/includes/feedzy-rss-feeds-limited-offers.php +++ b/includes/feedzy-rss-feeds-limited-offers.php @@ -51,7 +51,7 @@ public function __construct() { try { foreach ( $this->announcements as $announcement => $event_data ) { - if ( false !== strpos( $slug, 'black_friday' ) ) { + if ( false !== strpos( $announcement, 'black_friday' ) ) { if ( empty( $event_data ) || ! is_array( $event_data ) || From 9cfed4a54d8eb938d8e04534dfa50981c35ffe4f Mon Sep 17 00:00:00 2001 From: "Soare Robert Daniel (Mac 2023)" Date: Tue, 30 Jan 2024 15:47:48 +0200 Subject: [PATCH 04/15] refactor: names --- includes/feedzy-rss-feeds-limited-offers.php | 41 +++++++++++++------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/includes/feedzy-rss-feeds-limited-offers.php b/includes/feedzy-rss-feeds-limited-offers.php index 8102d81d..fe24a888 100644 --- a/includes/feedzy-rss-feeds-limited-offers.php +++ b/includes/feedzy-rss-feeds-limited-offers.php @@ -33,7 +33,7 @@ class Feedzy_Rss_Feeds_Limited_Offers { * * @var array */ - public $offer_metadata = array(); + public $assets = array(); /** * Timeline for the offers. @@ -49,6 +49,10 @@ public function __construct() { $this->announcements = apply_filters( 'themeisle_sdk_announcements', array() ); + if ( empty( $this->announcements ) || ! is_array( $this->announcements ) ) { + return; + } + try { foreach ( $this->announcements as $announcement => $event_data ) { if ( false !== strpos( $announcement, 'black_friday' ) ) { @@ -64,7 +68,6 @@ public function __construct() { $this->active = $announcement; $this->prepare_black_friday_assets( $event_data ); - break; } } } catch ( Exception $e ) { @@ -80,6 +83,11 @@ public function __construct() { * @return void */ public function load_dashboard_hooks() { + + if ( empty( $this->assets['globalNoticeUrl'] ) ) { + return; + } + add_filter( 'themeisle_products_deal_priority', array( $this, 'add_priority' ) ); add_action( 'admin_notices', array( $this, 'render_notice') ); add_action( 'wp_ajax_dismiss_themeisle_sale_notice_feedzy', array( $this, 'disable_notification_ajax' ) ); @@ -102,12 +110,15 @@ public function is_active() { * @return void */ public function prepare_black_friday_assets( $data ) { - $this->offer_metadata = array( - 'bannerUrl' => FEEDZY_ABSURL . 'img/black-friday-banner.png', - 'bannerAlt' => 'Feedzy Black Friday Sale', - 'linkDashboard' => esc_url_raw( $data['feedzy_dashboard_url'] ), - 'linkGlobal' => '', - 'urgencyText' => esc_html( $data['urgency_text'] ), + $this->assets = array_merge( + $this->assets, + array( + 'bannerUrl' => FEEDZY_ABSURL . 'img/black-friday-banner.png', + 'bannerAlt' => 'Feedzy Black Friday Sale', + 'linkDashboard' => esc_url_raw( $data['feedzy_dashboard_url'] ), + 'linkGlobal' => '', + 'urgencyText' => esc_html( $data['urgency_text'] ), + ) ); } @@ -131,7 +142,7 @@ public function get_localized_data() { 'active' => $this->is_active(), 'dealSlug' => $this->get_active_deal(), ), - $this->offer_metadata + $this->assets ); } @@ -211,7 +222,7 @@ public function render_notice() { - + @@ -308,6 +319,10 @@ public function has_priority() { */ public function render_banner() { + if ( empty( $this->assets['linkDashboard'] ) || empty( $this->assets['bannerUrl'] ) ) { + return; + } + if ( ! function_exists( 'get_current_screen' ) ) { return; } @@ -370,10 +385,10 @@ public function render_banner() { } From ecf9dfb9147f675d930e9fad27f9b53daaeccc2e Mon Sep 17 00:00:00 2001 From: "Soare Robert Daniel (Mac 2023)" Date: Tue, 30 Jan 2024 16:50:00 +0200 Subject: [PATCH 05/15] refactor: assets name --- includes/feedzy-rss-feeds-limited-offers.php | 6 +++--- includes/layouts/settings.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/includes/feedzy-rss-feeds-limited-offers.php b/includes/feedzy-rss-feeds-limited-offers.php index fe24a888..616f3353 100644 --- a/includes/feedzy-rss-feeds-limited-offers.php +++ b/includes/feedzy-rss-feeds-limited-offers.php @@ -115,7 +115,7 @@ public function prepare_black_friday_assets( $data ) { array( 'bannerUrl' => FEEDZY_ABSURL . 'img/black-friday-banner.png', 'bannerAlt' => 'Feedzy Black Friday Sale', - 'linkDashboard' => esc_url_raw( $data['feedzy_dashboard_url'] ), + 'bannerStoreUrl' => esc_url_raw( $data['feedzy_dashboard_url'] ), 'linkGlobal' => '', 'urgencyText' => esc_html( $data['urgency_text'] ), ) @@ -319,7 +319,7 @@ public function has_priority() { */ public function render_banner() { - if ( empty( $this->assets['linkDashboard'] ) || empty( $this->assets['bannerUrl'] ) ) { + if ( empty( $this->assets['bannerStoreUrl'] ) || empty( $this->assets['bannerUrl'] ) ) { return; } @@ -385,7 +385,7 @@ public function render_banner() { }
- + <?php echo esc_attr( ! empty( $this->assets['bannerAlt'] ) ? $this->assets['bannerAlt'] : '' ); ?>
assets['urgencyText'] ) ? $this->assets['urgencyText'] : '' ); ?> diff --git a/includes/layouts/settings.php b/includes/layouts/settings.php index 2456fc27..351c7b93 100644 --- a/includes/layouts/settings.php +++ b/includes/layouts/settings.php @@ -33,7 +33,7 @@
- + <?php echo esc_html( $offer_data['bannerAlt'] ); ?>
From 1e2b9709f6a56563f45da923e7b13a4b2dc9bb17 Mon Sep 17 00:00:00 2001 From: Soare Robert Daniel Date: Wed, 7 Feb 2024 12:42:07 +0200 Subject: [PATCH 06/15] chore: update phpdocs --- includes/feedzy-rss-feeds-limited-offers.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/includes/feedzy-rss-feeds-limited-offers.php b/includes/feedzy-rss-feeds-limited-offers.php index 616f3353..51055812 100644 --- a/includes/feedzy-rss-feeds-limited-offers.php +++ b/includes/feedzy-rss-feeds-limited-offers.php @@ -29,16 +29,16 @@ class Feedzy_Rss_Feeds_Limited_Offers { public $wp_option_dismiss_notification_key_base = 'dismiss_themeisle_notice_event_'; /** - * Offer Links + * Metadata for announcements. * - * @var array + * @var array */ public $assets = array(); /** * Timeline for the offers. * - * @var array[] + * @var array */ public $announcements = array(); From f88d8b838c01730ffd310aebace97337da12632f Mon Sep 17 00:00:00 2001 From: Soare Robert Daniel Date: Thu, 8 Feb 2024 15:48:17 +0200 Subject: [PATCH 07/15] chore: update phpdoc --- includes/feedzy-rss-feeds-limited-offers.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/feedzy-rss-feeds-limited-offers.php b/includes/feedzy-rss-feeds-limited-offers.php index 51055812..b6a4f6a4 100644 --- a/includes/feedzy-rss-feeds-limited-offers.php +++ b/includes/feedzy-rss-feeds-limited-offers.php @@ -36,7 +36,7 @@ class Feedzy_Rss_Feeds_Limited_Offers { public $assets = array(); /** - * Timeline for the offers. + * Announcements. * * @var array */ From 6d428233e5f88f7889c361618936235b9b7a93d5 Mon Sep 17 00:00:00 2001 From: "Soare Robert Daniel (Mac 2023)" Date: Tue, 13 Feb 2024 17:02:34 +0200 Subject: [PATCH 08/15] fix: try reuse image before generating --- includes/admin/feedzy-rss-feeds-import.php | 55 ++++++++++++++++------ 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/includes/admin/feedzy-rss-feeds-import.php b/includes/admin/feedzy-rss-feeds-import.php index ae8b1068..8d63c40b 100644 --- a/includes/admin/feedzy-rss-feeds-import.php +++ b/includes/admin/feedzy-rss-feeds-import.php @@ -1818,22 +1818,25 @@ function( $term ) { } } - // Item image action. - $import_featured_img = rawurldecode( $import_featured_img ); - $import_featured_img = trim( $import_featured_img ); - $img_action = $this->handle_content_actions( $import_featured_img, 'item_image' ); - // Item image action process. - $image_url = $img_action->run_action_job( $import_featured_img, $import_translation_lang, $job, $language_code, $item, $image_url ); - - if ( ! empty( $image_url ) ) { - if ( 'yes' === $import_item_img_url ) { - // Set external image URL. - update_post_meta( $new_post_id, 'feedzy_item_external_url', $image_url ); - } else { - // if import_featured_img is a tag. - $img_success = $this->generate_featured_image( $image_url, $new_post_id, $item['item_title'], $import_errors, $import_info ); + if ( 'yes' === $import_item_img_url || ! $this->tryReuseExistingFeaturedImage( $img_success, $item['item_title'], $new_post_id ) ) { + // Item image action. + $import_featured_img = rawurldecode( $import_featured_img ); + $import_featured_img = trim( $import_featured_img ); + $img_action = $this->handle_content_actions( $import_featured_img, 'item_image' ); + // Item image action process. + $image_url = $img_action->run_action_job( $import_featured_img, $import_translation_lang, $job, $language_code, $item, $image_url ); + + if ( ! empty( $image_url ) ) { + if ( 'yes' === $import_item_img_url ) { + // Set external image URL. + update_post_meta( $new_post_id, 'feedzy_item_external_url', $image_url ); + } else { + // if import_featured_img is a tag. + $img_success = $this->generate_featured_image( $image_url, $new_post_id, $item['item_title'], $import_errors, $import_info ); + } } } + // Set default thumbnail image. if ( ! $img_success && ! empty( $default_thumbnail ) ) { $img_success = set_post_thumbnail( $new_post_id, $default_thumbnail ); @@ -1940,6 +1943,30 @@ public function get_job_feed( $options, $import_content = null, $raw_feed_also = return $feed_items; } + /** + * Reuses an existing featured image if possible. + * + * @param int|bool $result The result of the operation. It can be a boolean or an attachment ID. + * @param string $title_feed The title of the feed. + * @param int $post_id The post ID. + * + * @return bool + */ + public function tryReuseExistingFeaturedImage( &$result, $title_feed, $post_id = 0 ) { + if ( ! function_exists( 'post_exists' ) ) { + require_once ABSPATH . 'wp-admin/includes/post.php'; + } + // Find existing attachment by feed title. + $attachment_id = post_exists( $title_feed, '', '', 'attachment' ); + + if ( ! $attachment_id ) { + return false; + } + + $result = set_post_thumbnail( $post_id, $attachment_id ); + return true; + } + /** * Downloads and sets a post featured image if possible. * From 32bf8a3dd7b7840f6ef07438a8f51183dedf04f7 Mon Sep 17 00:00:00 2001 From: "Soare Robert Daniel (Mac 2023)" Date: Wed, 14 Feb 2024 15:41:33 +0200 Subject: [PATCH 09/15] feat: add nps survey --- includes/admin/feedzy-rss-feeds-admin.php | 88 +++++++++++++++++++++++ js/survey.js | 13 ++++ 2 files changed, 101 insertions(+) create mode 100644 js/survey.js diff --git a/includes/admin/feedzy-rss-feeds-admin.php b/includes/admin/feedzy-rss-feeds-admin.php index f0a3d49c..b734e36f 100644 --- a/includes/admin/feedzy-rss-feeds-admin.php +++ b/includes/admin/feedzy-rss-feeds-admin.php @@ -128,6 +128,12 @@ public function enqueue_styles_admin() { wp_enqueue_script( $this->plugin_name . '_telemetry', FEEDZY_ABSURL . 'js/telemetry.js', array(), $this->version, true ); } + if ( 'feedzy_imports' === $screen->post_type && 'edit' === $screen->base ) { + if ( ! defined( 'CYPRESS_TESTING' ) ) { + $this->register_survey(); + } + } + if ( 'feedzy_categories' === $screen->post_type ) { wp_enqueue_script( $this->plugin_name . '_categories', @@ -152,6 +158,10 @@ public function enqueue_styles_admin() { ), ) ); + + if ( ! defined( 'CYPRESS_TESTING' ) ) { + $this->register_survey(); + } } if ( 'feedzy_page_feedzy-settings' === $screen->base ) { @@ -171,6 +181,10 @@ public function enqueue_styles_admin() { ), ) ); + + if ( ! defined( 'CYPRESS_TESTING' ) ) { + $this->register_survey(); + } } $upsell_screens = array( 'feedzy-rss_page_feedzy-settings', 'feedzy-rss_page_feedzy-admin-menu-pro-upsell' ); @@ -195,6 +209,10 @@ public function enqueue_styles_admin() { ) ); wp_enqueue_style( 'wp-block-editor' ); + + if ( ! defined( 'CYPRESS_TESTING' ) ) { + $this->register_survey(); + } } if ( ! defined( 'TI_CYPRESS_TESTING' ) && ( 'edit' !== $screen->base && 'feedzy_imports' === $screen->post_type && feedzy_show_import_tour() ) ) { wp_enqueue_script( $this->plugin_name . '_on_boarding', FEEDZY_ABSURL . 'js/Onboarding/import-onboarding.min.js', array( 'react', 'react-dom', 'wp-editor', 'wp-api', 'lodash' ), $this->version, true ); @@ -205,6 +223,9 @@ public function enqueue_styles_admin() { } if ( 'feedzy_page_feedzy-support' === $screen->base || ( 'edit' !== $screen->base && 'feedzy_imports' === $screen->post_type ) ) { + if ( ! defined( 'CYPRESS_TESTING' ) ) { + $this->register_survey(); + } wp_enqueue_script( $this->plugin_name . '_feedback', FEEDZY_ABSURL . 'js/FeedBack/feedback.min.js', array( 'react', 'react-dom', 'wp-editor', 'wp-api', 'lodash' ), $this->version, true ); wp_enqueue_style( 'wp-block-editor' ); @@ -1565,10 +1586,13 @@ public function api_license_status() { 'spinnerChiefStatus' => false, 'wordaiStatus' => false, 'openaiStatus' => false, + 'amazonStatus' => false, ); + if ( ! feedzy_is_pro() ) { return $data; } + if ( apply_filters( 'feedzy_is_license_of_type', false, 'agency' ) ) { if ( isset( $pro_options['spinnerchief_licence'] ) && 'yes' === $pro_options['spinnerchief_licence'] ) { $data['spinnerChiefStatus'] = true; @@ -1577,11 +1601,75 @@ public function api_license_status() { $data['wordaiStatus'] = true; } } + if ( isset( $pro_options['openai_licence'] ) && 'yes' === $pro_options['openai_licence'] ) { if ( apply_filters( 'feedzy_is_license_of_type', false, 'business' ) || apply_filters( 'feedzy_is_license_of_type', false, 'agency' ) ) { $data['openaiStatus'] = true; } } + + if ( ! empty( $pro_options['amazon_access_key'] ) && ! empty( $pro_options['amazon_secret_key'] ) ) { + $data['amazonStatus'] = true; + } return $data; } + + /** + * Get the data used for the survey. + * + * @return array + * @see survey.js + */ + public function get_survery_metadata() { + + $user_id = 'feedzy_'; + $license = get_option( 'feedzy_rss_feeds_pro_license_data', array() ); + + if ( ! empty( $license->key ) ) { + $user_id .= $license->key; + } else { + $user_id .= 'free'; + } + + $integration_status = $this->api_license_status(); + + $days_since_install = round( ( time() - get_option( 'feedzy_rss_feeds_install', 0 ) ) / DAY_IN_SECONDS ); + $install_category = null; + if ( 0 === $days_since_install || 1 === $days_since_install ) { + $install_category = 0; + } elseif ( 1 < $days_since_install && 8 > $days_since_install ) { + $install_category = 7; + } elseif ( 8 <= $days_since_install && 31 > $days_since_install ) { + $install_category = 30; + } elseif ( 30 < $days_since_install && 90 > $days_since_install ) { + $install_category = 90; + } elseif ( 90 <= $days_since_install ) { + $install_category = 91; + } + + return array( + 'userId' => $user_id, + 'attributes' => array( + 'free_version' => $this->version, + 'pro_version' => defined( 'FEEDZY_PRO_VERSION' ) ? FEEDZY_PRO_VERSION : '', + 'openai' => $integration_status['openaiStatus'] ? 'valid' : 'invalid', + 'amazon' => $integration_status['amazonStatus'] ? 'valid' : 'invalid', + 'spinnerchief' => $integration_status['spinnerChiefStatus'] ? 'valid' : 'invalid', + 'wordai' => $integration_status['wordaiStatus'] ? 'valid' : 'invalid', + 'plan' => apply_filters( 'product_feedzy_license_plan', 0 ), + 'days_since_install' => $install_category, + ), + ); + } + + /** + * Register the survey script. + */ + public function register_survey() { + + // Register the survey script. + wp_register_script( $this->plugin_name . '_survey_formbrick', 'https://unpkg.com/@formbricks/js@^1.5.1/dist/index.umd.js', array(), $this->version, true ); + wp_enqueue_script( $this->plugin_name . '_survey', FEEDZY_ABSURL . 'js/survey.js', array( $this->plugin_name . '_survey_formbrick' ), $this->version, true ); + wp_localize_script( $this->plugin_name . '_survey', 'feedzySurveyData', $this->get_survery_metadata() ); + } } diff --git a/js/survey.js b/js/survey.js new file mode 100644 index 00000000..49a4befc --- /dev/null +++ b/js/survey.js @@ -0,0 +1,13 @@ +/** + * Initialize the formbricks survey. + * + * @see https://github.com/formbricks/setup-examples/tree/main/html + */ +window.addEventListener('load', function () { + window?.formbricks?.init?.({ + environmentId: "clskgehf78eu5podwdrnzciti", + apiHost: "https://app.formbricks.com", + debug: true, + ...(window?.feedzySurveyData ?? {}) + }); +}); \ No newline at end of file From 114c75c4d1a3875c27f91b98975747943ed4f4d2 Mon Sep 17 00:00:00 2001 From: "Soare Robert Daniel (Mac 2023)" Date: Wed, 14 Feb 2024 15:53:22 +0200 Subject: [PATCH 10/15] feat: normalized url for user id survey --- includes/admin/feedzy-rss-feeds-admin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/admin/feedzy-rss-feeds-admin.php b/includes/admin/feedzy-rss-feeds-admin.php index b734e36f..8c557bd9 100644 --- a/includes/admin/feedzy-rss-feeds-admin.php +++ b/includes/admin/feedzy-rss-feeds-admin.php @@ -1628,7 +1628,7 @@ public function get_survery_metadata() { if ( ! empty( $license->key ) ) { $user_id .= $license->key; } else { - $user_id .= 'free'; + $user_id .= preg_replace( '/[^\w\d]*/', '', get_site_url() ); // Use a normalized version of the site URL as a user ID for free users. } $integration_status = $this->api_license_status(); From 4782d62cfc9f19c0e93840d0e7485f3ba538e3bf Mon Sep 17 00:00:00 2001 From: "Soare Robert Daniel (Mac 2023)" Date: Thu, 15 Feb 2024 14:50:18 +0200 Subject: [PATCH 11/15] feat: nps plan category & license status --- includes/admin/feedzy-rss-feeds-admin.php | 42 ++++++++++++++++++++--- js/survey.js | 3 +- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/includes/admin/feedzy-rss-feeds-admin.php b/includes/admin/feedzy-rss-feeds-admin.php index 8c557bd9..11d81106 100644 --- a/includes/admin/feedzy-rss-feeds-admin.php +++ b/includes/admin/feedzy-rss-feeds-admin.php @@ -1614,6 +1614,37 @@ public function api_license_status() { return $data; } + /** + * Get the plan category for the product plan ID. + * + * @param object $license_data The license data. + * @return int + */ + private static function plan_category( $license_data ) { + + if ( ! isset( $license_data->plan ) || ! is_numeric( $license_data->plan ) ) { + return 0; // Free + } + + $plan = (int) $license_data->plan; + $current_category = 0; + + $categories = array( + '1' => array(1, 4, 9), // Personal + '2' => array(2, 5, 8), // Business/Developer + '3' => array(3, 6, 7, 10), // Agency + ); + + foreach ( $categories as $category => $plans ) { + if ( in_array( $plan, $plans, true ) ) { + $current_category = (int) $category; + break; + } + } + + return $current_category; + } + /** * Get the data used for the survey. * @@ -1623,10 +1654,10 @@ public function api_license_status() { public function get_survery_metadata() { $user_id = 'feedzy_'; - $license = get_option( 'feedzy_rss_feeds_pro_license_data', array() ); + $license_data = get_option( 'feedzy_rss_feeds_pro_license_data', array() ); - if ( ! empty( $license->key ) ) { - $user_id .= $license->key; + if ( ! empty( $license_data->key ) ) { + $user_id .= $license_data->key; } else { $user_id .= preg_replace( '/[^\w\d]*/', '', get_site_url() ); // Use a normalized version of the site URL as a user ID for free users. } @@ -1634,7 +1665,7 @@ public function get_survery_metadata() { $integration_status = $this->api_license_status(); $days_since_install = round( ( time() - get_option( 'feedzy_rss_feeds_install', 0 ) ) / DAY_IN_SECONDS ); - $install_category = null; + $install_category = 0; if ( 0 === $days_since_install || 1 === $days_since_install ) { $install_category = 0; } elseif ( 1 < $days_since_install && 8 > $days_since_install ) { @@ -1656,8 +1687,9 @@ public function get_survery_metadata() { 'amazon' => $integration_status['amazonStatus'] ? 'valid' : 'invalid', 'spinnerchief' => $integration_status['spinnerChiefStatus'] ? 'valid' : 'invalid', 'wordai' => $integration_status['wordaiStatus'] ? 'valid' : 'invalid', - 'plan' => apply_filters( 'product_feedzy_license_plan', 0 ), + 'plan' => $this->plan_category( $license_data ), 'days_since_install' => $install_category, + 'license_status' => ! empty( $license_data->license ) ? $license_data->license : 'invalid', ), ); } diff --git a/js/survey.js b/js/survey.js index 49a4befc..1071763b 100644 --- a/js/survey.js +++ b/js/survey.js @@ -7,7 +7,6 @@ window.addEventListener('load', function () { window?.formbricks?.init?.({ environmentId: "clskgehf78eu5podwdrnzciti", apiHost: "https://app.formbricks.com", - debug: true, - ...(window?.feedzySurveyData ?? {}) + ...(window?.feedzySurveyData ?? {}), }); }); \ No newline at end of file From 2ecb1eb0dd72d4b9c85a62f6f04658cb7d73fbe9 Mon Sep 17 00:00:00 2001 From: "Soare Robert Daniel (Mac 2023)" Date: Thu, 15 Feb 2024 14:59:40 +0200 Subject: [PATCH 12/15] chore: unknown nps plan category --- includes/admin/feedzy-rss-feeds-admin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/admin/feedzy-rss-feeds-admin.php b/includes/admin/feedzy-rss-feeds-admin.php index 11d81106..ccfcb189 100644 --- a/includes/admin/feedzy-rss-feeds-admin.php +++ b/includes/admin/feedzy-rss-feeds-admin.php @@ -1627,7 +1627,7 @@ private static function plan_category( $license_data ) { } $plan = (int) $license_data->plan; - $current_category = 0; + $current_category = -1; $categories = array( '1' => array(1, 4, 9), // Personal From 211a3497e62ab905d8e556a098c3a941620d026d Mon Sep 17 00:00:00 2001 From: "Soare Robert Daniel (Mac 2023)" Date: Mon, 26 Feb 2024 12:59:23 +0200 Subject: [PATCH 13/15] refactor: CI env checking for survey loading --- includes/admin/feedzy-rss-feeds-admin.php | 30 +++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/includes/admin/feedzy-rss-feeds-admin.php b/includes/admin/feedzy-rss-feeds-admin.php index ccfcb189..fc3199a4 100644 --- a/includes/admin/feedzy-rss-feeds-admin.php +++ b/includes/admin/feedzy-rss-feeds-admin.php @@ -129,9 +129,7 @@ public function enqueue_styles_admin() { } if ( 'feedzy_imports' === $screen->post_type && 'edit' === $screen->base ) { - if ( ! defined( 'CYPRESS_TESTING' ) ) { - $this->register_survey(); - } + $this->register_survey(); } if ( 'feedzy_categories' === $screen->post_type ) { @@ -159,9 +157,7 @@ public function enqueue_styles_admin() { ) ); - if ( ! defined( 'CYPRESS_TESTING' ) ) { - $this->register_survey(); - } + $this->register_survey(); } if ( 'feedzy_page_feedzy-settings' === $screen->base ) { @@ -182,9 +178,7 @@ public function enqueue_styles_admin() { ) ); - if ( ! defined( 'CYPRESS_TESTING' ) ) { - $this->register_survey(); - } + $this->register_survey(); } $upsell_screens = array( 'feedzy-rss_page_feedzy-settings', 'feedzy-rss_page_feedzy-admin-menu-pro-upsell' ); @@ -210,9 +204,7 @@ public function enqueue_styles_admin() { ); wp_enqueue_style( 'wp-block-editor' ); - if ( ! defined( 'CYPRESS_TESTING' ) ) { - $this->register_survey(); - } + $this->register_survey(); } if ( ! defined( 'TI_CYPRESS_TESTING' ) && ( 'edit' !== $screen->base && 'feedzy_imports' === $screen->post_type && feedzy_show_import_tour() ) ) { wp_enqueue_script( $this->plugin_name . '_on_boarding', FEEDZY_ABSURL . 'js/Onboarding/import-onboarding.min.js', array( 'react', 'react-dom', 'wp-editor', 'wp-api', 'lodash' ), $this->version, true ); @@ -223,9 +215,9 @@ public function enqueue_styles_admin() { } if ( 'feedzy_page_feedzy-support' === $screen->base || ( 'edit' !== $screen->base && 'feedzy_imports' === $screen->post_type ) ) { - if ( ! defined( 'CYPRESS_TESTING' ) ) { - $this->register_survey(); - } + + $this->register_survey(); + wp_enqueue_script( $this->plugin_name . '_feedback', FEEDZY_ABSURL . 'js/FeedBack/feedback.min.js', array( 'react', 'react-dom', 'wp-editor', 'wp-api', 'lodash' ), $this->version, true ); wp_enqueue_style( 'wp-block-editor' ); @@ -1696,9 +1688,17 @@ public function get_survery_metadata() { /** * Register the survey script. + * + * It does register if we are in CI environment. + * + * @return void */ public function register_survey() { + if ( defined( 'CYPRESS_TESTING' ) ) { + return; + } + // Register the survey script. wp_register_script( $this->plugin_name . '_survey_formbrick', 'https://unpkg.com/@formbricks/js@^1.5.1/dist/index.umd.js', array(), $this->version, true ); wp_enqueue_script( $this->plugin_name . '_survey', FEEDZY_ABSURL . 'js/survey.js', array( $this->plugin_name . '_survey_formbrick' ), $this->version, true ); From 4c4fff28a9677580e4b6fb2305f928a7149d9d9b Mon Sep 17 00:00:00 2001 From: "Soare Robert Daniel (Mac 2023)" Date: Tue, 27 Feb 2024 14:41:52 +0200 Subject: [PATCH 14/15] refactor: use formbricks deps from SDK --- includes/admin/feedzy-rss-feeds-admin.php | 10 +++++++--- js/survey.js | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/includes/admin/feedzy-rss-feeds-admin.php b/includes/admin/feedzy-rss-feeds-admin.php index fc3199a4..fa4a95b2 100644 --- a/includes/admin/feedzy-rss-feeds-admin.php +++ b/includes/admin/feedzy-rss-feeds-admin.php @@ -1699,9 +1699,13 @@ public function register_survey() { return; } - // Register the survey script. - wp_register_script( $this->plugin_name . '_survey_formbrick', 'https://unpkg.com/@formbricks/js@^1.5.1/dist/index.umd.js', array(), $this->version, true ); - wp_enqueue_script( $this->plugin_name . '_survey', FEEDZY_ABSURL . 'js/survey.js', array( $this->plugin_name . '_survey_formbrick' ), $this->version, true ); + $survey_handler = apply_filters( 'themeisle_sdk_dependency_script_handler', 'survey' ); + if ( empty( $survey_handler ) ) { + return; + } + + do_action( 'themeisle_sdk_dependency_enqueue_script', 'survey' ); + wp_enqueue_script( $this->plugin_name . '_survey', FEEDZY_ABSURL . 'js/survey.js', array( $survey_handler ), $this->version, true ); wp_localize_script( $this->plugin_name . '_survey', 'feedzySurveyData', $this->get_survery_metadata() ); } } diff --git a/js/survey.js b/js/survey.js index 1071763b..88dc55f2 100644 --- a/js/survey.js +++ b/js/survey.js @@ -3,8 +3,8 @@ * * @see https://github.com/formbricks/setup-examples/tree/main/html */ -window.addEventListener('load', function () { - window?.formbricks?.init?.({ +window.addEventListener('themeisle:survey:loaded', function () { + window?.tsdk_formbricks?.init?.({ environmentId: "clskgehf78eu5podwdrnzciti", apiHost: "https://app.formbricks.com", ...(window?.feedzySurveyData ?? {}), From 678455f4672f6b608ee73607f5ea9e795f411043 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 20:41:53 +0000 Subject: [PATCH 15/15] Bump codeinwp/themeisle-sdk from 3.3.13 to 3.3.14 Bumps [codeinwp/themeisle-sdk](https://github.com/Codeinwp/themeisle-sdk) from 3.3.13 to 3.3.14. - [Release notes](https://github.com/Codeinwp/themeisle-sdk/releases) - [Changelog](https://github.com/Codeinwp/themeisle-sdk/blob/master/CHANGELOG.md) - [Commits](https://github.com/Codeinwp/themeisle-sdk/compare/v3.3.13...v3.3.14) --- updated-dependencies: - dependency-name: codeinwp/themeisle-sdk dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 36605089..0f974c16 100644 --- a/composer.lock +++ b/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "codeinwp/themeisle-sdk", - "version": "3.3.13", + "version": "3.3.14", "source": { "type": "git", "url": "https://github.com/Codeinwp/themeisle-sdk.git", - "reference": "2209cdf402e8f97def8d699bb8447dc67585cc95" + "reference": "662952078c57b12e4d3af9bc98ef847ea3500206" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/2209cdf402e8f97def8d699bb8447dc67585cc95", - "reference": "2209cdf402e8f97def8d699bb8447dc67585cc95", + "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/662952078c57b12e4d3af9bc98ef847ea3500206", + "reference": "662952078c57b12e4d3af9bc98ef847ea3500206", "shasum": "" }, "require-dev": { @@ -42,9 +42,9 @@ ], "support": { "issues": "https://github.com/Codeinwp/themeisle-sdk/issues", - "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.13" + "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.14" }, - "time": "2024-02-01T14:10:46+00:00" + "time": "2024-02-27T17:30:04+00:00" } ], "packages-dev": [