HEX
Server: Apache
System: Linux WWW 6.1.0-40-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.153-1 (2025-09-20) x86_64
User: web11 (1011)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/intranet.kauko.lt/wp-content/plugins/wise-chat/assets/js/src/utils/channels-storage.js
/**
 * Channels storage utility.
 * It uses Local Storage to store currently opened and focused channels.
 */
export default class ChannelsStorage {

	constructor(instanceId) {
		if (!instanceId) {
			instanceId = 'c';
		}
		this.instanceId = instanceId;
		this.LOCAL_STORAGE_KEY = "WiseChatChannelsStorage";
	}

	/**
	 * Determines if the store was used before.
	 * @returns {boolean}
	 */
	isEmpty() {
		const data = this.getData();

		return data[this.instanceId] === undefined;
	}

	/**
	 * Convert channel IDs.
	 *
	 * @param {String} fromChannelId
	 * @param {String} toChannelId
	 */
	mapChannel(fromChannelId, toChannelId) {
		if (this.isFocused(fromChannelId)) {
			this.markFocused(toChannelId);
		}

		if (this.isOpen(fromChannelId)) {
			this.clear(fromChannelId);
			this.markOpen(toChannelId);
		}
	}

	/**
	 * Marks the channel as hidden.
	 *
	 * @param {String} channelId
	 */
	markHidden(channelId) {
		const data = this.getInstanceData();

		if (!data.hidden.includes(channelId)) {
			data.hidden.push(channelId);
		}

		this.saveInstanceData(data);
	}

	/**
	 * Check if the channel is hidden.
	 *
	 * @param {String} channelId
	 * @return {Boolean}
	 */
	isHidden(channelId) {
		const data = this.getInstanceData();

		return data.hidden.includes(channelId);
	}

	/**
	 * Clears hidden of the channel.
	 *
	 * @param {String} channelId
	 */
	unmarkHidden(channelId) {
		const data = this.getInstanceData();

		this.saveInstanceData({
			...data,
			hidden: data.hidden.filter( channelIdCandidate => channelIdCandidate !== channelId )
		});
	}

	/**
	 * Marks the channel as ignored.
	 *
	 * @param {String} channelId
	 */
	markIgnored(channelId) {
		const data = this.getInstanceData();

		this.saveInstanceData({
			...data,
			ignored: [...(data.ignored ? data.ignored : []), channelId]
		});
	}

	/**
	 * Marks the channel as focused.
	 *
	 * @param {String} channelId
	 */
	markFocused(channelId) {
		this.saveInstanceData({
			...this.getInstanceData(),
			focused: channelId
		});
	}

	/**
	 * Returns the focused channel.
	 *
	 * @return {String}
	 */
	getFocused() {
		const data = this.getInstanceData();

		return data.focused ? data.focused : null;
	}

	/**
	 * Marks the channel as open.
	 *
	 * @param {String} channelId
	 */
	markOpen(channelId) {
		const data = this.getInstanceData();

		this.saveInstanceData({
			...data,
			open: [...(data.open ? data.open : []), channelId]
		});
	}

	/**
	 * Removes the channel from all lists.
	 *
	 * @param {String} channelId
	 */
	clear(channelId) {
		const data = this.getInstanceData();

		// do not clear the ignored:
		this.saveInstanceData({
			...data,
			focused: data.focused === channelId ? undefined : data.focused,
			open: data.open.filter( channelIdCandidate => channelIdCandidate !== channelId ),
			hidden: data.hidden.filter( channelIdCandidate => channelIdCandidate !== channelId )
		});
	}

	/**
	 * Check if the channel is on the list.
	 *
	 * @param {String} channelId
	 * @return {Boolean}
	 */
	isOpen(channelId) {
		const data = this.getInstanceData();

		return data.open.includes(channelId);
	}

	/**
	 * Check if the channel is focused.
	 *
	 * @param {String} channelId
	 * @return {Boolean}
	 */
	isFocused(channelId) {
		const data = this.getInstanceData();

		return data.focused === channelId;
	}

	/**
	 * Check if the channel is on the ignored list.
	 *
	 * @param {String} channelId
	 * @return {Boolean}
	 */
	isIgnored(channelId) {
		return this.getInstanceData().ignored.includes(channelId);
	}

	/**
	 * Removes the channel from the ignored lists.
	 *
	 * @param {String} channelId
	 */
	clearIgnored(channelId) {
		const data = this.getInstanceData();

		this.saveInstanceData({
			...data,
			ignored: data.ignored.filter( channelIdCandidate => channelIdCandidate !== channelId )
		});
	}

	/**
	 * Returns opened channels.
	 *
	 * @return {Array}
	 */
	getOpenedChannels() {
		return this.getInstanceData().open;
	}

	/**
	 * Returns ignored channels.
	 *
	 * @return {Array}
	 */
	getIgnoredChannels() {
		return this.getInstanceData().ignored;
	}

	/**
	 * Returns hidden channels.
	 *
	 * @return {Array}
	 */
	getHiddenChannels() {
		return this.getInstanceData().hidden;
	}

	getInstanceData() {
		const data = this.getData();

		return data[this.instanceId] ? data[this.instanceId] : {
			open: [],
			focused: undefined,
			hidden: [],
			ignored: []
		};
	}

	saveInstanceData(instanceData) {
		const data = {
			...this.getData(), [this.instanceId]: instanceData
		};

		this.saveData(data);
	}

	getData() {
		let data = {};
		if (typeof(Storage) !== "undefined") {
			const encodedData = window.localStorage.getItem(this.LOCAL_STORAGE_KEY);
			if (encodedData !== null) {
				try {
					data = JSON.parse(encodedData);
				} catch (e) { }
			}
		}

		return data;
	}

	saveData(data) {
		if (typeof(Storage) !== "undefined") {
			window.localStorage.setItem(this.LOCAL_STORAGE_KEY, JSON.stringify(data));
		}
	}
}