diff --git a/packages/console/src/assets/icons/descend-arrow.svg b/packages/console/src/assets/icons/descend-arrow.svg new file mode 100644 index 000000000..9e355f630 --- /dev/null +++ b/packages/console/src/assets/icons/descend-arrow.svg @@ -0,0 +1,3 @@ + diff --git a/packages/console/src/ds-components/ConfirmModal/index.tsx b/packages/console/src/ds-components/ConfirmModal/index.tsx index 3bc98e7d4..ac7ac9172 100644 --- a/packages/console/src/ds-components/ConfirmModal/index.tsx +++ b/packages/console/src/ds-components/ConfirmModal/index.tsx @@ -8,6 +8,7 @@ import Button from '@/ds-components/Button'; import * as modalStyles from '@/scss/modal.module.scss'; import ModalLayout from '../ModalLayout'; +import type { Props as ModalLayoutProps } from '../ModalLayout'; import * as styles from './index.module.scss'; @@ -21,6 +22,7 @@ export type ConfirmModalProps = { isOpen: boolean; isConfirmButtonDisabled?: boolean; isLoading?: boolean; + size?: ModalLayoutProps['size']; onCancel?: () => void; onConfirm?: () => void; }; @@ -35,6 +37,7 @@ function ConfirmModal({ isOpen, isConfirmButtonDisabled = false, isLoading = false, + size, onCancel, onConfirm, }: ConfirmModalProps) { @@ -63,6 +66,7 @@ function ConfirmModal({ > } className={classNames(styles.content, className)} + size={size} onClose={onCancel} > {children} diff --git a/packages/console/src/ds-components/ModalLayout/index.tsx b/packages/console/src/ds-components/ModalLayout/index.tsx index 06bfcfced..fedc4513b 100644 --- a/packages/console/src/ds-components/ModalLayout/index.tsx +++ b/packages/console/src/ds-components/ModalLayout/index.tsx @@ -10,7 +10,7 @@ import IconButton from '../IconButton'; import * as styles from './index.module.scss'; -type Props = { +export type Props = { children: ReactNode; footer?: ReactNode; onClose?: () => void; diff --git a/packages/console/src/pages/TenantSettings/Subscription/DowngradeConfirmModalContent/PlanQuotaDiffList/QuotaDiffItem/index.module.scss b/packages/console/src/pages/TenantSettings/Subscription/DowngradeConfirmModalContent/PlanQuotaDiffList/QuotaDiffItem/index.module.scss new file mode 100644 index 000000000..4d542cfe4 --- /dev/null +++ b/packages/console/src/pages/TenantSettings/Subscription/DowngradeConfirmModalContent/PlanQuotaDiffList/QuotaDiffItem/index.module.scss @@ -0,0 +1,29 @@ +@use '@/scss/underscore' as _; + +.item { + margin-left: _.unit(4); + + &.withChangeState { + list-style-type: none; + margin-left: unset; + } + + .itemContent { + display: flex; + align-items: center; + gap: _.unit(2); + + .icon { + width: 16px; + height: 16px; + } + + &.notCapable { + text-decoration: line-through; + + .icon { + color: var(--color-error-hover); + } + } + } +} diff --git a/packages/console/src/pages/TenantSettings/Subscription/DowngradeConfirmModalContent/PlanQuotaDiffList/QuotaDiffItem/index.tsx b/packages/console/src/pages/TenantSettings/Subscription/DowngradeConfirmModalContent/PlanQuotaDiffList/QuotaDiffItem/index.tsx new file mode 100644 index 000000000..63b76f4f1 --- /dev/null +++ b/packages/console/src/pages/TenantSettings/Subscription/DowngradeConfirmModalContent/PlanQuotaDiffList/QuotaDiffItem/index.tsx @@ -0,0 +1,53 @@ +import { conditional } from '@silverhand/essentials'; +import classNames from 'classnames'; +import { useTranslation } from 'react-i18next'; + +import DescendArrow from '@/assets/icons/descend-arrow.svg'; +import Failed from '@/assets/icons/failed.svg'; +import { + quotaItemUnlimitedPhrasesMap, + quotaItemPhrasesMap, + quotaItemLimitedPhrasesMap, +} from '@/pages/TenantSettings/Subscription/quota-item-phrases'; +import { type SubscriptionPlanQuota } from '@/types/subscriptions'; + +import * as styles from './index.module.scss'; + +type Props = { + hasIcon?: boolean; + quotaKey: keyof SubscriptionPlanQuota; + quotaValue: SubscriptionPlanQuota[keyof SubscriptionPlanQuota]; +}; + +function QuotaDiffItem({ hasIcon = false, quotaKey, quotaValue }: Props) { + const { t } = useTranslation(undefined, { keyPrefix: 'admin_console.subscription.quota_item' }); + const isUnlimited = quotaValue === null; + const isNotCapable = quotaValue === 0 || quotaValue === false; + const isLimited = Boolean(quotaValue); + + const Icon = isNotCapable ? Failed : DescendArrow; + + return ( +