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/cvetdv.ru/bitrix/js/im/v2/component/recent-list/src/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/js/im/v2/component/recent-list/src/recent-list.js
import 'ui.design-tokens';

import {EventEmitter} from 'main.core.events';
import {mapState} from 'ui.vue3.vuex';

import {ChatTypes, EventType, RecentSettings, OpenTarget} from 'im.v2.const';
import {Utils} from 'im.v2.lib.utils';
import {RecentService} from 'im.v2.provider.service';
import {RecentLoadingState} from 'im.v2.component.elements';
import {RecentMenu} from 'im.v2.lib.menu';

import {RecentItem} from './components/recent-item';
import {ActiveCall} from './components/active-call';

import {SettingsManager} from './settings-manager';
import {BroadcastManager} from './broadcast-manager';
import {CallManager} from './call-manager';
import {DraftManager} from './draft-manager';
import {EventHandler} from './event-handler';

import './css/recent-list.css';

// @vue/component
export const RecentList = {
	name: 'RecentList',
	components: {LoadingState: RecentLoadingState, RecentItem, ActiveCall},
	directives:
	{
		'recent-list-observer':
		{
			mounted(element, binding)
			{
				binding.instance.observer.observe(element);
			}
		}
	},
	props: {
		compactMode: {
			type: Boolean,
			default: false
		}
	},
	data()
	{
		return {
			isLoading: false,
			visibleElements: new Set()
		};
	},
	computed:
	{
		collection()
		{
			return this.$store.getters['recent/getCollection'];
		},
		sections()
		{
			return [this.pinnedItems, this.generalItems];
		},
		preparedItems()
		{
			const filteredCollection = this.collection.filter(item => {
				if (!this.showBirthdays && item.options.birthdayPlaceholder)
				{
					return false;
				}

				const dialog = this.$store.getters['dialogues/get'](item.dialogId, true);
				const isUser = dialog.type === ChatTypes.user;
				const hasBirthday = isUser && this.showBirthdays && this.$store.getters['users/hasBirthday'](item.dialogId);
				if (!this.showInvited && item.options.defaultUserRecord && !hasBirthday)
				{
					return false;
				}

				return true;
			});

			return [...filteredCollection].sort((a, b) => {
				const firstDate = this.$store.getters['recent/getMessageDate'](a.dialogId);
				const secondDate = this.$store.getters['recent/getMessageDate'](b.dialogId);

				return secondDate - firstDate;
			});
		},
		pinnedItems()
		{
			return this.preparedItems.filter(item => {
				return item.pinned === true;
			});
		},
		generalItems()
		{
			return this.preparedItems.filter(item => {
				return item.pinned === false;
			});
		},
		isDarkTheme()
		{
			return this.application.options.darkTheme;
		},
		showBirthdays()
		{
			return this.$store.getters['recent/getOption'](RecentSettings.showBirthday);
		},
		showInvited()
		{
			return this.$store.getters['recent/getOption'](RecentSettings.showInvited);
		},
		transitionType()
		{
			if (this.compactMode)
			{
				return '';
			}

			if (this.isLoading)
			{
				return '';
			}

			return 'bx-messenger-recent-transition';
		},
		...mapState({
			activeCalls: state => state.recent.activeCalls,
			application: state => state.application
		})
	},
	created()
	{
		this.recentService = RecentService.getInstance(this.$Bitrix);
		this.contextMenuManager = new RecentMenu(this.$Bitrix);

		CallManager.init(this.$Bitrix);
		EventHandler.init(this.$Bitrix);
		SettingsManager.init(this.$Bitrix);
		this.initBroadcastManager();
		this.initObserver();

		this.managePreloadedList();
		this.manageChatOptions();
	},
	mounted()
	{
		this.isLoading = true;
		this.recentService.loadFirstPage().then(() => {
			this.isLoading = false;
			DraftManager.init(this.$Bitrix);
		});
		this.initBirthdayCheck();
	},
	beforeUnmount()
	{
		this.contextMenuManager.destroy();
		this.clearBirthdayCheck();
		this.destroyBroadcastManager();
	},
	methods:
	{
		onScroll(event)
		{
			this.contextMenuManager.close();
			if (!this.oneScreenRemaining(event) || !this.recentService.hasMoreItemsToLoad)
			{
				return false;
			}

			this.isLoading = true;
			this.recentService.loadNextPage().then(() => {
				this.isLoading = false;
			});
		},

		onClick(item, event)
		{
			const target = !this.compactMode || event.altKey? OpenTarget.current: OpenTarget.auto;

			EventEmitter.emit(EventType.dialog.open, {
				...item,
				chat: this.$store.getters['dialogues/get'](item.dialogId, true),
				user: this.$store.getters['users/get'](item.dialogId, true),
				target
			});
		},

		onRightClick(item, event)
		{
			if (event.altKey && event.shiftKey)
			{
				return;
			}

			const target = !this.compactMode || event.altKey? OpenTarget.current: OpenTarget.auto;
			const context = {
				...item,
				compactMode: this.compactMode,
				target
			};

			this.contextMenuManager.openMenu(context, event.currentTarget);

			event.preventDefault();
		},

		onCallClick({item, $event})
		{
			this.onClick(item, $event);
		},

		onCallRightClick({item, $event})
		{
			this.onRightClick(item, $event);
		},

		oneScreenRemaining(event)
		{
			return event.target.scrollTop + event.target.clientHeight >= event.target.scrollHeight - event.target.clientHeight;
		},

		initObserver()
		{
			this.observer = new IntersectionObserver(((entries) => {
				entries.forEach(entry => {
					if (entry.isIntersecting && entry.intersectionRatio === 1)
					{
						this.visibleElements.add(entry.target.dataset.id);
					}
					else if (!entry.isIntersecting)
					{
						this.visibleElements.delete(entry.target.dataset.id);
					}
				});
			}), {threshold: [0, 1]});
		},

		initBroadcastManager()
		{
			this.onRecentListUpdate = (event) => {
				this.recentService.setPreloadedData(event.data);
			};
			this.broadcastManager = BroadcastManager.getInstance();
			this.broadcastManager.subscribe(BroadcastManager.events.recentListUpdate, this.onRecentListUpdate);
		},

		destroyBroadcastManager()
		{
			this.broadcastManager = BroadcastManager.getInstance();
			this.broadcastManager.unsubscribe(BroadcastManager.events.recentListUpdate, this.onRecentListUpdate);
		},

		initBirthdayCheck()
		{
			const fourHours = 60000*60*4;
			const day = 60000*60*24;
			this.birthdayCheckTimeout = setTimeout(() => {
				this.recentService.loadFirstPage({ignorePreloadedItems: true});
				this.birthdayCheckInterval = setInterval(() => {
					this.recentService.loadFirstPage({ignorePreloadedItems: true});
				}, day);
			}, Utils.date.getTimeToNextMidnight() + fourHours);
		},

		clearBirthdayCheck()
		{
			clearTimeout(this.birthdayCheckTimeout);
			clearInterval(this.birthdayCheckInterval);
		},

		managePreloadedList()
		{
			const {preloadedList} = this.$Bitrix.Application.get().params;
			if (!preloadedList)
			{
				return false;
			}

			this.recentService.setPreloadedData(preloadedList);
			this.broadcastManager.sendRecentList(preloadedList);
		},

		manageChatOptions()
		{
			const {chatOptions} = this.$Bitrix.Application.get().params;
			if (!chatOptions)
			{
				return false;
			}

			this.$store.dispatch('dialogues/setChatOptions', chatOptions);
		}
	},
	template: `
		<div @scroll="onScroll" class="bx-messenger-recent-list" :class="{'bx-messenger-recent-compact': compactMode}" >
			<transition-group :name="transitionType">
				<ActiveCall
					v-for="activeCall in activeCalls"
					:key="'call-' + activeCall.dialogId"
					:item="activeCall"
					:compactMode="compactMode"
					@click="onCallClick"
					@click.right="onCallRightClick"
				/>
				<template v-for="section in sections">
					<RecentItem
						v-for="item in section"
						:key="item.dialogId"
						:item="item"
						:compactMode="compactMode"
						:isVisibleOnScreen="visibleElements.has(item.dialogId)"
						v-recent-list-observer
						@click="onClick(item, $event)"
						@click.right="onRightClick(item, $event)"
					/>
				</template>
			</transition-group>
			<LoadingState v-if="isLoading" :compactMode="compactMode" />
			<template v-if="collection.length === 0">
				<div class="bx-im-recent-empty">{{ $Bitrix.Loc.getMessage('IM_RECENT_EMPTY') }}</div>
			</template>
		</div>
	`
};

Youez - 2016 - github.com/yon3zu
LinuXploit