first commit
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace Elementor\Modules\Announcements\Classes;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Announcement {
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $raw_data;
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $triggers;
|
||||
|
||||
public function __construct( array $data ) {
|
||||
$this->raw_data = $data;
|
||||
$this->set_triggers();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function get_triggers(): array {
|
||||
return $this->triggers;
|
||||
}
|
||||
|
||||
protected function set_triggers() {
|
||||
$triggers = $this->raw_data['triggers'] ?? [];
|
||||
foreach ( $triggers as $trigger ) {
|
||||
$this->triggers[] = Utils::get_trigger_object( $trigger );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* is_active
|
||||
* @return bool
|
||||
*/
|
||||
public function is_active(): bool {
|
||||
$triggers = $this->get_triggers();
|
||||
|
||||
if ( empty( $triggers ) ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
foreach ( $triggers as $trigger ) {
|
||||
if ( ! $trigger->is_active() ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function after_triggered() {
|
||||
foreach ( $this->get_triggers() as $trigger ) {
|
||||
if ( $trigger->is_active() ) {
|
||||
$trigger->after_triggered();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function get_prepared_data(): array {
|
||||
$raw_data = $this->raw_data;
|
||||
unset( $raw_data['triggers'] );
|
||||
|
||||
return $raw_data;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace Elementor\Modules\Announcements\Classes;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
abstract class Trigger_Base {
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'trigger-base';
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function get_name(): string {
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function is_active(): bool {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function after_triggered() {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace Elementor\Modules\Announcements\Classes;
|
||||
|
||||
use Elementor\Modules\Announcements\Triggers\{
|
||||
IsFlexContainerInactive, AiStarted
|
||||
};
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Utils {
|
||||
/**
|
||||
* get_trigger_object
|
||||
*
|
||||
* @param $trigger
|
||||
*
|
||||
* @return IsFlexContainerInactive|false
|
||||
*/
|
||||
public static function get_trigger_object( $trigger ) {
|
||||
$object_trigger = apply_filters( 'elementor/announcements/trigger_object', false, $trigger );
|
||||
|
||||
if ( false !== $object_trigger ) {
|
||||
return $object_trigger;
|
||||
}
|
||||
|
||||
//@TODO - replace with trigger manager
|
||||
switch ( $trigger['action'] ) {
|
||||
case 'isFlexContainerInactive':
|
||||
return new IsFlexContainerInactive();
|
||||
case 'aiStared':
|
||||
return new AiStarted();
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
177
wp-content/plugins/elementor/modules/announcements/module.php
Normal file
177
wp-content/plugins/elementor/modules/announcements/module.php
Normal file
@@ -0,0 +1,177 @@
|
||||
<?php
|
||||
|
||||
namespace Elementor\Modules\Announcements;
|
||||
|
||||
use Elementor\Core\Base\App as BaseApp;
|
||||
use Elementor\Modules\Announcements\Classes\Announcement;
|
||||
use Elementor\Settings as ElementorSettings;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Module extends BaseApp {
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public static function is_active(): bool {
|
||||
return is_admin();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function get_name(): string {
|
||||
return 'announcements';
|
||||
}
|
||||
|
||||
/**
|
||||
* Render wrapper for the app to load.
|
||||
*/
|
||||
private function render_app_wrapper() {
|
||||
?>
|
||||
<div id="e-announcements-root"></div>
|
||||
<?php
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueue app scripts.
|
||||
*/
|
||||
private function enqueue_scripts() {
|
||||
wp_enqueue_script(
|
||||
'announcements-app',
|
||||
$this->get_js_assets_url( 'announcements-app' ),
|
||||
[
|
||||
'wp-i18n',
|
||||
],
|
||||
ELEMENTOR_VERSION,
|
||||
true
|
||||
);
|
||||
|
||||
wp_set_script_translations( 'announcements-app', 'elementor' );
|
||||
|
||||
$this->print_config( 'announcements-app' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get initialization settings to use in frontend.
|
||||
*
|
||||
* @return array[]
|
||||
*/
|
||||
protected function get_init_settings(): array {
|
||||
$active_announcements = $this->get_active_announcements();
|
||||
$additional_settings = [];
|
||||
|
||||
foreach ( $active_announcements as $announcement ) {
|
||||
$additional_settings[] = $announcement->get_prepared_data();
|
||||
//@TODO - replace with ajax request from the front after actually triggered
|
||||
$announcement->after_triggered();
|
||||
}
|
||||
|
||||
return [
|
||||
'announcements' => $additional_settings,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueue the module styles.
|
||||
*/
|
||||
public function enqueue_styles() {
|
||||
wp_enqueue_style(
|
||||
'announcements-app',
|
||||
$this->get_css_assets_url( 'modules/announcements/announcements' ),
|
||||
[],
|
||||
ELEMENTOR_VERSION
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve all announcement in raw format ( array ).
|
||||
*
|
||||
* @return array[]
|
||||
*/
|
||||
private function get_raw_announcements(): array {
|
||||
$raw_announcements = [
|
||||
[
|
||||
'title' => __( 'Discover your new superpowers ', 'elementor' ),
|
||||
'description' => __( '<p>With AI for text, code, image generation and editing, you can bring your vision to life faster than ever. Start your free trial now - <b>no credit card required!</b></p>', 'elementor' ),
|
||||
'media' => [
|
||||
'type' => 'image',
|
||||
'src' => ELEMENTOR_ASSETS_URL . 'images/announcement.png?' . ELEMENTOR_VERSION,
|
||||
],
|
||||
'cta' => [
|
||||
[
|
||||
'label' => __( 'Let\'s do it', 'elementor' ),
|
||||
'variant' => 'primary',
|
||||
'target' => '_top',
|
||||
'url' => '#welcome-ai',
|
||||
],
|
||||
[
|
||||
'label' => __( 'Skip', 'elementor' ),
|
||||
'variant' => 'secondary',
|
||||
],
|
||||
],
|
||||
'triggers' => [
|
||||
[
|
||||
'action' => 'aiStared',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
// DO NOT USE THIS FILTER
|
||||
return apply_filters( 'elementor/announcements/raw_announcements', $raw_announcements );
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve all announcement objects.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function get_announcements(): array {
|
||||
$announcements = [];
|
||||
foreach ( $this->get_raw_announcements() as $announcement_data ) {
|
||||
$announcements[] = new Announcement( $announcement_data );
|
||||
}
|
||||
|
||||
return $announcements;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve all active announcement objects.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function get_active_announcements(): array {
|
||||
$active_announcements = [];
|
||||
foreach ( $this->get_announcements() as $announcement ) {
|
||||
if ( $announcement->is_active() ) {
|
||||
$active_announcements[] = $announcement;
|
||||
}
|
||||
}
|
||||
|
||||
return $active_announcements;
|
||||
}
|
||||
|
||||
public function __construct() {
|
||||
parent::__construct();
|
||||
|
||||
add_action( 'elementor/init', [ $this, 'on_elementor_init' ] );
|
||||
}
|
||||
|
||||
public function on_elementor_init() {
|
||||
if ( empty( $this->get_active_announcements() ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
add_action( 'elementor/editor/footer', function () {
|
||||
$this->render_app_wrapper();
|
||||
} );
|
||||
|
||||
add_action( 'elementor/editor/after_enqueue_scripts', function () {
|
||||
$this->enqueue_scripts();
|
||||
$this->enqueue_styles();
|
||||
} );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace Elementor\Modules\Announcements\Triggers;
|
||||
|
||||
use Elementor\Modules\Announcements\Classes\Trigger_Base;
|
||||
use Elementor\User;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class AiStarted extends Trigger_Base {
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'ai-get-started-announcement';
|
||||
|
||||
public function after_triggered() {
|
||||
User::set_introduction_viewed( [ 'introductionKey' => $this->name ] );
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function is_active(): bool {
|
||||
return ! User::get_introduction_meta( 'ai_get_started' ) && ! User::get_introduction_meta( $this->name );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace Elementor\Modules\Announcements\Triggers;
|
||||
|
||||
use Elementor\Modules\Announcements\Classes\Trigger_Base;
|
||||
use Elementor\Plugin;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class IsFlexContainerInactive extends Trigger_Base {
|
||||
|
||||
const USER_META_KEY = 'announcements_user_counter';
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'is-flex-container-inactive';
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
protected function get_view_count(): int {
|
||||
$user_counter = $this->get_user_announcement_count();
|
||||
|
||||
return ! empty( $user_counter ) ? (int) $user_counter : 0;
|
||||
}
|
||||
|
||||
public function after_triggered() {
|
||||
$new_counter = $this->get_view_count() + 1;
|
||||
update_user_meta( get_current_user_id(), self::USER_META_KEY, $new_counter );
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function is_active(): bool {
|
||||
$is_feature_active = Plugin::$instance->experiments->is_feature_active( 'container' );
|
||||
$counter = $this->get_user_announcement_count();
|
||||
|
||||
return ! $is_feature_active && (int) $counter < 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
private function get_user_announcement_count(): string {
|
||||
return get_user_meta( get_current_user_id(), self::USER_META_KEY, true );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user