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

META-INF.resources.js.pages.questions.hooks.useActivityQuestionKebabOptions.es.js Maven / Gradle / Ivy

/**
 * 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 {openToast} from 'frontend-js-web';
import {useMutation} from 'graphql-hooks';
import {useCallback, useMemo, useState} from 'react';

import {subscribeQuery, unsubscribeQuery} from '../../../utils/client.es';
import {deleteCache, getFullPath} from '../../../utils/utils.es';

const FEEDBACK_DELAY = 2000;

const useActiviyQuestionKebabOptions = ({
	activityPage,
	context,
	onClickReport,
	question,
	questionId,
	sectionTitle,
	setError,
	setShowDeleteModalPanel,
}) => {
	const [isSubscribed, setIsSubscribe] = useState(true);

	const [unsubscribe] = useMutation(unsubscribeQuery);
	const [subscribe] = useMutation(subscribeQuery);

	const onClickShare = useCallback(async () => {
		const urlClipboard = `${getFullPath(
			context.historyRouterBasePath || 'questions'
		)}${
			context.historyRouterBasePath ? context.historyRouterBasePath : '#'
		}/questions/${sectionTitle}/${questionId}`;

		try {
			await navigator.clipboard.writeText(urlClipboard);

			openToast({
				message: Liferay.Language.get('copied-link-to-the-clipboard'),
				type: 'success',
			});
		}
		catch (error) {
			setError(error);

			openToast({
				message: error,
				title: Liferay.Language.get('an-error-occurred'),
				type: 'warning',
			});
		}
		finally {
			setTimeout(() => {
				setError(null);
			}, FEEDBACK_DELAY);
		}
	}, [context.historyRouterBasePath, questionId, sectionTitle, setError]);

	const onSubscribe = useCallback(
		async (question) => {
			const fn = isSubscribed ? unsubscribe : subscribe;

			await fn({
				variables: {
					messageBoardThreadId: question.id,
				},
			});

			setIsSubscribe(!isSubscribed);

			deleteCache();

			openToast({
				message: isSubscribed
					? Liferay.Language.get('unsubscribe')
					: Liferay.Language.get('subscribe'),
				type: 'success',
			});
		},
		[isSubscribed, subscribe, unsubscribe]
	);

	const kebabOptions = useMemo(() => {
		const options = [
			{
				href: `${getFullPath(
					context.historyRouterBasePath || 'questions'
				)}${
					context.historyRouterBasePath
						? context.historyRouterBasePath
						: '#'
				}/questions/${sectionTitle}/${questionId}`,
				label: Liferay.Language.get('view-question'),
				symbolLeft: 'shortcut',
				visible: activityPage,
			},
			{
				label: Liferay.Language.get('share'),
				onClick: onClickShare,
				symbolLeft: 'share',
				visible: window.isSecureContext,
			},
			{
				label: Liferay.Language.get('report'),
				onClick: () => onClickReport(),
				symbolLeft: 'flag-empty',
			},
			{
				href: `${getFullPath(
					context.historyRouterBasePath || 'questions'
				)}${
					context.historyRouterBasePath
						? context.historyRouterBasePath
						: '#'
				}/questions/${sectionTitle}/${questionId}/edit`,
				label: Liferay.Language.get('edit'),
				symbolLeft: 'pencil',
				visible: question?.actions?.replace,
			},
			{
				label: isSubscribed
					? Liferay.Language.get('unsubscribe')
					: Liferay.Language.get('subscribe'),
				onClick: () => onSubscribe(question),
				symbolLeft: isSubscribed ? 'bell-off' : 'bell-on',
				visible:
					question?.actions?.subscribe ||
					question?.actions?.unsubscribe,
			},
			{
				type: 'divider',
				visible: question?.actions?.delete,
			},
			{
				label: Liferay.Language.get('delete'),
				onClick: () => setShowDeleteModalPanel(true),
				symbolLeft: 'trash',
				visible: question?.actions?.delete,
			},
		];

		return options.filter(({visible = true}) => visible);
	}, [
		activityPage,
		context.historyRouterBasePath,
		isSubscribed,
		onClickReport,
		onClickShare,
		onSubscribe,
		question,
		questionId,
		sectionTitle,
		setShowDeleteModalPanel,
	]);

	return {kebabOptions, setIsSubscribe};
};

export default useActiviyQuestionKebabOptions;




© 2015 - 2025 Weber Informatics LLC | Privacy Policy