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,145 +1,147 @@
1
- import TrashIcon from '../../icons/TrashIcon'
2
- import React, { useMemo } from 'react'
3
- import useTheme from '../../hooks/useThemes'
4
- import { useTranslation } from 'react-i18next'
5
-
6
- interface IProps {
7
- fileList: File[]
8
- onUpdateFile: (files: File) => void
9
- label: string
10
- onRemoveFile: (files: File) => void
11
- maxSize: string
12
- loading: boolean
13
- }
14
-
15
- function InputFile ({
16
- fileList,
17
- onUpdateFile,
18
- label,
19
- onRemoveFile,
20
- maxSize,
21
- loading,
22
- }: IProps) {
23
- const { theme } = useTheme()
24
- const { t } = useTranslation('newFormChat')
25
-
26
- const validateFileType = useMemo(
27
- () => (allowedTypes: string[], file?: File) => {
28
- if (file?.type) {
29
- return allowedTypes.includes(file.type)
30
- }
31
- const extension = file?.name.split('.').pop()?.toLowerCase()
32
- return extension ? allowedTypes.includes(`.${extension}`) : false
33
- },
34
- []
35
- )
36
-
37
- const onUpload = () => {
38
- const input = document.querySelector('.file-input__input') as HTMLElement
39
- input?.click()
40
- }
41
-
42
- const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
43
- const file = e?.target?.files?.[0]
44
-
45
- const isAllowedType = validateFileType(
46
- [
47
- 'image/png',
48
- 'image/jpeg',
49
- 'application/pdf',
50
- 'application/msword',
51
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
52
- ],
53
- file
54
- )
55
- if (!isAllowedType) {
56
- console.error(t('inputFile.documentSendError'))
57
- return false
58
- }
59
-
60
- if (file) onUpdateFile(file)
61
- return true
62
- }
63
-
64
- const removeItem = (file: File) => {
65
- if (fileList.some((item) => item === file)) {
66
- onRemoveFile(file)
67
- }
68
- }
69
-
70
- return (
71
- <>
72
- <div className='file-input'>
73
- <label
74
- style={{ color: theme.newChatFormTexts }}
75
- htmlFor=''
76
- className='file-input__label'
77
- >
78
- {label}
79
- </label>
80
- <div
81
- className='file-input__container'
82
- style={{
83
- backgroundColor: theme.inputBg,
84
- color: theme.newChatFormTexts,
85
- }}
86
- >
87
- <input
88
- className='file-input__input'
89
- type='file'
90
- id='docpicker'
91
- hidden
92
- accept='.jpg, .jpeg, .png, .pdf, .doc, .docx'
93
- onChange={(event) => onChange(event)}
94
- />
95
-
96
- <h4>{t('inputFile.chooseFile')}</h4>
97
- <button
98
- className='file-input__button'
99
- type='button'
100
- onClick={onUpload}
101
- style={{
102
- background: theme?.buttonPrimary,
103
- color: theme?.buttonPrimaryText,
104
- }}
105
- >
106
- {t('inputFile.chooseFile')}
107
- </button>
108
-
109
- {loading ? (
110
- ''
111
- ) : (
112
- <p>
113
- {t('inputFile.allowDocuments')}(
114
- {t('inputFile.allowSizeDocument', { maxSize })})
115
- </p>
116
- )}
117
- </div>
118
- </div>
119
-
120
- <div>
121
- {fileList &&
122
- fileList.map((item) => (
123
- <div
124
- className='file-input__list'
125
- key={item.name}
126
- style={{
127
- backgroundColor: theme.inputBg,
128
- color: theme.newChatFormTexts,
129
- }}
130
- >
131
- <span className='file-input__list--file-name'>{item.name}</span>
132
- <button
133
- className='file-input__delete'
134
- onClick={() => removeItem(item)}
135
- >
136
- <TrashIcon color={theme.newChatFormDeleteFileButton || 'red'} />
137
- </button>
138
- </div>
139
- ))}
140
- </div>
141
- </>
142
- )
143
- }
144
-
145
- export default InputFile
1
+ import TrashIcon from '../../icons/TrashIcon'
2
+ import React, { useMemo } from 'react'
3
+ import useTheme from '../../hooks/useThemes'
4
+ import { useTranslation } from 'react-i18next'
5
+
6
+ interface IProps {
7
+ fileList: File[]
8
+ onUpdateFile: (files: File) => void
9
+ label: string
10
+ onRemoveFile: (files: File) => void
11
+ maxSize: string
12
+ loading: boolean
13
+ }
14
+
15
+ function InputFile ({
16
+ fileList,
17
+ onUpdateFile,
18
+ label,
19
+ onRemoveFile,
20
+ maxSize,
21
+ loading,
22
+ }: IProps) {
23
+ const { theme } = useTheme()
24
+ const { t } = useTranslation('newFormChat')
25
+
26
+ const validateFileType = useMemo(
27
+ () => (allowedTypes: string[], file?: File) => {
28
+ if (file?.type) {
29
+ return allowedTypes.includes(file.type)
30
+ }
31
+ const extension = file?.name.split('.').pop()?.toLowerCase()
32
+ return extension ? allowedTypes.includes(`.${extension}`) : false
33
+ },
34
+ []
35
+ )
36
+
37
+ const onUpload = () => {
38
+ const input = document.querySelector('.file-input__input') as HTMLElement
39
+ input?.click()
40
+ }
41
+
42
+ const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
43
+ const file = e?.target?.files?.[0]
44
+
45
+ const isAllowedType = validateFileType(
46
+ [
47
+ 'image/png',
48
+ 'image/jpeg',
49
+ 'application/pdf',
50
+ 'application/msword',
51
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
52
+ 'text/csv',
53
+ 'video/mp4',
54
+ ],
55
+ file
56
+ )
57
+ if (!isAllowedType) {
58
+ console.error(t('inputFile.documentSendError'))
59
+ return false
60
+ }
61
+
62
+ if (file) onUpdateFile(file)
63
+ return true
64
+ }
65
+
66
+ const removeItem = (file: File) => {
67
+ if (fileList.some((item) => item === file)) {
68
+ onRemoveFile(file)
69
+ }
70
+ }
71
+
72
+ return (
73
+ <>
74
+ <div className='file-input'>
75
+ <label
76
+ style={{ color: theme.newChatFormTexts }}
77
+ htmlFor=''
78
+ className='file-input__label'
79
+ >
80
+ {label}
81
+ </label>
82
+ <div
83
+ className='file-input__container'
84
+ style={{
85
+ backgroundColor: theme.inputBg,
86
+ color: theme.newChatFormTexts,
87
+ }}
88
+ >
89
+ <input
90
+ className='file-input__input'
91
+ type='file'
92
+ id='docpicker'
93
+ hidden
94
+ accept='.jpg, .jpeg, .png, .pdf, .doc, .docx, .csv, .mp4'
95
+ onChange={(event) => onChange(event)}
96
+ />
97
+
98
+ <h4>{t('inputFile.chooseFile')}</h4>
99
+ <button
100
+ className='file-input__button'
101
+ type='button'
102
+ onClick={onUpload}
103
+ style={{
104
+ background: theme?.buttonPrimary,
105
+ color: theme?.buttonPrimaryText,
106
+ }}
107
+ >
108
+ {t('inputFile.chooseFile')}
109
+ </button>
110
+
111
+ {loading ? (
112
+ ''
113
+ ) : (
114
+ <p>
115
+ {t('inputFile.allowDocuments')}(
116
+ {t('inputFile.allowSizeDocument', { maxSize })})
117
+ </p>
118
+ )}
119
+ </div>
120
+ </div>
121
+
122
+ <div>
123
+ {fileList &&
124
+ fileList.map((item) => (
125
+ <div
126
+ className='file-input__list'
127
+ key={item.name}
128
+ style={{
129
+ backgroundColor: theme.inputBg,
130
+ color: theme.newChatFormTexts,
131
+ }}
132
+ >
133
+ <span className='file-input__list--file-name'>{item.name}</span>
134
+ <button
135
+ className='file-input__delete'
136
+ onClick={() => removeItem(item)}
137
+ >
138
+ <TrashIcon color={theme.newChatFormDeleteFileButton || 'red'} />
139
+ </button>
140
+ </div>
141
+ ))}
142
+ </div>
143
+ </>
144
+ )
145
+ }
146
+
147
+ export default InputFile
@@ -1,59 +1,59 @@
1
- .file-input {
2
- margin-bottom: 1rem;
3
- width: 100%;
4
-
5
- &__label {
6
- color: @title-form-color;
7
- font-weight: bold;
8
- margin: 0.5rem;
9
- }
10
-
11
- &__container {
12
- align-items: center;
13
- background-color: var(--secondary-color);
14
- border-radius: 10px;
15
- display: flex;
16
- flex-direction: column;
17
- justify-content: center;
18
- margin-top: 0.5rem;
19
- padding: 1rem;
20
- width: 100%;
21
- }
22
-
23
- &__button {
24
- border: none;
25
- border-radius: 30px;
26
- color: var(--secondary-color);
27
- cursor: pointer;
28
- font-size: 1rem;
29
- font-weight: bold;
30
- margin: 0.5rem 1rem;
31
- padding: 0.5rem;
32
- }
33
-
34
- &__list {
35
- align-items: center;
36
- background-color: var(--secondary-color);
37
- border-radius: 10px;
38
- display: flex;
39
- justify-content: space-between;
40
- margin: 0.5rem 0;
41
- padding: 0.5rem;
42
-
43
- &--file-name {
44
- overflow: hidden;
45
- text-overflow: ellipsis;
46
- white-space: nowrap;
47
- max-width: 100%;
48
- }
49
- }
50
-
51
- &__delete {
52
- align-items: center;
53
- background: transparent;
54
- border: none;
55
- cursor: pointer;
56
- display: flex;
57
- justify-content: center;
58
- }
59
- }
1
+ .file-input {
2
+ margin-bottom: 1rem;
3
+ width: 100%;
4
+
5
+ &__label {
6
+ color: @title-form-color;
7
+ font-weight: bold;
8
+ margin: 0.5rem;
9
+ }
10
+
11
+ &__container {
12
+ align-items: center;
13
+ background-color: var(--secondary-color);
14
+ border-radius: 10px;
15
+ display: flex;
16
+ flex-direction: column;
17
+ justify-content: center;
18
+ margin-top: 0.5rem;
19
+ padding: 1rem;
20
+ width: 100%;
21
+ }
22
+
23
+ &__button {
24
+ border: none;
25
+ border-radius: 30px;
26
+ color: var(--secondary-color);
27
+ cursor: pointer;
28
+ font-size: 1rem;
29
+ font-weight: bold;
30
+ margin: 0.5rem 1rem;
31
+ padding: 0.5rem;
32
+ }
33
+
34
+ &__list {
35
+ align-items: center;
36
+ background-color: var(--secondary-color);
37
+ border-radius: 10px;
38
+ display: flex;
39
+ justify-content: space-between;
40
+ margin: 0.5rem 0;
41
+ padding: 0.5rem;
42
+
43
+ &--file-name {
44
+ overflow: hidden;
45
+ text-overflow: ellipsis;
46
+ white-space: nowrap;
47
+ max-width: 100%;
48
+ }
49
+ }
50
+
51
+ &__delete {
52
+ align-items: center;
53
+ background: transparent;
54
+ border: none;
55
+ cursor: pointer;
56
+ display: flex;
57
+ justify-content: center;
58
+ }
59
+ }
@@ -1,100 +1,100 @@
1
- import React from 'react'
2
- import { Iimages, IMessages } from 'types'
3
- import IncomingMessage from '../IncomingMessage/IncomingMessage'
4
- import SenderMessages from '../SenderMessages/SenderMessages'
5
- import SystemMessage from '../SystemMessage/SystemMessage'
6
-
7
- function MessageBalloon ({
8
- item,
9
- creatorId,
10
- formatDate,
11
- id,
12
- }: {
13
- item: IMessages
14
- creatorId?: string
15
- formatDate: (date: string | Date) => string | undefined
16
- id: string
17
- }) {
18
- if (item.isSystemMessage) {
19
- return (
20
- <SystemMessage
21
- formatDate={formatDate}
22
- date={item.createdAt}
23
- message={item.content}
24
- id={item.senderId}
25
- user={{ name: 'System' }}
26
- />
27
- )
28
- }
29
-
30
- if (
31
- item.sender.uniqueCode &&
32
- !item.isSystemMessage &&
33
- item.sender.uniqueCode === creatorId
34
- ) {
35
- return (
36
- <>
37
- <SenderMessages
38
- id={id}
39
- formatDate={formatDate}
40
- message={item.content}
41
- date={item.createdAt}
42
- read={item.everybodyHasRead}
43
- hasFile={item.hasFile}
44
- file={item.file}
45
- />
46
-
47
- {item.images &&
48
- item.images.map((image: Iimages, index: number) => (
49
- <SenderMessages
50
- key={image.key}
51
- id={`${id}image-${index}`}
52
- formatDate={formatDate}
53
- date={item.createdAt}
54
- file={image}
55
- message=''
56
- hasFile={true}
57
- read={item.everybodyHasRead}
58
- />
59
- ))}
60
- </>
61
- )
62
- }
63
-
64
- return (
65
- <>
66
- <IncomingMessage
67
- id={id}
68
- formatDate={formatDate}
69
- date={item.createdAt}
70
- message={item.content}
71
- hasFile={item.hasFile}
72
- isSystemMessage={item.isSystemMessage}
73
- file={item.file}
74
- user={{
75
- avatar: item.sender?.image,
76
- name: item.sender.username,
77
- }}
78
- />
79
-
80
- {item.images &&
81
- item.images.map((image: Iimages, index: number) => (
82
- <IncomingMessage
83
- key={image.key}
84
- id={`${id}image-${index}`}
85
- formatDate={formatDate}
86
- date={item.createdAt}
87
- file={image}
88
- message=''
89
- hasFile={true}
90
- user={{
91
- avatar: item.sender?.image,
92
- name: item.sender.username,
93
- }}
94
- />
95
- ))}
96
- </>
97
- )
98
- }
99
-
100
- export default MessageBalloon
1
+ import React from 'react'
2
+ import { Iimages, IMessages } from 'types'
3
+ import IncomingMessage from '../IncomingMessage/IncomingMessage'
4
+ import SenderMessages from '../SenderMessages/SenderMessages'
5
+ import SystemMessage from '../SystemMessage/SystemMessage'
6
+
7
+ function MessageBalloon ({
8
+ item,
9
+ creatorId,
10
+ formatDate,
11
+ id,
12
+ }: {
13
+ item: IMessages
14
+ creatorId?: string
15
+ formatDate: (date: string | Date) => string | undefined
16
+ id: string
17
+ }) {
18
+ if (item.isSystemMessage) {
19
+ return (
20
+ <SystemMessage
21
+ formatDate={formatDate}
22
+ date={item.createdAt}
23
+ message={item.content}
24
+ id={item.senderId}
25
+ user={{ name: 'System' }}
26
+ />
27
+ )
28
+ }
29
+
30
+ if (
31
+ item.sender.uniqueCode &&
32
+ !item.isSystemMessage &&
33
+ item.sender.uniqueCode === creatorId
34
+ ) {
35
+ return (
36
+ <>
37
+ <SenderMessages
38
+ id={id}
39
+ formatDate={formatDate}
40
+ message={item.content}
41
+ date={item.createdAt}
42
+ read={item.everybodyHasRead}
43
+ hasFile={item.hasFile}
44
+ file={item.file}
45
+ />
46
+
47
+ {item.images &&
48
+ item.images.map((image: Iimages, index: number) => (
49
+ <SenderMessages
50
+ key={image.key}
51
+ id={`${id}image-${index}`}
52
+ formatDate={formatDate}
53
+ date={item.createdAt}
54
+ file={image}
55
+ message=''
56
+ hasFile={true}
57
+ read={item.everybodyHasRead}
58
+ />
59
+ ))}
60
+ </>
61
+ )
62
+ }
63
+
64
+ return (
65
+ <>
66
+ <IncomingMessage
67
+ id={id}
68
+ formatDate={formatDate}
69
+ date={item.createdAt}
70
+ message={item.content}
71
+ hasFile={item.hasFile}
72
+ isSystemMessage={item.isSystemMessage}
73
+ file={item.file}
74
+ user={{
75
+ avatar: item.sender?.image,
76
+ name: item.sender.username,
77
+ }}
78
+ />
79
+
80
+ {item.images &&
81
+ item.images.map((image: Iimages, index: number) => (
82
+ <IncomingMessage
83
+ key={image.key}
84
+ id={`${id}image-${index}`}
85
+ formatDate={formatDate}
86
+ date={item.createdAt}
87
+ file={image}
88
+ message=''
89
+ hasFile={true}
90
+ user={{
91
+ avatar: item.sender?.image,
92
+ name: item.sender.username,
93
+ }}
94
+ />
95
+ ))}
96
+ </>
97
+ )
98
+ }
99
+
100
+ export default MessageBalloon
@@ -1,29 +1,29 @@
1
- import useTheme from '../../hooks/useThemes'
2
- import React from 'react'
3
- import { useTranslation } from 'react-i18next'
4
- import { IMesssengerAvatar } from 'types'
5
-
6
- function MessengerAvatar ({
7
- image,
8
- children,
9
- className = '',
10
- }: IMesssengerAvatar) {
11
- const { t } = useTranslation('messengerList')
12
- const { theme } = useTheme()
13
- return (
14
- <figure
15
- className={`${className} messenger__aside-list-item--avatar`}
16
- style={{
17
- background: theme.messengerIncomerColor,
18
- }}
19
- >
20
- {image ? (
21
- <img loading='lazy' alt={t('messengerAvatar.alt')} src={image} />
22
- ) : (
23
- children
24
- )}
25
- </figure>
26
- )
27
- }
28
-
29
- export default MessengerAvatar
1
+ import useTheme from '../../hooks/useThemes'
2
+ import React from 'react'
3
+ import { useTranslation } from 'react-i18next'
4
+ import { IMesssengerAvatar } from 'types'
5
+
6
+ function MessengerAvatar ({
7
+ image,
8
+ children,
9
+ className = '',
10
+ }: IMesssengerAvatar) {
11
+ const { t } = useTranslation('messengerList')
12
+ const { theme } = useTheme()
13
+ return (
14
+ <figure
15
+ className={`${className} messenger__aside-list-item--avatar`}
16
+ style={{
17
+ background: theme.messengerIncomerColor,
18
+ }}
19
+ >
20
+ {image ? (
21
+ <img loading='lazy' alt={t('messengerAvatar.alt')} src={image} />
22
+ ) : (
23
+ children
24
+ )}
25
+ </figure>
26
+ )
27
+ }
28
+
29
+ export default MessengerAvatar