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/model/src/notifications/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/js/im/v2/model/src/notifications/notifications.js
import {BuilderModel} from 'ui.vue3.vuex';
import {Type, Text} from 'main.core';

import {Core} from 'im.v2.application.core';
import {Utils} from 'im.v2.lib.utils';
import {NotificationTypesCodes} from 'im.v2.const';

import { convertObjectKeysToCamelCase } from '../utils/format';

export class NotificationsModel extends BuilderModel
{
	getName(): string
	{
		return 'notifications';
	}

	getState(): Object
	{
		return {
			collection: new Map(),
			searchCollection: new Map(),
			unreadCounter: 0,
		};
	}

	getElementState(): Object
	{
		return {
			id: 0,
			authorId: 0,
			date: new Date(),
			title: '',
			text: '',
			params: {},
			replaces: [],
			notifyButtons: [],
			sectionCode: NotificationTypesCodes.simple,
			read: false,
			settingName: 'im|default',
		};
	}

	getGetters(): Object
	{
		return {
			getSortedCollection: state =>
			{
				return [...state.collection.values()].sort(this.sortByType);
			},
			getSearchResultCollection: state =>
			{
				return [...state.searchCollection.values()].sort(this.sortByType);
			},
			getConfirmsCount: state =>
			{
				return [...state.collection.values()].filter(notification => {
					return notification.sectionCode === NotificationTypesCodes.confirm;
				}).length;
			},
			getById: state => (notificationId) =>
			{
				if (Type.isString(notificationId))
				{
					notificationId = Number.parseInt(notificationId, 10);
				}

				const existingItem = state.collection.get(notificationId);
				if (!existingItem)
				{
					return false;
				}

				return existingItem;
			},
			getCounter: (state): number =>
			{
				return state.unreadCounter;
			}
		};
	}

	getActions(): Object
	{
		return {
			initialSet: (store, payload) =>
			{
				if (Type.isNumber(payload.total_unread_count))
				{
					store.commit('setCounter', payload.total_unread_count);
				}

				if (!Type.isArrayFilled(payload.notifications))
				{
					return;
				}

				const itemsToUpdate = [];
				const itemsToAdd = [];

				const currentUserId = Core.getUserId();
				payload.notifications.map(element => {
					return NotificationsModel.validate(element, currentUserId);
				}).forEach(element => {
					const existingItem = store.state.collection.get(element.id);
					if (existingItem)
					{
						itemsToUpdate.push({id: existingItem.id, fields: {...element}});
					}
					else
					{
						itemsToAdd.push({...this.getElementState(), ...element});
					}
				});

				if (itemsToAdd.length > 0)
				{
					store.commit('add', itemsToAdd);
				}
				if (itemsToUpdate.length > 0)
				{
					store.commit('update', itemsToUpdate);
				}
			},
			set: (store, payload) =>
			{
				if (!Array.isArray(payload) && Type.isPlainObject(payload))
				{
					payload = [payload];
				}

				const itemsToUpdate = [];
				const itemsToAdd = [];
				const currentUserId = Core.getUserId();
				payload.map(element => {
					return NotificationsModel.validate(element, currentUserId);
				}).forEach(element => {
					const existingItem = store.state.collection.get(element.id);
					if (existingItem)
						{
						itemsToUpdate.push({id: existingItem.id, fields: {...element}});
					}
					else
					{
						itemsToAdd.push({...this.getElementState(), ...element});
					}
				});

				if (itemsToAdd.length > 0)
				{
					store.commit('add', itemsToAdd);
				}
				if (itemsToUpdate.length > 0)
				{
					store.commit('update', itemsToUpdate);
				}
			},
			setSearchResult: (store, payload) =>
			{
				const itemsToUpdate = [];
				const itemsToAdd = [];

				let {notifications} = payload;

				const skipValidation = !!payload.skipValidation;
				if (!skipValidation)
				{
					const currentUserId = Core.getUserId();
					notifications = notifications.map(element => {
						return NotificationsModel.validate(element, currentUserId);
					});
				}

				notifications.forEach(element => {
					const existingItem = store.state.searchCollection.get(element.id);
					if (existingItem)
					{
						itemsToUpdate.push({id: existingItem.id, fields: {...element}});
					}
					else
					{
						itemsToAdd.push({...this.getElementState(), ...element});
					}
				});

				if (itemsToAdd.length > 0)
				{
					store.commit('addSearchResult', itemsToAdd);
				}
				if (itemsToUpdate.length > 0)
				{
					store.commit('updateSearchResult', itemsToUpdate);
				}
			},
			read: (store, payload) =>
			{
				payload.ids.forEach(notificationId => {
					const existingItem = store.state.collection.get(notificationId);
					if (!existingItem || existingItem.read === payload.read)
					{
						return false;
					}

					if (payload.read)
					{
						store.commit('decreaseCounter');
					}
					else
					{
						store.commit('increaseCounter');
					}

					store.commit('read', {
						id: existingItem.id,
						read: payload.read,
					});
				});
			},
			readAll: (store) =>
			{
				store.commit('readAll');
				store.commit('setCounter', 0);
			},
			delete: (store, payload) =>
			{
				const existingItem = store.state.collection.get(payload.id);
				if (!existingItem)
				{
					return;
				}

				if (existingItem.read === false)
				{
					store.commit('decreaseCounter');
				}

				store.commit('delete', {id: existingItem.id});
			},
			deleteFromSearch: (store, payload) => {
				const existingItem = store.state.searchCollection.get(payload.id);
				if (!existingItem)
				{
					return;
				}

				store.commit('delete', { id: existingItem.id });
			},
			clearSearchResult: (store) =>
			{
				store.commit('clearSearchResult');
			},
			setCounter: (store, payload) =>
			{
				store.commit('setCounter', payload);
			}
		};
	}

	getMutations()
	{
		return {
			add: (state, payload) =>
			{
				payload.forEach(item => {
					state.collection.set(item.id, item);
				});
			},
			addSearchResult: (state, payload) =>
			{
				payload.forEach(item => {
					state.searchCollection.set(item.id, item);
				});
			},
			update: (state, payload) =>
			{
				payload.forEach(item => {
					state.collection.set(item.id, {
						...state.collection.get(item.id),
						...item.fields
					});
				});
			},
			updateSearchResult: (state, payload) =>
			{
				payload.forEach(item => {
					state.searchCollection.set(item.id, {
						...state.searchCollection.get(item.id),
						...item.fields
					});
				});
			},
			delete: (state, payload) =>
			{
				state.collection.delete(payload.id);
				state.searchCollection.delete(payload.id);
			},
			read: (state, payload) => {
				state.collection.set(payload.id, {
					...state.collection.get(payload.id),
					read: payload.read,
				});
				state.searchCollection.set(payload.id, {
					...state.collection.get(payload.id),
					read: payload.read,
				});
			},
			readAll: (state) =>
			{
				[...state.collection.values()].forEach(item => {
					if (!item.read)
					{
						item.read = true;
					}
				});
			},
			setCounter: (state, payload) =>
			{
				state.unreadCounter = Number.parseInt(payload, 10);
			},
			decreaseCounter: (state) =>
			{
				if (state.unreadCounter > 0)
				{
					state.unreadCounter--;
				}
			},
			increaseCounter: (state) =>
			{
				state.unreadCounter++;
			},
			clearSearchResult: (state) =>
			{
				state.searchCollection.clear();
			}
		};
	}

	static validate(fields: Object)
	{
		const result = {};

		if (Type.isString(fields.id) || Type.isNumber(fields.id))
		{
			result.id = fields.id;
		}

		if (Type.isNumber(fields.author_id))
		{
			result.authorId = fields.author_id;
		}
		else if (Type.isNumber(fields.userId))
		{
			result.authorId = fields.userId;
		}

		if (!Type.isNil(fields.date))
		{
			result.date = Utils.date.cast(fields.date);
		}

		if (Type.isString(fields.notify_title))
		{
			result.title = fields.notify_title;
		}
		else if (Type.isString(fields.title))
		{
			result.title = fields.title;
		}

		if (Type.isString(fields.text) || Type.isNumber(fields.text))
		{
			result.text = Text.decode(fields.text.toString());
		}

		if (Type.isObjectLike(fields.params))
		{
			result.params = convertObjectKeysToCamelCase(fields.params);
		}

		if (Type.isArray(fields.replaces))
		{
			result.replaces = fields.replaces;
		}

		if (!Type.isNil(fields.notify_buttons))
		{
			result.notifyButtons = JSON.parse(fields.notify_buttons);
		}
		else if (!Type.isNil(fields.buttons))
		{
			result.notifyButtons = fields.buttons.map(button => {
				return {
					COMMAND: 'notifyConfirm',
					COMMAND_PARAMS: `${result.id}|${button.VALUE}`,
					TEXT: `${button.TITLE}`,
					TYPE: 'BUTTON',
					DISPLAY: 'LINE',
					BG_COLOR: (button.VALUE === 'Y' ? '#8bc84b' : '#ef4b57'),
					TEXT_COLOR: '#fff',
				};
			});
		}

		if (fields.notify_type === NotificationTypesCodes.confirm || fields.type === NotificationTypesCodes.confirm)
		{
			result.sectionCode = NotificationTypesCodes.confirm;
		}
		else
		{
			result.sectionCode = NotificationTypesCodes.simple;
		}

		if (!Type.isNil(fields.notify_read))
		{
			result.read = fields.notify_read === 'Y';
		}
		else if (!Type.isNil(fields.read))
		{
			result.read = fields.read === 'Y';
		}

		if (Type.isString(fields.setting_name))
		{
			result.settingName = fields.setting_name;
		}
		else if (Type.isString(fields.settingName))
		{
			result.settingName = fields.settingName;
		}

		return result;
	}

	sortByType(a, b)
	{
		if (a.sectionCode === NotificationTypesCodes.confirm && b.sectionCode !== NotificationTypesCodes.confirm)
		{
			return -1;
		}
		else if (a.sectionCode !== NotificationTypesCodes.confirm && b.sectionCode === NotificationTypesCodes.confirm)
		{
			return 1;
		}
		else
		{
			return b.id - a.id;
		}
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit