File "aitools.php"

Full Path: /home/romayxjt/public_html/wp-content/plugins/vikbooking/admin/helpers/widgets/aitools.php
File size: 3.85 KB
MIME-type: text/x-php
Charset: utf-8

<?php
/**
 * @package     VikBooking
 * @subpackage  com_vikbooking
 * @author      Alessio Gaggii - E4J srl
 * @copyright   Copyright (C) 2024 E4J srl. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 * @link        https://vikwp.com
 */

defined('ABSPATH') or die('No script kiddies please!');

/**
 * Class handler for admin widget "AI Tools".
 * 
 * @since 1.17 (J) - 1.7 (WP)
 */
class VikBookingAdminWidgetAitools extends VikBookingAdminWidget
{
	/**
	 * @inheritDOc
	 */
	public function __construct()
	{
		// call parent constructor
		parent::__construct();

		$this->widgetName = JText::translate('VBO_W_AITOOLS_TITLE');
		$this->widgetDescr = JText::translate('VBO_W_AITOOLS_DESCR');
		$this->widgetId = basename(__FILE__, '.php');

		$this->widgetIcon = '<i class="' . VikBookingIcons::i('magic') . '"></i>';
		$this->widgetStyleName = 'violet';
	}

	/**
	 * @inheritDoc
	 */
	public function getPriority()
	{
		// give this widget a higher priority
		return 15;
	}

	/**
	 * @inheritDoc
	 */
	public function preflight()
	{
		if (VBOPlatformDetection::isJoomla()) {
			// can be used only if VCM is installed and the AI channel is supported (not necessarily active)
			return class_exists('VikChannelManager') && defined('VikChannelManagerConfig::AI');
		}

		return parent::preflight();
	}

	/**
	 * @inheritDoc
	 */
	public function preload()
	{
		$options = [
			'version' => defined('VIKCHANNELMANAGER_SOFTWARE_VERSION') ? VIKCHANNELMANAGER_SOFTWARE_VERSION : VIKBOOKING_SOFTWARE_VERSION,
		];

		if (class_exists('VikChannelManager')) {
			// manually load required dependencies
			JHtml::fetch('script', VCM_ADMIN_URI . 'layouts/ai/assistant/aitools.js', $options);
			JHtml::fetch('stylesheet', VCM_ADMIN_URI . 'layouts/ai/assistant/aitools.css', $options);

			JHtml::fetch('script', VCM_ADMIN_URI . 'assets/js/katex/katex.min.js', $options);
			JHtml::fetch('script', VCM_ADMIN_URI . 'assets/js/katex/auto-render.min.js', $options);
			JHtml::fetch('stylesheet', VCM_ADMIN_URI . 'assets/js/katex/katex.min.css', $options);

			// language definitions
			JText::script('VBO_AI_ASSISTANT_DISCLAIMER');
			JText::script('VBO_AI_ASSISTANT_DISCOVER_HINT');
			JText::script('VBO_AI_ASSISTANT_DISCOVER_TITLE');
		}
	}

	/**
	 * @inheritDoc
	 */
	public function render(?VBOMultitaskData $data = null)
	{
		$auto_focus = false;
		$prompt = null;
		$scope = null;

		// if we are rendering the widget on a modal, register a script to prevent the latter
		// from dismissing whenever the ESC key is pressed
		if ($data && $data->isModalRendering()) {
			$auto_focus = true;
			$prompt = (array) $this->getOption('prompt', null);
			$scope = $this->getOption('scope');
			?>
<script>
	(function() {
		const vbo_modal_ai_assistant_dismiss = (event) => {
			if (event.key == 'Escape') {
				event.preventDefault();
				event.stopPropagation();
				return false;
			}
		};

		document.addEventListener('keyup', vbo_modal_ai_assistant_dismiss);

		document.addEventListener(VBOCore.widget_modal_dismissed + '<?php echo $data->getModalJsIdentifier(); ?>', (e) => {
			document.removeEventListener('keyup', vbo_modal_ai_assistant_dismiss);
			VBOCore.emitEvent('vbo-widget-ai-tools-dismissed');
		});
	})();
</script>
			<?php
		}

		// display by using a specific layout provided by VCM
		echo JLayoutHelper::render(
			'ai.assistant.chat',
			[
				// prevent the layout from loading the required assets
				'load_assets' => false,
				// auto-focus textarea
				'auto_focus' => $auto_focus,
				// default prompt
				'prompt' => $prompt,
				// default scope
				'scope' => $scope,
				// show widget title (VBO dashboard only)
				'widget_title' => is_null($data),
				// widget icon
				'widget_icon' => $this->widgetIcon,
				// widget name
				'widget_name' => $this->widgetName,
			],
			null,
			[
				'component' => 'com_vikchannelmanager',
				'client' => 'admin',
			]
		);
	}
}