From 4cf3df1ee27b9592aae1b1c4196364319eb7584f Mon Sep 17 00:00:00 2001 From: "Soare Robert Daniel (Mac 2023)" Date: Wed, 19 Feb 2025 17:00:52 +0200 Subject: [PATCH] feat: load Formbricks survey via internal pages hooks --- assets/src/dashboard/parts/connected/index.js | 33 --------- inc/admin.php | 71 +++++++++++++++++++ inc/dam.php | 2 + optimole-wp.php | 1 + package-lock.json | 13 +--- package.json | 1 - tests/static-analysis-stubs/optimole-wp.php | 2 + 7 files changed, 77 insertions(+), 46 deletions(-) diff --git a/assets/src/dashboard/parts/connected/index.js b/assets/src/dashboard/parts/connected/index.js index bf7c4c8f..698495ea 100644 --- a/assets/src/dashboard/parts/connected/index.js +++ b/assets/src/dashboard/parts/connected/index.js @@ -21,41 +21,8 @@ import Help from './help'; import Sidebar from './Sidebar'; import CSAT from './CSAT'; import { retrieveConflicts } from '../../utils/api'; -import formbricks from '@formbricks/js/app'; import BlackFridayBanner from '../components/BlackFridayBanner'; -if ( 'undefined' !== typeof window && optimoleDashboardApp.user_data.plan ) { - formbricks.init({ - environmentId: 'clo8wxwzj44orpm0gjchurujm', - apiHost: 'https://app.formbricks.com', - userId: 'optml_' + ( optimoleDashboardApp.user_data.id ), - attributes: { - plan: optimoleDashboardApp.user_data.plan, - status: optimoleDashboardApp.user_data.status, - language: optimoleDashboardApp.language, - cname_assigned: optimoleDashboardApp.user_data.is_cname_assigned || 'no', - connected_websites: optimoleDashboardApp.user_data.whitelist && optimoleDashboardApp.user_data.whitelist.length.toString(), - traffic: convertToCategory( optimoleDashboardApp.user_data.traffic || 0, 500 ).toString(), - images_number: convertToCategory( optimoleDashboardApp.user_data.images_number || 0, 100 ).toString(), - days_since_install: convertToCategory( optimoleDashboardApp.days_since_install ).toString() - } - }); -} -function convertToCategory( number, scale = 1 ) { - - const normalizedNumber = Math.round( number / scale ); - if ( 0 === normalizedNumber || 1 === normalizedNumber ) { - return 0; - } else if ( 1 < normalizedNumber && 8 > normalizedNumber ) { - return 7; - } else if ( 8 <= normalizedNumber && 31 > normalizedNumber ) { - return 30; - } else if ( 30 < normalizedNumber && 90 > normalizedNumber ) { - return 90; - } else if ( 90 < normalizedNumber ) { - return 91; - } -} const ConnectedLayout = ({ tab, setTab diff --git a/inc/admin.php b/inc/admin.php index b03f2e86..11dbe1f2 100755 --- a/inc/admin.php +++ b/inc/admin.php @@ -95,6 +95,8 @@ public function __construct() { ); // phpcs:ignore WordPressVIPMinimum.Hooks.RestrictedHooks.upload_mimes add_filter( 'wp_handle_upload_prefilter', [ $this, 'check_svg_and_sanitize' ] ); } + + add_filter( 'themeisle-sdk/survey/' . OPTML_PRODUCT_SLUG, [ $this, 'get_survey_metadata' ], 10, 2 ); } /** * Check if the file is an SVG, if so handle appropriately @@ -1257,6 +1259,8 @@ public function enqueue() { ], $asset_file['version'] ); + + do_action( 'themeisle_internal_page', OPTML_PRODUCT_SLUG, 'dashboard' ); } /** @@ -1980,4 +1984,71 @@ public function allow_svg( $mimes ) { return $mimes; } + + /** + * Get the Formbricks survey metadata. + * + * @param array $data The data in Formbricks format. + * @param string $page_slug The slug of the page. + * + * @return array - The data in Formbricks format. + */ + public function get_survey_metadata( $data, $page_slug ) { + + if ( 'dashboard' !== $page_slug ) { + return $data; + } + + $dashboard_data = $this->localize_dashboard_app(); + $user_data = $dashboard_data['user_data']; + + if ( ! isset( $user_data['plan'] ) ) { + return $data; + } + + $data = [ + 'environmentId' => 'clo8wxwzj44orpm0gjchurujm', + 'attributes' => [ + 'plan' => $user_data['plan'], + 'status' => $user_data['status'], + 'cname_assigned' => ! empty( $user_data['is_cname_assigned'] ) ? $user_data['is_cname_assigned'] : 'no', + 'connected_websites' => isset( $user_data['whitelist'] ) ? strval( count( $user_data['whitelist'] ) ) : '0', + 'install_days_number' => intval( $dashboard_data['days_since_install'] ), + 'traffic' => strval( isset( $user_data['traffic'] ) ? $this->survey_category( $user_data['traffic'], 500 ) : 0 ), + 'images_number' => strval( isset( $user_data['images_number'] ) ? $this->survey_category( $user_data['images_number'], 100 ) : 0 ), + ], + ]; + + return $data; + } + + /** + * Categorize a number for survey based on its scale. + * + * @param int $value The value. + * @param int $scale The scale. + * + * @return int - The category. + */ + public function survey_category( $value, $scale = 1 ) { + $value = intval( $value / $scale ); + + if ( 1 < $value && 8 > $value ) { + return 7; + } + + if ( 8 <= $value && 31 > $value ) { + return 30; + } + + if ( 30 < $value && 90 > $value ) { + return 90; + } + + if ( 90 <= $value ) { + return 91; + } + + return 0; + } } diff --git a/inc/dam.php b/inc/dam.php index fcd604a2..e5f621c5 100644 --- a/inc/dam.php +++ b/inc/dam.php @@ -536,6 +536,8 @@ public function enqueue_admin_page_scripts() { wp_enqueue_script( OPTML_NAMESPACE . '-admin-page' ); wp_enqueue_style( OPTML_NAMESPACE . '-admin-page', OPTML_URL . 'assets/build/media/admin-page.css' ); + + do_action( 'themeisle_internal_page', OPTML_PRODUCT_SLUG, 'dam' ); } /** diff --git a/optimole-wp.php b/optimole-wp.php index fa62d41e..3b010b5b 100644 --- a/optimole-wp.php +++ b/optimole-wp.php @@ -92,6 +92,7 @@ function optml() { define( 'OPTML_VERSION', '3.13.9' ); define( 'OPTML_NAMESPACE', 'optml' ); define( 'OPTML_BASEFILE', __FILE__ ); + define( 'OPTML_PRODUCT_SLUG', basename( OPTML_PATH ) ); // Fallback for old PHP versions when this constant is not defined. if ( ! defined( 'PHP_INT_MIN' ) ) { define( 'PHP_INT_MIN', - 999999 ); diff --git a/package-lock.json b/package-lock.json index 2b3183dd..d662bfcc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,10 +6,9 @@ "packages": { "": { "name": "optimole-wp", - "version": "3.12.10", + "version": "3.13.9", "license": "GPL-2.0+", "dependencies": { - "@formbricks/js": "^2.0.0", "classnames": "^2.3.2", "react-compare-image": "^3.4.0", "usehooks-ts": "^2.9.1" @@ -2582,11 +2581,6 @@ "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==", "dev": true }, - "node_modules/@formbricks/js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@formbricks/js/-/js-2.0.0.tgz", - "integrity": "sha512-1T0i1zxU3cKDQ3Rxw9DXGoWwLNBEJT2pO2ELuwbGg36u6ijazLA4j61HbNUMuHgEoiyhVtLcTOZF5FquQVzr/A==" - }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -33042,11 +33036,6 @@ "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==", "dev": true }, - "@formbricks/js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@formbricks/js/-/js-2.0.0.tgz", - "integrity": "sha512-1T0i1zxU3cKDQ3Rxw9DXGoWwLNBEJT2pO2ELuwbGg36u6ijazLA4j61HbNUMuHgEoiyhVtLcTOZF5FquQVzr/A==" - }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", diff --git a/package.json b/package.json index 2a1cf77e..3ff4a9e3 100755 --- a/package.json +++ b/package.json @@ -57,7 +57,6 @@ "tailwindcss": "^3.3.2" }, "dependencies": { - "@formbricks/js": "^2.0.0", "classnames": "^2.3.2", "react-compare-image": "^3.4.0", "usehooks-ts": "^2.9.1" diff --git a/tests/static-analysis-stubs/optimole-wp.php b/tests/static-analysis-stubs/optimole-wp.php index 609c9663..d3a1ea9d 100644 --- a/tests/static-analysis-stubs/optimole-wp.php +++ b/tests/static-analysis-stubs/optimole-wp.php @@ -10,6 +10,8 @@ define( 'OPTML_VERSION', '3.7.0' ); define( 'OPTML_NAMESPACE', 'optml' ); define( 'OPTML_BASEFILE', __FILE__ ); +define( 'OPTML_PRODUCT_SLUG', basename( OPTML_PATH ) ); + if ( ! defined( 'OPTML_DEBUG' ) ) { define( 'OPTML_DEBUG', false ); }