$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,
)
);
}