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;