file-tree-modal-create-folder.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import React, { useState } from 'react'
  2. import PropTypes from 'prop-types'
  3. import { Button, Modal } from 'react-bootstrap'
  4. import { useTranslation } from 'react-i18next'
  5. import { useRefWithAutoFocus } from '../../../../infrastructure/auto-focus'
  6. import { useFileTreeActionable } from '../../contexts/file-tree-actionable'
  7. function FileTreeModalCreateFolder() {
  8. const { t } = useTranslation()
  9. const [name, setName] = useState('')
  10. const {
  11. isCreatingFolder,
  12. inFlight,
  13. finishCreatingFolder,
  14. cancel,
  15. error
  16. } = useFileTreeActionable()
  17. if (!isCreatingFolder) return null // the modal will not be rendered; return early
  18. function handleHide() {
  19. cancel()
  20. }
  21. function handleCreateFolder() {
  22. finishCreatingFolder(name)
  23. }
  24. return (
  25. <Modal show={isCreatingFolder} onHide={handleHide}>
  26. <Modal.Header>
  27. <Modal.Title>{t('new_folder')}</Modal.Title>
  28. </Modal.Header>
  29. <Modal.Body>
  30. <InputName
  31. name={name}
  32. setName={setName}
  33. handleCreateFolder={handleCreateFolder}
  34. />
  35. {error && (
  36. <div className="alert alert-danger file-tree-modal-alert">
  37. {t('generic_something_went_wrong')}
  38. </div>
  39. )}
  40. </Modal.Body>
  41. <Modal.Footer>
  42. {inFlight ? (
  43. <Button bsStyle="primary" disabled>
  44. {t('creating')}…
  45. </Button>
  46. ) : (
  47. <>
  48. <Button onClick={handleHide}>{t('cancel')}</Button>
  49. <Button bsStyle="primary" onClick={handleCreateFolder}>
  50. {t('create')}
  51. </Button>
  52. </>
  53. )}
  54. </Modal.Footer>
  55. </Modal>
  56. )
  57. }
  58. function InputName({ name, setName, handleCreateFolder }) {
  59. const { autoFocusedRef } = useRefWithAutoFocus()
  60. function handleFocus(ev) {
  61. ev.target.setSelectionRange(0, -1)
  62. }
  63. function handleChange(ev) {
  64. setName(ev.target.value)
  65. }
  66. function handleKeyDown(ev) {
  67. if (ev.key === 'Enter') {
  68. handleCreateFolder()
  69. }
  70. }
  71. return (
  72. <input
  73. ref={autoFocusedRef}
  74. className="form-control"
  75. type="text"
  76. value={name}
  77. onKeyDown={handleKeyDown}
  78. onChange={handleChange}
  79. onFocus={handleFocus}
  80. />
  81. )
  82. }
  83. InputName.propTypes = {
  84. name: PropTypes.string.isRequired,
  85. setName: PropTypes.func.isRequired,
  86. handleCreateFolder: PropTypes.func.isRequired
  87. }
  88. export default FileTreeModalCreateFolder