A Metamask fork with Infura removed and default networks editable
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
ciphermask/ui/components/ui/form-field/form-field.js

211 lines
4.8 KiB

import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import Typography from '../typography/typography';
import Box from '../box/box';
import {
COLORS,
TEXT_ALIGN,
DISPLAY,
TYPOGRAPHY,
FONT_WEIGHT,
} from '../../../helpers/constants/design-system';
import NumericInput from '../numeric-input/numeric-input.component';
import InfoTooltip from '../info-tooltip/info-tooltip';
export default function FormField({
dataTestId,
titleText,
titleUnit,
tooltipText,
titleDetail,
error,
onChange,
value,
numeric,
detailText,
autoFocus,
password,
allowDecimals,
disabled,
placeholder,
warning,
}) {
return (
<div
className={classNames('form-field', {
'form-field__row--error': error,
})}
>
<label>
<div className="form-field__heading">
<div className="form-field__heading-title">
{titleText && (
<Typography
tag={TYPOGRAPHY.H6}
fontWeight={FONT_WEIGHT.BOLD}
variant={TYPOGRAPHY.H6}
boxProps={{ display: DISPLAY.INLINE_BLOCK }}
>
{titleText}
</Typography>
)}
{titleUnit && (
<Typography
tag={TYPOGRAPHY.H6}
variant={TYPOGRAPHY.H6}
color={COLORS.UI4}
boxProps={{ display: DISPLAY.INLINE_BLOCK }}
>
{titleUnit}
</Typography>
)}
{tooltipText && (
<InfoTooltip position="top" contentText={tooltipText} />
)}
</div>
{titleDetail && (
<Box
className="form-field__heading-detail"
textAlign={TEXT_ALIGN.END}
marginBottom={3}
marginRight={2}
>
{titleDetail}
</Box>
)}
</div>
{numeric ? (
<NumericInput
error={error}
onChange={onChange}
value={value}
detailText={detailText}
autoFocus={autoFocus}
allowDecimals={allowDecimals}
disabled={disabled}
dataTestId={dataTestId}
placeholder={placeholder}
/>
) : (
<input
className={classNames('form-field__input', {
'form-field__input--error': error,
'form-field__input--warning': warning,
})}
onChange={(e) => onChange(e.target.value)}
value={value}
type={password ? 'password' : 'text'}
autoFocus={autoFocus}
disabled={disabled}
data-testid={dataTestId}
placeholder={placeholder}
/>
)}
{error && (
<Typography
color={COLORS.ERROR1}
variant={TYPOGRAPHY.H7}
className="form-field__error"
>
{error}
</Typography>
)}
{warning && (
<Typography
color={COLORS.UI4}
variant={TYPOGRAPHY.H7}
className="form-field__warning"
>
{warning}
</Typography>
)}
</label>
</div>
);
}
FormField.propTypes = {
/**
* Identifier for testing purpose
*/
dataTestId: PropTypes.string,
/**
* Form Fields Title
*/
titleText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
/**
* Show unit (eg. ETH)
*/
titleUnit: PropTypes.string,
/**
* Add Tooltip and text content
*/
tooltipText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
/**
* Show content (text, image, component) in title
*/
titleDetail: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
/**
* Show error message
*/
error: PropTypes.string,
/**
* Show warning message
*/
warning: PropTypes.string,
/**
* Handler when fields change
*/
onChange: PropTypes.func,
/**
* Field value
*/
value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
/**
* Show detail text if field mode is numeric
*/
detailText: PropTypes.string,
/**
* Set autofocus on render
*/
autoFocus: PropTypes.bool,
/**
* Set numeric mode, the default is text
*/
numeric: PropTypes.bool,
/**
* Set password mode
*/
password: PropTypes.bool,
/**
* Allow decimals on the field
*/
allowDecimals: PropTypes.bool,
/**
* Check if the form disabled
*/
disabled: PropTypes.bool,
/**
* Set the placeholder text for the input field
*/
placeholder: PropTypes.string,
};
FormField.defaultProps = {
titleText: '',
titleUnit: '',
tooltipText: '',
titleDetail: '',
error: '',
onChange: undefined,
value: 0,
detailText: '',
autoFocus: false,
numeric: false,
password: false,
allowDecimals: true,
disabled: false,
};