All Downloads are FREE. Search and download functionalities are using the official Maven repository.

META-INF.resources.page_editor.app.contexts.ClipboardContext.tsx Maven / Gradle / Ivy

The newest version!
/**
 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

import React, {ReactNode, useCallback, useContext, useState} from 'react';

import {LayoutDataItem} from '../../types/layout_data/LayoutData';
import {LAYOUT_DATA_ITEM_TYPES} from '../config/constants/layoutDataItemTypes';
import {useSelectorRef} from './StoreContext';

type Clipboard = Array;

const INITIAL_STATE: {
	clipboard: Clipboard;
	setClipboard: (itemIds: Clipboard) => void;
} = {
	clipboard: [],
	setClipboard: () => [],
};

const ClipboardContext = React.createContext(INITIAL_STATE);

function ClipboardContextProvider({children}: {children: ReactNode}) {
	const [clipboard, setClipboard] = useState([]);

	const layoutDataRef = useSelectorRef((state) => state.layoutData);

	const updateClipboard = useCallback(
		(itemIds: Clipboard) => {
			const nextItemIds = [];

			for (const itemId of itemIds) {
				const item = layoutDataRef.current?.items[itemId];

				if (!item) {
					continue;
				}

				if (
					item.type !== LAYOUT_DATA_ITEM_TYPES.formStep &&
					item.type !== LAYOUT_DATA_ITEM_TYPES.fragmentDropZone &&
					item.type !== LAYOUT_DATA_ITEM_TYPES.column &&
					item.type !== LAYOUT_DATA_ITEM_TYPES.root
				) {
					nextItemIds.push(itemId);
				}

				setClipboard(nextItemIds);
			}
		},
		[layoutDataRef]
	);

	return (
		
			{children}
		
	);
}

function useClipboard() {
	return useContext(ClipboardContext).clipboard;
}

function useSetClipboard() {
	return useContext(ClipboardContext).setClipboard;
}

export {ClipboardContextProvider, useClipboard, useSetClipboard};




© 2015 - 2025 Weber Informatics LLC | Privacy Policy