frontend/src/old-pages/Clusters/Costs/EnableCostMonitoringButton.tsx (93 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
// with the License. A copy of the License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "LICENSE.txt" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
// OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions and
// limitations under the License.
import {Box, Button, Modal, SpaceBetween} from '@cloudscape-design/components'
import React, {useCallback} from 'react'
import {Trans, useTranslation} from 'react-i18next'
import {notify} from '../../../model'
import {
CostMonitoringActivationErrorKind,
useActivateCostMonitoringMutation,
useCostMonitoringStatus,
} from './costs.queries'
import {consoleDomain, useState} from '../../../store'
import {useFeatureFlag} from '../../../feature-flags/useFeatureFlag'
export function EnableCostMonitoringButton() {
const {t} = useTranslation()
const isCostMonitoringActive = useFeatureFlag('cost_monitoring')
const defaultRegion = useState(['aws', 'region'])
const region = useState(['app', 'selectedRegion']) || defaultRegion
const [modalVisible, setModalVisible] = React.useState(false)
const showModal = useCallback(() => {
setModalVisible(true)
}, [setModalVisible])
const dismissModal = useCallback(() => {
setModalVisible(false)
}, [setModalVisible])
const onActivationError = useCallback(
(kind: CostMonitoringActivationErrorKind, message?: string) => {
switch (kind) {
case 'costExplorerCannotBeAccessed':
showModal()
break
case 'genericError':
notify(message, 'error')
break
}
},
[showModal],
)
const onActivationSuccess = useCallback(() => {
notify(t('costMonitoring.activateButton.activationSuccess'))
}, [t])
const {data: costMonitoringStatus, isLoading} = useCostMonitoringStatus()
const costMonitoringStatusMutation = useActivateCostMonitoringMutation(
onActivationError,
onActivationSuccess,
)
const onClick = useCallback(() => {
costMonitoringStatusMutation.mutate()
}, [costMonitoringStatusMutation])
const domain = consoleDomain(region)
const costExplorerHref = `${domain}/cost-management/home#/cost-explorer`
if (isLoading || costMonitoringStatus || !isCostMonitoringActive) return null
return (
<>
<Button
onClick={onClick}
loading={costMonitoringStatusMutation.isLoading}
>
{t('costMonitoring.activateButton.label')}
</Button>
{modalVisible && (
<Modal
onDismiss={dismissModal}
visible={modalVisible}
closeAriaLabel={t(
'costMonitoring.enableCostExplorerModal.closeAriaLabel',
)}
footer={
<Box float="right">
<SpaceBetween direction="horizontal" size="xs">
<Button onClick={dismissModal} variant="link">
{t('costMonitoring.enableCostExplorerModal.actions.cancel')}
</Button>
<Button
variant="primary"
iconName="external"
target="_blank"
href={costExplorerHref}
onClick={dismissModal}
>
{t(
'costMonitoring.enableCostExplorerModal.actions.goToCostExplorer',
)}
</Button>
</SpaceBetween>
</Box>
}
header={t('costMonitoring.enableCostExplorerModal.title')}
>
<Trans i18nKey="costMonitoring.enableCostExplorerModal.description" />
</Modal>
)}
</>
)
}