import { Box, Icon, Menu } from '@rocket.chat/fuselage'; import React, { useMemo, useCallback } from 'react'; import { useSetModal } from '../../../contexts/ModalContext'; import { useRoute } from '../../../contexts/RouterContext'; import { useMethod, useEndpoint } from '../../../contexts/ServerContext'; import { useTranslation } from '../../../contexts/TranslationContext'; import CloudLoginModal from './CloudLoginModal'; import IframeModal from './IframeModal'; import WarningModal from './WarningModal'; import { appEnabledStatuses, warnStatusChange, handleAPIError } from './helpers'; function AppMenu({ app, ...props }) { const t = useTranslation(); const setModal = useSetModal(); const appsRoute = useRoute('admin-apps'); const checkUserLoggedIn = useMethod('cloud:checkUserLoggedIn'); const setAppStatus = useEndpoint('POST', `/apps/${app.id}/status`); const buildExternalUrl = useEndpoint('GET', '/apps'); const syncApp = useEndpoint('POST', `/apps/${app.id}/sync`); const uninstallApp = useEndpoint('DELETE', `/apps/${app.id}`); const canAppBeSubscribed = app.purchaseType === 'subscription'; const isSubscribed = app.subscriptionInfo && ['active', 'trialing'].includes(app.subscriptionInfo.status); const isAppEnabled = appEnabledStatuses.includes(app.status); const closeModal = useCallback(() => { setModal(null); }, [setModal]); const handleEnable = useCallback(async () => { try { const { status } = await setAppStatus({ status: 'manually_enabled' }); warnStatusChange(app.name, status); } catch (error) { handleAPIError(error); } }, [app.name, setAppStatus]); const handleViewLogs = useCallback(() => { appsRoute.push({ context: 'logs', id: app.id }); }, [app.id, appsRoute]); const handleSubscription = useCallback(async () => { if (!(await checkUserLoggedIn())) { setModal(); return; } let data; try { data = await buildExternalUrl({ buildExternalUrl: 'true', appId: app.id, purchaseType: app.purchaseType, details: true, }); } catch (error) { handleAPIError(error); return; } const confirm = async () => { try { await syncApp(); } catch (error) { handleAPIError(error); } }; setModal(); }, [checkUserLoggedIn, setModal, closeModal, buildExternalUrl, app.id, app.purchaseType, syncApp]); const handleDisable = useCallback(() => { const confirm = async () => { closeModal(); try { const { status } = await setAppStatus({ status: 'manually_disabled' }); warnStatusChange(app.name, status); } catch (error) { handleAPIError(error); } }; setModal( , ); }, [app.name, closeModal, setAppStatus, setModal, t]); const handleUninstall = useCallback(() => { const uninstall = async () => { closeModal(); try { await uninstallApp(); } catch (error) { handleAPIError(error); } }; if (isSubscribed) { const confirm = async () => { await handleSubscription(); }; setModal( , ); } setModal( , ); }, [closeModal, handleSubscription, isSubscribed, setModal, t, uninstallApp]); const menuOptions = useMemo( () => ({ ...(canAppBeSubscribed && { subscribe: { label: ( {t('Subscription')} ), action: handleSubscription, }, }), viewLogs: { label: ( {t('View_Logs')} ), action: handleViewLogs, }, ...(isAppEnabled && { disable: { label: ( {t('Disable')} ), action: handleDisable, }, }), ...(!isAppEnabled && { enable: { label: ( {t('Enable')} ), action: handleEnable, }, }), uninstall: { label: ( {t('Uninstall')} ), action: handleUninstall, }, }), [canAppBeSubscribed, t, handleSubscription, handleViewLogs, isAppEnabled, handleDisable, handleEnable, handleUninstall], ); return ; } export default AppMenu;