import React, { useState } from 'react'; import toast from 'react-hot-toast'; import { Deployment, Domain, Environment, Project } from 'gql-client'; import { Button } from 'components/shared/Button'; import { GlobeIcon, HorizontalDotIcon, LinkIcon, RefreshIcon, RocketIcon, UndoIcon, } from 'components/shared/CustomIcon'; import { Menu, MenuHandler, MenuItem, MenuList, } from '@material-tailwind/react'; import { ComponentPropsWithRef } from 'react'; import AssignDomainDialog from './AssignDomainDialog'; import { useGQLClient } from 'context/GQLClientContext'; import { cn } from 'utils/classnames'; import { ChangeStateToProductionDialog } from 'components/projects/Dialog/ChangeStateToProductionDialog'; interface DeploymentMenuProps extends ComponentPropsWithRef<'div'> { deployment: Deployment; currentDeployment: Deployment; onUpdate: () => Promise; project: Project; prodBranchDomains: Domain[]; } export const DeploymentMenu = ({ deployment, currentDeployment, onUpdate, project, prodBranchDomains, className, ...props }: DeploymentMenuProps) => { const client = useGQLClient(); const [changeToProduction, setChangeToProduction] = useState(false); const [redeployToProduction, setRedeployToProduction] = useState(false); const [rollbackDeployment, setRollbackDeployment] = useState(false); const [assignDomainDialog, setAssignDomainDialog] = useState(false); const updateDeployment = async () => { const isUpdated = await client.updateDeploymentToProd(deployment.id); if (isUpdated) { await onUpdate(); toast.success('Deployment changed to production'); } else { toast.error('Unable to change deployment to production'); } }; const redeployToProd = async () => { const isRedeployed = await client.redeployToProd(deployment.id); if (isRedeployed) { await onUpdate(); toast.success('Redeployed to production'); } else { toast.error('Unable to redeploy to production'); } }; const rollbackDeploymentHandler = async () => { const isRollbacked = await client.rollbackDeployment( project.id, deployment.id, ); if (isRollbacked) { await onUpdate(); toast.success('Deployment rolled back'); } else { toast.error('Unable to rollback deployment'); } }; return ( <>
{/* Dialogs */} setChangeToProduction((preVal) => !preVal)} open={changeToProduction} handleConfirm={async () => { await updateDeployment(); setChangeToProduction((preVal) => !preVal); }} deployment={deployment} domains={prodBranchDomains} /> setRedeployToProduction((preVal) => !preVal)} open={redeployToProduction} confirmButtonTitle="Redeploy" handleConfirm={async () => { await redeployToProd(); setRedeployToProduction((preVal) => !preVal); }} deployment={deployment} domains={deployment.domain ? [deployment.domain] : []} /> {Boolean(currentDeployment) && ( setRollbackDeployment((preVal) => !preVal)} open={rollbackDeployment} confirmButtonTitle="Rollback" handleConfirm={async () => { await rollbackDeploymentHandler(); setRollbackDeployment((preVal) => !preVal); }} deployment={currentDeployment} newDeployment={deployment} domains={currentDeployment.domain ? [currentDeployment.domain] : []} /> )} setAssignDomainDialog(!assignDomainDialog)} /> ); };