agx-chat-web 1.1.0 → 1.2.1

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 (86) hide show
  1. package/README.md +49 -49
  2. package/dist/agx-chat.esm.js +1 -1
  3. package/dist/agx-chat.esm.js.map +1 -1
  4. package/dist/{agx-chat.min.js → agx-chat.umd.js} +2 -2
  5. package/dist/agx-chat.umd.js.map +1 -0
  6. package/dist/esm/app/Messenger/components/IncomingMessage/IncomingMessage.js +7 -3
  7. package/dist/esm/app/Messenger/components/IncomingMessage/IncomingMessage.js.map +1 -1
  8. package/dist/esm/app/Messenger/components/InputFile/InputFile.js +3 -1
  9. package/dist/esm/app/Messenger/components/InputFile/InputFile.js.map +1 -1
  10. package/dist/esm/app/Messenger/components/RenderFileIcon/RenderFileIcon.js +8 -0
  11. package/dist/esm/app/Messenger/components/RenderFileIcon/RenderFileIcon.js.map +1 -1
  12. package/dist/esm/app/Messenger/components/SendMessageForm/SendMessageForm.js +30 -8
  13. package/dist/esm/app/Messenger/components/SendMessageForm/SendMessageForm.js.map +1 -1
  14. package/dist/esm/app/Messenger/components/SenderMessages/SenderMessages.js +11 -8
  15. package/dist/esm/app/Messenger/components/SenderMessages/SenderMessages.js.map +1 -1
  16. package/dist/esm/app/Messenger/icons/CSVFileIcon.d.ts +4 -0
  17. package/dist/esm/app/Messenger/icons/CSVFileIcon.js +7 -0
  18. package/dist/esm/app/Messenger/icons/CSVFileIcon.js.map +1 -0
  19. package/dist/esm/app/Messenger/icons/MP4FileIcon.d.ts +4 -0
  20. package/dist/esm/app/Messenger/icons/MP4FileIcon.js +7 -0
  21. package/dist/esm/app/Messenger/icons/MP4FileIcon.js.map +1 -0
  22. package/package.json +91 -91
  23. package/src/__tests__/app/Messenger/classes/slaCalculations.spec.ts +122 -122
  24. package/src/app/ChatProvider/ChatProvider.tsx +20 -20
  25. package/src/app/Messenger/classes/slaCalculations.ts +197 -197
  26. package/src/app/Messenger/components/ChatButton/ChatButton.tsx +64 -64
  27. package/src/app/Messenger/components/ChatTabs/ChatTabs.less +18 -18
  28. package/src/app/Messenger/components/ChatTabs/ChatTabs.tsx +32 -32
  29. package/src/app/Messenger/components/DocMessage/DocMessage.less +71 -71
  30. package/src/app/Messenger/components/DocMessage/DocMessage.tsx +50 -50
  31. package/src/app/Messenger/components/ImagesContainer/ImagesContainer.less +79 -79
  32. package/src/app/Messenger/components/ImagesContainer/ImagesContainer.tsx +51 -51
  33. package/src/app/Messenger/components/IncomingMessage/IncomingMessage.tsx +170 -166
  34. package/src/app/Messenger/components/InfiniteScroll/InfiniteScroll.tsx +80 -80
  35. package/src/app/Messenger/components/InputFile/InputFile.tsx +147 -145
  36. package/src/app/Messenger/components/InputFile/inputFile.less +59 -59
  37. package/src/app/Messenger/components/MessageBallon/MessageBalloon.tsx +100 -100
  38. package/src/app/Messenger/components/MessengerAvatar/MessengerAvatar.tsx +29 -29
  39. package/src/app/Messenger/components/MessengerThemeWrapper/MessengerThemeWrapper.tsx +62 -62
  40. package/src/app/Messenger/components/RenderFileIcon/RenderFileIcon.tsx +40 -34
  41. package/src/app/Messenger/components/SearchInput/SearchInput.less +45 -45
  42. package/src/app/Messenger/components/SearchInput/SearchInput.tsx +77 -77
  43. package/src/app/Messenger/components/Select/Select.less +22 -22
  44. package/src/app/Messenger/components/Select/Select.tsx +56 -56
  45. package/src/app/Messenger/components/SendMessageForm/SendMessageForm.tsx +254 -234
  46. package/src/app/Messenger/components/SenderMessages/SenderMessages.tsx +91 -89
  47. package/src/app/Messenger/components/SystemMessage/SystemMessage.tsx +25 -25
  48. package/src/app/Messenger/components/TextArea/TextArea.tsx +35 -35
  49. package/src/app/Messenger/components/TextArea/Textarea.less +22 -22
  50. package/src/app/Messenger/components/Tooltip/Tooltip.less +27 -27
  51. package/src/app/Messenger/components/Tooltip/Tooltip.tsx +17 -17
  52. package/src/app/Messenger/hooks/useConversations.tsx +143 -143
  53. package/src/app/Messenger/hooks/useMessages.tsx +49 -49
  54. package/src/app/Messenger/hooks/useThemes.tsx +14 -14
  55. package/src/app/Messenger/icons/AttachFileIcon.tsx +20 -20
  56. package/src/app/Messenger/icons/CSVFileIcon.tsx +26 -0
  57. package/src/app/Messenger/icons/CloseIcon.tsx +20 -20
  58. package/src/app/Messenger/icons/DOCFileIcon.tsx +54 -54
  59. package/src/app/Messenger/icons/DownloadMinimalistIcon.tsx +37 -37
  60. package/src/app/Messenger/icons/EmptyIcon.tsx +20 -20
  61. package/src/app/Messenger/icons/MP4FileIcon.tsx +26 -0
  62. package/src/app/Messenger/icons/MessageIcon.tsx +27 -27
  63. package/src/app/Messenger/icons/PDFFileIcon.tsx +54 -54
  64. package/src/app/Messenger/icons/ReadIcon.tsx +18 -18
  65. package/src/app/Messenger/icons/SearchIcon.tsx +20 -20
  66. package/src/app/Messenger/icons/TimerIcon.tsx +18 -18
  67. package/src/app/Messenger/icons/TrashIcon.tsx +21 -21
  68. package/src/app/Messenger/views/Messenger.less +623 -623
  69. package/src/app/Messenger/views/MessengerList.tsx +170 -170
  70. package/src/app/Messenger/views/MessengerListItem.tsx +178 -178
  71. package/src/app/Messenger/views/MessengerMessages.tsx +414 -414
  72. package/src/app/Messenger/views/NewFormChat.tsx +145 -145
  73. package/src/app/i18n/index.ts +36 -36
  74. package/src/app/i18n/locales/en.json +64 -64
  75. package/src/app/i18n/locales/pt.json +64 -64
  76. package/src/assets/right-arrow.svg +9 -9
  77. package/src/index.ts +23 -23
  78. package/src/react-app-env.d.ts +19 -19
  79. package/src/setupTests.ts +5 -5
  80. package/src/styles/abstracts/animations.less +8 -8
  81. package/src/styles/abstracts/mixins.less +5 -5
  82. package/src/styles/abstracts/variables.less +31 -31
  83. package/src/styles/base/base.less +6 -6
  84. package/src/styles/index.less +5 -5
  85. package/src/types.ts +174 -174
  86. package/dist/agx-chat.min.js.map +0 -1
@@ -1,234 +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'
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
- if (
157
- file?.type?.includes('image/') ||
158
- file?.type?.includes('application/') ||
159
- file?.type === 'application/msword' ||
160
- file?.type ===
161
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
162
- ) {
163
- updateFile(e.target.files[0])
164
- }
165
- }
166
- }
167
-
168
- return (
169
- <form
170
- onSubmit={handleSubmit}
171
- className='messenger__messages-send--form'
172
- style={{
173
- height: `${formHeight}px`,
174
- maxHeight: '150px',
175
- }}
176
- >
177
- <div className='messenger__messages-send__input-container'>
178
- <textarea
179
- onChange={handleTextareaChange}
180
- placeholder={
181
- closedChat
182
- ? t('sendMessageForm.chatEnded')
183
- : t('sendMessageForm.typeMessage')
184
- }
185
- ref={inputRef}
186
- onKeyDown={(e) => {
187
- if (e.key === 'Enter' && !e.shiftKey) {
188
- e.preventDefault()
189
- handleSubmit()
190
- }
191
- }}
192
- className={`messenger__messages-send__input ${closedChat || sending ? 'messenger__messages-send__input--disabled' : ''} `}
193
- disabled={closedChat || sending}
194
- style={{
195
- backgroundColor: theme?.inputBg,
196
- }}
197
- />
198
-
199
- <AllowDocuments
200
- allowImages={allowImages}
201
- handleFile={handleFile}
202
- attachFile={attachFile}
203
- closedChat={closedChat}
204
- maxFileField={maxFileSize}
205
- />
206
- </div>
207
-
208
- {isLoading ? (
209
- <div className='messenger__messages-sending'>
210
- <SpinLoading />
211
- </div>
212
- ) : (
213
- <button
214
- type='submit'
215
- className={`messenger__messages-send__button ${closedChat || sending ? 'messenger__messages-send__button--disabled' : ''}`}
216
- disabled={closedChat || sending}
217
- style={{
218
- backgroundColor: theme?.buttonPrimary,
219
- }}
220
- >
221
- <img
222
- alt={t('sendMessageForm.rightIcon')}
223
- height={25}
224
- width={25}
225
- className='ml-1'
226
- src={rightArrow}
227
- />
228
- </button>
229
- )}
230
- </form>
231
- )
232
- }
233
-
234
- 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
@@ -1,89 +1,91 @@
1
- import useTheme from '../../hooks/useThemes'
2
- import React, { useCallback, useState } from 'react'
3
- import { IMessagesBalloon } from 'types'
4
- import ReadIcon from '../../icons/ReadIcon'
5
- import ReactSimpleImageViewer from 'react-simple-image-viewer'
6
- import { MessageImage } from '../IncomingMessage/IncomingMessage'
7
- import DocMessage from '../DocMessage/DocMessage'
8
-
9
- function SenderMessages ({
10
- date,
11
- message,
12
- read,
13
- hasFile,
14
- file,
15
- formatDate,
16
- id,
17
- }: IMessagesBalloon) {
18
- const [currentImage, setCurrentImage] = useState(0)
19
- const [isViewerOpen, setIsViewerOpen] = useState(false)
20
- const { theme } = useTheme()
21
-
22
- const openImageViewer = useCallback((index: number) => {
23
- setCurrentImage(index)
24
- setIsViewerOpen(true)
25
- }, [])
26
-
27
- const closeImageViewer = () => {
28
- setCurrentImage(0)
29
- setIsViewerOpen(false)
30
- }
31
-
32
- const isDoc =
33
- file?.mimetype === 'application/msword' ||
34
- file?.mimetype ===
35
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ||
36
- file?.mimetype === 'application/pdf'
37
-
38
- return (
39
- <div className='messenger__messages-row--sender'>
40
- <div
41
- className='messenger__messages-sender'
42
- id={id}
43
- style={{
44
- background: theme?.messengerSenderColor,
45
- color: theme?.documentMessagesTextColor,
46
- }}
47
- >
48
- <span>
49
- {hasFile &&
50
- (isDoc ? (
51
- <DocMessage
52
- date={date}
53
- message={message}
54
- read={read}
55
- file={file}
56
- formatDate={formatDate}
57
- id={id}
58
- />
59
- ) : (
60
- <MessageImage
61
- src={file?.location}
62
- onClick={() => openImageViewer(currentImage)}
63
- />
64
- ))}
65
-
66
- <p className='messenger__message'>{message}</p>
67
- <div className='messenger__message--bottom'>
68
- <p className='messenger__message--date'>
69
- {formatDate(date) ?? new Date(date).toString()}
70
- </p>
71
- <ReadIcon fill={read ? '#00efff' : 'white'} />
72
- </div>
73
- </span>
74
- </div>
75
-
76
- {file && !isDoc && isViewerOpen && (
77
- <ReactSimpleImageViewer
78
- src={[file.location]}
79
- currentIndex={0}
80
- disableScroll={false}
81
- closeOnClickOutside={true}
82
- onClose={closeImageViewer}
83
- />
84
- )}
85
- </div>
86
- )
87
- }
88
-
89
- export default SenderMessages
1
+ import useTheme from '../../hooks/useThemes'
2
+ import React, { useCallback, useState } from 'react'
3
+ import { IMessagesBalloon } from 'types'
4
+ import ReadIcon from '../../icons/ReadIcon'
5
+ import ReactSimpleImageViewer from 'react-simple-image-viewer'
6
+ import { MessageImage } from '../IncomingMessage/IncomingMessage'
7
+ import DocMessage from '../DocMessage/DocMessage'
8
+
9
+ function SenderMessages ({
10
+ date,
11
+ message,
12
+ read,
13
+ hasFile,
14
+ file,
15
+ formatDate,
16
+ id,
17
+ }: IMessagesBalloon) {
18
+ const [currentImage, setCurrentImage] = useState(0)
19
+ const [isViewerOpen, setIsViewerOpen] = useState(false)
20
+ const { theme } = useTheme()
21
+
22
+ const openImageViewer = useCallback((index: number) => {
23
+ setCurrentImage(index)
24
+ setIsViewerOpen(true)
25
+ }, [])
26
+
27
+ const closeImageViewer = () => {
28
+ setCurrentImage(0)
29
+ setIsViewerOpen(false)
30
+ }
31
+
32
+ const isDoc = [
33
+ 'application/msword',
34
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
35
+ 'application/pdf',
36
+ 'text/csv',
37
+ 'video/mp4',
38
+ ].includes(file?.mimetype ?? '')
39
+
40
+ return (
41
+ <div className='messenger__messages-row--sender'>
42
+ <div
43
+ className='messenger__messages-sender'
44
+ id={id}
45
+ style={{
46
+ background: theme?.messengerSenderColor,
47
+ color: theme?.documentMessagesTextColor,
48
+ }}
49
+ >
50
+ <span>
51
+ {hasFile &&
52
+ (isDoc ? (
53
+ <DocMessage
54
+ date={date}
55
+ message={message}
56
+ read={read}
57
+ file={file}
58
+ formatDate={formatDate}
59
+ id={id}
60
+ />
61
+ ) : (
62
+ <MessageImage
63
+ src={file?.location}
64
+ onClick={() => openImageViewer(currentImage)}
65
+ />
66
+ ))}
67
+
68
+ <p className='messenger__message'>{message}</p>
69
+ <div className='messenger__message--bottom'>
70
+ <p className='messenger__message--date'>
71
+ {formatDate(date) ?? new Date(date).toString()}
72
+ </p>
73
+ <ReadIcon fill={read ? '#00efff' : 'white'} />
74
+ </div>
75
+ </span>
76
+ </div>
77
+
78
+ {file && !isDoc && isViewerOpen && (
79
+ <ReactSimpleImageViewer
80
+ src={[file.location]}
81
+ currentIndex={0}
82
+ disableScroll={false}
83
+ closeOnClickOutside={true}
84
+ onClose={closeImageViewer}
85
+ />
86
+ )}
87
+ </div>
88
+ )
89
+ }
90
+
91
+ export default SenderMessages