message-input.tsx 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { useTranslation } from 'react-i18next'
  2. import { bsVersion } from '@/features/utils/bootstrap-5'
  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
  27. htmlFor="chat-input"
  28. className={bsVersion({ bs3: 'sr-only', bs5: 'visually-hidden' })}
  29. >
  30. {t('your_message_to_collaborators')}
  31. </label>
  32. <textarea
  33. id="chat-input"
  34. placeholder={`${t('your_message_to_collaborators')}…`}
  35. onKeyDown={handleKeyDown}
  36. onClick={resetUnreadMessages}
  37. />
  38. </form>
  39. )
  40. }
  41. export default MessageInput