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 { appEnabledStatuses, warnStatusChange, handleAPIError } from './helpers'; import { CloudLoginModal } from './CloudLoginModal'; import { IframeModal } from './IframeModal'; import WarningModal from './WarningModal'; 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;