request-status.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { useTranslation } from 'react-i18next'
  2. import { Card, CardBody, Row, Col } from 'react-bootstrap'
  3. import Button from '@/shared/components/button/button'
  4. import MaterialIcon from '@/shared/components/material-icon'
  5. import getMeta from '@/utils/meta'
  6. import IconButton from '@/shared/components/button/icon-button'
  7. import classnames from 'classnames'
  8. type RequestStatusProps = {
  9. icon: string
  10. title: string
  11. content?: React.ReactNode
  12. variant?: 'primary' | 'danger'
  13. }
  14. function RequestStatus({ icon, title, content, variant }: RequestStatusProps) {
  15. const { t } = useTranslation()
  16. const groupName = getMeta('ol-groupName')
  17. return (
  18. <div className="container">
  19. <Row>
  20. <Col xxl={5} xl={6} lg={7} md={9} className="mx-auto">
  21. <div className="group-heading" data-testid="group-heading">
  22. <IconButton
  23. variant="ghost"
  24. href="/user/subscription"
  25. size="lg"
  26. icon="arrow_back"
  27. accessibilityLabel={t('back_to_subscription')}
  28. />
  29. <h2>{groupName || t('group_subscription')}</h2>
  30. </div>
  31. <Card>
  32. <CardBody className="d-grid gap-3">
  33. <div
  34. className={classnames('card-icon', {
  35. [`text-${variant}`]: variant,
  36. })}
  37. >
  38. <MaterialIcon type={icon} />
  39. </div>
  40. <div className="d-grid gap-2 text-center">
  41. <h3 className="mb-0 fw-bold" data-testid="title">
  42. {title}
  43. </h3>
  44. {content && (
  45. <div className="card-description-secondary">{content}</div>
  46. )}
  47. </div>
  48. <div className="text-center">
  49. <Button variant="secondary" href="/user/subscription">
  50. {t('go_to_subscriptions')}
  51. </Button>
  52. </div>
  53. </CardBody>
  54. </Card>
  55. </Col>
  56. </Row>
  57. </div>
  58. )
  59. }
  60. export default RequestStatus