Your IP : 18.191.67.90


Current Path : /var/www/www-root/data/www/info.monolith-realty.ru/bitrix/js/landing/ui/button/
Upload File :
Current File : /var/www/www-root/data/www/info.monolith-realty.ru/bitrix/js/landing/ui/button/ai_copilot_button.js

(function() {
	'use strict';

	BX.namespace('BX.Landing.UI.Button');

	const COPILOT_WIDTH = 980;
	const COPILOT_INPUT_HEIGHT = 42;
	const COPILOT_PADDING = 4;
	const EDITOR_HEADER_HEIGHT = 66;

	/**
	 * Implements interface for works with AI (text) button.
	 *
	 * @extends {BX.Landing.UI.Button.EditorAction}
	 *
	 * @param {string} id
	 * @param {object} options
	 * @constructor
	 */
	BX.Landing.UI.Button.AiCopilot = function(id, options)
	{
		BX.Landing.UI.Button.EditorAction.apply(this, arguments);
		this.options = options;
		this.onReplace = options.onReplace;
		this.onReplaceContext = options.onReplaceContext;
		this.onAddBelow = options.onAddBelow;
		this.editor = options.editor;
		this.clientHeight = document.documentElement.clientHeight;
		this.clientWidth = document.documentElement.clientWidth;
	};

	BX.Landing.UI.Button.AiCopilot.getInstance = function(id, options)
	{
		if (!BX.Landing.UI.Button.AiCopilot.instance)
		{
			BX.Landing.UI.Button.AiCopilot.instance = new BX.Landing.UI.Button.AiCopilot(id, options);
		}

		return BX.Landing.UI.Button.AiCopilot.instance;
	};

	BX.Landing.UI.Button.AiCopilot.prototype = {
		constructor: BX.Landing.UI.Button.AiCopilot,
		__proto__: BX.Landing.UI.Button.EditorAction.prototype,

		onClick()
		{
			if (
				!BX.Landing.Env.getInstance().getOptions()["ai_text_active"]
				&& BX.Landing.Main.getInstance()["options"]["ai_unactive_info_code"]
			)
			{
				BX.UI.InfoHelper.show(BX.Landing.Main.getInstance()["options"]["ai_unactive_info_code"]);

				return;
			}
			
			if (!this.isInit)
			{
				BX.Dom.addClass(this.layout, 'active');
				this.clickBeforeInit = true;
			}

			this.context = ' ';
			const selectedText = window.getSelection().toString();
			if (selectedText !== '')
			{
				this.context = selectedText;
				this.selectedContext = true;
			}

			if (this.context === ' ' && this.editor.currentElement)
			{
				const fieldInput = this.editor.currentElement.querySelector('.landing-ui-field-input');
				if (fieldInput)
				{
					this.context = fieldInput.innerHTML;
				}
				else
				{
					this.context = this.editor.currentElement.innerHTML;
				}
			}

			const currentElement = this.editor.currentElement;
			if (this.copilot && this.currentElement === this.editor.currentElement)
			{
				this.hideEditorPanel(true);
				this.copilot.setSelectedText(this.context);
				this.copilot.show({
					currentElement,
					width: COPILOT_WIDTH,
				});

				return;
			}
			this.currentElement = this.editor.currentElement;
			if (this.isInit)
			{
				this.hideEditorPanel(true);
				this.copilot.setSelectedText(this.context);
				this.copilot.show({
					currentElement,
					width: COPILOT_WIDTH,
				});
			}
		},

		onMouseOver()
		{
			if (!this.copilot)
			{
				const copilot = top.BX.AI ? top.BX.AI.Copilot : BX.AI.Copilot;
				this.copilot = new copilot({
					moduleId: 'landing',
					contextId: this.getContext(),
					category: 'landing',
				});
				this.copilot.subscribe('finish-init', this.finishInitHandler.bind(this));
				this.copilot.subscribe('save', this.saveHandler.bind(this));
				this.copilot.subscribe('add_below', this.addBelowHandler.bind(this));
				BX.Event.EventEmitter.subscribe('BX.Landing.Node.Text:onMousedown', this.onClickHandler.bind(this));
				BX.Event.EventEmitter.subscribe('BX.Landing.Node.Img:onClick', this.onClickHandler.bind(this));
				BX.Event.EventEmitter.subscribe('BX.Landing.Node.Icon:onClick', this.onClickHandler.bind(this));
				BX.Event.EventEmitter.subscribe('BX.Landing.UI.Panel.ContentEdit:onClick', this.onClickHandler.bind(this));
				BX.Event.bind(document, 'keydown', this.onWindowKeyDownHandler.bind(this));
				BX.Event.bind(document, 'click', this.onClickHandler.bind(this));
				BX.Event.bind(document, 'scroll', this.onScrollHandler.bind(this));
				this.copilot.init();
			}
		},

		finishInitHandler()
		{
			this.copilot.setSelectedText(this.context);
			this.copilotPositionTop = (this.clientHeight - COPILOT_INPUT_HEIGHT) / 2;
			this.copilotPositionLeft = (this.clientWidth - COPILOT_WIDTH) / 2;
			this.isInit = true;
			if (this.clickBeforeInit === true)
			{
				this.hideEditorPanel(true);
				const currentElement = this.editor.currentElement;

				this.copilot.show({
					currentElement,
					width: COPILOT_WIDTH,
				});
				BX.Dom.removeClass(this.layout, 'active');
			}
		},

		saveHandler(event)
		{
			if (this.selectedContext === true)
			{
				this.onReplaceContext(event.data.result);
			}
			else
			{
				this.onReplace(event.data.result);
			}

			if (this.copilot.isShown())
			{
				this.copilot.hide();
			}
		},

		addBelowHandler(event)
		{
			this.onAddBelow(event.data.result);
			if (this.copilot.isShown())
			{
				this.copilot.hide();
			}
		},

		onWindowKeyDownHandler(event)
		{
			if (event.key === 'Escape' && this.copilot.isShown())
			{
				this.copilot.hide();
			}
		},

		onClickHandler()
		{
			if (this.copilot.isShown())
			{
				this.copilot.hide();
			}
		},

		onScrollHandler()
		{
			const currentScrollY = window.scrollY;
			if (!this.lastScrollY)
			{
				this.lastScrollY = currentScrollY;
			}

			const diffScroll = currentScrollY - this.lastScrollY;
			this.lastScrollY += diffScroll;
			this.copilotPositionTop -= diffScroll;
			let top = this.copilotPositionTop;
			if (this.copilotPositionTop < EDITOR_HEADER_HEIGHT + COPILOT_PADDING)
			{
				top = EDITOR_HEADER_HEIGHT + COPILOT_PADDING;
			}

			const maxAllowedHeight = this.clientHeight + EDITOR_HEADER_HEIGHT - (COPILOT_INPUT_HEIGHT + COPILOT_PADDING);
			if (this.copilotPositionTop > maxAllowedHeight)
			{
				top = maxAllowedHeight;
			}

			this.copilot.adjust(
				{
					position: {
						top,
						left: this.copilotPositionLeft,
					},
				},
			);
		},

		getContext()
		{
			if (this.editor.currentElement)
			{
				return 'editor';
			}

			return 'edit_block_slider';
		},

		hideEditorPanel(strictMode)
		{
			if (strictMode)
			{
				const fieldInput = this.editor.currentElement.querySelector('.landing-ui-field-input');
				if (!fieldInput)
				{
					BX.Landing.UI.Panel.EditorPanel.getInstance().hide();
				}
			}
			else
			{
				BX.Landing.UI.Panel.EditorPanel.getInstance().hide();
			}
		},
	};
})();