180 lines
4.9 KiB
TypeScript

import React from 'react';
import styled from 'styled-components';
import { Divider, Typography, Switch, Card, Button, Tooltip } from 'antd';
import { ArrowRightOutlined } from '@ant-design/icons';
import { ANTD_GRAY } from '../../entity/shared/constants';
const Title = styled(Typography.Title)`
&& {
margin-bottom: 8px;
}
`;
const FeatureRow = styled.div`
display: flex;
align-items: flex-start;
justify-content: space-between;
`;
const FeatureOptionRow = styled.div`
display: flex;
justify-content: space-between;
&:not(:last-child) {
margin-bottom: 8px;
}
`;
const SettingsOptionRow = styled.div`
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 16px;
&:not(:last-child) {
margin-bottom: 8px;
}
`;
const DescriptionText = styled(Typography.Text)`
color: ${ANTD_GRAY[7]};
font-size: 11px;
`;
const SettingTitle = styled.div`
display: flex;
align-items: center;
gap: 8px;
font-size: 14px;
margin-bottom: 4px;
`;
const OptionTitle = styled(Typography.Text)`
display: flex;
align-items: center;
gap: 8px;
font-size: 12px;
`;
const learnMoreLinkStyle = {
flex: 1,
display: 'flex',
alignItems: 'center',
gap: '8px',
color: '#1890FF',
fontSize: '12px',
cursor: 'pointer',
};
const NewTag = styled.div`
padding: 4px 8px;
border-radius: 24px;
background: #f1fbfe;
color: #09739a;
font-size: 12px;
`;
const DataHubOnlyTag = styled.div`
padding: 2px 8px;
border-radius: 24px;
background: #c9fff2;
color: #50a494;
font-size: 12px;
`;
export interface FeatureType {
key: string;
title: string;
description: string;
settings: Array<{
key: string;
title: string;
isAvailable: boolean;
buttonText: string;
onClick?: () => void;
}>;
options: Array<{
key: string;
title: string;
description: string;
isAvailable: boolean;
checked: boolean;
onChange?: (checked: boolean) => void;
}>;
isNew: boolean;
learnMoreLink?: string;
}
export const Feature = ({ key, title, description, settings, options, isNew, learnMoreLink }: FeatureType) => (
<Card style={{ marginBottom: '1rem' }} key={key}>
<FeatureRow>
<div style={{ flex: 1 }}>
<SettingTitle>
<Title level={5} style={{ marginBottom: 0 }}>
{title}
</Title>
{isNew && <NewTag>New!</NewTag>}
</SettingTitle>
<div>
<Typography.Paragraph type="secondary">{description}</Typography.Paragraph>
</div>
</div>
<div>
{learnMoreLink && (
<a href={learnMoreLink} target="_blank" style={learnMoreLinkStyle} rel="noreferrer">
Learn more <ArrowRightOutlined />
</a>
)}
</div>
</FeatureRow>
<Divider style={{ margin: `8px 0 24px 0` }} />
{settings.map((option) => (
<>
<SettingsOptionRow key={option.key}>
<span>
<OptionTitle>
<span>{option.title}</span>
</OptionTitle>
</span>
<Tooltip title={option.isAvailable ? '' : 'Only available on DataHub Cloud'}>
<Button onClick={option.onClick} disabled={!option.isAvailable}>
{option.buttonText}
</Button>
</Tooltip>
</SettingsOptionRow>
</>
))}
<Card style={{ margin: `16px auto` }}>
{options.map((option, index) => (
<>
<FeatureOptionRow key={option.key}>
<span>
<OptionTitle>
<span>{option.title}</span>
{!option.isAvailable && (
<DataHubOnlyTag>Only available on DataHub Cloud</DataHubOnlyTag>
)}
</OptionTitle>
<div>
<DescriptionText>{option.description}</DescriptionText>
</div>
</span>
<Switch
checked={option.checked}
onChange={(checked) => (option.onChange ? option.onChange(checked) : null)}
disabled={!option.isAvailable}
/>
</FeatureOptionRow>
{index !== options.length - 1 && <Divider />}
</>
))}
</Card>
</Card>
);