file-tree-create-new-doc.jsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { useCallback, useEffect } from 'react'
  2. import FileTreeCreateNameInput from '../file-tree-create-name-input'
  3. import { useFileTreeActionable } from '../../../contexts/file-tree-actionable'
  4. import { useFileTreeCreateName } from '../../../contexts/file-tree-create-name'
  5. import { useFileTreeCreateForm } from '../../../contexts/file-tree-create-form'
  6. import * as eventTracking from '../../../../../infrastructure/event-tracking'
  7. import ErrorMessage from '../error-message'
  8. import importOverleafModules from '../../../../../../macros/import-overleaf-module.macro'
  9. const newFilePromotionComponents = importOverleafModules('newFilePromotions')
  10. export default function FileTreeCreateNewDoc() {
  11. const { name, validName } = useFileTreeCreateName()
  12. const { setValid } = useFileTreeCreateForm()
  13. const { error, finishCreatingDoc, inFlight } = useFileTreeActionable()
  14. // form validation: name is valid
  15. useEffect(() => {
  16. setValid(validName)
  17. }, [setValid, validName])
  18. // form submission: create an empty doc with this name
  19. const handleSubmit = useCallback(
  20. event => {
  21. event.preventDefault()
  22. finishCreatingDoc({ name })
  23. eventTracking.sendMB('new-file-created', {
  24. method: 'doc',
  25. extension: name.split('.').length > 1 ? name.split('.').pop() : '',
  26. })
  27. },
  28. [finishCreatingDoc, name]
  29. )
  30. return (
  31. <form noValidate id="create-file" onSubmit={handleSubmit}>
  32. <FileTreeCreateNameInput focusName error={error} inFlight={inFlight} />
  33. {error && <ErrorMessage error={error} />}
  34. {newFilePromotionComponents.map(
  35. ({ import: { default: Component }, path }) => (
  36. <Component key={path} />
  37. )
  38. )}
  39. </form>
  40. )
  41. }