@webinex/chatify 1.0.0-rc2 → 1.0.0-rc3

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 (267) hide show
  1. package/dist/css/chatify.css +183 -141
  2. package/dist/esm/index.js +1 -1
  3. package/dist/esm/index.js.map +1 -1
  4. package/dist/esm/types/core/action.d.ts +110 -42
  5. package/dist/esm/types/core/client.d.ts +2 -1
  6. package/dist/esm/types/core/index.d.ts +11 -8
  7. package/dist/esm/types/core/models.d.ts +10 -4
  8. package/dist/esm/types/core/state.d.ts +36 -7
  9. package/dist/esm/types/core/useAddChatMutation.d.ts +2 -0
  10. package/dist/esm/types/core/useAddMemberMutation.d.ts +2 -0
  11. package/dist/esm/types/core/useFetchNextMutation.d.ts +3 -0
  12. package/dist/esm/types/core/useGetAccountsQuery.d.ts +1 -0
  13. package/dist/esm/types/core/useGetChatListQuery.d.ts +1 -0
  14. package/dist/{cjs/types/core/useChat.d.ts → esm/types/core/useGetChatQuery.d.ts} +1 -1
  15. package/dist/esm/types/core/useGetMessagesQuery.d.ts +4 -0
  16. package/dist/esm/types/core/useRemoveMemberMutation.d.ts +2 -0
  17. package/dist/esm/types/core/useSendMutation.d.ts +2 -0
  18. package/dist/esm/types/core/useUpdateChatNameMutation.d.ts +2 -0
  19. package/dist/esm/types/ui/AddChatButton.d.ts +2 -2
  20. package/dist/esm/types/ui/Avatar.d.ts +2 -2
  21. package/dist/esm/types/ui/ChatList/ChatList.d.ts +2 -0
  22. package/dist/esm/types/ui/ChatList/ChatListItemBox.d.ts +6 -0
  23. package/dist/esm/types/ui/ChatList/ChatListItemLastMessage.d.ts +3 -0
  24. package/dist/esm/types/ui/ChatList/ChatListItemLastMessageAuthor.d.ts +3 -0
  25. package/dist/esm/types/ui/ChatList/ChatListItemLastMessageContent.d.ts +3 -0
  26. package/dist/esm/types/ui/ChatList/ChatListItemName.d.ts +3 -0
  27. package/dist/esm/types/ui/ChatList/ChatListItemUnreadCount.d.ts +3 -0
  28. package/dist/esm/types/ui/ChatList/index.d.ts +7 -0
  29. package/dist/esm/types/ui/ChatName.d.ts +2 -2
  30. package/dist/esm/types/ui/ChatPanel/ChatBody.d.ts +5 -0
  31. package/dist/esm/types/ui/ChatPanel/ChatHeader.d.ts +5 -0
  32. package/dist/esm/types/ui/ChatPanel/ChatHeaderMembers.d.ts +5 -0
  33. package/dist/esm/types/ui/ChatPanel/ChatHeaderName.d.ts +5 -0
  34. package/dist/esm/types/ui/ChatPanel/ChatMembersButton.d.ts +5 -0
  35. package/dist/esm/types/ui/ChatPanel/ChatMembersPanel.d.ts +5 -0
  36. package/dist/esm/types/ui/ChatPanel/ChatPanel.d.ts +5 -0
  37. package/dist/esm/types/ui/ChatPanel/index.d.ts +6 -0
  38. package/dist/esm/types/ui/Chatify.d.ts +45 -23
  39. package/dist/esm/types/ui/CreateChatPanel/CreateChatForm.d.ts +11 -0
  40. package/dist/esm/types/ui/CreateChatPanel/CreateChatMemberInput.d.ts +5 -0
  41. package/dist/esm/types/ui/CreateChatPanel/CreateChatNameInput.d.ts +5 -0
  42. package/dist/esm/types/ui/CreateChatPanel/CreateChatPanel.d.ts +2 -0
  43. package/dist/esm/types/ui/CreateChatPanel/index.d.ts +4 -0
  44. package/dist/esm/types/ui/Icon.d.ts +13 -4
  45. package/dist/esm/types/ui/InputBox/InputBox.d.ts +2 -0
  46. package/dist/esm/types/ui/InputBox/InputFilesBox.d.ts +2 -0
  47. package/dist/esm/types/ui/InputBox/InputSubmitButtonBox.d.ts +5 -0
  48. package/dist/esm/types/ui/InputBox/InputTextBox.d.ts +7 -0
  49. package/dist/esm/types/ui/InputBox/index.d.ts +4 -0
  50. package/dist/esm/types/ui/Layout/Aside.d.ts +2 -0
  51. package/dist/esm/types/ui/Layout/Body.d.ts +2 -0
  52. package/dist/esm/types/ui/Layout/Footer.d.ts +2 -0
  53. package/dist/esm/types/ui/Layout/Header.d.ts +2 -0
  54. package/dist/esm/types/ui/Layout/Main.d.ts +2 -0
  55. package/dist/esm/types/ui/Layout/index.d.ts +5 -0
  56. package/dist/esm/types/ui/Message/MessageAuthor.d.ts +3 -0
  57. package/dist/esm/types/ui/Message/MessageBox.d.ts +6 -0
  58. package/dist/esm/types/ui/Message/MessageContent.d.ts +3 -0
  59. package/dist/esm/types/ui/Message/MessageInfoBox.d.ts +3 -0
  60. package/dist/esm/types/ui/Message/MessageRow.d.ts +6 -0
  61. package/dist/esm/types/ui/Message/MessageText.d.ts +3 -0
  62. package/dist/esm/types/ui/Message/index.d.ts +6 -0
  63. package/dist/esm/types/ui/MessageReadObserver.d.ts +6 -0
  64. package/dist/esm/types/ui/Next.d.ts +4 -0
  65. package/dist/esm/types/ui/SendingMessage/SendingMessageBox.d.ts +7 -0
  66. package/dist/esm/types/ui/SendingMessage/SendingMessageContent.d.ts +3 -0
  67. package/dist/esm/types/ui/SendingMessage/SendingMessageInfoBox.d.ts +3 -0
  68. package/dist/esm/types/ui/SendingMessage/SendingMessageText.d.ts +3 -0
  69. package/dist/esm/types/ui/SendingMessage/index.d.ts +4 -0
  70. package/dist/esm/types/ui/SystemMessage/SystemMessageBox.d.ts +6 -0
  71. package/dist/esm/types/ui/SystemMessage/SystemMessageRow.d.ts +9 -0
  72. package/dist/esm/types/ui/SystemMessage/index.d.ts +2 -0
  73. package/dist/esm/types/{util → ui}/customize.d.ts +2 -3
  74. package/dist/esm/types/ui/index.d.ts +6 -6
  75. package/dist/esm/types/ui/localizer.d.ts +5 -0
  76. package/dist/esm/types/util/index.d.ts +0 -1
  77. package/dist/index.d.ts +353 -142
  78. package/package.json +3 -1
  79. package/src/core/action.tsx +319 -233
  80. package/src/core/client.ts +6 -0
  81. package/src/core/index.ts +11 -8
  82. package/src/core/models.tsx +11 -4
  83. package/src/core/reducer.tsx +2 -1
  84. package/src/core/state.ts +68 -14
  85. package/src/core/useAddChatMutation.tsx +22 -0
  86. package/src/core/useAddMemberMutation.tsx +25 -0
  87. package/src/core/useFetchNextMutation.tsx +28 -0
  88. package/src/core/useGetAccountsQuery.tsx +33 -0
  89. package/src/core/useGetChatListQuery.tsx +33 -0
  90. package/src/core/useGetChatQuery.tsx +34 -0
  91. package/src/core/useGetMessagesQuery.tsx +35 -0
  92. package/src/core/useReadMonitor.tsx +8 -7
  93. package/src/core/useRemoveMemberMutation.tsx +23 -0
  94. package/src/core/useSendMutation.tsx +24 -0
  95. package/src/core/useSignalRMonitor.tsx +19 -5
  96. package/src/core/useUpdateChatNameMutation.tsx +23 -0
  97. package/src/{ui/styles → styles}/aside.scss +1 -1
  98. package/src/styles/chat.scss +222 -0
  99. package/src/styles/index.scss +79 -0
  100. package/src/styles/settings.scss +5 -0
  101. package/src/ui/AddChatButton.tsx +4 -8
  102. package/src/ui/Avatar.tsx +1 -1
  103. package/src/ui/ChatList/ChatList.tsx +42 -0
  104. package/src/ui/ChatList/ChatListItemBox.tsx +22 -0
  105. package/src/ui/ChatList/ChatListItemLastMessage.tsx +13 -0
  106. package/src/ui/ChatList/ChatListItemLastMessageAuthor.tsx +20 -0
  107. package/src/ui/ChatList/ChatListItemLastMessageContent.tsx +21 -0
  108. package/src/ui/ChatList/ChatListItemName.tsx +13 -0
  109. package/src/ui/ChatList/ChatListItemUnreadCount.tsx +12 -0
  110. package/src/ui/ChatList/index.ts +7 -0
  111. package/src/ui/ChatName.tsx +3 -8
  112. package/src/ui/ChatPanel/ChatBody.tsx +44 -0
  113. package/src/ui/ChatPanel/ChatHeader.tsx +33 -0
  114. package/src/ui/{ChatHeaderMembers.tsx → ChatPanel/ChatHeaderMembers.tsx} +5 -9
  115. package/src/ui/ChatPanel/ChatHeaderName.tsx +67 -0
  116. package/src/ui/ChatPanel/ChatMembersButton.tsx +21 -0
  117. package/src/ui/ChatPanel/ChatMembersPanel.tsx +117 -0
  118. package/src/ui/ChatPanel/ChatPanel.tsx +27 -0
  119. package/src/ui/ChatPanel/index.ts +6 -0
  120. package/src/ui/Chatify.tsx +78 -36
  121. package/src/ui/CreateChatPanel/CreateChatForm.tsx +36 -0
  122. package/src/ui/CreateChatPanel/CreateChatMemberInput.tsx +66 -0
  123. package/src/ui/CreateChatPanel/CreateChatNameInput.tsx +25 -0
  124. package/src/ui/CreateChatPanel/CreateChatPanel.tsx +33 -0
  125. package/src/ui/CreateChatPanel/index.ts +4 -0
  126. package/src/ui/Icon.tsx +18 -6
  127. package/src/ui/InputBox/InputBox.tsx +38 -0
  128. package/src/ui/InputBox/InputFilesBox.tsx +9 -0
  129. package/src/ui/InputBox/InputSubmitButtonBox.tsx +17 -0
  130. package/src/ui/InputBox/InputTextBox.tsx +50 -0
  131. package/src/ui/InputBox/index.ts +4 -0
  132. package/src/ui/Layout/Aside.tsx +10 -0
  133. package/src/ui/Layout/Body.tsx +10 -0
  134. package/src/ui/Layout/Footer.tsx +3 -0
  135. package/src/ui/Layout/Header.tsx +10 -0
  136. package/src/ui/Layout/Main.tsx +15 -0
  137. package/src/ui/Layout/index.ts +5 -0
  138. package/src/ui/Message/MessageAuthor.tsx +13 -0
  139. package/src/ui/Message/MessageBox.tsx +20 -0
  140. package/src/ui/Message/MessageContent.tsx +13 -0
  141. package/src/ui/Message/MessageInfoBox.tsx +25 -0
  142. package/src/ui/Message/MessageRow.tsx +24 -0
  143. package/src/ui/Message/MessageText.tsx +7 -0
  144. package/src/ui/Message/index.ts +6 -0
  145. package/src/ui/MessageReadObserver.tsx +45 -0
  146. package/src/ui/{LoadMore.tsx → Next.tsx} +16 -8
  147. package/src/ui/SendingMessage/SendingMessageBox.tsx +16 -0
  148. package/src/ui/SendingMessage/SendingMessageContent.tsx +13 -0
  149. package/src/ui/SendingMessage/SendingMessageInfoBox.tsx +13 -0
  150. package/src/ui/SendingMessage/SendingMessageText.tsx +7 -0
  151. package/src/ui/SendingMessage/index.ts +4 -0
  152. package/src/ui/SystemMessage/SystemMessageBox.tsx +20 -0
  153. package/src/ui/SystemMessage/SystemMessageRow.tsx +43 -0
  154. package/src/ui/SystemMessage/index.ts +2 -0
  155. package/src/{util → ui}/customize.tsx +5 -5
  156. package/src/ui/index.ts +6 -6
  157. package/src/ui/localizer.tsx +12 -0
  158. package/src/util/index.ts +0 -1
  159. package/dist/cjs/index.js +0 -2
  160. package/dist/cjs/index.js.map +0 -1
  161. package/dist/cjs/types/ChatifyContext.d.ts +0 -11
  162. package/dist/cjs/types/core/action.d.ts +0 -76
  163. package/dist/cjs/types/core/client.d.ts +0 -35
  164. package/dist/cjs/types/core/index.d.ts +0 -14
  165. package/dist/cjs/types/core/models.d.ts +0 -64
  166. package/dist/cjs/types/core/reducer.d.ts +0 -11
  167. package/dist/cjs/types/core/state.d.ts +0 -25
  168. package/dist/cjs/types/core/useAccounts.d.ts +0 -1
  169. package/dist/cjs/types/core/useAddChat.d.ts +0 -2
  170. package/dist/cjs/types/core/useAddMember.d.ts +0 -2
  171. package/dist/cjs/types/core/useAddMessage.d.ts +0 -5
  172. package/dist/cjs/types/core/useChatList.d.ts +0 -1
  173. package/dist/cjs/types/core/useLoadMore.d.ts +0 -3
  174. package/dist/cjs/types/core/useMessages.d.ts +0 -15
  175. package/dist/cjs/types/core/useMutation.d.ts +0 -12
  176. package/dist/cjs/types/core/useQuery.d.ts +0 -7
  177. package/dist/cjs/types/core/useReadMonitor.d.ts +0 -1
  178. package/dist/cjs/types/core/useRemoveMember.d.ts +0 -2
  179. package/dist/cjs/types/core/useSignalRMonitor.d.ts +0 -2
  180. package/dist/cjs/types/index.d.ts +0 -3
  181. package/dist/cjs/types/ui/AddChat.d.ts +0 -1
  182. package/dist/cjs/types/ui/AddChatButton.d.ts +0 -2
  183. package/dist/cjs/types/ui/Aside.d.ts +0 -1
  184. package/dist/cjs/types/ui/Avatar.d.ts +0 -6
  185. package/dist/cjs/types/ui/Chat.d.ts +0 -4
  186. package/dist/cjs/types/ui/ChatBody.d.ts +0 -4
  187. package/dist/cjs/types/ui/ChatHeader.d.ts +0 -4
  188. package/dist/cjs/types/ui/ChatHeaderMembers.d.ts +0 -5
  189. package/dist/cjs/types/ui/ChatHeaderSettingsButton.d.ts +0 -5
  190. package/dist/cjs/types/ui/ChatListItem.d.ts +0 -11
  191. package/dist/cjs/types/ui/ChatName.d.ts +0 -5
  192. package/dist/cjs/types/ui/ChatSettings.d.ts +0 -1
  193. package/dist/cjs/types/ui/Chatify.d.ts +0 -49
  194. package/dist/cjs/types/ui/Footer.d.ts +0 -2
  195. package/dist/cjs/types/ui/Header.d.ts +0 -2
  196. package/dist/cjs/types/ui/Icon.d.ts +0 -7
  197. package/dist/cjs/types/ui/InputForm.d.ts +0 -1
  198. package/dist/cjs/types/ui/LoadMore.d.ts +0 -4
  199. package/dist/cjs/types/ui/Main.d.ts +0 -1
  200. package/dist/cjs/types/ui/Message.d.ts +0 -18
  201. package/dist/cjs/types/ui/MessageSkeleton.d.ts +0 -4
  202. package/dist/cjs/types/ui/SendingMessage.d.ts +0 -10
  203. package/dist/cjs/types/ui/SystemMessage.d.ts +0 -8
  204. package/dist/cjs/types/ui/index.d.ts +0 -11
  205. package/dist/cjs/types/ui/localizer.d.ts +0 -32
  206. package/dist/cjs/types/util/customize.d.ts +0 -12
  207. package/dist/cjs/types/util/index.d.ts +0 -3
  208. package/dist/cjs/types/util/uniqBy.d.ts +0 -1
  209. package/dist/cjs/types/util/uniqId.d.ts +0 -1
  210. package/dist/esm/types/core/useAccounts.d.ts +0 -1
  211. package/dist/esm/types/core/useAddChat.d.ts +0 -2
  212. package/dist/esm/types/core/useAddMember.d.ts +0 -2
  213. package/dist/esm/types/core/useAddMessage.d.ts +0 -5
  214. package/dist/esm/types/core/useChat.d.ts +0 -3
  215. package/dist/esm/types/core/useChatList.d.ts +0 -1
  216. package/dist/esm/types/core/useLoadMore.d.ts +0 -3
  217. package/dist/esm/types/core/useMessages.d.ts +0 -15
  218. package/dist/esm/types/core/useMutation.d.ts +0 -12
  219. package/dist/esm/types/core/useQuery.d.ts +0 -7
  220. package/dist/esm/types/core/useRemoveMember.d.ts +0 -2
  221. package/dist/esm/types/ui/AddChat.d.ts +0 -1
  222. package/dist/esm/types/ui/Aside.d.ts +0 -1
  223. package/dist/esm/types/ui/Chat.d.ts +0 -4
  224. package/dist/esm/types/ui/ChatBody.d.ts +0 -4
  225. package/dist/esm/types/ui/ChatHeader.d.ts +0 -4
  226. package/dist/esm/types/ui/ChatHeaderMembers.d.ts +0 -5
  227. package/dist/esm/types/ui/ChatHeaderSettingsButton.d.ts +0 -5
  228. package/dist/esm/types/ui/ChatListItem.d.ts +0 -11
  229. package/dist/esm/types/ui/ChatSettings.d.ts +0 -1
  230. package/dist/esm/types/ui/Footer.d.ts +0 -2
  231. package/dist/esm/types/ui/Header.d.ts +0 -2
  232. package/dist/esm/types/ui/InputForm.d.ts +0 -1
  233. package/dist/esm/types/ui/LoadMore.d.ts +0 -4
  234. package/dist/esm/types/ui/Main.d.ts +0 -1
  235. package/dist/esm/types/ui/Message.d.ts +0 -18
  236. package/dist/esm/types/ui/SendingMessage.d.ts +0 -10
  237. package/dist/esm/types/ui/SystemMessage.d.ts +0 -8
  238. package/src/core/useAccounts.tsx +0 -11
  239. package/src/core/useAddChat.tsx +0 -12
  240. package/src/core/useAddMember.tsx +0 -12
  241. package/src/core/useAddMessage.tsx +0 -40
  242. package/src/core/useChat.tsx +0 -12
  243. package/src/core/useChatList.tsx +0 -10
  244. package/src/core/useLoadMore.tsx +0 -42
  245. package/src/core/useMessages.tsx +0 -23
  246. package/src/core/useMutation.tsx +0 -48
  247. package/src/core/useQuery.tsx +0 -45
  248. package/src/core/useRemoveMember.tsx +0 -12
  249. package/src/ui/AddChat.tsx +0 -55
  250. package/src/ui/Aside.tsx +0 -41
  251. package/src/ui/Chat.tsx +0 -26
  252. package/src/ui/ChatBody.tsx +0 -43
  253. package/src/ui/ChatHeader.tsx +0 -33
  254. package/src/ui/ChatHeaderSettingsButton.tsx +0 -26
  255. package/src/ui/ChatListItem.tsx +0 -101
  256. package/src/ui/ChatSettings.tsx +0 -59
  257. package/src/ui/Footer.tsx +0 -7
  258. package/src/ui/Header.tsx +0 -14
  259. package/src/ui/InputForm.tsx +0 -51
  260. package/src/ui/Main.tsx +0 -16
  261. package/src/ui/Message.tsx +0 -118
  262. package/src/ui/SendingMessage.tsx +0 -50
  263. package/src/ui/SystemMessage.tsx +0 -32
  264. package/src/ui/styles/index.scss +0 -248
  265. /package/src/{ui/styles → styles}/keyframes.scss +0 -0
  266. /package/src/{ui/styles → styles}/mixins.scss +0 -0
  267. /package/src/{ui/styles → styles}/variables.scss +0 -0
@@ -0,0 +1,50 @@
1
+ import { Input } from 'antd';
2
+ import { customize } from '../customize';
3
+ import isHotkey from 'is-hotkey';
4
+ import { memo, useCallback } from 'react';
5
+ import { useLocalizer } from '../localizer';
6
+
7
+ export interface TextInputBoxProps {
8
+ value: string;
9
+ onChange: (value: string) => void;
10
+ onSend: (value: string) => void;
11
+ }
12
+
13
+ const isSend = isHotkey('ctrl+enter');
14
+
15
+ const AUTO_SIZE = { maxRows: 5 };
16
+
17
+ export const InputTextBox = customize(
18
+ 'InputTextBox',
19
+ memo((props: TextInputBoxProps) => {
20
+ const { value, onChange, onSend } = props;
21
+ const localizer = useLocalizer();
22
+
23
+ const onInputChange = useCallback(
24
+ (e: React.ChangeEvent<HTMLTextAreaElement>) => onChange(e.target.value),
25
+ [onChange],
26
+ );
27
+
28
+ const onKeyDown = useCallback(
29
+ (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
30
+ if (isSend(e)) {
31
+ onSend(value);
32
+ }
33
+ },
34
+ [onSend, value],
35
+ );
36
+
37
+ return (
38
+ <div className="wxchtf-text-input-box">
39
+ <Input.TextArea
40
+ value={value}
41
+ onChange={onInputChange}
42
+ autoSize={AUTO_SIZE}
43
+ className="wxchtf-text-input-textarea"
44
+ placeholder={localizer.input.placeholder()}
45
+ onKeyDown={onKeyDown}
46
+ />
47
+ </div>
48
+ );
49
+ }),
50
+ );
@@ -0,0 +1,4 @@
1
+ export * from './InputBox';
2
+ export * from './InputFilesBox';
3
+ export * from './InputSubmitButtonBox';
4
+ export * from './InputTextBox';
@@ -0,0 +1,10 @@
1
+ import { customize } from '../customize';
2
+ import { ChatList } from '../ChatList';
3
+
4
+ export const Aside = customize('Aside', () => {
5
+ return (
6
+ <div className="wxchtf-aside">
7
+ <ChatList />
8
+ </div>
9
+ );
10
+ });
@@ -0,0 +1,10 @@
1
+ import { customize } from '../customize';
2
+ import { Aside } from './Aside';
3
+ import { Main } from './Main';
4
+
5
+ export const Body = customize('Body', () => (
6
+ <div className="wxchtf-body">
7
+ <Aside />
8
+ <Main />
9
+ </div>
10
+ ));
@@ -0,0 +1,3 @@
1
+ import { customize } from '../customize';
2
+
3
+ export const Footer = customize('Footer', () => <div className="wxchtf-footer"></div>);
@@ -0,0 +1,10 @@
1
+ import { AddChatButton } from '../AddChatButton';
2
+ import { customize } from '../customize';
3
+
4
+ export const Header = customize('Header', () => {
5
+ return (
6
+ <div className="wxchtf-header">
7
+ <AddChatButton />
8
+ </div>
9
+ );
10
+ });
@@ -0,0 +1,15 @@
1
+ import { useSelect } from '../../core';
2
+ import { customize } from '../customize';
3
+ import { CreateChatPanel } from '../CreateChatPanel';
4
+ import { ChatPanel } from '../ChatPanel';
5
+
6
+ export const Main = customize('Main', () => {
7
+ const { view, chatId } = useSelect((x) => ({ view: x.ui.view, chatId: x.ui.chatId }), []);
8
+
9
+ return (
10
+ <div className="wxchtf-main">
11
+ {view === 'chat' && chatId && <ChatPanel id={chatId} key={chatId} />}
12
+ {view === 'new-chat' && <CreateChatPanel />}
13
+ </div>
14
+ );
15
+ });
@@ -0,0 +1,5 @@
1
+ export * from './Aside';
2
+ export * from './Header';
3
+ export * from './Footer';
4
+ export * from './Main';
5
+ export * from './Body';
@@ -0,0 +1,13 @@
1
+ import { customize } from '../customize';
2
+ import { Avatar } from '../Avatar';
3
+ import type { MessageBoxProps } from './MessageBox';
4
+
5
+ export const MessageAuthor = customize('MessageAuthor', (props: MessageBoxProps) => {
6
+ const { sentBy } = props.message;
7
+
8
+ return (
9
+ <div className="wxchtf-message-author">
10
+ <Avatar account={sentBy} />
11
+ </div>
12
+ );
13
+ });
@@ -0,0 +1,20 @@
1
+ import { useRef } from 'react';
2
+ import { Message } from '../../core';
3
+ import { customize } from '../customize';
4
+ import { MessageReadObserver } from '../MessageReadObserver';
5
+ import { MessageRow } from './MessageRow';
6
+
7
+ export interface MessageBoxProps {
8
+ message: Message;
9
+ }
10
+
11
+ export const MessageBox = customize('MessageBox', (props: MessageBoxProps) => {
12
+ const ref = useRef<HTMLDivElement | null>(null);
13
+
14
+ return (
15
+ <>
16
+ <MessageReadObserver messageRef={ref} {...props} />
17
+ <MessageRow containerRef={ref} {...props} />
18
+ </>
19
+ );
20
+ });
@@ -0,0 +1,13 @@
1
+ import { customize } from '../customize';
2
+ import { MessageText } from './MessageText';
3
+ import { MessageInfoBox } from './MessageInfoBox';
4
+ import type { MessageBoxProps } from './MessageBox';
5
+
6
+ export const MessageContent = customize('MessageContent', (props: MessageBoxProps) => {
7
+ return (
8
+ <div className="wxchtf-message-content">
9
+ <MessageText {...props} />
10
+ <MessageInfoBox {...props} />
11
+ </div>
12
+ );
13
+ });
@@ -0,0 +1,25 @@
1
+ import { useMe } from '../../ChatifyContext';
2
+ import { useSelect } from '../../core';
3
+ import { customize } from '../customize';
4
+ import { useLocalizer } from '../localizer';
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 me = useMe();
11
+ const my = sentBy.id === me;
12
+ const localizer = useLocalizer();
13
+ const reading = useSelect((x) => x.queue.read.queued.includes(id), []);
14
+
15
+ return (
16
+ <div className="wxchtf-message-info-box">
17
+ <div className="wxchtf-message-sent-at">{localizer.timestamp(sentAt)}</div>
18
+ {!my && (
19
+ <div className="wxchtf-message-read-box">
20
+ {reading ? localizer.message.reading() : localizer.message.read()}
21
+ </div>
22
+ )}
23
+ </div>
24
+ );
25
+ });
@@ -0,0 +1,24 @@
1
+ import { useMe } from '../../ChatifyContext';
2
+ import { Ref } from 'react';
3
+ import { customize } from '../customize';
4
+ import { MessageAuthor } from './MessageAuthor';
5
+ import { MessageContent } from './MessageContent';
6
+ import { MessageBoxProps } from './MessageBox';
7
+
8
+ export interface MessageRowProps extends MessageBoxProps {
9
+ containerRef?: Ref<HTMLDivElement>;
10
+ }
11
+
12
+ export const MessageRow = customize('MessageRow', (props: MessageRowProps) => {
13
+ const { message, containerRef } = props;
14
+ const { sentBy } = message;
15
+ const me = useMe();
16
+ const my = sentBy.id === me;
17
+
18
+ return (
19
+ <div ref={containerRef} className={'wxchtf-message' + (my ? ' --my' : '')}>
20
+ <MessageAuthor {...props} />
21
+ <MessageContent {...props} />
22
+ </div>
23
+ );
24
+ });
@@ -0,0 +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
+ });
@@ -0,0 +1,6 @@
1
+ export * from './MessageAuthor';
2
+ export * from './MessageBox';
3
+ export * from './MessageContent';
4
+ export * from './MessageInfoBox';
5
+ export * from './MessageRow';
6
+ export * from './MessageText';
@@ -0,0 +1,45 @@
1
+ import { FC, RefObject, useEffect, useMemo, useRef } from 'react';
2
+ import { useDispatch, useSelect } from '../core';
3
+ import { customize } from './customize';
4
+ import { MessageBoxProps } from './Message/MessageBox';
5
+
6
+ export interface MessageReadObserverProps extends MessageBoxProps {
7
+ messageRef: RefObject<HTMLDivElement | null>;
8
+ }
9
+
10
+ export const MessageReadObserver = customize<FC<MessageReadObserverProps>>('MessageReadObserver', (props) => {
11
+ const { message, messageRef } = props;
12
+ const dispatch = useDispatch();
13
+ const isRead = useSelect((x) => {
14
+ const lastReadMessageId = x.query.chatList.data!.find((x) => x.id === message.chatId)!.lastReadMessageId;
15
+ return lastReadMessageId != null && message.id.localeCompare(lastReadMessageId) <= 0;
16
+ }, []);
17
+
18
+ const readRef = useRef(isRead);
19
+
20
+ useEffect(() => {
21
+ readRef.current = readRef.current || isRead;
22
+ }, [isRead]);
23
+
24
+ const observer = useMemo(
25
+ () =>
26
+ new IntersectionObserver(([entry]) => {
27
+ if (entry.isIntersecting && !readRef.current) {
28
+ readRef.current = true;
29
+ dispatch({ type: 'read', data: { id: message.id, timestamp: new Date().getTime() } });
30
+ }
31
+ }),
32
+
33
+ // eslint-disable-next-line react-hooks/exhaustive-deps
34
+ [],
35
+ );
36
+
37
+ useEffect(() => {
38
+ observer.observe(messageRef.current!);
39
+ return () => observer.disconnect();
40
+
41
+ // eslint-disable-next-line react-hooks/exhaustive-deps
42
+ }, [observer]);
43
+
44
+ return <></>;
45
+ });
@@ -1,19 +1,27 @@
1
1
  import { useEffect, useMemo, useRef, useState } from 'react';
2
- import { useLoadMore } from '../core';
2
+ import { useFetchNextMutation } from '../core';
3
3
  import { MessageSkeleton } from './MessageSkeleton';
4
4
 
5
- export interface LoadMoreProps {
5
+ export interface NextProps {
6
6
  chatId: string;
7
7
  }
8
8
 
9
- export function LoadMore(props: LoadMoreProps) {
9
+ export function Next(props: NextProps) {
10
10
  const { chatId } = props;
11
- const [loadMore, { isFetching }] = useLoadMore({ chatId });
11
+ const [fetchNext, { isFetching }] = useFetchNextMutation({ chatId });
12
12
  const [intersecting, setIntersecting] = useState(false);
13
13
  const ref = useRef<HTMLDivElement | null>(null);
14
+ const timerRef = useRef<NodeJS.Timer>();
14
15
 
15
16
  const observer = useMemo(
16
- () => new IntersectionObserver(([entry]) => setIntersecting((prev) => prev || entry.isIntersecting)),
17
+ () =>
18
+ new IntersectionObserver(([entry]) => {
19
+ if (entry.isIntersecting) {
20
+ timerRef.current = setTimeout(() => setIntersecting(true), 200);
21
+ } else {
22
+ clearTimeout(timerRef.current!);
23
+ }
24
+ }),
17
25
  [],
18
26
  );
19
27
 
@@ -27,14 +35,14 @@ export function LoadMore(props: LoadMoreProps) {
27
35
  return;
28
36
  }
29
37
 
30
- loadMore();
38
+ fetchNext();
31
39
 
32
40
  // eslint-disable-next-line react-hooks/exhaustive-deps
33
41
  }, [intersecting]);
34
42
 
35
- if (isFetching) {
43
+ if (isFetching || intersecting) {
36
44
  return <MessageSkeleton count={4} />;
37
45
  }
38
46
 
39
- return <div ref={ref} />;
47
+ return <div className="wxchtf-next" ref={ref}></div>;
40
48
  }
@@ -0,0 +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
+ });
@@ -0,0 +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
+ });
@@ -0,0 +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
+ });
@@ -0,0 +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
+ });
@@ -0,0 +1,4 @@
1
+ export * from './SendingMessageBox';
2
+ export * from './SendingMessageContent';
3
+ export * from './SendingMessageInfoBox';
4
+ export * from './SendingMessageText';
@@ -0,0 +1,20 @@
1
+ import { useRef } from 'react';
2
+ import { customize } from '../customize';
3
+ import { Message } from '../../core';
4
+ import { MessageReadObserver } from '../MessageReadObserver';
5
+ import { SystemMessageRow } from './SystemMessageRow';
6
+
7
+ export interface SystemMessageBoxProps {
8
+ message: Message;
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
+ });
@@ -0,0 +1,43 @@
1
+ import { Ref } from 'react';
2
+ import { customize } from '../customize';
3
+ import { Localizer, useLocalizer } from '../localizer';
4
+ import { Message } from '../../core';
5
+
6
+ export interface SystemMessageRowProps {
7
+ message: Message;
8
+ containerRef?: Ref<HTMLDivElement>;
9
+ }
10
+
11
+ export function formatSystemMessage(localizer: Localizer, text: string): React.ReactNode {
12
+ if (text === 'chatify://chat-created') {
13
+ return localizer.system.chatCreated();
14
+ }
15
+
16
+ if (text.startsWith('chatify://member-added')) {
17
+ return localizer.system.memberAdded();
18
+ }
19
+
20
+ if (text.startsWith('chatify://member-removed')) {
21
+ return localizer.system.memberRemoved();
22
+ }
23
+
24
+ if (text.startsWith('chatify://chat-name-changed::')) {
25
+ const data = JSON.parse(text.substring('chatify://chat-name-changed::'.length));
26
+ return localizer.system.chatNameChanged(data.newName);
27
+ }
28
+
29
+ return text;
30
+ }
31
+
32
+ export const SystemMessageRow = customize('SystemMessageRow', (props: SystemMessageRowProps) => {
33
+ const { message, containerRef } = props;
34
+ const { text, sentAt } = message;
35
+ const localizer = useLocalizer();
36
+
37
+ return (
38
+ <div ref={containerRef} className="wxchtf-system-message">
39
+ <div className="wxchtf-text">{formatSystemMessage(localizer, text)}</div>
40
+ <div className="wxchtf-timestamp">{localizer.timestamp(sentAt)}</div>
41
+ </div>
42
+ );
43
+ });
@@ -0,0 +1,2 @@
1
+ export * from './SystemMessageBox';
2
+ export * from './SystemMessageRow';
@@ -1,8 +1,7 @@
1
1
  import React, { FC, PropsWithChildren, useContext } from 'react';
2
2
 
3
- export type Customizable<TComponent extends React.ComponentType<any>, TKey extends string> = TComponent & {
3
+ export type Customizable<TComponent extends React.ComponentType<any>> = TComponent & {
4
4
  Component: TComponent;
5
- key: TKey;
6
5
  };
7
6
 
8
7
  const CustomizeContext = React.createContext<CustomizeProviderValue>(null!);
@@ -21,10 +20,10 @@ function useCustom<TComponent extends React.ComponentType>(key: string): TCompon
21
20
  return value[key] as TComponent | null | undefined;
22
21
  }
23
22
 
24
- export function customize<TComponent extends React.ComponentType<any>, TKey extends string>(
25
- key: TKey,
23
+ export function customize<TComponent extends React.ComponentType<any>>(
24
+ key: string,
26
25
  Component: TComponent,
27
- ): Customizable<TComponent, TKey> {
26
+ ): TComponent extends React.ComponentType<infer X> ? Customizable<React.ComponentType<X>> : never {
28
27
  const Result: FC<any> = React.forwardRef<TComponent, any>((props: any, forwardRef) => {
29
28
  const Custom = useCustom(key);
30
29
 
@@ -39,6 +38,7 @@ export function customize<TComponent extends React.ComponentType<any>, TKey exte
39
38
  return <Component {...props} ref={forwardRef} />;
40
39
  });
41
40
 
41
+ Component.displayName = Component.displayName || key;
42
42
  Result.displayName = 'Customizable.' + Component.displayName;
43
43
 
44
44
  return Object.assign(Result, { key, Component }) as any;
package/src/ui/index.ts CHANGED
@@ -2,10 +2,10 @@ export * from './Chatify';
2
2
  export * from './Avatar';
3
3
  export * from './localizer';
4
4
  export * from './AddChatButton';
5
- export * from './Header';
6
- export * from './ChatHeader';
7
- export * from './ChatHeaderMembers';
8
- export * from './ChatListItem';
9
- export * from './Message';
10
- export * from './SystemMessage';
5
+ export * from './Layout/Header';
6
+ export * from './ChatPanel/ChatHeader';
7
+ export * from './ChatPanel/ChatHeaderMembers';
8
+ export * from './ChatList/ChatListItemBox';
9
+ export * from './Message/MessageBox';
10
+ export * from './SystemMessage/SystemMessageBox';
11
11
  export * from './Icon';
@@ -6,6 +6,8 @@ export interface Localizer {
6
6
  system: {
7
7
  chatCreated: () => string;
8
8
  memberAdded: () => string;
9
+ memberRemoved: () => string;
10
+ chatNameChanged: (newName: string) => string;
9
11
  };
10
12
  message: {
11
13
  read: () => React.ReactNode;
@@ -29,6 +31,10 @@ export interface Localizer {
29
31
  input: {
30
32
  placeholder: () => string;
31
33
  };
34
+
35
+ settings: {
36
+ members: () => string;
37
+ };
32
38
  }
33
39
 
34
40
  export const LocalizerContext = React.createContext<Localizer>(null!);
@@ -60,9 +66,15 @@ export const defaultLocalizer: Localizer = {
60
66
  system: {
61
67
  chatCreated: () => 'Chat created',
62
68
  memberAdded: () => 'New member added',
69
+ memberRemoved: () => 'Member removed',
70
+ chatNameChanged: (newName: string) => `Chat name changed to '${newName}'`,
63
71
  },
64
72
 
65
73
  input: {
66
74
  placeholder: () => 'Start typing (Ctrl/⌘Cmd + Enter to send) ...',
67
75
  },
76
+
77
+ settings: {
78
+ members: () => 'Members',
79
+ },
68
80
  };
package/src/util/index.ts CHANGED
@@ -1,3 +1,2 @@
1
1
  export * from './uniqBy';
2
2
  export * from './uniqId';
3
- export * from './customize';
package/dist/cjs/index.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";var e=require("react/jsx-runtime"),t=require("@microsoft/signalr"),s=require("react"),a=require("shallow-equal"),n=require("antd"),i=require("dayjs"),c=require("@ant-design/icons"),r=require("is-hotkey"),d=require("@ant-design/icons/SendOutlined"),o=require("@ant-design/icons/FileAddOutlined");function u(e){var t=Object.create(null);return e&&Object.keys(e).forEach((function(s){if("default"!==s){var a=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(t,s,a.get?a:{enumerable:!0,get:function(){return e[s]}})}})),t.default=e,Object.freeze(t)}var l=u(t);function h(e,t,s,a){return new(s||(s=Promise))((function(n,i){function c(e){try{d(a.next(e))}catch(e){i(e)}}function r(e){try{d(a.throw(e))}catch(e){i(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(c,r)}d((a=a.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const m={hubUri:"/api/chatify/hub",headersFactory:()=>Promise.resolve({})},g=["chatify://new-message","chatify://chat-created","chatify://read","chatify://member-added","chatify://member-removed"];function x(e,t,s){const a=s((e=Object.assign(Object.assign({},e),{query:Object.assign({},e.query)})).query[t]);return a&&(e.query[t]=a),e}function j(e,t,s){const a=s((e=Object.assign(Object.assign({},e),{mutation:Object.assign({},e.mutation)})).mutation[t]);return a&&(e.mutation[t]=a),e}const b={query_fetch:(e,{key:t})=>x(e,t,(e=>Object.assign(Object.assign({},e),{isFetching:!0,uninitialized:!1}))),query_resolve:(e,{key:t,data:s})=>x(e,t,(e=>Object.assign(Object.assign({},e),{isFetching:!1,error:void 0,data:s}))),query_reject:(e,{key:t,error:s})=>x(e,t,(e=>Object.assign(Object.assign({},e),{isFetching:!1,error:s}))),mutation_fetch:(e,{key:t})=>j(e,t,(e=>Object.assign(Object.assign({},e),{isFetching:!0}))),mutation_resolve:(e,{key:t})=>j(e,t,(e=>Object.assign(Object.assign({},e),{isFetching:!1,error:void 0}))),mutation_reject:(e,{key:t,error:s})=>j(e,t,(e=>Object.assign(Object.assign({},e),{isFetching:!1,error:s}))),update:(e,{mutation:t})=>t(e),chat_open:(e,{chatId:t})=>Object.assign(Object.assign({},e),{ui:Object.assign(Object.assign({},e.ui),{view:"chat",chatId:t})}),new_chat_open:e=>Object.assign(Object.assign({},e),{ui:Object.assign(Object.assign({},e.ui),{view:"new-chat",chatId:void 0})}),chat_settings_open:(e,{chatId:t})=>Object.assign(Object.assign({},e),{ui:Object.assign(Object.assign({},e.ui),{view:"chat-settings",chatId:t})}),message_received:(e,{message:t,requestId:s})=>{var a;return void 0!==(null===(a=e.query["messages."+t.chatId])||void 0===a?void 0:a.data)&&(e=Object.assign(Object.assign({},e),{query:Object.assign(Object.assign({},e.query),{["messages."+t.chatId]:Object.assign(Object.assign({},e.query["messages."+t.chatId]),{data:[Object.assign({type:"message"},t),...e.query["messages."+t.chatId].data].filter((e=>"sending"!==e.type||e.requestId!==s))})})})),void 0!==e.query["chat-list"].data&&(e=Object.assign(Object.assign({},e),{query:Object.assign(Object.assign({},e.query),{"chat-list":Object.assign(Object.assign({},e.query["chat-list"]),{data:e.query["chat-list"].data.map((e=>e.id===t.chatId?Object.assign(Object.assign({},e),{message:t,unreadCount:t.read?e.unreadCount:e.unreadCount+1}):e))})})})),e},chat_created:(e,{chat:t})=>{var s;return void 0===(null===(s=e.query["chat-list"])||void 0===s?void 0:s.data)?e:Object.assign(Object.assign({},e),{query:Object.assign(Object.assign({},e.query),{"chat-list":Object.assign(Object.assign({},e.query["chat-list"]),{data:[t,...e.query["chat-list"].data]})})})},read:(e,{id:t,timestamp:s})=>Object.assign(Object.assign({},e),{read:Object.assign(Object.assign({},e.read),{queued:[...e.read.queued,t],timestamp:s})}),read_send:(e,{ids:t})=>Object.assign(Object.assign({},e),{read:Object.assign(Object.assign({},e.read),{queued:e.read.queued.filter((e=>!t.includes(e))),sent:[...e.read.sent,...t]})}),read_reject:(e,{ids:t,timestamp:s})=>Object.assign(Object.assign({},e),{read:Object.assign(Object.assign({},e.read),{queued:[...e.read.queued,...t],sent:e.read.sent.filter((e=>!t.includes(e))),timestamp:s})}),read_received:(e,{events:t})=>{var s,a;const n=t.map((e=>e.messageId));e=Object.assign(Object.assign({},e),{query:Object.assign({},e.query),read:Object.assign(Object.assign({},e.read),{sent:e.read.sent.filter((e=>!n.includes(e)))})}),Object.keys(e.query).filter((e=>e.startsWith("messages."))).forEach((t=>{var s;e.query[t]=Object.assign({},e.query[t]);const a=e.query[t];a.data=null===(s=a.data)||void 0===s?void 0:s.map((e=>"message"===e.type&&n.includes(e.id)?Object.assign(Object.assign({},e),{read:!0}):e))})),e.query["chat-list"]=Object.assign({},e.query["chat-list"]);const i=e.query["chat-list"];return i.data=null===(s=i.data)||void 0===s?void 0:s.map((e=>n.includes(e.message.id)?Object.assign(Object.assign({},e),{message:Object.assign(Object.assign({},e.message),{read:!0})}):e)),i.data=null===(a=i.data)||void 0===a?void 0:a.map((e=>Object.assign(Object.assign({},e),{unreadCount:e.unreadCount-t.filter((t=>t.chatId===e.id)).length}))),e},member_added:(e,{chatId:t,chatName:s,account:a,me:n,message:i})=>{var c,r;if(void 0!==(null===(c=(e=Object.assign(Object.assign({},e),{query:Object.assign({},e.query)})).query["chat."+t])||void 0===c?void 0:c.data)&&(e.query["chat."+t]=Object.assign(Object.assign({},e.query["chat."+t]),{data:Object.assign({},e.query["chat."+t].data)}),e.query["chat."+t].data.members=[...e.query["chat."+t].data.members,a]),void 0!==(null===(r=e.query["messages."+t])||void 0===r?void 0:r.data)&&(e.query["messages."+t]=Object.assign(Object.assign({},e.query["messages."+t]),{data:[Object.assign({type:"message"},i),...e.query["messages."+t].data]})),a.id!==n&&void 0!==e.query["chat-list"].data&&(e.query["chat-list"]=Object.assign({},e.query["chat-list"]),e.query["chat-list"].data=e.query["chat-list"].data.map((e=>e.id===t?Object.assign(Object.assign({},e),{message:Object.assign({},i)}):e))),a.id===n&&void 0!==e.query["chat-list"].data){const a={id:t,name:s,message:Object.assign({},i),unreadCount:0};e.query["chat-list"]=Object.assign(Object.assign({},e.query["chat-list"]),{data:[...e.query["chat-list"].data,a]})}return e},member_removed:(e,{chatId:t,accountId:s,deleteHistory:a,me:n})=>{var i,c,r,d,o;return void 0!==(null===(i=(e=Object.assign(Object.assign({},e),{query:Object.assign({},e.query)})).query["chat."+t])||void 0===i?void 0:i.data)&&(e.query["chat."+t]=Object.assign(Object.assign({},e.query["chat."+t]),{data:Object.assign({},e.query["chat."+t].data)}),e.query["chat."+t].data.members=e.query["chat."+t].data.members.filter((e=>e.id!==s))),s===n&&a&&(null===(c=e.query["chat-list"])||void 0===c?void 0:c.data)&&(e.query["chat-list"]=Object.assign({},e.query["chat-list"]),e.query["chat-list"].data=e.query["chat-list"].data.filter((e=>e.id!==t))),s===n&&a&&(null===(r=e.query["chat-list"])||void 0===r?void 0:r.data)&&e.ui.chatId===t&&(e.ui=Object.assign(Object.assign({},e.ui),{chatId:null===(o=null===(d=e.query["chat-list"])||void 0===d?void 0:d.data.at(0))||void 0===o?void 0:o.id})),e}},y={ui:{},query:{},mutation:{},read:{queued:[],sent:[],timestamp:0}};function f(){const e=s.useRef(y),t=s.useRef([]),a=s.useCallback((s=>{const a=function(e,t){const s=b[t.type](e,t.data);return console.debug("[Chatify]: ",t,s),s}(e.current,s);e.current!==a&&(e.current=a,t.current.forEach((e=>e(a))))}),[]),n=s.useCallback((e=>(t.current.push(e),()=>{t.current=t.current.filter((t=>t!==e))})),[]);return[e,a,n]}const p=s.createContext(null);function v({children:t}){const s=f();return e.jsx(p.Provider,{value:s,children:t})}function O(){return s.useContext(p)[1]}function q(){const[e]=s.useContext(p);return e}function C(e,t){const[n,,i]=s.useContext(p),c=s.useRef(e(n.current)),[r,d]=s.useState(c.current);return s.useEffect((()=>{const t=e(n.current);return a.shallowEqual(c.current,t)||(c.current=t,d(t)),i((t=>{const s=e(t);a.shallowEqual(s,c.current)||(c.current=s,d(s))}))}),[]),r}function I(e,t){const a=O();s.useEffect((()=>{let s=[];return t.connect().then((()=>{s.push(t.subscribe("chatify://new-message",(([e,t])=>{a({type:"message_received",data:{message:e,requestId:t}})}))),s.push(t.subscribe("chatify://chat-created",(([e,t])=>{a({type:"chat_created",data:{chat:e,requestId:t}})}))),s.push(t.subscribe("chatify://read",(([e])=>{a({type:"read_received",data:{events:e}})}))),s.push(t.subscribe("chatify://member-added",(([t,s,n,i])=>{a({type:"member_added",data:{chatId:t,chatName:s,account:n,me:e,message:i}})}))),s.push(t.subscribe("chatify://member-removed",(([t,s,n])=>{a({type:"member_removed",data:{chatId:t,accountId:s,deleteHistory:n,me:e}})})))})),()=>{s.forEach((e=>e()))}}),[])}const w=s.createContext(null),N=s.createContext(null);function k(){return s.useContext(N)}function _(){return s.useContext(w)}function M(t){const{children:s}=t;return I(_(),k()),e.jsx(e.Fragment,{children:s})}const S={uninitialized:!1,isFetching:!0,data:void 0,error:void 0};function F(e,t){return e.query[t]}function R(e){const{key:t,queryFn:a}=e,n=q(),i=O(),c=function(e){return C((t=>F(t,e)))}(e.key);return s.useEffect((()=>{F(n.current,t)||(i({type:"query_fetch",data:{key:t}}),a().then((e=>i({type:"query_resolve",data:{key:t,data:e}}))).catch((e=>i({type:"query_reject",data:{key:t,error:e}}))))}),[]),null!=c?c:S}function B(e){const{chatId:t}=e,s=k();return R({key:"chat."+t,queryFn:()=>s.chat(t)})}function A(){const e=k();return R({key:"chat-list",queryFn:()=>e.chats()})}const L={isFetching:!1,error:void 0};function E(e){const{key:t,queryFn:a,onQueryStarted:n}=e,i=O(),c=q(),r=C((t=>t.mutation[e.key])),d=s.useCallback((e=>{i({type:"mutation_fetch",data:{key:t}});const s=a(e);s.then((()=>{i({type:"mutation_resolve",data:{key:t}})})).catch((e=>i({type:"mutation_reject",data:{key:t,error:e}}))),n&&n(e,{promise:s,state:c.current,updateState:e=>{i({type:"update",data:{mutation:e}})}})}),[]);return[d,null!=r?r:L]}function H({chatId:e}){const t=q(),s=k();return E({key:"more."+e,queryFn:()=>s.messages({chatId:e,skip:t.current.query["messages."+e].data.filter((e=>"message"===e.type)).length,take:15}),onQueryStarted:(t,{promise:s,updateState:a})=>h(this,void 0,void 0,(function*(){const t=yield s;a((s=>{var a;(s=Object.assign({},s)).query=Object.assign({},s.query),s.query["messages."+e]=Object.assign({},s.query["messages."+e]);const n=s.query["messages."+e];return n.data=null===(a=n.data)||void 0===a?void 0:a.filter((e=>"more"!==e.type)),n.data=[...n.data,...t.map((e=>Object.assign(Object.assign({type:"message"},e),{proceed:!0})))],15===t.length&&(n.data=[...n.data,{type:"more"}]),s}))}))})}function T(e){const{chatId:t}=e,s=k();return R({key:"messages."+t,queryFn:()=>s.messages({chatId:t,skip:0,take:15}).then((e=>{const t=e.map((e=>Object.assign(Object.assign({type:"message"},e),{proceed:!0})));return 15===e.length?[...t,{type:"more"}]:t}))})}function P(){const e=k();return R({key:"accounts",queryFn:()=>e.accounts()})}function z(){const e=k();return E({key:"add-chat",queryFn:t=>e.addChat(t)})}function U(){const e=k(),[t,a]=C((e=>[e.read.queued,e.read.timestamp])),n=O(),i=s.useRef(null);s.useEffect((()=>{0!==t.length&&(i.current&&clearTimeout(i.current),i.current=setTimeout((()=>{n({type:"read_send",data:{ids:t}}),e.read({ids:t}).catch((()=>n({type:"read_reject",data:{ids:t,timestamp:(new Date).getTime()}})))}),100))}),[a])}function D(){const e=k();return E({key:"add-member",queryFn:t=>e.addMember(t)})}function $(){const e=k();return E({key:"remove-member",queryFn:t=>e.removeMember(t)})}const K=s.createContext(null);function Q(){return s.useContext(K)}const W={timestamp:e=>i(e).format("HH:mm"),message:{read:()=>"Read",reading:()=>"Reading...",sending:()=>"Sending..."},addChat:{title:()=>"Add chat",name:{label:()=>"Name",required:()=>"Name is required",max250:()=>"Max 250 characters allowed"},members:{label:()=>"Members",required:()=>"Members is required"},submitBtn:()=>"Submit"},system:{chatCreated:()=>"Chat created",memberAdded:()=>"New member added"},input:{placeholder:()=>"Start typing (Ctrl/⌘Cmd + Enter to send) ..."}};function G(){return Date.now().toString(36)+Math.random().toString(36).substring(2)}const J=s.createContext(null);function V(t){const{children:s,value:a}=t;return e.jsx(J.Provider,{value:a,children:s})}function X(t,a){const n=s.forwardRef(((n,i)=>{const c=function(e){return s.useContext(J)[e]}(t);return null===c?null:c?e.jsx(c,Object.assign({},n,{ref:i})):e.jsx(a,Object.assign({},n,{ref:i}))}));return n.displayName="Customizable."+a.displayName,Object.assign(n,{key:t,Component:a})}function Y(e,t){return"chatify://chat-created"===t?e.system.chatCreated():t.startsWith("chatify://member-added::")?e.system.memberAdded():t}const Z=X("SystemMessage",(t=>{const{text:s,sentAt:a}=t,n=Q();return e.jsxs("div",{className:"wxchtf-system-message",children:[e.jsx("div",{className:"wxchtf-text",children:Y(n,s)}),e.jsx("div",{className:"wxchtf-timestamp",children:n.timestamp(a)})]})})),ee=t=>{const{account:s}=t;return e.jsx(n.Avatar,{src:s.avatar})};ee.displayName="Avatar";const te=X("Avatar",ee),se=t=>{const{name:s}=t;return e.jsx(e.Fragment,{children:s})};se.displayName="ChatName";const ae=X("ChatName",se),ne=t=>{const{name:s}=t.chat;return e.jsx("div",{className:"wxchtf-chat-name",children:e.jsx(ae,{name:s})})};ne.displayName="ChatListItemName";const ie=X("ChatListItemName",ne),ce=t=>{const{unreadCount:s}=t.chat;return s<=0?null:e.jsx("div",{className:"wxchtf-unread-count",children:s})};ce.displayName="ChatListItemUnreadCount";const re=X("ChatListItemUnreadCount",ce),de=t=>e.jsxs("div",{className:"wxchtf-chat-last",children:[e.jsx(ue,Object.assign({},t)),e.jsx(le,Object.assign({},t))]});de.displayName="ChatListItemLastMessage";const oe=X("ChatListItemLastMessage",de),ue=X("ChatListItemLastMessageAuthor",(t=>{const{message:s}=t.chat;return"chatify::system"===s.sentBy.id?null:e.jsxs("div",{className:"wxchtf-chat-last-author",children:[e.jsx(te,{account:s.sentBy})," ",s.sentBy.name]})})),le=X("ChatListItemLastMessageContent",(t=>{const{message:s}=t.chat,a=Q();return e.jsx("div",{className:"wxchtf-chat-last-message",children:"chatify::system"===s.sentBy.id?Y(a,s.text):s.text})})),he=t=>{const{message:s}=t.chat;return e.jsxs("div",{className:"wxchtf-chat"+(s.read?"":" --unread"),children:[e.jsx(ie,Object.assign({},t)),e.jsx(re,Object.assign({},t)),e.jsx(oe,Object.assign({},t))]})};he.displayName="ChatListItemBox";const me=X("ChatListItemBox",he);function ge(){const t=C((e=>e.ui.chatId)),a=O(),i=s.useMemo((()=>t?[t]:[]),[t]),c=s.useCallback((e=>a({type:"chat_open",data:{chatId:e.selectedKeys[0]}})),[a]),{data:r}=A(),d=s.useMemo((()=>r?r.map((t=>({key:t.id,label:e.jsx(me,{chat:t})}))):[]),[r]);return s.useEffect((()=>{!t&&r&&r.length>0&&a({type:"chat_open",data:{chatId:r[0].id}})}),[r,a]),e.jsx("div",{className:"wxchtf-aside",children:r&&e.jsx(n.Menu,{className:"wxchtf-chats",selectedKeys:i,onSelect:c,items:d})})}function xe(){const[t,{isFetching:a}]=z(),{data:i,isFetching:c}=P(),r=Q(),d=s.useMemo((()=>null==i?void 0:i.map((e=>({value:e.id,label:e.name})))),[i]),o=s.useCallback((e=>t({name:e.name,members:e.members,requestId:G()})),[t]);return e.jsxs("div",{className:"wxchtf-add-chat",children:[e.jsx("h3",{children:r.addChat.title()}),e.jsxs(n.Form,{onFinish:o,layout:"vertical",disabled:a,children:[e.jsx(n.Form.Item,{name:"name",label:r.addChat.name.label(),rules:[{required:!0,message:r.addChat.name.required()},{max:250,message:r.addChat.name.max250()}],children:e.jsx(n.Input,{})}),e.jsx(n.Form.Item,{name:"members",label:r.addChat.members.label(),rules:[{required:!0,message:r.addChat.members.required()}],children:e.jsx(n.Select,{mode:"multiple",loading:c,options:d})}),e.jsx(n.Button,{loading:a,type:"primary",block:!0,htmlType:"submit",children:r.addChat.submitBtn()})]})]})}const je=t=>{const{id:s}=t,{data:a}=B({chatId:s});return(null==a?void 0:a.members)?e.jsx(n.Avatar.Group,{maxCount:5,children:a.members.map((t=>e.jsx(n.Tooltip,{title:t.name,children:e.jsx(n.Avatar,{src:t.avatar,children:t.name})},t.id)))}):null};je.displayName="ChatHeaderMembers";const be=X("ChatHeaderMembers",je),ye=t=>{const{id:a}=t,i=O(),r=s.useCallback((()=>i({type:"chat_settings_open",data:{chatId:a}})),[i]);return e.jsx(n.Button,{onClick:r,type:"link",icon:e.jsx(c.SettingOutlined,{})})};ye.displayName="ChatSettingsButton";const fe=X("ChatSettingsButton",ye);function pe(t){var s;const{id:a}=t,{data:i}=B({chatId:a}),c=C((e=>{var t;return null===(t=e.query["chat-list"].data)||void 0===t?void 0:t.find((e=>e.id===a))})),r=null!==(s=null==i?void 0:i.name)&&void 0!==s?s:null==c?void 0:c.name;return e.jsx("div",{className:"wxchtf-chat-header",children:e.jsxs(n.Row,{justify:"space-between",align:"middle",children:[e.jsx(n.Col,{className:"wxchtf-chat-name",children:r&&e.jsx(ae,{name:r})}),e.jsx(n.Col,{className:"wxchtf-chat-members",children:e.jsxs(n.Space,{align:"center",children:[e.jsx(be,{id:a}),e.jsx(fe,{id:a})]})})]})})}const ve=X("MessageAuthor",(t=>{const{sentBy:s}=t.message;return e.jsx("div",{className:"wxchtf-message-author",children:e.jsx(te,{account:s})})})),Oe=X("MessageText",(t=>{const{text:s}=t.message;return e.jsx("div",{className:"wxchtf-message-text",children:s})})),qe=X("MessageInfoBox",(t=>{const{message:s}=t,{id:a,sentBy:n,sentAt:i,read:c}=s,r=_(),d=n.id===r,o=Q(),u=C((e=>e.read.queued.includes(a)));return e.jsxs("div",{className:"wxchtf-message-info-box",children:[e.jsx("div",{className:"wxchtf-message-sent-at",children:o.timestamp(i)}),void 0!==c&&!d&&e.jsx("div",{className:"wxchtf-message-read-box",children:u?o.message.reading():o.message.read()})]})})),Ce=X("MessageContent",(t=>e.jsxs("div",{className:"wxchtf-message-content",children:[e.jsx(Oe,Object.assign({},t)),e.jsx(qe,Object.assign({},t))]}))),Ie=X("MessageRow",(t=>{const{message:s,containerRef:a}=t,{sentBy:n}=s,i=_(),c=n.id===i;return e.jsxs("div",{ref:a,className:"wxchtf-message"+(c?" --my":""),children:[e.jsx(ve,Object.assign({},t)),e.jsx(Ce,Object.assign({},t))]})})),we=X("MessageBox",(t=>{const a=s.useRef(null);return e.jsxs(e.Fragment,{children:[e.jsx(Ne,Object.assign({messageRef:a},t)),e.jsx(Ie,Object.assign({containerRef:a},t))]})})),Ne=X("MessageReadObserver",(t=>{const{message:a,messageRef:n}=t,i=O(),c=s.useRef(!1),r=s.useMemo((()=>new IntersectionObserver((([e])=>{!e.isIntersecting||c.current||a.read||(c.current=!0,i({type:"read",data:{id:a.id,timestamp:(new Date).getTime()}}))}))),[]);return s.useEffect((()=>(r.observe(n.current),()=>r.disconnect())),[r]),e.jsx(e.Fragment,{})}));function ke(t){const{count:s=1}=t;return e.jsx(e.Fragment,{children:Array.from(Array(s)).map(((t,s)=>e.jsxs("div",{className:"wxchtf-message-skeleton",children:[e.jsx(n.Skeleton.Avatar,{className:"wxchtf-avatar",active:!0}),e.jsx(n.Skeleton.Button,{active:!0,className:"wxchtf-content"})]},s)))})}function _e(t){const{chatId:a}=t,[n,{isFetching:i}]=H({chatId:a}),[c,r]=s.useState(!1),d=s.useRef(null),o=s.useMemo((()=>new IntersectionObserver((([e])=>r((t=>t||e.isIntersecting))))),[]);return s.useEffect((()=>(o.observe(d.current),()=>o.disconnect())),[o]),s.useEffect((()=>{c&&n()}),[c]),i?e.jsx(ke,{count:4}):e.jsx("div",{ref:d})}const Me=X("SendingMessageText",(t=>{const{text:s}=t;return e.jsx("div",{className:"wxchtf-sending-message-text",children:s})})),Se=X("SendingMessageInfoBox",(()=>{const t=Q();return e.jsx("div",{className:"wxchtf-sending-message-info-box",children:e.jsx("div",{className:"wxchtf-sending-message-sending-box",children:t.message.sending()})})})),Fe=X("SendingMessageContent",(t=>e.jsxs("div",{className:"wxchtf-sending-message-content",children:[e.jsx(Me,Object.assign({},t)),e.jsx(Se,Object.assign({},t))]}))),Re=X("SendingMessage",(t=>e.jsx("div",{className:"wxchtf-sending-message",children:e.jsx(Fe,Object.assign({},t))})));function Be(t){const{id:s}=t,{data:a}=T({chatId:s});return e.jsxs("div",{className:"wxchtf-chat-body",children:[!a&&e.jsx(ke,{count:5}),null==a?void 0:a.map(((t,a)=>{if("message"===t.type&&"chatify::system"===t.sentBy.id)return e.jsx(Z,{text:t.text,sentAt:t.sentAt});switch(t.type){case"message":return e.jsx(we,{message:t},t.id);case"sending":return e.jsx(Re,{text:t.text,files:t.files},t.requestId);case"more":return e.jsx(_e,{chatId:s},a);default:return null}}))]})}const Ae={attach:o,send:d},Le=X("Icon",(t=>{const{type:s}=t,a=Ae[s];return a?e.jsx(a,{}):null})),Ee=r("ctrl+enter");function He(){const t=C((e=>e.ui.chatId)),[a]=function(e){const{chatId:t}=e,s=k();return E({key:"add."+t,queryFn:e=>s.send(Object.assign({chatId:t},e)),onQueryStarted:(e,{updateState:s})=>h(this,void 0,void 0,(function*(){s((s=>{const a=(s=Object.assign(Object.assign({},s),{query:Object.assign(Object.assign({},s.query),{["messages."+t]:Object.assign({},s.query["messages."+t])})})).query["messages."+t];return a.data=[{type:"sending",text:e.text,requestId:e.requestId,files:e.files},...a.data],s}))}))})}({chatId:t}),[i,c]=s.useState(""),r=Q(),d=s.useCallback((()=>{c(""),a({text:i,files:[],requestId:G()})}),[t,i]);return e.jsx("div",{className:"wxchtf-input-form",children:e.jsxs("div",{className:"wxchtf-input-box",children:[e.jsx("div",{className:"wxchtf-add-files-box",children:e.jsx(n.Button,{type:"link",icon:e.jsx(Le,{type:"attach"}),className:"wxchtf-add-files-btn"})}),e.jsx("div",{className:"wxchtf-text-input-box",children:e.jsx(n.Input.TextArea,{value:i,onChange:e=>c(e.target.value),autoSize:{maxRows:5},className:"wxchtf-text-input-textarea",placeholder:r.input.placeholder(),onKeyDown:e=>{Ee(e)&&d()}})}),e.jsx("div",{className:"wxchtf-submit-btn-box",children:e.jsx(n.Button,{onClick:d,type:"link",icon:e.jsx(Le,{type:"send"}),className:"wxchtf-submit-btn"})})]})})}function Te(t){const{id:s}=t,a=_(),{data:n}=B({chatId:s}),i=!0===(null==n?void 0:n.members.map((e=>e.id)).includes(a));return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"wxchtf-chat",children:[e.jsx(pe,{id:s}),e.jsx(Be,{id:s})]}),i&&e.jsx(He,{})]})}function Pe(t){const{account:a,chatId:i}=t,[r]=$(),d=s.useCallback((()=>r({chatId:i,accountId:a.id,deleteHistory:!1})),[r,i,a.id]);return e.jsxs(n.List.Item,{children:[a.name," ",e.jsx(n.Button,{onClick:d,type:"link",icon:e.jsx(c.CloseOutlined,{})})]})}function ze(){const[t]=C((e=>[e.ui.chatId])),{data:a}=B({chatId:t}),[i]=D(),{data:r}=P(),d=s.useMemo((()=>null==r?void 0:r.map((e=>({value:e.id,label:e.name})))),[r]),o=s.useCallback((e=>i({chatId:t,accountId:e,withHistory:!0})),[i,t]);return a?e.jsxs("div",{className:"wxchtf-chat-settings",children:[e.jsxs(n.Row,{justify:"space-between",children:[e.jsx(n.Col,{children:e.jsx("h3",{className:"wxchtf-title",children:a.name})}),e.jsx(n.Col,{children:e.jsx(n.Button,{type:"link",icon:e.jsx(c.CloseOutlined,{})})})]}),e.jsx("h4",{children:"Members"}),e.jsx(n.List,{dataSource:a.members,rowKey:"id",renderItem:s=>e.jsx(Pe,{account:s,chatId:t})}),e.jsx(n.Select,{style:{width:"350px"},options:d,value:null,onSelect:o})]}):null}function Ue(){const{view:t,chatId:s}=C((e=>({view:e.ui.view,chatId:e.ui.chatId})));return e.jsxs("div",{className:"wxchtf-main",children:["chat"===t&&s&&e.jsx(Te,{id:s},s),"new-chat"===t&&e.jsx(xe,{}),"chat-settings"===t&&e.jsx(ze,{})]})}const De=()=>{const t=O(),a=s.useCallback((()=>t({type:"new_chat_open",data:void 0})),[t]);return e.jsx(n.Button,{onClick:a,icon:"+",type:"link",children:"Add chat"})};De.displayName="AddChatButton";const $e=X("AddChatButton",De),Ke=()=>e.jsx("div",{className:"wxchtf-header",children:e.jsx($e,{})});Ke.displayName="Header";const Qe=X("Header",Ke),We=()=>e.jsx("div",{className:"wxchtf-footer"});We.displayName="Footer";const Ge=X("Footer",We);function Je(t){const{className:s="",style:a}=t;return U(),e.jsxs("div",{className:s+" wxchtf-chatify",style:a,children:[e.jsx(Qe,{}),e.jsxs("div",{className:"wxchtf-body",children:[e.jsx(ge,{}),e.jsx(Ue,{})]}),e.jsx(Ge,{})]})}const Ve={},Xe=t=>{const{localizer:s=W,customize:a=Ve}=t;return e.jsx(K.Provider,{value:s,children:e.jsx(V,{value:a,children:e.jsx(Je,Object.assign({},t))})})};Xe.displayName="Chatify",exports.ACTIONS=b,exports.AddChatButton=$e,exports.Avatar=te,exports.ChatHeader=pe,exports.ChatHeaderMembers=be,exports.ChatListItemBox=me,exports.ChatListItemLastMessage=oe,exports.ChatListItemLastMessageAuthor=ue,exports.ChatListItemLastMessageContent=le,exports.ChatListItemName=ie,exports.ChatListItemUnreadCount=re,exports.Chatify=Xe,exports.ChatifyClient=class{constructor(e){this._connection=null,this._subscribers={},this._reconnectSubscribers=[],this.connect=()=>h(this,void 0,void 0,(function*(){const e=yield this._config.signalR.headersFactory();this._connection=(new l.HubConnectionBuilder).withUrl(this._config.signalR.hubUri,{accessTokenFactory:this._config.signalR.accessTokenFactory?this._config.signalR.accessTokenFactory:void 0,headers:e}).withAutomaticReconnect().build(),g.forEach((e=>{this._connection.on(e,((...t)=>{var s;null===(s=this._subscribers[e])||void 0===s||s.forEach((e=>e(t)))}))})),this._connection.onreconnected((()=>this._reconnectSubscribers.forEach((e=>e())))),yield this._connection.start()})),this.subscribe=(e,t)=>{var s;return this._subscribers[e]=null!==(s=this._subscribers[e])&&void 0!==s?s:[],this._subscribers[e].push(t),()=>this._subscribers[e].filter((e=>e!==t))},this.subscribeReconnect=e=>(this._reconnectSubscribers.push(e),()=>this._reconnectSubscribers.filter((t=>t!==e))),this.accounts=()=>h(this,void 0,void 0,(function*(){const{data:e}=yield this.axios.get("account");return e})),this.chats=()=>h(this,void 0,void 0,(function*(){const{data:e}=yield this.axios.get("chat");return e})),this.chat=e=>h(this,void 0,void 0,(function*(){const{data:t}=yield this.axios.get(`chat/${e}`);return t})),this.addChat=e=>h(this,void 0,void 0,(function*(){const{data:t}=yield this.axios.post("chat",e);return t})),this.messages=e=>h(this,void 0,void 0,(function*(){const{chatId:t,skip:s=0,take:a=20}=e,n=encodeURIComponent(JSON.stringify({skip:s,take:a})),{data:i}=yield this.axios.get(`chat/${t}/message?pagingRule=${n}`);return i})),this.send=e=>h(this,void 0,void 0,(function*(){const{chatId:t}=e,s=function(e,t){var s={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(s[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(a=Object.getOwnPropertySymbols(e);n<a.length;n++)t.indexOf(a[n])<0&&Object.prototype.propertyIsEnumerable.call(e,a[n])&&(s[a[n]]=e[a[n]])}return s}(e,["chatId"]);yield this.axios.post(`chat/${t}/message`,s)})),this.read=e=>h(this,void 0,void 0,(function*(){yield this.axios.put("chat/message/read",e)})),this.removeMember=e=>h(this,void 0,void 0,(function*(){yield this.axios.delete(`chat/${e.chatId}/member`,{data:e})})),this.addMember=e=>h(this,void 0,void 0,(function*(){yield this.axios.post(`chat/${e.chatId}/member`,e)})),this._config=Object.assign(Object.assign({},e),{signalR:Object.assign(Object.assign({},m),e.signalR)})}get axios(){return this._config.axios}},exports.ChatifyContext=function({value:t,children:s}){return e.jsx(N.Provider,{value:t.client,children:e.jsx(w.Provider,{value:t.me,children:e.jsx(v,{children:e.jsx(M,{children:s})})})})},exports.Header=Qe,exports.ICONS=Ae,exports.Icon=Le,exports.LocalizerContext=K,exports.MessageAuthor=ve,exports.MessageBox=we,exports.MessageContent=Ce,exports.MessageInfoBox=qe,exports.MessageReadObserver=Ne,exports.MessageRow=Ie,exports.MessageText=Oe,exports.ReducerProvider=v,exports.SystemMessage=Z,exports.defaultLocalizer=W,exports.formatSystemMessage=Y,exports.useAccounts=P,exports.useAddChat=z,exports.useAddMember=D,exports.useChat=B,exports.useChatList=A,exports.useClient=k,exports.useDispatch=O,exports.useLoadMore=H,exports.useLocalizer=Q,exports.useMe=_,exports.useMessages=T,exports.useReadMonitor=U,exports.useReducer=f,exports.useRemoveMember=$,exports.useSelect=C,exports.useSignalRMonitor=I,exports.useStateRef=q;
2
- //# sourceMappingURL=index.js.map