message-input.tsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import PropTypes from 'prop-types'
  2. import { useTranslation } from 'react-i18next'
  3. type MessageInputProps = {
  4. resetUnreadMessages: () => void
  5. sendMessage: (message: string) => void
  6. }
  7. function MessageInput({ resetUnreadMessages, sendMessage }: MessageInputProps) {
  8. const { t } = useTranslation()
  9. function handleKeyDown(event: React.KeyboardEvent) {
  10. const selectingCharacter = event.nativeEvent.isComposing
  11. if (event.key === 'Enter' && !selectingCharacter) {
  12. event.preventDefault()
  13. const target = event.target as HTMLInputElement
  14. sendMessage(target.value)
  15. // wrap the form reset in setTimeout so input sources have time to finish
  16. // https://github.com/overleaf/internal/pull/9206
  17. window.setTimeout(() => {
  18. target.blur()
  19. target.closest('form')?.reset()
  20. target.focus()
  21. }, 0)
  22. }
  23. }
  24. return (
  25. <form className="new-message">
  26. <label htmlFor="chat-input" className="sr-only">
  27. {t('your_message_to_collaborators')}
  28. </label>
  29. <textarea
  30. id="chat-input"
  31. placeholder={`${t('your_message_to_collaborators')}…`}
  32. onKeyDown={handleKeyDown}
  33. onClick={resetUnreadMessages}
  34. />
  35. </form>
  36. )
  37. }
  38. MessageInput.propTypes = {
  39. resetUnreadMessages: PropTypes.func.isRequired,
  40. sendMessage: PropTypes.func.isRequired,
  41. }
  42. export default MessageInput