@webinex/chatify 2.0.1-alpha1 → 2.0.1-alpha2

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 (231) hide show
  1. package/dist/css/chatify.css +111 -12
  2. package/dist/esm/index.js +2 -2
  3. package/dist/esm/index.js.map +1 -1
  4. package/dist/esm/types/core/api/api.d.ts +10784 -232
  5. package/dist/esm/types/core/api/baseApi.d.ts +1 -1
  6. package/dist/esm/types/ui/Conversation/Conversation.d.ts +2 -0
  7. package/dist/esm/types/ui/Conversation/ConversationContext.d.ts +2 -0
  8. package/dist/esm/types/ui/Conversation/InputBox/InputBoxFile.d.ts +7 -0
  9. package/dist/esm/types/ui/Conversation/InputBox/InputBoxFileList.d.ts +7 -0
  10. package/dist/esm/types/ui/Conversation/InputBox/InputFilesBox.d.ts +10 -1
  11. package/dist/esm/types/ui/Conversation/InputBox/InputSubmitButtonBox.d.ts +1 -0
  12. package/dist/esm/types/ui/Conversation/InputBox/index.d.ts +8 -1
  13. package/dist/esm/types/ui/Conversation/Message/MessageFile.d.ts +6 -0
  14. package/dist/esm/types/ui/Conversation/Message/MessageFileList.d.ts +3 -0
  15. package/dist/esm/types/ui/Conversation/Message/index.d.ts +6 -0
  16. package/dist/esm/types/ui/common/Icon.d.ts +2 -0
  17. package/dist/esm/types/ui/customize.d.ts +2 -2
  18. package/dist/esm/types/ui/localizer.d.ts +5 -0
  19. package/dist/esm/types/ui/useFormatter.d.ts +3 -0
  20. package/dist/index.d.ts +10830 -239
  21. package/package.json +94 -93
  22. package/src/core/api/api.ts +643 -642
  23. package/src/core/api/baseApi.ts +38 -38
  24. package/src/core/api/index.ts +1 -1
  25. package/src/core/client.ts +280 -280
  26. package/src/core/constants.ts +1 -1
  27. package/src/core/debounce.ts +90 -90
  28. package/src/core/index.ts +4 -4
  29. package/src/core/types.tsx +152 -152
  30. package/src/index.ts +2 -2
  31. package/src/styles/aside.scss +162 -161
  32. package/src/styles/chat.scss +209 -208
  33. package/src/styles/index.scss +153 -110
  34. package/src/styles/input.scss +147 -74
  35. package/src/styles/keyframes.scss +14 -14
  36. package/src/styles/members.scss +13 -13
  37. package/src/styles/mixins.scss +25 -20
  38. package/src/styles/variables.scss +13 -10
  39. package/src/ui/Chat/ChatContext.tsx +30 -30
  40. package/src/ui/Chat/ChatEditableHeaderName.tsx +63 -63
  41. package/src/ui/Chat/ChatHeaderActions.tsx +19 -19
  42. package/src/ui/Chat/ChatPanel.tsx +30 -30
  43. package/src/ui/Chat/ChatView.tsx +115 -115
  44. package/src/ui/Chat/Members/ChatMembersButton.tsx +9 -9
  45. package/src/ui/Chat/Members/ChatMembersPanel.tsx +112 -112
  46. package/src/ui/Chat/Members/ChatMembersPreview.tsx +25 -25
  47. package/src/ui/Chat/Members/index.ts +13 -13
  48. package/src/ui/Chat/index.ts +6 -6
  49. package/src/ui/ChatGroup/ChatGroupContext.tsx +50 -50
  50. package/src/ui/ChatGroup/ChatGroupPanel.tsx +73 -73
  51. package/src/ui/ChatGroup/Create/CreateChatButton.tsx +15 -15
  52. package/src/ui/ChatGroup/Create/CreateChatForm.tsx +36 -36
  53. package/src/ui/ChatGroup/Create/CreateChatMemberInput.tsx +65 -65
  54. package/src/ui/ChatGroup/Create/CreateChatNameInput.tsx +25 -25
  55. package/src/ui/ChatGroup/Create/CreateChatPanel.tsx +45 -45
  56. package/src/ui/ChatGroup/Create/index.ts +19 -19
  57. package/src/ui/ChatGroup/Layout/ChatGroupAside.tsx +12 -12
  58. package/src/ui/ChatGroup/Layout/ChatGroupBody.tsx +10 -10
  59. package/src/ui/ChatGroup/Layout/ChatGroupFooter.tsx +3 -3
  60. package/src/ui/ChatGroup/Layout/ChatGroupHeader.tsx +5 -5
  61. package/src/ui/ChatGroup/Layout/ChatGroupMain.tsx +17 -17
  62. package/src/ui/ChatGroup/Layout/index.ts +19 -19
  63. package/src/ui/ChatGroup/List/ChatList.tsx +41 -41
  64. package/src/ui/ChatGroup/List/ChatListItemAvatar.tsx +22 -22
  65. package/src/ui/ChatGroup/List/ChatListItemBox.tsx +26 -26
  66. package/src/ui/ChatGroup/List/ChatListItemLastMessage.tsx +15 -15
  67. package/src/ui/ChatGroup/List/ChatListItemLastMessageAuthor.tsx +15 -15
  68. package/src/ui/ChatGroup/List/ChatListItemLastMessageContent.tsx +21 -21
  69. package/src/ui/ChatGroup/List/ChatListItemLastMessageSentAt.tsx +22 -22
  70. package/src/ui/ChatGroup/List/ChatListItemName.tsx +8 -8
  71. package/src/ui/ChatGroup/List/ChatListItemUnreadCount.tsx +12 -12
  72. package/src/ui/ChatGroup/List/index.ts +31 -31
  73. package/src/ui/ChatGroup/index.ts +5 -5
  74. package/src/ui/Chatify.tsx +9 -9
  75. package/src/ui/Conversation/Conversation.tsx +78 -76
  76. package/src/ui/Conversation/ConversationActions.tsx +5 -5
  77. package/src/ui/Conversation/ConversationBody.tsx +28 -28
  78. package/src/ui/Conversation/ConversationContext.ts +29 -27
  79. package/src/ui/Conversation/ConversationHeader.tsx +23 -23
  80. package/src/ui/Conversation/ConversationName.tsx +7 -7
  81. package/src/ui/Conversation/InputBox/InputBox.tsx +104 -40
  82. package/src/ui/Conversation/InputBox/InputBoxFile.tsx +36 -0
  83. package/src/ui/Conversation/InputBox/InputBoxFileList.tsx +19 -0
  84. package/src/ui/Conversation/InputBox/InputFilesBox.tsx +75 -9
  85. package/src/ui/Conversation/InputBox/InputSubmitButtonBox.tsx +24 -17
  86. package/src/ui/Conversation/InputBox/InputTextBox.tsx +53 -53
  87. package/src/ui/Conversation/InputBox/index.ts +23 -16
  88. package/src/ui/Conversation/Message/MessageAuthor.tsx +13 -13
  89. package/src/ui/Conversation/Message/MessageBox.tsx +20 -20
  90. package/src/ui/Conversation/Message/MessageContent.tsx +15 -11
  91. package/src/ui/Conversation/Message/MessageFile.tsx +36 -0
  92. package/src/ui/Conversation/Message/MessageFileList.tsx +14 -0
  93. package/src/ui/Conversation/Message/MessageInfoBox.tsx +28 -28
  94. package/src/ui/Conversation/Message/MessageRow.tsx +28 -28
  95. package/src/ui/Conversation/Message/MessageText.tsx +7 -7
  96. package/src/ui/Conversation/Message/index.ts +28 -22
  97. package/src/ui/Conversation/NextObserver/NextMessagesObserver.tsx +47 -47
  98. package/src/ui/Conversation/NextObserver/index.ts +1 -1
  99. package/src/ui/Conversation/ReadObserver/MessageReadObserver.tsx +49 -49
  100. package/src/ui/Conversation/ReadObserver/index.ts +1 -1
  101. package/src/ui/Conversation/SendingMessage/SendingMessageBox.tsx +16 -16
  102. package/src/ui/Conversation/SendingMessage/SendingMessageContent.tsx +13 -13
  103. package/src/ui/Conversation/SendingMessage/SendingMessageInfoBox.tsx +13 -13
  104. package/src/ui/Conversation/SendingMessage/SendingMessageText.tsx +7 -7
  105. package/src/ui/Conversation/SendingMessage/index.ts +16 -16
  106. package/src/ui/Conversation/SystemMessage/SystemMessageBox.tsx +20 -20
  107. package/src/ui/Conversation/SystemMessage/SystemMessageRow.tsx +28 -28
  108. package/src/ui/Conversation/SystemMessage/index.ts +10 -10
  109. package/src/ui/Conversation/index.ts +13 -13
  110. package/src/ui/Thread/ThreadActions.tsx +22 -22
  111. package/src/ui/Thread/ThreadContext.ts +13 -13
  112. package/src/ui/Thread/ThreadPanel.tsx +127 -127
  113. package/src/ui/Thread/index.tsx +3 -3
  114. package/src/ui/color.ts +20 -20
  115. package/src/ui/common/Avatar.tsx +20 -20
  116. package/src/ui/common/Icon.tsx +44 -40
  117. package/src/ui/common/MessageSkeleton.tsx +20 -20
  118. package/src/ui/common/index.ts +13 -13
  119. package/src/ui/customize.tsx +51 -53
  120. package/src/ui/index.ts +11 -11
  121. package/src/ui/localizer.tsx +96 -81
  122. package/src/ui/useFormatter.tsx +17 -0
  123. package/dist/esm/types/core/api/accountApi.d.ts +0 -5
  124. package/dist/esm/types/core/api/chatApi.d.ts +0 -16
  125. package/dist/esm/types/core/api/chatListApi.d.ts +0 -5
  126. package/dist/esm/types/core/api/chatMemberApi.d.ts +0 -6
  127. package/dist/esm/types/core/api/chatMessageApi.d.ts +0 -3
  128. package/dist/esm/types/core/api/threadApi.d.ts +0 -1
  129. package/dist/esm/types/core/api/threadMessageApi.d.ts +0 -6
  130. package/src/core/api/accountApi.ts +0 -11
  131. package/src/core/api/chatApi.ts +0 -87
  132. package/src/core/api/chatListApi.ts +0 -134
  133. package/src/core/api/chatMemberApi.ts +0 -20
  134. package/src/core/api/chatMessageApi.ts +0 -12
  135. package/src/core/api/threadApi.ts +0 -8
  136. package/src/core/api/threadMessageApi.ts +0 -20
  137. package/src/types/core/api/accountApi.d.ts +0 -5
  138. package/src/types/core/api/api.d.ts +0 -2380
  139. package/src/types/core/api/baseApi.d.ts +0 -15
  140. package/src/types/core/api/chatApi.d.ts +0 -16
  141. package/src/types/core/api/chatListApi.d.ts +0 -5
  142. package/src/types/core/api/chatMemberApi.d.ts +0 -6
  143. package/src/types/core/api/chatMessageApi.d.ts +0 -3
  144. package/src/types/core/api/index.d.ts +0 -1
  145. package/src/types/core/api/threadApi.d.ts +0 -1
  146. package/src/types/core/api/threadMessageApi.d.ts +0 -6
  147. package/src/types/core/client.d.ts +0 -83
  148. package/src/types/core/constants.d.ts +0 -1
  149. package/src/types/core/debounce.d.ts +0 -27
  150. package/src/types/core/index.d.ts +0 -4
  151. package/src/types/core/types.d.ts +0 -105
  152. package/src/types/index.d.ts +0 -2
  153. package/src/types/ui/Chat/ChatContext.d.ts +0 -10
  154. package/src/types/ui/Chat/ChatEditableHeaderName.d.ts +0 -2
  155. package/src/types/ui/Chat/ChatHeaderActions.d.ts +0 -2
  156. package/src/types/ui/Chat/ChatPanel.d.ts +0 -13
  157. package/src/types/ui/Chat/ChatView.d.ts +0 -17
  158. package/src/types/ui/Chat/Members/ChatMembersButton.d.ts +0 -2
  159. package/src/types/ui/Chat/Members/ChatMembersPanel.d.ts +0 -2
  160. package/src/types/ui/Chat/Members/ChatMembersPreview.d.ts +0 -2
  161. package/src/types/ui/Chat/Members/index.d.ts +0 -11
  162. package/src/types/ui/Chat/index.d.ts +0 -6
  163. package/src/types/ui/ChatGroup/ChatGroupContext.d.ts +0 -12
  164. package/src/types/ui/ChatGroup/ChatGroupPanel.d.ts +0 -15
  165. package/src/types/ui/ChatGroup/Create/CreateChatButton.d.ts +0 -2
  166. package/src/types/ui/ChatGroup/Create/CreateChatForm.d.ts +0 -11
  167. package/src/types/ui/ChatGroup/Create/CreateChatMemberInput.d.ts +0 -5
  168. package/src/types/ui/ChatGroup/Create/CreateChatNameInput.d.ts +0 -5
  169. package/src/types/ui/ChatGroup/Create/CreateChatPanel.d.ts +0 -2
  170. package/src/types/ui/ChatGroup/Create/index.d.ts +0 -17
  171. package/src/types/ui/ChatGroup/Layout/ChatGroupAside.d.ts +0 -2
  172. package/src/types/ui/ChatGroup/Layout/ChatGroupBody.d.ts +0 -2
  173. package/src/types/ui/ChatGroup/Layout/ChatGroupFooter.d.ts +0 -2
  174. package/src/types/ui/ChatGroup/Layout/ChatGroupHeader.d.ts +0 -2
  175. package/src/types/ui/ChatGroup/Layout/ChatGroupMain.d.ts +0 -2
  176. package/src/types/ui/ChatGroup/Layout/index.d.ts +0 -17
  177. package/src/types/ui/ChatGroup/List/ChatList.d.ts +0 -2
  178. package/src/types/ui/ChatGroup/List/ChatListItemAvatar.d.ts +0 -3
  179. package/src/types/ui/ChatGroup/List/ChatListItemBox.d.ts +0 -6
  180. package/src/types/ui/ChatGroup/List/ChatListItemLastMessage.d.ts +0 -3
  181. package/src/types/ui/ChatGroup/List/ChatListItemLastMessageAuthor.d.ts +0 -3
  182. package/src/types/ui/ChatGroup/List/ChatListItemLastMessageContent.d.ts +0 -3
  183. package/src/types/ui/ChatGroup/List/ChatListItemLastMessageSentAt.d.ts +0 -3
  184. package/src/types/ui/ChatGroup/List/ChatListItemName.d.ts +0 -3
  185. package/src/types/ui/ChatGroup/List/ChatListItemUnreadCount.d.ts +0 -3
  186. package/src/types/ui/ChatGroup/List/index.d.ts +0 -29
  187. package/src/types/ui/ChatGroup/index.d.ts +0 -5
  188. package/src/types/ui/Chatify.d.ts +0 -8
  189. package/src/types/ui/Conversation/Conversation.d.ts +0 -21
  190. package/src/types/ui/Conversation/ConversationActions.d.ts +0 -2
  191. package/src/types/ui/Conversation/ConversationBody.d.ts +0 -2
  192. package/src/types/ui/Conversation/ConversationContext.d.ts +0 -20
  193. package/src/types/ui/Conversation/ConversationHeader.d.ts +0 -2
  194. package/src/types/ui/Conversation/ConversationName.d.ts +0 -2
  195. package/src/types/ui/Conversation/InputBox/InputBox.d.ts +0 -2
  196. package/src/types/ui/Conversation/InputBox/InputFilesBox.d.ts +0 -2
  197. package/src/types/ui/Conversation/InputBox/InputSubmitButtonBox.d.ts +0 -5
  198. package/src/types/ui/Conversation/InputBox/InputTextBox.d.ts +0 -8
  199. package/src/types/ui/Conversation/InputBox/index.d.ts +0 -14
  200. package/src/types/ui/Conversation/Message/MessageAuthor.d.ts +0 -3
  201. package/src/types/ui/Conversation/Message/MessageBox.d.ts +0 -6
  202. package/src/types/ui/Conversation/Message/MessageContent.d.ts +0 -3
  203. package/src/types/ui/Conversation/Message/MessageInfoBox.d.ts +0 -3
  204. package/src/types/ui/Conversation/Message/MessageRow.d.ts +0 -6
  205. package/src/types/ui/Conversation/Message/MessageText.d.ts +0 -3
  206. package/src/types/ui/Conversation/Message/index.d.ts +0 -20
  207. package/src/types/ui/Conversation/NextObserver/NextMessagesObserver.d.ts +0 -5
  208. package/src/types/ui/Conversation/NextObserver/index.d.ts +0 -1
  209. package/src/types/ui/Conversation/ReadObserver/MessageReadObserver.d.ts +0 -6
  210. package/src/types/ui/Conversation/ReadObserver/index.d.ts +0 -1
  211. package/src/types/ui/Conversation/SendingMessage/SendingMessageBox.d.ts +0 -7
  212. package/src/types/ui/Conversation/SendingMessage/SendingMessageContent.d.ts +0 -3
  213. package/src/types/ui/Conversation/SendingMessage/SendingMessageInfoBox.d.ts +0 -3
  214. package/src/types/ui/Conversation/SendingMessage/SendingMessageText.d.ts +0 -3
  215. package/src/types/ui/Conversation/SendingMessage/index.d.ts +0 -14
  216. package/src/types/ui/Conversation/SystemMessage/SystemMessageBox.d.ts +0 -6
  217. package/src/types/ui/Conversation/SystemMessage/SystemMessageRow.d.ts +0 -9
  218. package/src/types/ui/Conversation/SystemMessage/index.d.ts +0 -8
  219. package/src/types/ui/Conversation/index.d.ts +0 -12
  220. package/src/types/ui/Thread/ThreadActions.d.ts +0 -2
  221. package/src/types/ui/Thread/ThreadContext.d.ts +0 -8
  222. package/src/types/ui/Thread/ThreadPanel.d.ts +0 -14
  223. package/src/types/ui/Thread/index.d.ts +0 -3
  224. package/src/types/ui/color.d.ts +0 -6
  225. package/src/types/ui/common/Avatar.d.ts +0 -6
  226. package/src/types/ui/common/Icon.d.ts +0 -20
  227. package/src/types/ui/common/MessageSkeleton.d.ts +0 -5
  228. package/src/types/ui/common/index.d.ts +0 -11
  229. package/src/types/ui/customize.d.ts +0 -9
  230. package/src/types/ui/index.d.ts +0 -11
  231. package/src/types/ui/localizer.d.ts +0 -35
@@ -0,0 +1,36 @@
1
+ import { Button } from 'antd';
2
+ import { File } from '../../../core';
3
+ import { customize, useCustomizeContext } from '../../customize';
4
+ import { useFormatter } from '../../useFormatter';
5
+ import { Icon } from '../../common';
6
+ import { ConversationCustomizeValue } from '../Conversation';
7
+ import { useCallback } from 'react';
8
+
9
+ function open(url: string) {
10
+ const w = window.open(url, '_blank');
11
+ w?.focus();
12
+ }
13
+
14
+ export interface MessageFileProps {
15
+ file: File;
16
+ }
17
+
18
+ export const MessageFile = customize('MessageFile', (props: MessageFileProps) => {
19
+ const { file } = props;
20
+ const { flippo } = useCustomizeContext<ConversationCustomizeValue>();
21
+ const formatter = useFormatter();
22
+
23
+ const onOpen = useCallback(() => flippo?.getSasUrl(file.ref).then(open), [flippo, file.ref]);
24
+
25
+ return (
26
+ <div className="wxchtf-file">
27
+ <div className="wxchtf-icon">
28
+ <Button onClick={onOpen} type="link" icon={<Icon type="open-file" />} />
29
+ </div>
30
+ <div className="wxchtf-file-info">
31
+ <div className="wxchtf-name">{file.name}</div>
32
+ <div className="wxchtf-size">{formatter.size(file.bytes)}</div>
33
+ </div>
34
+ </div>
35
+ );
36
+ });
@@ -0,0 +1,14 @@
1
+ import { customize } from '../../customize';
2
+ import { MessageBoxProps } from './MessageBox';
3
+ import { MessageFile } from './MessageFile';
4
+
5
+ export const MessageFileList = customize('MessageFileList', (props: MessageBoxProps) => {
6
+ const { files } = props.message;
7
+ return (
8
+ <div className="wxchtf-file-list">
9
+ {files.map((file) => (
10
+ <MessageFile key={file.ref} file={file} />
11
+ ))}
12
+ </div>
13
+ );
14
+ });
@@ -1,28 +1,28 @@
1
- import { chatifyApi } from '../../../core';
2
- import { customize } from '../../customize';
3
- import { useLocalizer } from '../../localizer';
4
- import { useConversation } from '../ConversationContext';
5
- import type { MessageBoxProps } from './MessageBox';
6
-
7
- export const MessageInfoBox = customize('MessageInfoBox', (props: MessageBoxProps) => {
8
- const { message } = props;
9
- const { id, sentBy, sentAt } = message;
10
- const { lastReadMessageId, isReading, noReadTracking } = useConversation();
11
- const me = chatifyApi.settings.me();
12
- const my = sentBy.id === me;
13
- const localizer = useLocalizer();
14
- const isRead = lastReadMessageId != null && id.localeCompare(lastReadMessageId) <= 0;
15
- const reading = !isRead && isReading(id);
16
-
17
- return (
18
- <div className="wxchtf-message-info-box">
19
- {!my && <div className="wxchtf-message-author-name">{sentBy.name},</div>}
20
- <div className="wxchtf-message-sent-at">{localizer.timestamp(sentAt)}</div>
21
- {!my && !noReadTracking && (
22
- <div className="wxchtf-message-read-box">
23
- {reading ? localizer.message.reading() : localizer.message.read()}
24
- </div>
25
- )}
26
- </div>
27
- );
28
- });
1
+ import { chatifyApi } from '../../../core';
2
+ import { customize } from '../../customize';
3
+ import { useLocalizer } from '../../localizer';
4
+ import { useConversation } from '../ConversationContext';
5
+ import type { MessageBoxProps } from './MessageBox';
6
+
7
+ export const MessageInfoBox = customize('MessageInfoBox', (props: MessageBoxProps) => {
8
+ const { message } = props;
9
+ const { id, sentBy, sentAt } = message;
10
+ const { lastReadMessageId, isReading, noReadTracking } = useConversation();
11
+ const me = chatifyApi.settings.me();
12
+ const my = sentBy.id === me;
13
+ const localizer = useLocalizer();
14
+ const isRead = lastReadMessageId != null && id.localeCompare(lastReadMessageId) <= 0;
15
+ const reading = !isRead && isReading(id);
16
+
17
+ return (
18
+ <div className="wxchtf-message-info-box">
19
+ {!my && <div className="wxchtf-message-author-name">{sentBy.name},</div>}
20
+ <div className="wxchtf-message-sent-at">{localizer.timestamp(sentAt)}</div>
21
+ {!my && !noReadTracking && (
22
+ <div className="wxchtf-message-read-box">
23
+ {reading ? localizer.message.reading() : localizer.message.read()}
24
+ </div>
25
+ )}
26
+ </div>
27
+ );
28
+ });
@@ -1,28 +1,28 @@
1
- import { Ref } from 'react';
2
- import { customize } from '../../customize';
3
- import { MessageAuthor } from './MessageAuthor';
4
- import { MessageContent } from './MessageContent';
5
- import { MessageBoxProps } from './MessageBox';
6
- import { MessageInfoBox } from './MessageInfoBox';
7
- import { chatifyApi } from '../../../core';
8
-
9
- export interface MessageRowProps extends MessageBoxProps {
10
- containerRef?: Ref<HTMLDivElement>;
11
- }
12
-
13
- export const MessageRow = customize('MessageRow', (props: MessageRowProps) => {
14
- const { message, containerRef } = props;
15
- const { sentBy } = message;
16
- const me = chatifyApi.settings.me();
17
- const my = sentBy.id === me;
18
-
19
- return (
20
- <div ref={containerRef} className={'wxchtf-message' + (my ? ' --my' : '')}>
21
- <MessageAuthor {...props} />
22
- <div>
23
- <MessageInfoBox {...props} />
24
- <MessageContent {...props} />
25
- </div>
26
- </div>
27
- );
28
- });
1
+ import { Ref } from 'react';
2
+ import { customize } from '../../customize';
3
+ import { MessageAuthor } from './MessageAuthor';
4
+ import { MessageContent } from './MessageContent';
5
+ import { MessageBoxProps } from './MessageBox';
6
+ import { MessageInfoBox } from './MessageInfoBox';
7
+ import { chatifyApi } from '../../../core';
8
+
9
+ export interface MessageRowProps extends MessageBoxProps {
10
+ containerRef?: Ref<HTMLDivElement>;
11
+ }
12
+
13
+ export const MessageRow = customize('MessageRow', (props: MessageRowProps) => {
14
+ const { message, containerRef } = props;
15
+ const { sentBy } = message;
16
+ const me = chatifyApi.settings.me();
17
+ const my = sentBy.id === me;
18
+
19
+ return (
20
+ <div ref={containerRef} className={'wxchtf-message' + (my ? ' --my' : '')}>
21
+ <MessageAuthor {...props} />
22
+ <div>
23
+ <MessageInfoBox {...props} />
24
+ <MessageContent {...props} />
25
+ </div>
26
+ </div>
27
+ );
28
+ });
@@ -1,7 +1,7 @@
1
- import { customize } from '../../customize';
2
- import { MessageBoxProps } from './MessageBox';
3
-
4
- export const MessageText = customize('MessageText', (props: MessageBoxProps) => {
5
- const { text } = props.message;
6
- return <div className="wxchtf-message-text">{text}</div>;
7
- });
1
+ import { customize } from '../../customize';
2
+ import { MessageBoxProps } from './MessageBox';
3
+
4
+ export const MessageText = customize('MessageText', (props: MessageBoxProps) => {
5
+ const { text } = props.message;
6
+ return <div className="wxchtf-message-text">{text}</div>;
7
+ });
@@ -1,22 +1,28 @@
1
- import { MessageAuthor } from './MessageAuthor';
2
- import { MessageBox } from './MessageBox';
3
- import { MessageContent } from './MessageContent';
4
- import { MessageInfoBox } from './MessageInfoBox';
5
- import { MessageRow } from './MessageRow';
6
- import { MessageText } from './MessageText';
7
-
8
- export * from './MessageAuthor';
9
- export * from './MessageBox';
10
- export * from './MessageContent';
11
- export * from './MessageInfoBox';
12
- export * from './MessageRow';
13
- export * from './MessageText';
14
-
15
- export interface MessageCustomizeValue {
16
- MessageAuthor?: typeof MessageAuthor.Component | null;
17
- MessageBox?: typeof MessageBox.Component | null;
18
- MessageContent?: typeof MessageContent.Component | null;
19
- MessageInfoBox?: typeof MessageInfoBox.Component | null;
20
- MessageRow?: typeof MessageRow.Component | null;
21
- MessageText?: typeof MessageText.Component | null;
22
- }
1
+ import { MessageAuthor } from './MessageAuthor';
2
+ import { MessageBox } from './MessageBox';
3
+ import { MessageContent } from './MessageContent';
4
+ import { MessageFile } from './MessageFile';
5
+ import { MessageFileList } from './MessageFileList';
6
+ import { MessageInfoBox } from './MessageInfoBox';
7
+ import { MessageRow } from './MessageRow';
8
+ import { MessageText } from './MessageText';
9
+
10
+ export * from './MessageAuthor';
11
+ export * from './MessageBox';
12
+ export * from './MessageContent';
13
+ export * from './MessageInfoBox';
14
+ export * from './MessageRow';
15
+ export * from './MessageText';
16
+ export * from './MessageFileList';
17
+ export * from './MessageFile';
18
+
19
+ export interface MessageCustomizeValue {
20
+ MessageAuthor?: typeof MessageAuthor.Component | null;
21
+ MessageBox?: typeof MessageBox.Component | null;
22
+ MessageContent?: typeof MessageContent.Component | null;
23
+ MessageInfoBox?: typeof MessageInfoBox.Component | null;
24
+ MessageRow?: typeof MessageRow.Component | null;
25
+ MessageText?: typeof MessageText.Component | null;
26
+ MessageFileList?: typeof MessageFileList.Component | null;
27
+ MessageFile?: typeof MessageFile.Component | null;
28
+ }
@@ -1,47 +1,47 @@
1
- import { useEffect, useMemo, useRef, useState } from 'react';
2
- import { MessageSkeleton } from '../../common/MessageSkeleton';
3
-
4
- export interface NextMessagesObserverProps {
5
- onLoad: () => void;
6
- loading: boolean;
7
- }
8
-
9
- export function NextMessagesObserver(props: NextMessagesObserverProps) {
10
- const { onLoad, loading } = props;
11
- const [intersecting, setIntersecting] = useState(false);
12
- const ref = useRef<HTMLDivElement | null>(null);
13
- const timerRef = useRef<number>();
14
-
15
- const observer = useMemo(
16
- () =>
17
- new IntersectionObserver(([entry]) => {
18
- if (entry.isIntersecting) {
19
- timerRef.current = window.setTimeout(() => setIntersecting(true), 200);
20
- } else {
21
- clearTimeout(timerRef.current!);
22
- }
23
- }),
24
- [],
25
- );
26
-
27
- useEffect(() => {
28
- observer.observe(ref.current!);
29
- return () => observer.disconnect();
30
- }, [observer]);
31
-
32
- useEffect(() => {
33
- if (!intersecting) {
34
- return;
35
- }
36
-
37
- onLoad();
38
-
39
- // eslint-disable-next-line react-hooks/exhaustive-deps
40
- }, [intersecting]);
41
-
42
- if (loading || intersecting) {
43
- return <MessageSkeleton count={4} />;
44
- }
45
-
46
- return <div className="wxchtf-next" ref={ref} />;
47
- }
1
+ import { useEffect, useMemo, useRef, useState } from 'react';
2
+ import { MessageSkeleton } from '../../common/MessageSkeleton';
3
+
4
+ export interface NextMessagesObserverProps {
5
+ onLoad: () => void;
6
+ loading: boolean;
7
+ }
8
+
9
+ export function NextMessagesObserver(props: NextMessagesObserverProps) {
10
+ const { onLoad, loading } = props;
11
+ const [intersecting, setIntersecting] = useState(false);
12
+ const ref = useRef<HTMLDivElement | null>(null);
13
+ const timerRef = useRef<number>();
14
+
15
+ const observer = useMemo(
16
+ () =>
17
+ new IntersectionObserver(([entry]) => {
18
+ if (entry.isIntersecting) {
19
+ timerRef.current = window.setTimeout(() => setIntersecting(true), 200);
20
+ } else {
21
+ clearTimeout(timerRef.current!);
22
+ }
23
+ }),
24
+ [],
25
+ );
26
+
27
+ useEffect(() => {
28
+ observer.observe(ref.current!);
29
+ return () => observer.disconnect();
30
+ }, [observer]);
31
+
32
+ useEffect(() => {
33
+ if (!intersecting) {
34
+ return;
35
+ }
36
+
37
+ onLoad();
38
+
39
+ // eslint-disable-next-line react-hooks/exhaustive-deps
40
+ }, [intersecting]);
41
+
42
+ if (loading || intersecting) {
43
+ return <MessageSkeleton count={4} />;
44
+ }
45
+
46
+ return <div className="wxchtf-next" ref={ref} />;
47
+ }
@@ -1 +1 @@
1
- export * from './NextMessagesObserver';
1
+ export * from './NextMessagesObserver';
@@ -1,49 +1,49 @@
1
- import { FC, RefObject, useEffect, useMemo, useRef } from 'react';
2
- import { MessageBoxProps } from '../Message';
3
- import { useConversation } from '../ConversationContext';
4
-
5
- export interface MessageReadObserverProps extends MessageBoxProps {
6
- messageRef: RefObject<HTMLDivElement | null>;
7
- }
8
- const Observer: FC<MessageReadObserverProps> = (props) => {
9
- const { message, messageRef } = props;
10
- const { onRead, lastReadMessageId } = useConversation();
11
- const isRead = lastReadMessageId != null && message.id.localeCompare(lastReadMessageId) <= 0;
12
- const readRef = useRef(isRead);
13
-
14
- useEffect(() => {
15
- readRef.current = readRef.current || isRead;
16
- }, [isRead]);
17
-
18
- const observer = useMemo(
19
- () =>
20
- new IntersectionObserver(([entry]) => {
21
- if (entry.isIntersecting && !readRef.current) {
22
- readRef.current = true;
23
- onRead(message.id);
24
- }
25
- }),
26
-
27
- // eslint-disable-next-line react-hooks/exhaustive-deps
28
- [],
29
- );
30
-
31
- useEffect(() => {
32
- observer.observe(messageRef.current!);
33
- return () => observer.disconnect();
34
-
35
- // eslint-disable-next-line react-hooks/exhaustive-deps
36
- }, [observer]);
37
-
38
- return <></>;
39
- };
40
-
41
- export function MessageReadObserver(props: MessageReadObserverProps) {
42
- const { noReadTracking } = useConversation();
43
-
44
- if (noReadTracking === true) {
45
- return null;
46
- }
47
-
48
- return <Observer {...props} />;
49
- }
1
+ import { FC, RefObject, useEffect, useMemo, useRef } from 'react';
2
+ import { MessageBoxProps } from '../Message';
3
+ import { useConversation } from '../ConversationContext';
4
+
5
+ export interface MessageReadObserverProps extends MessageBoxProps {
6
+ messageRef: RefObject<HTMLDivElement | null>;
7
+ }
8
+ const Observer: FC<MessageReadObserverProps> = (props) => {
9
+ const { message, messageRef } = props;
10
+ const { onRead, lastReadMessageId } = useConversation();
11
+ const isRead = lastReadMessageId != null && message.id.localeCompare(lastReadMessageId) <= 0;
12
+ const readRef = useRef(isRead);
13
+
14
+ useEffect(() => {
15
+ readRef.current = readRef.current || isRead;
16
+ }, [isRead]);
17
+
18
+ const observer = useMemo(
19
+ () =>
20
+ new IntersectionObserver(([entry]) => {
21
+ if (entry.isIntersecting && !readRef.current) {
22
+ readRef.current = true;
23
+ onRead(message.id);
24
+ }
25
+ }),
26
+
27
+ // eslint-disable-next-line react-hooks/exhaustive-deps
28
+ [],
29
+ );
30
+
31
+ useEffect(() => {
32
+ observer.observe(messageRef.current!);
33
+ return () => observer.disconnect();
34
+
35
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36
+ }, [observer]);
37
+
38
+ return <></>;
39
+ };
40
+
41
+ export function MessageReadObserver(props: MessageReadObserverProps) {
42
+ const { noReadTracking } = useConversation();
43
+
44
+ if (noReadTracking === true) {
45
+ return null;
46
+ }
47
+
48
+ return <Observer {...props} />;
49
+ }
@@ -1 +1 @@
1
- export * from './MessageReadObserver';
1
+ export * from './MessageReadObserver';
@@ -1,16 +1,16 @@
1
- import { File } from '../../../core';
2
- import { customize } from '../../customize';
3
- import { SendingMessageContent } from './SendingMessageContent';
4
-
5
- export interface SendingMessageBoxProps {
6
- text: string;
7
- files: File[];
8
- }
9
-
10
- export const SendingMessageBox = customize('SendingMessageBox', (props: SendingMessageBoxProps) => {
11
- return (
12
- <div className="wxchtf-sending-message">
13
- <SendingMessageContent {...props} />
14
- </div>
15
- );
16
- });
1
+ import { File } from '../../../core';
2
+ import { customize } from '../../customize';
3
+ import { SendingMessageContent } from './SendingMessageContent';
4
+
5
+ export interface SendingMessageBoxProps {
6
+ text: string;
7
+ files: File[];
8
+ }
9
+
10
+ export const SendingMessageBox = customize('SendingMessageBox', (props: SendingMessageBoxProps) => {
11
+ return (
12
+ <div className="wxchtf-sending-message">
13
+ <SendingMessageContent {...props} />
14
+ </div>
15
+ );
16
+ });
@@ -1,13 +1,13 @@
1
- import { customize } from '../../customize';
2
- import { SendingMessageText } from './SendingMessageText';
3
- import { SendingMessageInfoBox } from './SendingMessageInfoBox';
4
- import type { SendingMessageBoxProps } from './SendingMessageBox';
5
-
6
- export const SendingMessageContent = customize('SendingMessageContent', (props: SendingMessageBoxProps) => {
7
- return (
8
- <div className="wxchtf-sending-message-content">
9
- <SendingMessageText {...props} />
10
- <SendingMessageInfoBox {...props} />
11
- </div>
12
- );
13
- });
1
+ import { customize } from '../../customize';
2
+ import { SendingMessageText } from './SendingMessageText';
3
+ import { SendingMessageInfoBox } from './SendingMessageInfoBox';
4
+ import type { SendingMessageBoxProps } from './SendingMessageBox';
5
+
6
+ export const SendingMessageContent = customize('SendingMessageContent', (props: SendingMessageBoxProps) => {
7
+ return (
8
+ <div className="wxchtf-sending-message-content">
9
+ <SendingMessageText {...props} />
10
+ <SendingMessageInfoBox {...props} />
11
+ </div>
12
+ );
13
+ });
@@ -1,13 +1,13 @@
1
- import { customize } from '../../customize';
2
- import { useLocalizer } from '../../localizer';
3
- import type { SendingMessageBoxProps } from './SendingMessageBox';
4
-
5
- export const SendingMessageInfoBox = customize('SendingMessageInfoBox', (_: SendingMessageBoxProps) => {
6
- const localizer = useLocalizer();
7
-
8
- return (
9
- <div className="wxchtf-sending-message-info-box">
10
- <div className="wxchtf-sending-message-sending-box">{localizer.message.sending()}</div>
11
- </div>
12
- );
13
- });
1
+ import { customize } from '../../customize';
2
+ import { useLocalizer } from '../../localizer';
3
+ import type { SendingMessageBoxProps } from './SendingMessageBox';
4
+
5
+ export const SendingMessageInfoBox = customize('SendingMessageInfoBox', (_: SendingMessageBoxProps) => {
6
+ const localizer = useLocalizer();
7
+
8
+ return (
9
+ <div className="wxchtf-sending-message-info-box">
10
+ <div className="wxchtf-sending-message-sending-box">{localizer.message.sending()}</div>
11
+ </div>
12
+ );
13
+ });
@@ -1,7 +1,7 @@
1
- import { customize } from '../../customize';
2
- import type { SendingMessageBoxProps } from './SendingMessageBox';
3
-
4
- export const SendingMessageText = customize('SendingMessageText', (props: SendingMessageBoxProps) => {
5
- const { text } = props;
6
- return <div className="wxchtf-sending-message-text">{text}</div>;
7
- });
1
+ import { customize } from '../../customize';
2
+ import type { SendingMessageBoxProps } from './SendingMessageBox';
3
+
4
+ export const SendingMessageText = customize('SendingMessageText', (props: SendingMessageBoxProps) => {
5
+ const { text } = props;
6
+ return <div className="wxchtf-sending-message-text">{text}</div>;
7
+ });
@@ -1,16 +1,16 @@
1
- import { SendingMessageBox } from './SendingMessageBox';
2
- import { SendingMessageContent } from './SendingMessageContent';
3
- import { SendingMessageInfoBox } from './SendingMessageInfoBox';
4
- import { SendingMessageText } from './SendingMessageText';
5
-
6
- export * from './SendingMessageBox';
7
- export * from './SendingMessageContent';
8
- export * from './SendingMessageInfoBox';
9
- export * from './SendingMessageText';
10
-
11
- export interface SendingMessageCustomizeValue {
12
- SendingMessageBox?: typeof SendingMessageBox.Component | null;
13
- SendingMessageContent?: typeof SendingMessageContent.Component | null;
14
- SendingMessageInfoBox?: typeof SendingMessageInfoBox.Component | null;
15
- SendingMessageText?: typeof SendingMessageText.Component | null;
16
- }
1
+ import { SendingMessageBox } from './SendingMessageBox';
2
+ import { SendingMessageContent } from './SendingMessageContent';
3
+ import { SendingMessageInfoBox } from './SendingMessageInfoBox';
4
+ import { SendingMessageText } from './SendingMessageText';
5
+
6
+ export * from './SendingMessageBox';
7
+ export * from './SendingMessageContent';
8
+ export * from './SendingMessageInfoBox';
9
+ export * from './SendingMessageText';
10
+
11
+ export interface SendingMessageCustomizeValue {
12
+ SendingMessageBox?: typeof SendingMessageBox.Component | null;
13
+ SendingMessageContent?: typeof SendingMessageContent.Component | null;
14
+ SendingMessageInfoBox?: typeof SendingMessageInfoBox.Component | null;
15
+ SendingMessageText?: typeof SendingMessageText.Component | null;
16
+ }
@@ -1,20 +1,20 @@
1
- import { useRef } from 'react';
2
- import { customize } from '../../customize';
3
- import { MessageBase } from '../../../core';
4
- import { SystemMessageRow } from './SystemMessageRow';
5
- import { MessageReadObserver } from '../ReadObserver';
6
-
7
- export interface SystemMessageBoxProps {
8
- message: MessageBase;
9
- }
10
-
11
- export const SystemMessageBox = customize('SystemMessageBox', (props: SystemMessageBoxProps) => {
12
- const ref = useRef<HTMLDivElement | null>(null);
13
-
14
- return (
15
- <>
16
- <MessageReadObserver messageRef={ref} {...props} />
17
- <SystemMessageRow containerRef={ref} {...props} />
18
- </>
19
- );
20
- });
1
+ import { useRef } from 'react';
2
+ import { customize } from '../../customize';
3
+ import { MessageBase } from '../../../core';
4
+ import { SystemMessageRow } from './SystemMessageRow';
5
+ import { MessageReadObserver } from '../ReadObserver';
6
+
7
+ export interface SystemMessageBoxProps {
8
+ message: MessageBase;
9
+ }
10
+
11
+ export const SystemMessageBox = customize('SystemMessageBox', (props: SystemMessageBoxProps) => {
12
+ const ref = useRef<HTMLDivElement | null>(null);
13
+
14
+ return (
15
+ <>
16
+ <MessageReadObserver messageRef={ref} {...props} />
17
+ <SystemMessageRow containerRef={ref} {...props} />
18
+ </>
19
+ );
20
+ });