$addons, 'ajax_url' => admin_url( 'admin-ajax.php' ), 'visitor' => aict_get_visitor_data(), ); if ( in_array( 'woocommerce', $addons, true ) ) { $localize_data['wc_store_cart_url'] = rest_url( 'wc/store/v1/cart' ); $localize_data['wc_currency'] = get_woocommerce_currency(); } wp_localize_script( 'aict-connect', 'aictConnect', $localize_data ); } ); add_action( 'wp_ajax_aict_disconnect_account', 'AICT\aict_disconnect_account' ); } /** * Load plugin for website. * * @return void */ function aict_load_plugin_for_website(): void { if ( is_admin() ) { return; } // Load widget with initial data. add_action( 'wp_enqueue_scripts', 'AICT\aict_load_widget' ); } /** * Register connect notification as admin notice. * * @return void */ function aict_load_connect_notification(): void { if ( aict_get_widget_url() ) { return; } add_action( 'admin_notices', 'AICT\Templates\aict_render_connect_notification' ); } /** * Add action links to plugin page. * * @param array $actions Action links. * @return array */ function aict_add_action_links( $actions ) { $mylinks = array( 'Settings', ); $actions = array_merge( $mylinks, $actions ); return $actions; } /** * Load plugin for WP admin. * * @return void */ function aict_load_plugin_for_wpadmin(): void { if ( ! is_admin() ) { return; } // Load global styles. add_action( 'admin_init', 'AICT\aict_load_styles' ); // Load connect notice. aict_load_connect_notification(); // Load menu. add_action( 'admin_menu', 'AICT\aict_add_admin_menu' ); // Load deactivation handler only for plugins page. add_action( 'admin_enqueue_scripts', function ( $hook ) { if ( 'plugins.php' !== $hook ) { return; } aict_register_deactivation_handler(); } ); // Add action links. add_filter( 'plugin_action_links_' . AICT_PLUGIN_BASE, 'AICT\aict_add_action_links' ); } /** * Register deactivation handler script. * * @return void */ function aict_register_deactivation_handler(): void { wp_enqueue_script( 'aict-deactivation-handler', AICT_PLUGIN_URL . '/includes/js/deactivationHandler.js', array(), AICT_PLUGIN_VERSION, true ); wp_localize_script( 'aict-deactivation-handler', 'aictDeactivationHandler', array( 'deactivationFeedbackUrl' => aict_get_deactivation_feedback_url(), ) ); } /** * Register register admin menu. * * @return void */ function aict_add_admin_menu(): void { $widget_url = aict_get_widget_url(); $menu_slug = 'aict'; $capability = 'administrator'; add_menu_page( 'Text', $widget_url ? 'Text' : 'Text !', $capability, $menu_slug, 'AICT\aict_settings_page', 'none' ); add_submenu_page( $menu_slug, __( 'Settings', 'ai-chatbot-by-text' ), __( 'Settings', 'ai-chatbot-by-text' ), $capability, $menu_slug . '_settings', 'AICT\aict_settings_page' ); remove_submenu_page( $menu_slug, $menu_slug ); } /** * Disconnect account action. * * @return void */ function aict_disconnect_account(): void { check_ajax_referer( 'aict_disconnect_account' ); try { aict_cleanup(); wp_send_json_success(); } catch ( Exception $e ) { wp_send_json_error( new WP_Error( $e->getCode(), $e->getMessage() ) ); } } /** * Validate and save widget URL in database. * * @param string $widget_url Widget URL to validate and save. * @return void */ function aict_validate_and_save_widget_url( string $widget_url ): void { if ( ! filter_var( $widget_url, FILTER_VALIDATE_URL ) ) { // phpcs:disable WordPress.PHP.DevelopmentFunctions.error_log_error_log error_log( 'Text plugin: invalid widget URL received: ' . $widget_url ); // phpcs:enable WordPress.PHP.DevelopmentFunctions.error_log_error_log return; } update_option( 'aict_widget_url', $widget_url, false ); } /** * Validate and save organization ID in database. * * @param string $organization_id Organization ID to validate and save. * @return void */ function aict_validate_and_save_organization_id( string $organization_id ): void { $organization_id = sanitize_text_field( $organization_id ); if ( '' === trim( $organization_id ) ) { return; } update_option( 'aict_organization_id', $organization_id, false ); } /** * Determine if the complete setup view should be rendered. * * @param string $complete_setup Query param indicating if the complete setup view should be rendered. * @return bool */ function aict_should_render_complete_setup_view( string $complete_setup ): bool { return 'true' === strtolower( $complete_setup ); } /** * Show settings page. * * @return void */ function aict_settings_page(): void { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html__( 'You do not have sufficient permissions to access this page.', 'ai-chatbot-by-text' ) ); } $complete_setup = ''; $is_valid_callback = false; if ( array_key_exists( '_nonce', $_GET ) ) { // Verify nonce and callback token before reading any other input. $is_valid_nonce = wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['_nonce'] ) ), 'aict_connect' ); $callback_token = isset( $_GET['_token'] ) ? sanitize_text_field( wp_unslash( $_GET['_token'] ) ) : ''; $is_valid_callback = $is_valid_nonce && aict_verify_wp_token( $callback_token ); if ( $is_valid_callback ) { $complete_setup = isset( $_GET['complete_setup'] ) ? sanitize_text_field( wp_unslash( $_GET['complete_setup'] ) ) : ''; $widget_url = isset( $_GET['widget_url'] ) ? esc_url_raw( wp_unslash( $_GET['widget_url'] ) ) : ''; if ( ! empty( $widget_url ) ) { aict_validate_and_save_widget_url( $widget_url ); } $organization_id = ''; if ( isset( $_GET['organization_id'] ) ) { $organization_id = sanitize_text_field( wp_unslash( $_GET['organization_id'] ) ); } aict_validate_and_save_organization_id( $organization_id ); } } $woocommerce_state = aict_get_woocommerce_return_state( $is_valid_callback ); $is_woocommerce_return = '' !== $woocommerce_state; if ( 'success' === $woocommerce_state ) { update_option( 'aict_woocommerce_connected', true, false ); } elseif ( ! $is_woocommerce_return && aict_is_woocommerce_active() && get_option( 'aict_woocommerce_connected', false ) ) { $woocommerce_state = 'success'; } if ( ! aict_get_widget_url() ) { aict_render_connect_view(); return; } if ( ! $is_woocommerce_return && aict_should_render_complete_setup_view( $complete_setup ) ) { aict_render_successfully_connected_view( true ); return; } aict_render_successfully_connected_view( false, $woocommerce_state ); } /** * Load widget script. * * @return void */ function aict_load_widget(): void { $widget_url = aict_get_widget_url(); if ( ! $widget_url ) { return; } wp_enqueue_script( 'aict-widget', $widget_url, array(), AICT_PLUGIN_VERSION, array( 'strategy' => 'async', 'in_footer' => true, ) ); }