403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/ilovecveti.ru/bitrix/js/ui/mail/provider-showcase/src/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/ilovecveti.ru/bitrix/js/ui/mail/provider-showcase/src/provider-showcase.js
import { ajax, Dom, Event, Loc, Tag, Text } from 'main.core';
import { Layout } from 'ui.sidepanel.layout';
import { SmtpEditor, AliasEditor } from 'ui.mail.sender-editor';
import 'ui.info-helper';
import 'ui.forms';
import 'ui.sidepanel-content';
import 'ui.buttons';
import './css/style.css';

type ProvidersParams = {
	options: ProvidersOptions,
	providers?: Array<Provider>,
};

type ProvidersOptions = {
	isModuleMailInstalled: boolean,
	canConnectNewMailbox?: boolean,
	mailboxLimitSliderCode?: string,
	isMailToolAvailable?: boolean,
	toolLimitSliderCode?: string | null,
	promotionProviders?: Array<string>,
	isSmtpAvailable: boolean,
	isCloud: boolean,
};

type Provider = {
	icon: string,
	name: string,
	href: string,
}

type Options = {
	isSender: boolean,
	addSenderCallback?: Function,
	setSenderCallback?: Function,
	updateSenderList: () => void,
}

const SidePanel = BX.SidePanel;

const showcaseSliderUrl = 'mailProviderShowcase';
const successMessage = 'mail-mailbox-config-success';
const imapServiceName = 'other';
const mailboxType = 'mailbox';

export class ProviderShowcase
{
	#wasSenderUpdated: boolean = false;
	constructor(options: Options = null)
	{
		this.isSender = options.isSender ?? false;
		this.setSenderCallback = options.setSenderCallback ?? null;
		this.addSenderCallback = options.addSenderCallback ?? null;
		this.updateSenderList = options.updateSenderList ?? null;

		this.container = Tag.render`
			<div class="showcase-container"></div>
		`;
	}

	static openSlider(options: Options): void
	{
		const instance = new ProviderShowcase(options);
		const onSliderMessage = function(event) {
			const [sliderEvent] = event.getData();
			if (!sliderEvent)
			{
				return;
			}

			const slider = SidePanel.Instance.getSlider(showcaseSliderUrl);
			if (!slider || sliderEvent.getEventId() !== successMessage)
			{
				return;
			}

			const mailboxId = sliderEvent.data.id;
			if (!mailboxId)
			{
				return;
			}

			instance.#wasSenderUpdated = true;
			slider.close();
			top.BX.SidePanel.Instance.postMessage(window, sliderEvent.getEventId(), sliderEvent.data);

			ajax.runAction(
				'main.api.mail.sender.getSenderByMailboxId',
				{
					data: {
						mailboxId,
						getSenderWithoutSmtp: !instance.options.isCloud,
					},
				},
			)
				.then((response) => {
					const data = response.data;
					if (!data)
					{
						return;
					}
					instance.setSender(data.id, data.name, data.email);
					if (instance.addSenderCallback || data.type === mailboxType)
					{
						return;
					}
					AliasEditor.openSlider({
						senderId: data.id,
						email: data.email,
						setSenderCallback: instance.setSenderCallback,
						updateSenderList: () => {
							void instance.updateSenderList();
						},
					});
				})
				.catch(() => {})
			;
		};

		SidePanel.Instance.open(showcaseSliderUrl, {
			width: 790,
			cacheable: false,
			contentCallback: () => {
				return Layout.createContent({
					extensions: [
						'ui.mail.provider-showcase',
					],
					title: Loc.getMessage('UI_MAIL_PROVIDER_SHOWCASE_TITLE'),
					design: {
						section: false,
					},
					content(): Promise
					{
						return instance.load();
					},
					buttons: () => {},
				});
			},
			events: {
				onClose: () => {
					top.BX.Event.EventEmitter.unsubscribe('SidePanel.Slider:onMessage', onSliderMessage);
					if (instance.updateSenderList && instance.#wasSenderUpdated)
					{
						instance.updateSenderList();
					}
				},
			},
		});

		top.BX.Event.EventEmitter.subscribe('SidePanel.Slider:onMessage', onSliderMessage);
	}

	static renderTo(target: HTMLElement, options: Options): Promise
	{
		const instance = new ProviderShowcase(options);

		return new Promise((resolve, reject) => {
			instance.load()
				.then((container) => {
					Dom.append(container, target);
					resolve(container);
				})
				.catch(() => {
					reject();
				})
			;
		});
	}

	load(): Promise
	{
		return ajax.runAction(
			'main.api.mail.mailproviders.getShowcaseParams',
			{
				data: { isSender: this.isSender ? 1 : 0 },
			},
		)
			.then((response) => {
				this.#createShowcase(response.data);

				return this.container;
			})
			.catch(() => {})
		;
	}

	#createSmtpItemNode(): void
	{
		this.smtpNode = Tag.render`
			<div class="mail-provider-item mail-provider-item-available">
				<div class="mail-provider-img-container">
					<div class="mail-provider-img-smtp"></div>
				</div>
				<div class="mail-provider-item-title-container">
					<span class="mail-provider-item-title">${Loc.getMessage('UI_MAIL_PROVIDER_SMTP_TITLE')}</span>
				</div>
			</div>
		`;
		Event.bind(this.smtpNode, 'click', () => {
			const slider = BX.SidePanel.Instance.getTopSlider();
			if (slider)
			{
				SmtpEditor.openSlider({
					setSenderCallback: (senderId?: string | number, senderName?: string, senderEmail?: string) => {
						if (this.setSenderCallback && senderId && senderName && senderEmail)
						{
							this.setSenderCallback(senderId, senderName, senderEmail);
						}
						this.updateSenderList();
						slider.close();
					},
					addSenderCallback: this.addSenderCallback,
				});
			}
		});

		if (this.options.isMailToolAvailable && this.options.canConnectNewMailbox)
		{
			return;
		}

		Dom.addClass(this.smtpNode, 'available-mail-provider-item');
		Dom.attr(this.smtpNode, 'data-tag', Loc.getMessage('UI_MAIL_PROVIDER_AVAILABLE_TAG'));
	}

	#createShowcase(params: ProvidersParams): void
	{
		this.options = params.options;
		this.providers = params.providers;
		this.showcaseNode = Tag.render`
			<div class="mail-provider-list"></div>
		`;
		Dom.append(this.showcaseNode, this.container);
		this.#createProvidersList();

		if (!this.isSender || !this.options.isSmtpAvailable)
		{
			return;
		}

		this.#createSmtpItemNode();
		const firstProvider = this.showcaseNode.firstChild;
		if (!firstProvider || (this.options.canConnectNewMailbox && this.options.isMailToolAvailable))
		{
			Dom.append(this.smtpNode, this.showcaseNode);
		}
		else
		{
			Dom.insertBefore(this.smtpNode, firstProvider);
		}

		if (this.options.isModuleMailInstalled)
		{
			return;
		}

		this.#createPromotionShowcase();
	}

	#createProvidersList(): void
	{
		if (!this.providers)
		{
			return;
		}

		this.providers.forEach((provider) => {
			const key = this.#getProviderKey(provider.name);
			const name = provider.name;
			const { root, title } = Tag.render`
				<a class="mail-provider-item mail-provider-item-available">
					<div class="mail-provider-img-container">
						<div class="mail-provider-img ${this.#getProviderImgSrcClass(key)}"></div>
					</div>
					<div class="mail-provider-item-title-container" ref="title">
						<span class="mail-provider-item-title">${Text.encode(this.#getProviderName(key) ?? (name[0].toUpperCase() + name.slice(1)))}</span>
					</div>
				</a>
			`;

			if (provider.name === imapServiceName)
			{
				const imapSubtitle = Tag.render`
					<span class="mail-provider-item-subtitle">${Loc.getMessage('UI_MAIL_PROVIDER_IMAP_SUBTITLE')}</span>
				`;
				Dom.append(imapSubtitle, title);
			}

			if (!this.options.isMailToolAvailable)
			{
				Event.bind(root, 'click', () => {
					BX.UI.InfoHelper.show(this.options.toolLimitSliderCode);
				});
			}
			else if (this.options.canConnectNewMailbox)
			{
				Event.bind(root, 'click', () => {
					SidePanel.Instance.open(
						provider.href,
						{
							width: 760,
						},
					);
				});
			}
			else
			{
				Event.bind(root, 'click', () => {
					if (this.activeFeaturePromoter)
					{
						this.activeFeaturePromoter.close();
						this.activeFeaturePromoter = null;
					}

					const featureRegistry = BX.Intranet ? BX.UI.FeaturePromotersRegistry : top.BX.UI.FeaturePromotersRegistry;
					this.activeFeaturePromoter = featureRegistry.getPromoter({
						code: this.options.mailboxLimitSliderCode,
						bindElement: title,
					});
					this.activeFeaturePromoter.show();
				});
			}

			Dom.append(root, this.showcaseNode);
			if (!this.isSender || !this.options.isMailToolAvailable || !this.options.canConnectNewMailbox)
			{
				return;
			}

			Dom.insertBefore(root, this.smtpNode);
		});
	}

	#createPromotionShowcase(): void
	{
		if (!this.options.promotionProviders)
		{
			return;
		}
		const promotionMessage = Loc.getMessage(
			'UI_MAIL_PROMOTION_TEXT',
			{
				'[strong]': '<strong>',
				'[/strong]': '</strong>',
			},
		);
		const { root, providerList } = Tag.render`
			<div class="promotion-showcase">
				<div class="ui-alert ui-alert-icon-info ui-alert-primary">
					<span class="ui-alert-message">${promotionMessage}</span>
				</div>
				<div class="mail-provider-list" ref="providerList" style="margin-top: 10px"></div>
			</div>
		`;
		this.promotionShowcaseNode = root;

		this.options.promotionProviders.forEach((providerName) => {
			const name = Text.encode(providerName);
			const item = Tag.render`
				<a class="mail-provider-item mail-provider-item-unavailable">
					<div class="mail-provider-img-container">
						<div class="mail-provider-img ${this.#getProviderImgSrcClass(name)}"></div>
					</div>
					<div class="mail-provider-item-title-container">
						<span class="mail-provider-item-title">${Text.encode(this.#getProviderName(name) ?? (name[0].toUpperCase() + name.slice(1)))}</span>
					</div>
				</a>
			`;
			Dom.append(item, providerList);
		});
		Dom.append(this.promotionShowcaseNode, this.container);
	}

	setSender(id: number, senderName: string, senderEmail: string): void
	{
		const name = senderName;
		const email = senderEmail;
		if (this.setSenderCallback)
		{
			this.setSenderCallback(id, name, email);
		}

		if (!this.addSenderCallback)
		{
			return;
		}

		const mailbox = [];
		mailbox.name = name;
		mailbox.email = email;
		this.addSenderCallback(mailbox);
	}

	#getProviderKey(name: string): string
	{
		switch (name)
		{
			case 'aol':
				return 'aol';
			case 'gmail':
				return 'gmail';
			case 'yahoo':
				return 'yahoo';
			case 'mail.ru':
			case 'mailru':
				return 'mailru';
			case 'icloud':
				return 'icloud';
			case 'outlook.com':
			case 'outlook':
				return 'outlook';
			case 'office365':
				return 'office365';
			case 'exchangeOnline':
			case 'exchange':
				return 'exchange';
			case 'yandex':
				return 'yandex';
			case 'ukr.net':
				return 'ukrnet';
			case 'other':
			case 'imap':
				return 'other';
			default:
				return '';
		}
	}

	#getProviderName(key: string): ?string
	{
		switch (key)
		{
			case 'aol':
				return Loc.getMessage('UI_MAIL_PROVIDER_SERVICE_NAME_AOL');
			case 'gmail':
				return Loc.getMessage('UI_MAIL_PROVIDER_SERVICE_NAME_GMAIL');
			case 'yahoo':
				return Loc.getMessage('UI_MAIL_PROVIDER_SERVICE_NAME_YAHOO');
			case 'mailru':
				return Loc.getMessage('UI_MAIL_PROVIDER_SERVICE_NAME_MAILRU');
			case 'icloud':
				return Loc.getMessage('UI_MAIL_PROVIDER_SERVICE_NAME_ICLOUD');
			case 'outlook':
				return Loc.getMessage('UI_MAIL_PROVIDER_SERVICE_NAME_OUTLOOK');
			case 'office365':
				return Loc.getMessage('UI_MAIL_PROVIDER_SERVICE_NAME_OFFICE365');
			case 'exchange':
				return Loc.getMessage('UI_MAIL_PROVIDER_SERVICE_NAME_EXCHANGE');
			case 'yandex':
				return Loc.getMessage('UI_MAIL_PROVIDER_SERVICE_NAME_YANDEX');
			case 'other':
				return Loc.getMessage('UI_MAIL_PROVIDER_SERVICE_NAME_IMAP');
			default:
				return null;
		}
	}

	#getProviderImgSrcClass(name: string): string
	{
		return `mail-provider-${name}-img`;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit