agx-chat-web 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/README.md +49 -49
  2. package/package.json +91 -91
  3. package/src/__tests__/app/Messenger/classes/slaCalculations.spec.ts +122 -122
  4. package/src/app/ChatProvider/ChatProvider.tsx +20 -20
  5. package/src/app/Messenger/classes/slaCalculations.ts +197 -197
  6. package/src/app/Messenger/components/ChatButton/ChatButton.tsx +64 -64
  7. package/src/app/Messenger/components/ChatTabs/ChatTabs.less +18 -18
  8. package/src/app/Messenger/components/ChatTabs/ChatTabs.tsx +32 -32
  9. package/src/app/Messenger/components/DocMessage/DocMessage.less +71 -71
  10. package/src/app/Messenger/components/DocMessage/DocMessage.tsx +50 -50
  11. package/src/app/Messenger/components/ImagesContainer/ImagesContainer.less +79 -79
  12. package/src/app/Messenger/components/ImagesContainer/ImagesContainer.tsx +51 -51
  13. package/src/app/Messenger/components/IncomingMessage/IncomingMessage.tsx +170 -170
  14. package/src/app/Messenger/components/InfiniteScroll/InfiniteScroll.tsx +80 -80
  15. package/src/app/Messenger/components/InputFile/InputFile.tsx +147 -147
  16. package/src/app/Messenger/components/InputFile/inputFile.less +59 -59
  17. package/src/app/Messenger/components/MessageBallon/MessageBalloon.tsx +100 -100
  18. package/src/app/Messenger/components/MessengerAvatar/MessengerAvatar.tsx +29 -29
  19. package/src/app/Messenger/components/MessengerThemeWrapper/MessengerThemeWrapper.tsx +62 -62
  20. package/src/app/Messenger/components/RenderFileIcon/RenderFileIcon.tsx +40 -40
  21. package/src/app/Messenger/components/SearchInput/SearchInput.less +45 -45
  22. package/src/app/Messenger/components/SearchInput/SearchInput.tsx +77 -77
  23. package/src/app/Messenger/components/Select/Select.less +22 -22
  24. package/src/app/Messenger/components/Select/Select.tsx +56 -56
  25. package/src/app/Messenger/components/SendMessageForm/SendMessageForm.tsx +254 -254
  26. package/src/app/Messenger/components/SenderMessages/SenderMessages.tsx +91 -91
  27. package/src/app/Messenger/components/SystemMessage/SystemMessage.tsx +25 -25
  28. package/src/app/Messenger/components/TextArea/TextArea.tsx +35 -35
  29. package/src/app/Messenger/components/TextArea/Textarea.less +22 -22
  30. package/src/app/Messenger/components/Tooltip/Tooltip.less +27 -27
  31. package/src/app/Messenger/components/Tooltip/Tooltip.tsx +17 -17
  32. package/src/app/Messenger/hooks/useConversations.tsx +143 -143
  33. package/src/app/Messenger/hooks/useMessages.tsx +49 -49
  34. package/src/app/Messenger/hooks/useThemes.tsx +14 -14
  35. package/src/app/Messenger/icons/AttachFileIcon.tsx +20 -20
  36. package/src/app/Messenger/icons/CSVFileIcon.tsx +26 -26
  37. package/src/app/Messenger/icons/CloseIcon.tsx +20 -20
  38. package/src/app/Messenger/icons/DOCFileIcon.tsx +54 -54
  39. package/src/app/Messenger/icons/DownloadMinimalistIcon.tsx +37 -37
  40. package/src/app/Messenger/icons/EmptyIcon.tsx +20 -20
  41. package/src/app/Messenger/icons/MP4FileIcon.tsx +26 -26
  42. package/src/app/Messenger/icons/MessageIcon.tsx +27 -27
  43. package/src/app/Messenger/icons/PDFFileIcon.tsx +54 -54
  44. package/src/app/Messenger/icons/ReadIcon.tsx +18 -18
  45. package/src/app/Messenger/icons/SearchIcon.tsx +20 -20
  46. package/src/app/Messenger/icons/TimerIcon.tsx +18 -18
  47. package/src/app/Messenger/icons/TrashIcon.tsx +21 -21
  48. package/src/app/Messenger/views/Messenger.less +623 -623
  49. package/src/app/Messenger/views/MessengerList.tsx +170 -170
  50. package/src/app/Messenger/views/MessengerListItem.tsx +178 -178
  51. package/src/app/Messenger/views/MessengerMessages.tsx +414 -414
  52. package/src/app/Messenger/views/NewFormChat.tsx +145 -145
  53. package/src/app/i18n/index.ts +36 -36
  54. package/src/app/i18n/locales/en.json +64 -64
  55. package/src/app/i18n/locales/pt.json +64 -64
  56. package/src/assets/right-arrow.svg +9 -9
  57. package/src/index.ts +23 -23
  58. package/src/react-app-env.d.ts +19 -19
  59. package/src/setupTests.ts +5 -5
  60. package/src/styles/abstracts/animations.less +8 -8
  61. package/src/styles/abstracts/mixins.less +5 -5
  62. package/src/styles/abstracts/variables.less +31 -31
  63. package/src/styles/base/base.less +6 -6
  64. package/src/styles/index.less +5 -5
  65. package/src/types.ts +174 -174
  66. package/dist/agx-chat.esm.js +0 -2
  67. package/dist/agx-chat.esm.js.map +0 -1
  68. package/dist/agx-chat.umd.js +0 -2
  69. package/dist/agx-chat.umd.js.map +0 -1
  70. package/dist/esm/__tests__/app/Messenger/classes/slaCalculations.spec.d.ts +0 -1
  71. package/dist/esm/__tests__/app/Messenger/classes/slaCalculations.spec.js +0 -46
  72. package/dist/esm/__tests__/app/Messenger/classes/slaCalculations.spec.js.map +0 -1
  73. package/dist/esm/app/ChatProvider/ChatProvider.d.ts +0 -7
  74. package/dist/esm/app/ChatProvider/ChatProvider.js +0 -14
  75. package/dist/esm/app/ChatProvider/ChatProvider.js.map +0 -1
  76. package/dist/esm/app/Messenger/classes/slaCalculations.d.ts +0 -30
  77. package/dist/esm/app/Messenger/classes/slaCalculations.js +0 -144
  78. package/dist/esm/app/Messenger/classes/slaCalculations.js.map +0 -1
  79. package/dist/esm/app/Messenger/components/ChatButton/ChatButton.d.ts +0 -14
  80. package/dist/esm/app/Messenger/components/ChatButton/ChatButton.js +0 -31
  81. package/dist/esm/app/Messenger/components/ChatButton/ChatButton.js.map +0 -1
  82. package/dist/esm/app/Messenger/components/ChatTabs/ChatTabs.d.ts +0 -10
  83. package/dist/esm/app/Messenger/components/ChatTabs/ChatTabs.js +0 -15
  84. package/dist/esm/app/Messenger/components/ChatTabs/ChatTabs.js.map +0 -1
  85. package/dist/esm/app/Messenger/components/DocMessage/DocMessage.d.ts +0 -5
  86. package/dist/esm/app/Messenger/components/DocMessage/DocMessage.js +0 -35
  87. package/dist/esm/app/Messenger/components/DocMessage/DocMessage.js.map +0 -1
  88. package/dist/esm/app/Messenger/components/ImagesContainer/ImagesContainer.d.ts +0 -4
  89. package/dist/esm/app/Messenger/components/ImagesContainer/ImagesContainer.js +0 -39
  90. package/dist/esm/app/Messenger/components/ImagesContainer/ImagesContainer.js.map +0 -1
  91. package/dist/esm/app/Messenger/components/IncomingMessage/IncomingMessage.d.ts +0 -7
  92. package/dist/esm/app/Messenger/components/IncomingMessage/IncomingMessage.js +0 -53
  93. package/dist/esm/app/Messenger/components/IncomingMessage/IncomingMessage.js.map +0 -1
  94. package/dist/esm/app/Messenger/components/InfiniteScroll/InfiniteScroll.d.ts +0 -13
  95. package/dist/esm/app/Messenger/components/InfiniteScroll/InfiniteScroll.js +0 -43
  96. package/dist/esm/app/Messenger/components/InfiniteScroll/InfiniteScroll.js.map +0 -1
  97. package/dist/esm/app/Messenger/components/InputFile/InputFile.d.ts +0 -11
  98. package/dist/esm/app/Messenger/components/InputFile/InputFile.js +0 -74
  99. package/dist/esm/app/Messenger/components/InputFile/InputFile.js.map +0 -1
  100. package/dist/esm/app/Messenger/components/MessageBallon/MessageBalloon.d.ts +0 -9
  101. package/dist/esm/app/Messenger/components/MessageBallon/MessageBalloon.js +0 -34
  102. package/dist/esm/app/Messenger/components/MessageBallon/MessageBalloon.js.map +0 -1
  103. package/dist/esm/app/Messenger/components/MessengerAvatar/MessengerAvatar.d.ts +0 -4
  104. package/dist/esm/app/Messenger/components/MessengerAvatar/MessengerAvatar.js +0 -13
  105. package/dist/esm/app/Messenger/components/MessengerAvatar/MessengerAvatar.js.map +0 -1
  106. package/dist/esm/app/Messenger/components/MessengerThemeWrapper/MessengerThemeWrapper.d.ts +0 -41
  107. package/dist/esm/app/Messenger/components/MessengerThemeWrapper/MessengerThemeWrapper.js +0 -40
  108. package/dist/esm/app/Messenger/components/MessengerThemeWrapper/MessengerThemeWrapper.js.map +0 -1
  109. package/dist/esm/app/Messenger/components/RenderFileIcon/RenderFileIcon.d.ts +0 -6
  110. package/dist/esm/app/Messenger/components/RenderFileIcon/RenderFileIcon.js +0 -29
  111. package/dist/esm/app/Messenger/components/RenderFileIcon/RenderFileIcon.js.map +0 -1
  112. package/dist/esm/app/Messenger/components/SearchInput/SearchInput.d.ts +0 -11
  113. package/dist/esm/app/Messenger/components/SearchInput/SearchInput.js +0 -33
  114. package/dist/esm/app/Messenger/components/SearchInput/SearchInput.js.map +0 -1
  115. package/dist/esm/app/Messenger/components/Select/Select.d.ts +0 -14
  116. package/dist/esm/app/Messenger/components/Select/Select.js +0 -16
  117. package/dist/esm/app/Messenger/components/Select/Select.js.map +0 -1
  118. package/dist/esm/app/Messenger/components/SendMessageForm/SendMessageForm.d.ts +0 -13
  119. package/dist/esm/app/Messenger/components/SendMessageForm/SendMessageForm.js +0 -143
  120. package/dist/esm/app/Messenger/components/SendMessageForm/SendMessageForm.js.map +0 -1
  121. package/dist/esm/app/Messenger/components/SenderMessages/SenderMessages.d.ts +0 -4
  122. package/dist/esm/app/Messenger/components/SenderMessages/SenderMessages.js +0 -43
  123. package/dist/esm/app/Messenger/components/SenderMessages/SenderMessages.js.map +0 -1
  124. package/dist/esm/app/Messenger/components/SystemMessage/SystemMessage.d.ts +0 -4
  125. package/dist/esm/app/Messenger/components/SystemMessage/SystemMessage.js +0 -14
  126. package/dist/esm/app/Messenger/components/SystemMessage/SystemMessage.js.map +0 -1
  127. package/dist/esm/app/Messenger/components/TextArea/TextArea.d.ts +0 -9
  128. package/dist/esm/app/Messenger/components/TextArea/TextArea.js +0 -14
  129. package/dist/esm/app/Messenger/components/TextArea/TextArea.js.map +0 -1
  130. package/dist/esm/app/Messenger/components/Tooltip/Tooltip.d.ts +0 -7
  131. package/dist/esm/app/Messenger/components/Tooltip/Tooltip.js +0 -9
  132. package/dist/esm/app/Messenger/components/Tooltip/Tooltip.js.map +0 -1
  133. package/dist/esm/app/Messenger/hooks/useConversations.d.ts +0 -21
  134. package/dist/esm/app/Messenger/hooks/useConversations.js +0 -105
  135. package/dist/esm/app/Messenger/hooks/useConversations.js.map +0 -1
  136. package/dist/esm/app/Messenger/hooks/useMessages.d.ts +0 -9
  137. package/dist/esm/app/Messenger/hooks/useMessages.js +0 -37
  138. package/dist/esm/app/Messenger/hooks/useMessages.js.map +0 -1
  139. package/dist/esm/app/Messenger/hooks/useThemes.d.ts +0 -32
  140. package/dist/esm/app/Messenger/hooks/useThemes.js +0 -11
  141. package/dist/esm/app/Messenger/hooks/useThemes.js.map +0 -1
  142. package/dist/esm/app/Messenger/icons/AttachFileIcon.d.ts +0 -4
  143. package/dist/esm/app/Messenger/icons/AttachFileIcon.js +0 -10
  144. package/dist/esm/app/Messenger/icons/AttachFileIcon.js.map +0 -1
  145. package/dist/esm/app/Messenger/icons/CSVFileIcon.d.ts +0 -4
  146. package/dist/esm/app/Messenger/icons/CSVFileIcon.js +0 -7
  147. package/dist/esm/app/Messenger/icons/CSVFileIcon.js.map +0 -1
  148. package/dist/esm/app/Messenger/icons/CloseIcon.d.ts +0 -2
  149. package/dist/esm/app/Messenger/icons/CloseIcon.js +0 -9
  150. package/dist/esm/app/Messenger/icons/CloseIcon.js.map +0 -1
  151. package/dist/esm/app/Messenger/icons/DOCFileIcon.d.ts +0 -4
  152. package/dist/esm/app/Messenger/icons/DOCFileIcon.js +0 -18
  153. package/dist/esm/app/Messenger/icons/DOCFileIcon.js.map +0 -1
  154. package/dist/esm/app/Messenger/icons/DownloadMinimalistIcon.d.ts +0 -7
  155. package/dist/esm/app/Messenger/icons/DownloadMinimalistIcon.js +0 -12
  156. package/dist/esm/app/Messenger/icons/DownloadMinimalistIcon.js.map +0 -1
  157. package/dist/esm/app/Messenger/icons/EmptyIcon.d.ts +0 -2
  158. package/dist/esm/app/Messenger/icons/EmptyIcon.js +0 -8
  159. package/dist/esm/app/Messenger/icons/EmptyIcon.js.map +0 -1
  160. package/dist/esm/app/Messenger/icons/MP4FileIcon.d.ts +0 -4
  161. package/dist/esm/app/Messenger/icons/MP4FileIcon.js +0 -7
  162. package/dist/esm/app/Messenger/icons/MP4FileIcon.js.map +0 -1
  163. package/dist/esm/app/Messenger/icons/MessageIcon.d.ts +0 -6
  164. package/dist/esm/app/Messenger/icons/MessageIcon.js +0 -12
  165. package/dist/esm/app/Messenger/icons/MessageIcon.js.map +0 -1
  166. package/dist/esm/app/Messenger/icons/PDFFileIcon.d.ts +0 -4
  167. package/dist/esm/app/Messenger/icons/PDFFileIcon.js +0 -18
  168. package/dist/esm/app/Messenger/icons/PDFFileIcon.js.map +0 -1
  169. package/dist/esm/app/Messenger/icons/ReadIcon.d.ts +0 -4
  170. package/dist/esm/app/Messenger/icons/ReadIcon.js +0 -7
  171. package/dist/esm/app/Messenger/icons/ReadIcon.js.map +0 -1
  172. package/dist/esm/app/Messenger/icons/SearchIcon.d.ts +0 -2
  173. package/dist/esm/app/Messenger/icons/SearchIcon.js +0 -8
  174. package/dist/esm/app/Messenger/icons/SearchIcon.js.map +0 -1
  175. package/dist/esm/app/Messenger/icons/TimerIcon.d.ts +0 -4
  176. package/dist/esm/app/Messenger/icons/TimerIcon.js +0 -7
  177. package/dist/esm/app/Messenger/icons/TimerIcon.js.map +0 -1
  178. package/dist/esm/app/Messenger/icons/TrashIcon.d.ts +0 -6
  179. package/dist/esm/app/Messenger/icons/TrashIcon.js +0 -7
  180. package/dist/esm/app/Messenger/icons/TrashIcon.js.map +0 -1
  181. package/dist/esm/app/Messenger/views/MessengerList.d.ts +0 -40
  182. package/dist/esm/app/Messenger/views/MessengerList.js +0 -46
  183. package/dist/esm/app/Messenger/views/MessengerList.js.map +0 -1
  184. package/dist/esm/app/Messenger/views/MessengerListItem.d.ts +0 -12
  185. package/dist/esm/app/Messenger/views/MessengerListItem.js +0 -99
  186. package/dist/esm/app/Messenger/views/MessengerListItem.js.map +0 -1
  187. package/dist/esm/app/Messenger/views/MessengerMessages.d.ts +0 -35
  188. package/dist/esm/app/Messenger/views/MessengerMessages.js +0 -181
  189. package/dist/esm/app/Messenger/views/MessengerMessages.js.map +0 -1
  190. package/dist/esm/app/Messenger/views/NewFormChat.d.ts +0 -13
  191. package/dist/esm/app/Messenger/views/NewFormChat.js +0 -68
  192. package/dist/esm/app/Messenger/views/NewFormChat.js.map +0 -1
  193. package/dist/esm/app/i18n/index.d.ts +0 -3
  194. package/dist/esm/app/i18n/index.js +0 -32
  195. package/dist/esm/app/i18n/index.js.map +0 -1
  196. package/dist/esm/index.d.ts +0 -11
  197. package/dist/esm/index.js +0 -12
  198. package/dist/esm/index.js.map +0 -1
  199. package/dist/esm/setupTests.d.ts +0 -1
  200. package/dist/esm/setupTests.js +0 -6
  201. package/dist/esm/setupTests.js.map +0 -1
  202. package/dist/esm/types.d.ts +0 -140
  203. package/dist/esm/types.js +0 -2
  204. package/dist/esm/types.js.map +0 -1
@@ -1,254 +1,254 @@
1
- import useTheme from '../../hooks/useThemes'
2
- import React, {
3
- Fragment,
4
- MutableRefObject,
5
- useMemo,
6
- useRef,
7
- useState,
8
- } from 'react'
9
- import { IList } from 'types'
10
- import AttachFileIcon from '../../../Messenger/icons/AttachFileIcon'
11
- import rightArrow from '../../../../assets/right-arrow.svg'
12
- import { SpinLoading } from '../../views/MessengerMessages'
13
- import ToolTip from '../Tooltip/Tooltip'
14
- import { useTranslation } from 'react-i18next'
15
-
16
- interface IProps {
17
- allowImages: boolean
18
- current?: IList
19
- onSubmit: (value: FormData, callback: () => void) => void
20
- file?: File | null
21
- updateFile: (file: File | null) => void
22
- isLoading?: boolean
23
- maxFileSize: string
24
- }
25
-
26
- function AllowDocuments ({
27
- allowImages,
28
- attachFile,
29
- handleFile,
30
- closedChat,
31
- maxFileField,
32
- }: {
33
- allowImages: boolean
34
- attachFile: MutableRefObject<HTMLInputElement | null>
35
- handleFile: (e: React.ChangeEvent<HTMLInputElement>) => void
36
- closedChat: boolean
37
- maxFileField: string
38
- }) {
39
- const { t } = useTranslation('messengerMessages')
40
-
41
- if (allowImages) {
42
- return (
43
- <Fragment>
44
- <input
45
- type='file'
46
- size={1}
47
- className='messenger__messages-send--file'
48
- ref={attachFile}
49
- onChange={handleFile}
50
- accept='.jpg, .jpeg, .png, .pdf, .doc, .docx, .mp4, .csv'
51
- />
52
-
53
- <ToolTip text={t('sendMessageForm.maxFileField', { maxFileField })}>
54
- <AttachFileIcon
55
- className={`messenger__messages-send__attach ${closedChat ? 'messenger__messages-send__attach--disabled' : ''}`}
56
- onClick={() => (!closedChat ? attachFile.current?.click() : null)}
57
- />
58
- </ToolTip>
59
- </Fragment>
60
- )
61
- }
62
-
63
- return <></>
64
- }
65
-
66
- function SendMessageForm ({
67
- allowImages,
68
- current,
69
- onSubmit,
70
- file,
71
- updateFile,
72
- isLoading,
73
- maxFileSize,
74
- }: IProps) {
75
- const { t } = useTranslation('messengerMessages')
76
- const [formHeight, setFormHeight] = useState<number>(100)
77
- const [sending, setSending] = useState<boolean>(false)
78
-
79
- const inputRef: MutableRefObject<HTMLTextAreaElement | null> = useRef(null)
80
- const attachFile: MutableRefObject<HTMLInputElement | null> = useRef(null)
81
-
82
- const closedChat = useMemo(
83
- () => current?.status.current.state === 'final',
84
- [current]
85
- )
86
-
87
- const { theme } = useTheme()
88
-
89
- function correctTextAreaHeight (styleConfig: {
90
- height: number
91
- overflow: string
92
- }) {
93
- const textarea = inputRef.current
94
- if (textarea) {
95
- textarea.style.height = `${styleConfig.height}px`
96
- textarea.style.overflowY = styleConfig.overflow
97
- }
98
- }
99
-
100
- function resetHeights () {
101
- const inicialFormHeight = 100
102
- const inicialTextAreaHeight = 50
103
- setFormHeight(inicialFormHeight)
104
- correctTextAreaHeight({ height: inicialTextAreaHeight, overflow: 'hidden' })
105
- }
106
-
107
- function adjustFormHeight (textareaRef: typeof inputRef.current) {
108
- if (textareaRef) {
109
- const initialHeight = 50
110
- const maxHeight = 80
111
- const newHeight = textareaRef.scrollHeight
112
-
113
- if (newHeight > maxHeight) {
114
- correctTextAreaHeight({
115
- height: maxHeight,
116
- overflow: 'auto',
117
- })
118
- return maxHeight + initialHeight
119
- }
120
-
121
- correctTextAreaHeight({
122
- height: initialHeight,
123
- overflow: 'auto',
124
- })
125
- return initialHeight * 2
126
- }
127
-
128
- return formHeight
129
- }
130
-
131
- function handleTextareaChange () {
132
- const textarea = inputRef.current
133
- setFormHeight(adjustFormHeight(textarea))
134
- }
135
-
136
- function handleSubmit (e?: React.FormEvent<HTMLFormElement>) {
137
- e?.preventDefault()
138
- if (sending) return
139
- setSending(true)
140
-
141
- const data = new FormData()
142
- if (file) data.append('file', file)
143
- if (inputRef.current?.value) data.append('message', inputRef.current?.value)
144
-
145
- onSubmit(data, () => {
146
- if (inputRef.current) inputRef.current.value = ''
147
- if (file) updateFile(null)
148
- setSending(false)
149
- resetHeights()
150
- })
151
- }
152
-
153
- function handleFile (e: React.ChangeEvent<HTMLInputElement>) {
154
- if (e.target.files) {
155
- const file = e.target.files[0]
156
- const allowedTypes = [
157
- 'image/png',
158
- 'image/jpeg',
159
- 'application/pdf',
160
- 'application/msword',
161
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
162
- 'text/csv',
163
- 'video/mp4',
164
- ]
165
- const allowedExtensions = [
166
- 'png',
167
- 'jpeg',
168
- 'jpg',
169
- 'pdf',
170
- 'doc',
171
- 'docx',
172
- 'csv',
173
- 'mp4',
174
- ]
175
- const fileType = file?.type
176
- const fileExtension = file?.name.split('.').pop()?.toLowerCase()
177
- const isAllowed = fileType
178
- ? allowedTypes.includes(fileType)
179
- : fileExtension
180
- ? allowedExtensions.includes(fileExtension)
181
- : false
182
- if (isAllowed) {
183
- updateFile(file)
184
- }
185
- }
186
- }
187
-
188
- return (
189
- <form
190
- onSubmit={handleSubmit}
191
- className='messenger__messages-send--form'
192
- style={{
193
- height: `${formHeight}px`,
194
- maxHeight: '150px',
195
- }}
196
- >
197
- <div className='messenger__messages-send__input-container'>
198
- <textarea
199
- onChange={handleTextareaChange}
200
- placeholder={
201
- closedChat
202
- ? t('sendMessageForm.chatEnded')
203
- : t('sendMessageForm.typeMessage')
204
- }
205
- ref={inputRef}
206
- onKeyDown={(e) => {
207
- if (e.key === 'Enter' && !e.shiftKey) {
208
- e.preventDefault()
209
- handleSubmit()
210
- }
211
- }}
212
- className={`messenger__messages-send__input ${closedChat || sending ? 'messenger__messages-send__input--disabled' : ''} `}
213
- disabled={closedChat || sending}
214
- style={{
215
- backgroundColor: theme?.inputBg,
216
- }}
217
- />
218
-
219
- <AllowDocuments
220
- allowImages={allowImages}
221
- handleFile={handleFile}
222
- attachFile={attachFile}
223
- closedChat={closedChat}
224
- maxFileField={maxFileSize}
225
- />
226
- </div>
227
-
228
- {isLoading ? (
229
- <div className='messenger__messages-sending'>
230
- <SpinLoading />
231
- </div>
232
- ) : (
233
- <button
234
- type='submit'
235
- className={`messenger__messages-send__button ${closedChat || sending ? 'messenger__messages-send__button--disabled' : ''}`}
236
- disabled={closedChat || sending}
237
- style={{
238
- backgroundColor: theme?.buttonPrimary,
239
- }}
240
- >
241
- <img
242
- alt={t('sendMessageForm.rightIcon')}
243
- height={25}
244
- width={25}
245
- className='ml-1'
246
- src={rightArrow}
247
- />
248
- </button>
249
- )}
250
- </form>
251
- )
252
- }
253
-
254
- export default SendMessageForm
1
+ import useTheme from '../../hooks/useThemes'
2
+ import React, {
3
+ Fragment,
4
+ MutableRefObject,
5
+ useMemo,
6
+ useRef,
7
+ useState,
8
+ } from 'react'
9
+ import { IList } from 'types'
10
+ import AttachFileIcon from '../../../Messenger/icons/AttachFileIcon'
11
+ import rightArrow from '../../../../assets/right-arrow.svg'
12
+ import { SpinLoading } from '../../views/MessengerMessages'
13
+ import ToolTip from '../Tooltip/Tooltip'
14
+ import { useTranslation } from 'react-i18next'
15
+
16
+ interface IProps {
17
+ allowImages: boolean
18
+ current?: IList
19
+ onSubmit: (value: FormData, callback: () => void) => void
20
+ file?: File | null
21
+ updateFile: (file: File | null) => void
22
+ isLoading?: boolean
23
+ maxFileSize: string
24
+ }
25
+
26
+ function AllowDocuments ({
27
+ allowImages,
28
+ attachFile,
29
+ handleFile,
30
+ closedChat,
31
+ maxFileField,
32
+ }: {
33
+ allowImages: boolean
34
+ attachFile: MutableRefObject<HTMLInputElement | null>
35
+ handleFile: (e: React.ChangeEvent<HTMLInputElement>) => void
36
+ closedChat: boolean
37
+ maxFileField: string
38
+ }) {
39
+ const { t } = useTranslation('messengerMessages')
40
+
41
+ if (allowImages) {
42
+ return (
43
+ <Fragment>
44
+ <input
45
+ type='file'
46
+ size={1}
47
+ className='messenger__messages-send--file'
48
+ ref={attachFile}
49
+ onChange={handleFile}
50
+ accept='.jpg, .jpeg, .png, .pdf, .doc, .docx, .mp4, .csv'
51
+ />
52
+
53
+ <ToolTip text={t('sendMessageForm.maxFileField', { maxFileField })}>
54
+ <AttachFileIcon
55
+ className={`messenger__messages-send__attach ${closedChat ? 'messenger__messages-send__attach--disabled' : ''}`}
56
+ onClick={() => (!closedChat ? attachFile.current?.click() : null)}
57
+ />
58
+ </ToolTip>
59
+ </Fragment>
60
+ )
61
+ }
62
+
63
+ return <></>
64
+ }
65
+
66
+ function SendMessageForm ({
67
+ allowImages,
68
+ current,
69
+ onSubmit,
70
+ file,
71
+ updateFile,
72
+ isLoading,
73
+ maxFileSize,
74
+ }: IProps) {
75
+ const { t } = useTranslation('messengerMessages')
76
+ const [formHeight, setFormHeight] = useState<number>(100)
77
+ const [sending, setSending] = useState<boolean>(false)
78
+
79
+ const inputRef: MutableRefObject<HTMLTextAreaElement | null> = useRef(null)
80
+ const attachFile: MutableRefObject<HTMLInputElement | null> = useRef(null)
81
+
82
+ const closedChat = useMemo(
83
+ () => current?.status.current.state === 'final',
84
+ [current]
85
+ )
86
+
87
+ const { theme } = useTheme()
88
+
89
+ function correctTextAreaHeight (styleConfig: {
90
+ height: number
91
+ overflow: string
92
+ }) {
93
+ const textarea = inputRef.current
94
+ if (textarea) {
95
+ textarea.style.height = `${styleConfig.height}px`
96
+ textarea.style.overflowY = styleConfig.overflow
97
+ }
98
+ }
99
+
100
+ function resetHeights () {
101
+ const inicialFormHeight = 100
102
+ const inicialTextAreaHeight = 50
103
+ setFormHeight(inicialFormHeight)
104
+ correctTextAreaHeight({ height: inicialTextAreaHeight, overflow: 'hidden' })
105
+ }
106
+
107
+ function adjustFormHeight (textareaRef: typeof inputRef.current) {
108
+ if (textareaRef) {
109
+ const initialHeight = 50
110
+ const maxHeight = 80
111
+ const newHeight = textareaRef.scrollHeight
112
+
113
+ if (newHeight > maxHeight) {
114
+ correctTextAreaHeight({
115
+ height: maxHeight,
116
+ overflow: 'auto',
117
+ })
118
+ return maxHeight + initialHeight
119
+ }
120
+
121
+ correctTextAreaHeight({
122
+ height: initialHeight,
123
+ overflow: 'auto',
124
+ })
125
+ return initialHeight * 2
126
+ }
127
+
128
+ return formHeight
129
+ }
130
+
131
+ function handleTextareaChange () {
132
+ const textarea = inputRef.current
133
+ setFormHeight(adjustFormHeight(textarea))
134
+ }
135
+
136
+ function handleSubmit (e?: React.FormEvent<HTMLFormElement>) {
137
+ e?.preventDefault()
138
+ if (sending) return
139
+ setSending(true)
140
+
141
+ const data = new FormData()
142
+ if (file) data.append('file', file)
143
+ if (inputRef.current?.value) data.append('message', inputRef.current?.value)
144
+
145
+ onSubmit(data, () => {
146
+ if (inputRef.current) inputRef.current.value = ''
147
+ if (file) updateFile(null)
148
+ setSending(false)
149
+ resetHeights()
150
+ })
151
+ }
152
+
153
+ function handleFile (e: React.ChangeEvent<HTMLInputElement>) {
154
+ if (e.target.files) {
155
+ const file = e.target.files[0]
156
+ const allowedTypes = [
157
+ 'image/png',
158
+ 'image/jpeg',
159
+ 'application/pdf',
160
+ 'application/msword',
161
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
162
+ 'text/csv',
163
+ 'video/mp4',
164
+ ]
165
+ const allowedExtensions = [
166
+ 'png',
167
+ 'jpeg',
168
+ 'jpg',
169
+ 'pdf',
170
+ 'doc',
171
+ 'docx',
172
+ 'csv',
173
+ 'mp4',
174
+ ]
175
+ const fileType = file?.type
176
+ const fileExtension = file?.name.split('.').pop()?.toLowerCase()
177
+ const isAllowed = fileType
178
+ ? allowedTypes.includes(fileType)
179
+ : fileExtension
180
+ ? allowedExtensions.includes(fileExtension)
181
+ : false
182
+ if (isAllowed) {
183
+ updateFile(file)
184
+ }
185
+ }
186
+ }
187
+
188
+ return (
189
+ <form
190
+ onSubmit={handleSubmit}
191
+ className='messenger__messages-send--form'
192
+ style={{
193
+ height: `${formHeight}px`,
194
+ maxHeight: '150px',
195
+ }}
196
+ >
197
+ <div className='messenger__messages-send__input-container'>
198
+ <textarea
199
+ onChange={handleTextareaChange}
200
+ placeholder={
201
+ closedChat
202
+ ? t('sendMessageForm.chatEnded')
203
+ : t('sendMessageForm.typeMessage')
204
+ }
205
+ ref={inputRef}
206
+ onKeyDown={(e) => {
207
+ if (e.key === 'Enter' && !e.shiftKey) {
208
+ e.preventDefault()
209
+ handleSubmit()
210
+ }
211
+ }}
212
+ className={`messenger__messages-send__input ${closedChat || sending ? 'messenger__messages-send__input--disabled' : ''} `}
213
+ disabled={closedChat || sending}
214
+ style={{
215
+ backgroundColor: theme?.inputBg,
216
+ }}
217
+ />
218
+
219
+ <AllowDocuments
220
+ allowImages={allowImages}
221
+ handleFile={handleFile}
222
+ attachFile={attachFile}
223
+ closedChat={closedChat}
224
+ maxFileField={maxFileSize}
225
+ />
226
+ </div>
227
+
228
+ {isLoading ? (
229
+ <div className='messenger__messages-sending'>
230
+ <SpinLoading />
231
+ </div>
232
+ ) : (
233
+ <button
234
+ type='submit'
235
+ className={`messenger__messages-send__button ${closedChat || sending ? 'messenger__messages-send__button--disabled' : ''}`}
236
+ disabled={closedChat || sending}
237
+ style={{
238
+ backgroundColor: theme?.buttonPrimary,
239
+ }}
240
+ >
241
+ <img
242
+ alt={t('sendMessageForm.rightIcon')}
243
+ height={25}
244
+ width={25}
245
+ className='ml-1'
246
+ src={rightArrow}
247
+ />
248
+ </button>
249
+ )}
250
+ </form>
251
+ )
252
+ }
253
+
254
+ export default SendMessageForm