ds-form-text.tsx 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { Form, FormTextProps as BS5FormTextProps } from 'react-bootstrap'
  2. import classnames from 'classnames'
  3. import { MergeAndOverride } from '@ol-types/utils'
  4. import { CheckCircle, WarningCircle } from '@phosphor-icons/react'
  5. type TextType = 'success' | 'error'
  6. export type FormTextProps = MergeAndOverride<
  7. BS5FormTextProps,
  8. { type?: TextType }
  9. >
  10. const typeClasses = {
  11. error: 'text-danger',
  12. success: 'text-success',
  13. } as const
  14. export const getFormTextClass = (type?: TextType) =>
  15. type && type in typeClasses
  16. ? typeClasses[type as keyof typeof typeClasses]
  17. : undefined
  18. function FormTextIcon({ type }: { type?: TextType }) {
  19. switch (type) {
  20. case 'success':
  21. return <CheckCircle className="ciam-form-text-icon" />
  22. case 'error':
  23. return <WarningCircle className="ciam-form-text-icon" />
  24. default:
  25. return null
  26. }
  27. }
  28. function DSFormText({ type, children, className, ...rest }: FormTextProps) {
  29. return (
  30. <Form.Text
  31. className={classnames('form-text-ds', className, getFormTextClass(type))}
  32. {...rest}
  33. >
  34. <span className="form-text-inner-ds">
  35. <FormTextIcon type={type} />
  36. {children}
  37. </span>
  38. </Form.Text>
  39. )
  40. }
  41. export default DSFormText