@webinex/chatify 2.0.1-alpha1 → 2.0.2-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 (232) 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 +8 -0
  9. package/dist/esm/types/ui/Conversation/InputBox/InputBoxFileList.d.ts +8 -0
  10. package/dist/esm/types/ui/Conversation/InputBox/InputFilesBox.d.ts +11 -1
  11. package/dist/esm/types/ui/Conversation/InputBox/InputSubmitButtonBox.d.ts +2 -0
  12. package/dist/esm/types/ui/Conversation/InputBox/InputTextBox.d.ts +1 -0
  13. package/dist/esm/types/ui/Conversation/InputBox/index.d.ts +8 -1
  14. package/dist/esm/types/ui/Conversation/Message/MessageFile.d.ts +6 -0
  15. package/dist/esm/types/ui/Conversation/Message/MessageFileList.d.ts +3 -0
  16. package/dist/esm/types/ui/Conversation/Message/index.d.ts +6 -0
  17. package/dist/esm/types/ui/common/Icon.d.ts +2 -0
  18. package/dist/esm/types/ui/customize.d.ts +2 -2
  19. package/dist/esm/types/ui/localizer.d.ts +5 -0
  20. package/dist/esm/types/ui/useFormatter.d.ts +3 -0
  21. package/dist/index.d.ts +10835 -239
  22. package/package.json +94 -93
  23. package/src/core/api/api.ts +643 -642
  24. package/src/core/api/baseApi.ts +38 -38
  25. package/src/core/api/index.ts +1 -1
  26. package/src/core/client.ts +280 -280
  27. package/src/core/constants.ts +1 -1
  28. package/src/core/debounce.ts +90 -90
  29. package/src/core/index.ts +4 -4
  30. package/src/core/types.tsx +152 -152
  31. package/src/index.ts +2 -2
  32. package/src/styles/aside.scss +162 -161
  33. package/src/styles/chat.scss +209 -208
  34. package/src/styles/index.scss +153 -110
  35. package/src/styles/input.scss +147 -74
  36. package/src/styles/keyframes.scss +14 -14
  37. package/src/styles/members.scss +13 -13
  38. package/src/styles/mixins.scss +25 -20
  39. package/src/styles/variables.scss +13 -10
  40. package/src/ui/Chat/ChatContext.tsx +30 -30
  41. package/src/ui/Chat/ChatEditableHeaderName.tsx +63 -63
  42. package/src/ui/Chat/ChatHeaderActions.tsx +19 -19
  43. package/src/ui/Chat/ChatPanel.tsx +30 -30
  44. package/src/ui/Chat/ChatView.tsx +115 -115
  45. package/src/ui/Chat/Members/ChatMembersButton.tsx +9 -9
  46. package/src/ui/Chat/Members/ChatMembersPanel.tsx +112 -112
  47. package/src/ui/Chat/Members/ChatMembersPreview.tsx +25 -25
  48. package/src/ui/Chat/Members/index.ts +13 -13
  49. package/src/ui/Chat/index.ts +6 -6
  50. package/src/ui/ChatGroup/ChatGroupContext.tsx +50 -50
  51. package/src/ui/ChatGroup/ChatGroupPanel.tsx +73 -73
  52. package/src/ui/ChatGroup/Create/CreateChatButton.tsx +15 -15
  53. package/src/ui/ChatGroup/Create/CreateChatForm.tsx +36 -36
  54. package/src/ui/ChatGroup/Create/CreateChatMemberInput.tsx +65 -65
  55. package/src/ui/ChatGroup/Create/CreateChatNameInput.tsx +25 -25
  56. package/src/ui/ChatGroup/Create/CreateChatPanel.tsx +45 -45
  57. package/src/ui/ChatGroup/Create/index.ts +19 -19
  58. package/src/ui/ChatGroup/Layout/ChatGroupAside.tsx +12 -12
  59. package/src/ui/ChatGroup/Layout/ChatGroupBody.tsx +10 -10
  60. package/src/ui/ChatGroup/Layout/ChatGroupFooter.tsx +3 -3
  61. package/src/ui/ChatGroup/Layout/ChatGroupHeader.tsx +5 -5
  62. package/src/ui/ChatGroup/Layout/ChatGroupMain.tsx +17 -17
  63. package/src/ui/ChatGroup/Layout/index.ts +19 -19
  64. package/src/ui/ChatGroup/List/ChatList.tsx +41 -41
  65. package/src/ui/ChatGroup/List/ChatListItemAvatar.tsx +22 -22
  66. package/src/ui/ChatGroup/List/ChatListItemBox.tsx +26 -26
  67. package/src/ui/ChatGroup/List/ChatListItemLastMessage.tsx +15 -15
  68. package/src/ui/ChatGroup/List/ChatListItemLastMessageAuthor.tsx +15 -15
  69. package/src/ui/ChatGroup/List/ChatListItemLastMessageContent.tsx +21 -21
  70. package/src/ui/ChatGroup/List/ChatListItemLastMessageSentAt.tsx +22 -22
  71. package/src/ui/ChatGroup/List/ChatListItemName.tsx +8 -8
  72. package/src/ui/ChatGroup/List/ChatListItemUnreadCount.tsx +12 -12
  73. package/src/ui/ChatGroup/List/index.ts +31 -31
  74. package/src/ui/ChatGroup/index.ts +5 -5
  75. package/src/ui/Chatify.tsx +9 -9
  76. package/src/ui/Conversation/Conversation.tsx +78 -76
  77. package/src/ui/Conversation/ConversationActions.tsx +5 -5
  78. package/src/ui/Conversation/ConversationBody.tsx +28 -28
  79. package/src/ui/Conversation/ConversationContext.ts +29 -27
  80. package/src/ui/Conversation/ConversationHeader.tsx +23 -23
  81. package/src/ui/Conversation/ConversationName.tsx +7 -7
  82. package/src/ui/Conversation/InputBox/InputBox.tsx +113 -40
  83. package/src/ui/Conversation/InputBox/InputBoxFile.tsx +38 -0
  84. package/src/ui/Conversation/InputBox/InputBoxFileList.tsx +21 -0
  85. package/src/ui/Conversation/InputBox/InputFilesBox.tsx +78 -9
  86. package/src/ui/Conversation/InputBox/InputSubmitButtonBox.tsx +26 -17
  87. package/src/ui/Conversation/InputBox/InputTextBox.tsx +55 -53
  88. package/src/ui/Conversation/InputBox/index.ts +23 -16
  89. package/src/ui/Conversation/Message/MessageAuthor.tsx +13 -13
  90. package/src/ui/Conversation/Message/MessageBox.tsx +20 -20
  91. package/src/ui/Conversation/Message/MessageContent.tsx +15 -11
  92. package/src/ui/Conversation/Message/MessageFile.tsx +52 -0
  93. package/src/ui/Conversation/Message/MessageFileList.tsx +14 -0
  94. package/src/ui/Conversation/Message/MessageInfoBox.tsx +28 -28
  95. package/src/ui/Conversation/Message/MessageRow.tsx +28 -28
  96. package/src/ui/Conversation/Message/MessageText.tsx +7 -7
  97. package/src/ui/Conversation/Message/index.ts +28 -22
  98. package/src/ui/Conversation/NextObserver/NextMessagesObserver.tsx +47 -47
  99. package/src/ui/Conversation/NextObserver/index.ts +1 -1
  100. package/src/ui/Conversation/ReadObserver/MessageReadObserver.tsx +49 -49
  101. package/src/ui/Conversation/ReadObserver/index.ts +1 -1
  102. package/src/ui/Conversation/SendingMessage/SendingMessageBox.tsx +16 -16
  103. package/src/ui/Conversation/SendingMessage/SendingMessageContent.tsx +13 -13
  104. package/src/ui/Conversation/SendingMessage/SendingMessageInfoBox.tsx +13 -13
  105. package/src/ui/Conversation/SendingMessage/SendingMessageText.tsx +7 -7
  106. package/src/ui/Conversation/SendingMessage/index.ts +16 -16
  107. package/src/ui/Conversation/SystemMessage/SystemMessageBox.tsx +20 -20
  108. package/src/ui/Conversation/SystemMessage/SystemMessageRow.tsx +28 -28
  109. package/src/ui/Conversation/SystemMessage/index.ts +10 -10
  110. package/src/ui/Conversation/index.ts +13 -13
  111. package/src/ui/Thread/ThreadActions.tsx +22 -22
  112. package/src/ui/Thread/ThreadContext.ts +13 -13
  113. package/src/ui/Thread/ThreadPanel.tsx +127 -127
  114. package/src/ui/Thread/index.tsx +3 -3
  115. package/src/ui/color.ts +20 -20
  116. package/src/ui/common/Avatar.tsx +20 -20
  117. package/src/ui/common/Icon.tsx +44 -40
  118. package/src/ui/common/MessageSkeleton.tsx +20 -20
  119. package/src/ui/common/index.ts +13 -13
  120. package/src/ui/customize.tsx +51 -53
  121. package/src/ui/index.ts +11 -11
  122. package/src/ui/localizer.tsx +96 -81
  123. package/src/ui/useFormatter.tsx +17 -0
  124. package/dist/esm/types/core/api/accountApi.d.ts +0 -5
  125. package/dist/esm/types/core/api/chatApi.d.ts +0 -16
  126. package/dist/esm/types/core/api/chatListApi.d.ts +0 -5
  127. package/dist/esm/types/core/api/chatMemberApi.d.ts +0 -6
  128. package/dist/esm/types/core/api/chatMessageApi.d.ts +0 -3
  129. package/dist/esm/types/core/api/threadApi.d.ts +0 -1
  130. package/dist/esm/types/core/api/threadMessageApi.d.ts +0 -6
  131. package/src/core/api/accountApi.ts +0 -11
  132. package/src/core/api/chatApi.ts +0 -87
  133. package/src/core/api/chatListApi.ts +0 -134
  134. package/src/core/api/chatMemberApi.ts +0 -20
  135. package/src/core/api/chatMessageApi.ts +0 -12
  136. package/src/core/api/threadApi.ts +0 -8
  137. package/src/core/api/threadMessageApi.ts +0 -20
  138. package/src/types/core/api/accountApi.d.ts +0 -5
  139. package/src/types/core/api/api.d.ts +0 -2380
  140. package/src/types/core/api/baseApi.d.ts +0 -15
  141. package/src/types/core/api/chatApi.d.ts +0 -16
  142. package/src/types/core/api/chatListApi.d.ts +0 -5
  143. package/src/types/core/api/chatMemberApi.d.ts +0 -6
  144. package/src/types/core/api/chatMessageApi.d.ts +0 -3
  145. package/src/types/core/api/index.d.ts +0 -1
  146. package/src/types/core/api/threadApi.d.ts +0 -1
  147. package/src/types/core/api/threadMessageApi.d.ts +0 -6
  148. package/src/types/core/client.d.ts +0 -83
  149. package/src/types/core/constants.d.ts +0 -1
  150. package/src/types/core/debounce.d.ts +0 -27
  151. package/src/types/core/index.d.ts +0 -4
  152. package/src/types/core/types.d.ts +0 -105
  153. package/src/types/index.d.ts +0 -2
  154. package/src/types/ui/Chat/ChatContext.d.ts +0 -10
  155. package/src/types/ui/Chat/ChatEditableHeaderName.d.ts +0 -2
  156. package/src/types/ui/Chat/ChatHeaderActions.d.ts +0 -2
  157. package/src/types/ui/Chat/ChatPanel.d.ts +0 -13
  158. package/src/types/ui/Chat/ChatView.d.ts +0 -17
  159. package/src/types/ui/Chat/Members/ChatMembersButton.d.ts +0 -2
  160. package/src/types/ui/Chat/Members/ChatMembersPanel.d.ts +0 -2
  161. package/src/types/ui/Chat/Members/ChatMembersPreview.d.ts +0 -2
  162. package/src/types/ui/Chat/Members/index.d.ts +0 -11
  163. package/src/types/ui/Chat/index.d.ts +0 -6
  164. package/src/types/ui/ChatGroup/ChatGroupContext.d.ts +0 -12
  165. package/src/types/ui/ChatGroup/ChatGroupPanel.d.ts +0 -15
  166. package/src/types/ui/ChatGroup/Create/CreateChatButton.d.ts +0 -2
  167. package/src/types/ui/ChatGroup/Create/CreateChatForm.d.ts +0 -11
  168. package/src/types/ui/ChatGroup/Create/CreateChatMemberInput.d.ts +0 -5
  169. package/src/types/ui/ChatGroup/Create/CreateChatNameInput.d.ts +0 -5
  170. package/src/types/ui/ChatGroup/Create/CreateChatPanel.d.ts +0 -2
  171. package/src/types/ui/ChatGroup/Create/index.d.ts +0 -17
  172. package/src/types/ui/ChatGroup/Layout/ChatGroupAside.d.ts +0 -2
  173. package/src/types/ui/ChatGroup/Layout/ChatGroupBody.d.ts +0 -2
  174. package/src/types/ui/ChatGroup/Layout/ChatGroupFooter.d.ts +0 -2
  175. package/src/types/ui/ChatGroup/Layout/ChatGroupHeader.d.ts +0 -2
  176. package/src/types/ui/ChatGroup/Layout/ChatGroupMain.d.ts +0 -2
  177. package/src/types/ui/ChatGroup/Layout/index.d.ts +0 -17
  178. package/src/types/ui/ChatGroup/List/ChatList.d.ts +0 -2
  179. package/src/types/ui/ChatGroup/List/ChatListItemAvatar.d.ts +0 -3
  180. package/src/types/ui/ChatGroup/List/ChatListItemBox.d.ts +0 -6
  181. package/src/types/ui/ChatGroup/List/ChatListItemLastMessage.d.ts +0 -3
  182. package/src/types/ui/ChatGroup/List/ChatListItemLastMessageAuthor.d.ts +0 -3
  183. package/src/types/ui/ChatGroup/List/ChatListItemLastMessageContent.d.ts +0 -3
  184. package/src/types/ui/ChatGroup/List/ChatListItemLastMessageSentAt.d.ts +0 -3
  185. package/src/types/ui/ChatGroup/List/ChatListItemName.d.ts +0 -3
  186. package/src/types/ui/ChatGroup/List/ChatListItemUnreadCount.d.ts +0 -3
  187. package/src/types/ui/ChatGroup/List/index.d.ts +0 -29
  188. package/src/types/ui/ChatGroup/index.d.ts +0 -5
  189. package/src/types/ui/Chatify.d.ts +0 -8
  190. package/src/types/ui/Conversation/Conversation.d.ts +0 -21
  191. package/src/types/ui/Conversation/ConversationActions.d.ts +0 -2
  192. package/src/types/ui/Conversation/ConversationBody.d.ts +0 -2
  193. package/src/types/ui/Conversation/ConversationContext.d.ts +0 -20
  194. package/src/types/ui/Conversation/ConversationHeader.d.ts +0 -2
  195. package/src/types/ui/Conversation/ConversationName.d.ts +0 -2
  196. package/src/types/ui/Conversation/InputBox/InputBox.d.ts +0 -2
  197. package/src/types/ui/Conversation/InputBox/InputFilesBox.d.ts +0 -2
  198. package/src/types/ui/Conversation/InputBox/InputSubmitButtonBox.d.ts +0 -5
  199. package/src/types/ui/Conversation/InputBox/InputTextBox.d.ts +0 -8
  200. package/src/types/ui/Conversation/InputBox/index.d.ts +0 -14
  201. package/src/types/ui/Conversation/Message/MessageAuthor.d.ts +0 -3
  202. package/src/types/ui/Conversation/Message/MessageBox.d.ts +0 -6
  203. package/src/types/ui/Conversation/Message/MessageContent.d.ts +0 -3
  204. package/src/types/ui/Conversation/Message/MessageInfoBox.d.ts +0 -3
  205. package/src/types/ui/Conversation/Message/MessageRow.d.ts +0 -6
  206. package/src/types/ui/Conversation/Message/MessageText.d.ts +0 -3
  207. package/src/types/ui/Conversation/Message/index.d.ts +0 -20
  208. package/src/types/ui/Conversation/NextObserver/NextMessagesObserver.d.ts +0 -5
  209. package/src/types/ui/Conversation/NextObserver/index.d.ts +0 -1
  210. package/src/types/ui/Conversation/ReadObserver/MessageReadObserver.d.ts +0 -6
  211. package/src/types/ui/Conversation/ReadObserver/index.d.ts +0 -1
  212. package/src/types/ui/Conversation/SendingMessage/SendingMessageBox.d.ts +0 -7
  213. package/src/types/ui/Conversation/SendingMessage/SendingMessageContent.d.ts +0 -3
  214. package/src/types/ui/Conversation/SendingMessage/SendingMessageInfoBox.d.ts +0 -3
  215. package/src/types/ui/Conversation/SendingMessage/SendingMessageText.d.ts +0 -3
  216. package/src/types/ui/Conversation/SendingMessage/index.d.ts +0 -14
  217. package/src/types/ui/Conversation/SystemMessage/SystemMessageBox.d.ts +0 -6
  218. package/src/types/ui/Conversation/SystemMessage/SystemMessageRow.d.ts +0 -9
  219. package/src/types/ui/Conversation/SystemMessage/index.d.ts +0 -8
  220. package/src/types/ui/Conversation/index.d.ts +0 -12
  221. package/src/types/ui/Thread/ThreadActions.d.ts +0 -2
  222. package/src/types/ui/Thread/ThreadContext.d.ts +0 -8
  223. package/src/types/ui/Thread/ThreadPanel.d.ts +0 -14
  224. package/src/types/ui/Thread/index.d.ts +0 -3
  225. package/src/types/ui/color.d.ts +0 -6
  226. package/src/types/ui/common/Avatar.d.ts +0 -6
  227. package/src/types/ui/common/Icon.d.ts +0 -20
  228. package/src/types/ui/common/MessageSkeleton.d.ts +0 -5
  229. package/src/types/ui/common/index.d.ts +0 -11
  230. package/src/types/ui/customize.d.ts +0 -9
  231. package/src/types/ui/index.d.ts +0 -11
  232. package/src/types/ui/localizer.d.ts +0 -35
@@ -0,0 +1,52 @@
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, useState } 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
+ function useOpen(props: MessageFileProps) {
19
+ const { file } = props;
20
+ const { flippo } = useCustomizeContext<ConversationCustomizeValue>();
21
+ const [isOpenFetching, setIsOpenFetching] = useState(false);
22
+
23
+ const onOpen = useCallback(
24
+ () =>
25
+ flippo &&
26
+ Promise.resolve(setIsOpenFetching(true))
27
+ .then(() => flippo!.getSasUrl(file.ref))
28
+ .then(open)
29
+ .finally(() => setIsOpenFetching(false)),
30
+ [flippo, file.ref],
31
+ );
32
+
33
+ return [onOpen, { isOpenFetching }] as const;
34
+ }
35
+
36
+ export const MessageFile = customize('MessageFile', (props: MessageFileProps) => {
37
+ const { file } = props;
38
+ const formatter = useFormatter();
39
+ const [onOpen, { isOpenFetching }] = useOpen(props);
40
+
41
+ return (
42
+ <div className="wxchtf-file">
43
+ <div className="wxchtf-icon">
44
+ <Button loading={isOpenFetching} onClick={onOpen} type="link" icon={<Icon type="open-file" />} />
45
+ </div>
46
+ <div className="wxchtf-file-info">
47
+ <div className="wxchtf-name">{file.name}</div>
48
+ <div className="wxchtf-size">{formatter.size(file.bytes)}</div>
49
+ </div>
50
+ </div>
51
+ );
52
+ });
@@ -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
+ });