ol-modal.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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' | 'clickOutsideDeactivates' | 'returnFocusOnDeactivate'
  19. >
  20. type OLModalHeaderProps = ModalHeaderProps & {
  21. closeButton?: boolean
  22. }
  23. export function OLModal({
  24. children,
  25. show = false,
  26. onHide,
  27. returnFocusOnDeactivate = true, // Return focus to trigger element when modal closes
  28. escapeDeactivates = false, // Let React-Bootstrap Modal handle Escape key to avoid double Escape key handling
  29. clickOutsideDeactivates = true, // Allow focus trap to deactivate on outside click and let React-Bootstrap Modal handle it
  30. ...props
  31. }: OLModalProps) {
  32. return (
  33. <Modal show={show} onHide={onHide} {...props}>
  34. <FocusTrap
  35. active={show}
  36. focusTrapOptions={{
  37. escapeDeactivates,
  38. clickOutsideDeactivates,
  39. returnFocusOnDeactivate,
  40. }}
  41. >
  42. {children}
  43. </FocusTrap>
  44. </Modal>
  45. )
  46. }
  47. export function OLModalHeader({
  48. children,
  49. closeButton = true,
  50. ...props
  51. }: OLModalHeaderProps) {
  52. const { t } = useTranslation()
  53. return (
  54. <Modal.Header
  55. closeButton={closeButton}
  56. closeLabel={t('close_dialog')}
  57. {...props}
  58. >
  59. {children}
  60. </Modal.Header>
  61. )
  62. }
  63. export function OLModalTitle({ children, ...props }: ModalTitleProps) {
  64. return (
  65. <Modal.Title as="h2" {...props}>
  66. {children}
  67. </Modal.Title>
  68. )
  69. }
  70. export function OLModalBody({ children, ...props }: ModalBodyProps) {
  71. return <Modal.Body {...props}>{children}</Modal.Body>
  72. }
  73. export function OLModalFooter({ children, ...props }: ModalFooterProps) {
  74. return <Modal.Footer {...props}>{children}</Modal.Footer>
  75. }