From 28740ffbee5d520ea3da4a3e512778ca808fa684 Mon Sep 17 00:00:00 2001 From: Wahyu Kurniawan Date: Thu, 14 Mar 2024 21:54:30 +0700 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20create=20chang?= =?UTF-8?q?e=20state=20to=20production=20dialog=20reusable=20component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dialog/ChangeStateToProductionDialog.tsx | 90 ++++++++++++++++ .../project/deployments/DeploymentMenu.tsx | 102 ++++-------------- 2 files changed, 109 insertions(+), 83 deletions(-) create mode 100644 packages/frontend/src/components/projects/Dialog/ChangeStateToProductionDialog.tsx diff --git a/packages/frontend/src/components/projects/Dialog/ChangeStateToProductionDialog.tsx b/packages/frontend/src/components/projects/Dialog/ChangeStateToProductionDialog.tsx new file mode 100644 index 00000000..cf7f1ef1 --- /dev/null +++ b/packages/frontend/src/components/projects/Dialog/ChangeStateToProductionDialog.tsx @@ -0,0 +1,90 @@ +import ConfirmDialog, { + ConfirmDialogProps, +} from 'components/shared/ConfirmDialog'; +import { Deployment, Domain } from 'gql-client'; +import React from 'react'; +import DeploymentDialogBodyCard from 'components/projects/project/deployments/DeploymentDialogBodyCard'; +import { Button } from 'components/shared/Button'; +import { + ChevronDoubleDownIcon, + LinkChainIcon, +} from 'components/shared/CustomIcon'; +import { TagProps } from 'components/shared/Tag'; + +interface ChangeStateToProductionDialogProps extends ConfirmDialogProps { + deployment: Deployment; + newDeployment?: Deployment; + domains: Domain[]; +} + +export const ChangeStateToProductionDialog = ({ + deployment, + newDeployment, + domains, + open, + handleCancel, + handleConfirm, + ...props +}: ChangeStateToProductionDialogProps) => { + const currentChip = { + value: 'Live Deployment', + type: 'positive' as TagProps['type'], + }; + const newChip = { + value: 'New Deployment', + type: 'attention' as TagProps['type'], + }; + + return ( + +
+
+

+ Upon confirmation, this deployment will be changed to production. +

+ + {newDeployment && ( + <> +
+ {Array.from({ length: 7 }).map((_, index) => ( + + ))} +
+ + + )} +
+
+

+ The new deployment will be associated with these domains: +

+ {domains.length > 0 && + domains.map((value) => { + return ( + + ); + })} +
+
+
+ ); +}; diff --git a/packages/frontend/src/components/projects/project/deployments/DeploymentMenu.tsx b/packages/frontend/src/components/projects/project/deployments/DeploymentMenu.tsx index f4eb9808..516b468a 100644 --- a/packages/frontend/src/components/projects/project/deployments/DeploymentMenu.tsx +++ b/packages/frontend/src/components/projects/project/deployments/DeploymentMenu.tsx @@ -17,12 +17,10 @@ import { MenuList, } from '@material-tailwind/react'; import { ComponentPropsWithRef } from 'react'; -import ConfirmDialog from '../../../shared/ConfirmDialog'; import AssignDomainDialog from './AssignDomainDialog'; -import DeploymentDialogBodyCard from './DeploymentDialogBodyCard'; -import { Typography } from '@material-tailwind/react'; -import { useGQLClient } from '../../../../context/GQLClientContext'; +import { useGQLClient } from 'context/GQLClientContext'; import { cn } from 'utils/classnames'; +import { ChangeStateToProductionDialog } from 'components/projects/Dialog/ChangeStateToProductionDialog'; interface DeploymentMenuProps extends ComponentPropsWithRef<'div'> { deployment: Deployment; @@ -158,106 +156,44 @@ export const DeploymentMenu = ({ {/* Dialogs */} - setChangeToProduction((preVal) => !preVal)} - open={changeToProduction} confirmButtonTitle="Change" - color="blue" + handleCancel={() => setChangeToProduction((preVal) => !preVal)} + open={changeToProduction} handleConfirm={async () => { await updateDeployment(); setChangeToProduction((preVal) => !preVal); }} - > -
- - Upon confirmation, this deployment will be changed to production. - - - - The new deployment will be associated with these domains: - - {prodBranchDomains.length > 0 && - prodBranchDomains.map((value) => { - return ( - - ^ {value.name} - - ); - })} -
-
- + setRedeployToProduction((preVal) => !preVal)} + handleCancel={() => setRedeployToProduction((preVal) => !preVal)} open={redeployToProduction} confirmButtonTitle="Redeploy" - color="blue" handleConfirm={async () => { await redeployToProd(); setRedeployToProduction((preVal) => !preVal); }} - > -
- - Upon confirmation, new deployment will be created with the same - source code as current deployment. - - - - These domains will point to your new deployment: - - {deployment.domain?.name && ( - - {deployment.domain?.name} - - )} -
-
+ deployment={deployment} + domains={deployment.domain ? [deployment.domain] : []} + /> {Boolean(currentDeployment) && ( - setRollbackDeployment((preVal) => !preVal)} + handleCancel={() => setRollbackDeployment((preVal) => !preVal)} open={rollbackDeployment} confirmButtonTitle="Rollback" - color="blue" handleConfirm={async () => { await rollbackDeploymentHandler(); setRollbackDeployment((preVal) => !preVal); }} - > -
- - Upon confirmation, this deployment will replace your current - deployment - - - - - These domains will point to your new deployment: - - - ^ {currentDeployment.domain?.name} - -
-
+ deployment={currentDeployment} + newDeployment={deployment} + domains={currentDeployment.domain ? [currentDeployment.domain] : []} + /> )}