ol-modal.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import FocusTrap from '../focus-trap'
  2. import {
  3. Modal,
  4. ModalProps,
  5. ModalHeaderProps,
  6. ModalTitleProps,
  7. ModalFooterProps,
  8. } from 'react-bootstrap'
  9. import { ModalBodyProps } from 'react-bootstrap/ModalBody'
  10. import type { Options as FocusTrapOptions } from 'focus-trap'
  11. import { useTranslation } from 'react-i18next'
  12. type OLModalProps = ModalProps & {
  13. size?: 'sm' | 'lg'
  14. onHide: () => void
  15. show?: boolean
  16. } & Pick<
  17. FocusTrapOptions,
  18. | 'escapeDeactivates'
  19. | 'clickOutsideDeactivates'
  20. | 'returnFocusOnDeactivate'
  21. | 'initialFocus'
  22. >
  23. type OLModalHeaderProps = ModalHeaderProps & {
  24. closeButton?: boolean
  25. }
  26. export function OLModal({
  27. children,
  28. show = false,
  29. onHide,
  30. returnFocusOnDeactivate = true, // Return focus to trigger element when modal closes
  31. escapeDeactivates = false, // Let React-Bootstrap Modal handle Escape key to avoid double Escape key handling
  32. clickOutsideDeactivates = true, // Allow focus trap to deactivate on outside click and let React-Bootstrap Modal handle it
  33. initialFocus,
  34. ...props
  35. }: OLModalProps) {
  36. return (
  37. <Modal show={show} onHide={onHide} {...props}>
  38. <FocusTrap
  39. active={show}
  40. focusTrapOptions={{
  41. escapeDeactivates,
  42. clickOutsideDeactivates,
  43. returnFocusOnDeactivate,
  44. initialFocus,
  45. }}
  46. >
  47. {children}
  48. </FocusTrap>
  49. </Modal>
  50. )
  51. }
  52. export function OLModalHeader({
  53. children,
  54. closeButton = true,
  55. ...props
  56. }: OLModalHeaderProps) {
  57. const { t } = useTranslation()
  58. return (
  59. <Modal.Header
  60. closeButton={closeButton}
  61. closeLabel={t('close_dialog')}
  62. {...props}
  63. >
  64. {children}
  65. </Modal.Header>
  66. )
  67. }
  68. export function OLModalTitle({ children, ...props }: ModalTitleProps) {
  69. return (
  70. <Modal.Title as="h2" {...props}>
  71. {children}
  72. </Modal.Title>
  73. )
  74. }
  75. export function OLModalBody({ children, ...props }: ModalBodyProps) {
  76. return <Modal.Body {...props}>{children}</Modal.Body>
  77. }
  78. export function OLModalFooter({ children, ...props }: ModalFooterProps) {
  79. return <Modal.Footer {...props}>{children}</Modal.Footer>
  80. }