@webinex/chatify 1.0.0-rc2 → 1.0.1-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 (273) 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 +92 -90
  79. package/src/ChatifyContext.tsx +41 -41
  80. package/src/core/action.tsx +405 -319
  81. package/src/core/client.ts +143 -137
  82. package/src/core/index.ts +17 -14
  83. package/src/core/models.tsx +82 -75
  84. package/src/core/reducer.tsx +87 -86
  85. package/src/core/state.ts +92 -38
  86. package/src/core/useAddChatMutation.tsx +22 -0
  87. package/src/core/useAddMemberMutation.tsx +25 -0
  88. package/src/core/useFetchNextMutation.tsx +28 -0
  89. package/src/core/useGetAccountsQuery.tsx +33 -0
  90. package/src/core/useGetChatListQuery.tsx +33 -0
  91. package/src/core/useGetChatQuery.tsx +34 -0
  92. package/src/core/useGetMessagesQuery.tsx +35 -0
  93. package/src/core/useReadMonitor.tsx +32 -31
  94. package/src/core/useRemoveMemberMutation.tsx +23 -0
  95. package/src/core/useSendMutation.tsx +24 -0
  96. package/src/core/useSignalRMonitor.tsx +66 -52
  97. package/src/core/useUpdateChatNameMutation.tsx +23 -0
  98. package/src/index.ts +3 -3
  99. package/src/{ui/styles → styles}/aside.scss +94 -94
  100. package/src/styles/chat.scss +222 -0
  101. package/src/styles/index.scss +79 -0
  102. package/src/{ui/styles → styles}/keyframes.scss +14 -14
  103. package/src/{ui/styles → styles}/mixins.scss +20 -20
  104. package/src/styles/settings.scss +5 -0
  105. package/src/{ui/styles → styles}/variables.scss +10 -10
  106. package/src/ui/AddChatButton.tsx +15 -19
  107. package/src/ui/Avatar.tsx +18 -18
  108. package/src/ui/ChatList/ChatList.tsx +42 -0
  109. package/src/ui/ChatList/ChatListItemBox.tsx +22 -0
  110. package/src/ui/ChatList/ChatListItemLastMessage.tsx +13 -0
  111. package/src/ui/ChatList/ChatListItemLastMessageAuthor.tsx +20 -0
  112. package/src/ui/ChatList/ChatListItemLastMessageContent.tsx +21 -0
  113. package/src/ui/ChatList/ChatListItemName.tsx +13 -0
  114. package/src/ui/ChatList/ChatListItemUnreadCount.tsx +12 -0
  115. package/src/ui/ChatList/index.ts +7 -0
  116. package/src/ui/ChatName.tsx +10 -15
  117. package/src/ui/ChatPanel/ChatBody.tsx +44 -0
  118. package/src/ui/ChatPanel/ChatHeader.tsx +33 -0
  119. package/src/ui/{ChatHeaderMembers.tsx → ChatPanel/ChatHeaderMembers.tsx} +26 -30
  120. package/src/ui/ChatPanel/ChatHeaderName.tsx +67 -0
  121. package/src/ui/ChatPanel/ChatMembersButton.tsx +21 -0
  122. package/src/ui/ChatPanel/ChatMembersPanel.tsx +117 -0
  123. package/src/ui/ChatPanel/ChatPanel.tsx +27 -0
  124. package/src/ui/ChatPanel/index.ts +6 -0
  125. package/src/ui/Chatify.tsx +148 -106
  126. package/src/ui/CreateChatPanel/CreateChatForm.tsx +36 -0
  127. package/src/ui/CreateChatPanel/CreateChatMemberInput.tsx +66 -0
  128. package/src/ui/CreateChatPanel/CreateChatNameInput.tsx +25 -0
  129. package/src/ui/CreateChatPanel/CreateChatPanel.tsx +33 -0
  130. package/src/ui/CreateChatPanel/index.ts +4 -0
  131. package/src/ui/Icon.tsx +33 -21
  132. package/src/ui/InputBox/InputBox.tsx +38 -0
  133. package/src/ui/InputBox/InputFilesBox.tsx +9 -0
  134. package/src/ui/InputBox/InputSubmitButtonBox.tsx +17 -0
  135. package/src/ui/InputBox/InputTextBox.tsx +50 -0
  136. package/src/ui/InputBox/index.ts +4 -0
  137. package/src/ui/Layout/Aside.tsx +10 -0
  138. package/src/ui/Layout/Body.tsx +10 -0
  139. package/src/ui/Layout/Footer.tsx +3 -0
  140. package/src/ui/Layout/Header.tsx +10 -0
  141. package/src/ui/Layout/Main.tsx +15 -0
  142. package/src/ui/Layout/index.ts +5 -0
  143. package/src/ui/Message/MessageAuthor.tsx +13 -0
  144. package/src/ui/Message/MessageBox.tsx +20 -0
  145. package/src/ui/Message/MessageContent.tsx +13 -0
  146. package/src/ui/Message/MessageInfoBox.tsx +25 -0
  147. package/src/ui/Message/MessageRow.tsx +24 -0
  148. package/src/ui/Message/MessageText.tsx +7 -0
  149. package/src/ui/Message/index.ts +6 -0
  150. package/src/ui/MessageReadObserver.tsx +45 -0
  151. package/src/ui/MessageSkeleton.tsx +19 -19
  152. package/src/ui/Next.tsx +48 -0
  153. package/src/ui/SendingMessage/SendingMessageBox.tsx +16 -0
  154. package/src/ui/SendingMessage/SendingMessageContent.tsx +13 -0
  155. package/src/ui/SendingMessage/SendingMessageInfoBox.tsx +13 -0
  156. package/src/ui/SendingMessage/SendingMessageText.tsx +7 -0
  157. package/src/ui/SendingMessage/index.ts +4 -0
  158. package/src/ui/SystemMessage/SystemMessageBox.tsx +20 -0
  159. package/src/ui/SystemMessage/SystemMessageRow.tsx +43 -0
  160. package/src/ui/SystemMessage/index.ts +2 -0
  161. package/src/{util → ui}/customize.tsx +45 -45
  162. package/src/ui/index.ts +11 -11
  163. package/src/ui/localizer.tsx +80 -68
  164. package/src/util/index.ts +2 -3
  165. package/src/util/uniqBy.tsx +17 -17
  166. package/src/util/uniqId.tsx +3 -3
  167. package/dist/cjs/index.js +0 -2
  168. package/dist/cjs/index.js.map +0 -1
  169. package/dist/cjs/types/ChatifyContext.d.ts +0 -11
  170. package/dist/cjs/types/core/action.d.ts +0 -76
  171. package/dist/cjs/types/core/client.d.ts +0 -35
  172. package/dist/cjs/types/core/index.d.ts +0 -14
  173. package/dist/cjs/types/core/models.d.ts +0 -64
  174. package/dist/cjs/types/core/reducer.d.ts +0 -11
  175. package/dist/cjs/types/core/state.d.ts +0 -25
  176. package/dist/cjs/types/core/useAccounts.d.ts +0 -1
  177. package/dist/cjs/types/core/useAddChat.d.ts +0 -2
  178. package/dist/cjs/types/core/useAddMember.d.ts +0 -2
  179. package/dist/cjs/types/core/useAddMessage.d.ts +0 -5
  180. package/dist/cjs/types/core/useChatList.d.ts +0 -1
  181. package/dist/cjs/types/core/useLoadMore.d.ts +0 -3
  182. package/dist/cjs/types/core/useMessages.d.ts +0 -15
  183. package/dist/cjs/types/core/useMutation.d.ts +0 -12
  184. package/dist/cjs/types/core/useQuery.d.ts +0 -7
  185. package/dist/cjs/types/core/useReadMonitor.d.ts +0 -1
  186. package/dist/cjs/types/core/useRemoveMember.d.ts +0 -2
  187. package/dist/cjs/types/core/useSignalRMonitor.d.ts +0 -2
  188. package/dist/cjs/types/index.d.ts +0 -3
  189. package/dist/cjs/types/ui/AddChat.d.ts +0 -1
  190. package/dist/cjs/types/ui/AddChatButton.d.ts +0 -2
  191. package/dist/cjs/types/ui/Aside.d.ts +0 -1
  192. package/dist/cjs/types/ui/Avatar.d.ts +0 -6
  193. package/dist/cjs/types/ui/Chat.d.ts +0 -4
  194. package/dist/cjs/types/ui/ChatBody.d.ts +0 -4
  195. package/dist/cjs/types/ui/ChatHeader.d.ts +0 -4
  196. package/dist/cjs/types/ui/ChatHeaderMembers.d.ts +0 -5
  197. package/dist/cjs/types/ui/ChatHeaderSettingsButton.d.ts +0 -5
  198. package/dist/cjs/types/ui/ChatListItem.d.ts +0 -11
  199. package/dist/cjs/types/ui/ChatName.d.ts +0 -5
  200. package/dist/cjs/types/ui/ChatSettings.d.ts +0 -1
  201. package/dist/cjs/types/ui/Chatify.d.ts +0 -49
  202. package/dist/cjs/types/ui/Footer.d.ts +0 -2
  203. package/dist/cjs/types/ui/Header.d.ts +0 -2
  204. package/dist/cjs/types/ui/Icon.d.ts +0 -7
  205. package/dist/cjs/types/ui/InputForm.d.ts +0 -1
  206. package/dist/cjs/types/ui/LoadMore.d.ts +0 -4
  207. package/dist/cjs/types/ui/Main.d.ts +0 -1
  208. package/dist/cjs/types/ui/Message.d.ts +0 -18
  209. package/dist/cjs/types/ui/MessageSkeleton.d.ts +0 -4
  210. package/dist/cjs/types/ui/SendingMessage.d.ts +0 -10
  211. package/dist/cjs/types/ui/SystemMessage.d.ts +0 -8
  212. package/dist/cjs/types/ui/index.d.ts +0 -11
  213. package/dist/cjs/types/ui/localizer.d.ts +0 -32
  214. package/dist/cjs/types/util/customize.d.ts +0 -12
  215. package/dist/cjs/types/util/index.d.ts +0 -3
  216. package/dist/cjs/types/util/uniqBy.d.ts +0 -1
  217. package/dist/cjs/types/util/uniqId.d.ts +0 -1
  218. package/dist/esm/types/core/useAccounts.d.ts +0 -1
  219. package/dist/esm/types/core/useAddChat.d.ts +0 -2
  220. package/dist/esm/types/core/useAddMember.d.ts +0 -2
  221. package/dist/esm/types/core/useAddMessage.d.ts +0 -5
  222. package/dist/esm/types/core/useChat.d.ts +0 -3
  223. package/dist/esm/types/core/useChatList.d.ts +0 -1
  224. package/dist/esm/types/core/useLoadMore.d.ts +0 -3
  225. package/dist/esm/types/core/useMessages.d.ts +0 -15
  226. package/dist/esm/types/core/useMutation.d.ts +0 -12
  227. package/dist/esm/types/core/useQuery.d.ts +0 -7
  228. package/dist/esm/types/core/useRemoveMember.d.ts +0 -2
  229. package/dist/esm/types/ui/AddChat.d.ts +0 -1
  230. package/dist/esm/types/ui/Aside.d.ts +0 -1
  231. package/dist/esm/types/ui/Chat.d.ts +0 -4
  232. package/dist/esm/types/ui/ChatBody.d.ts +0 -4
  233. package/dist/esm/types/ui/ChatHeader.d.ts +0 -4
  234. package/dist/esm/types/ui/ChatHeaderMembers.d.ts +0 -5
  235. package/dist/esm/types/ui/ChatHeaderSettingsButton.d.ts +0 -5
  236. package/dist/esm/types/ui/ChatListItem.d.ts +0 -11
  237. package/dist/esm/types/ui/ChatSettings.d.ts +0 -1
  238. package/dist/esm/types/ui/Footer.d.ts +0 -2
  239. package/dist/esm/types/ui/Header.d.ts +0 -2
  240. package/dist/esm/types/ui/InputForm.d.ts +0 -1
  241. package/dist/esm/types/ui/LoadMore.d.ts +0 -4
  242. package/dist/esm/types/ui/Main.d.ts +0 -1
  243. package/dist/esm/types/ui/Message.d.ts +0 -18
  244. package/dist/esm/types/ui/SendingMessage.d.ts +0 -10
  245. package/dist/esm/types/ui/SystemMessage.d.ts +0 -8
  246. package/src/core/useAccounts.tsx +0 -11
  247. package/src/core/useAddChat.tsx +0 -12
  248. package/src/core/useAddMember.tsx +0 -12
  249. package/src/core/useAddMessage.tsx +0 -40
  250. package/src/core/useChat.tsx +0 -12
  251. package/src/core/useChatList.tsx +0 -10
  252. package/src/core/useLoadMore.tsx +0 -42
  253. package/src/core/useMessages.tsx +0 -23
  254. package/src/core/useMutation.tsx +0 -48
  255. package/src/core/useQuery.tsx +0 -45
  256. package/src/core/useRemoveMember.tsx +0 -12
  257. package/src/ui/AddChat.tsx +0 -55
  258. package/src/ui/Aside.tsx +0 -41
  259. package/src/ui/Chat.tsx +0 -26
  260. package/src/ui/ChatBody.tsx +0 -43
  261. package/src/ui/ChatHeader.tsx +0 -33
  262. package/src/ui/ChatHeaderSettingsButton.tsx +0 -26
  263. package/src/ui/ChatListItem.tsx +0 -101
  264. package/src/ui/ChatSettings.tsx +0 -59
  265. package/src/ui/Footer.tsx +0 -7
  266. package/src/ui/Header.tsx +0 -14
  267. package/src/ui/InputForm.tsx +0 -51
  268. package/src/ui/LoadMore.tsx +0 -40
  269. package/src/ui/Main.tsx +0 -16
  270. package/src/ui/Message.tsx +0 -118
  271. package/src/ui/SendingMessage.tsx +0 -50
  272. package/src/ui/SystemMessage.tsx +0 -32
  273. package/src/ui/styles/index.scss +0 -248
@@ -0,0 +1,22 @@
1
+ import { ChatListItem as ChatListItemModel } from '../../core';
2
+ import { customize } from '../customize';
3
+ import { ChatListItemName } from './ChatListItemName';
4
+ import { ChatListItemUnreadCount } from './ChatListItemUnreadCount';
5
+ import { ChatListItemLastMessage } from './ChatListItemLastMessage';
6
+
7
+ export interface ChatListItemBoxProps {
8
+ chat: ChatListItemModel;
9
+ }
10
+
11
+ export const ChatListItemBox = customize('ChatListItemBox', (props: ChatListItemBoxProps) => {
12
+ const { message, lastReadMessageId } = props.chat;
13
+ const read = lastReadMessageId != null && lastReadMessageId.localeCompare(message.id) >= 0;
14
+
15
+ return (
16
+ <div className={'wxchtf-chat' + (!read ? ' --unread' : '')}>
17
+ <ChatListItemName {...props} />
18
+ <ChatListItemUnreadCount {...props} />
19
+ <ChatListItemLastMessage {...props} />
20
+ </div>
21
+ );
22
+ });
@@ -0,0 +1,13 @@
1
+ import { customize } from '../customize';
2
+ import type { ChatListItemBoxProps } from './ChatListItemBox';
3
+ import { ChatListItemLastMessageContent } from './ChatListItemLastMessageContent';
4
+ import { ChatListItemLastMessageAuthor } from './ChatListItemLastMessageAuthor';
5
+
6
+ export const ChatListItemLastMessage = customize('ChatListItemLastMessage', (props: ChatListItemBoxProps) => {
7
+ return (
8
+ <div className="wxchtf-chat-last">
9
+ <ChatListItemLastMessageAuthor {...props} />
10
+ <ChatListItemLastMessageContent {...props} />
11
+ </div>
12
+ );
13
+ });
@@ -0,0 +1,20 @@
1
+ import { Avatar } from '../Avatar';
2
+ import { customize } from '../customize';
3
+ import type { ChatListItemBoxProps } from './ChatListItemBox';
4
+
5
+ export const ChatListItemLastMessageAuthor = customize(
6
+ 'ChatListItemLastMessageAuthor',
7
+ (props: ChatListItemBoxProps) => {
8
+ const { message } = props.chat;
9
+
10
+ if (message.sentBy.id === 'chatify::system') {
11
+ return null;
12
+ }
13
+
14
+ return (
15
+ <div className="wxchtf-chat-last-author">
16
+ <Avatar account={message.sentBy} /> {message.sentBy.name}
17
+ </div>
18
+ );
19
+ },
20
+ );
@@ -0,0 +1,21 @@
1
+ import { useLocalizer } from '../localizer';
2
+ import { formatSystemMessage } from '../SystemMessage/SystemMessageRow';
3
+ import { FC } from 'react';
4
+ import { customize } from '../customize';
5
+ import type { ChatListItemBoxProps } from './ChatListItemBox';
6
+
7
+ export const ChatListItemLastMessageContent = customize<FC<ChatListItemBoxProps>>(
8
+ 'ChatListItemLastMessageContent',
9
+ (props) => {
10
+ const { message } = props.chat;
11
+ const localizer = useLocalizer();
12
+
13
+ return (
14
+ <div className="wxchtf-chat-last-message">
15
+ {message.sentBy.id === 'chatify::system'
16
+ ? formatSystemMessage(localizer, message.text)
17
+ : message.text}
18
+ </div>
19
+ );
20
+ },
21
+ );
@@ -0,0 +1,13 @@
1
+ import { ChatName } from '../ChatName';
2
+ import { customize } from '../customize';
3
+ import type { ChatListItemBoxProps } from './ChatListItemBox';
4
+
5
+ export const ChatListItemName = customize('ChatListItemName', (props: ChatListItemBoxProps) => {
6
+ const { name } = props.chat;
7
+
8
+ return (
9
+ <div className="wxchtf-chat-name">
10
+ <ChatName name={name} />
11
+ </div>
12
+ );
13
+ });
@@ -0,0 +1,12 @@
1
+ import { customize } from '../customize';
2
+ import { ChatListItemBoxProps } from './ChatListItemBox';
3
+
4
+ export const ChatListItemUnreadCount = customize('ChatListItemUnreadCount', (props: ChatListItemBoxProps) => {
5
+ const { totalUnreadCount: unreadCount } = props.chat;
6
+
7
+ if (unreadCount <= 0) {
8
+ return null;
9
+ }
10
+
11
+ return <div className="wxchtf-unread-count">{unreadCount}</div>;
12
+ });
@@ -0,0 +1,7 @@
1
+ export * from './ChatList';
2
+ export * from './ChatListItemBox';
3
+ export * from './ChatListItemLastMessage';
4
+ export * from './ChatListItemLastMessageAuthor';
5
+ export * from './ChatListItemLastMessageContent';
6
+ export * from './ChatListItemName';
7
+ export * from './ChatListItemUnreadCount';
@@ -1,15 +1,10 @@
1
- import { FC } from 'react';
2
- import { customize } from '../util';
3
-
4
- export interface ChatNameProps {
5
- name: string;
6
- }
7
-
8
- const _ChatName: FC<ChatNameProps> = (props) => {
9
- const { name } = props;
10
- return <>{name}</>;
11
- };
12
-
13
- _ChatName.displayName = 'ChatName';
14
-
15
- export const ChatName = customize('ChatName', _ChatName);
1
+ import { customize } from './customize';
2
+
3
+ export interface ChatNameProps {
4
+ name: string;
5
+ }
6
+
7
+ export const ChatName = customize('ChatName', (props: ChatNameProps) => {
8
+ const { name } = props;
9
+ return <>{name}</>;
10
+ });
@@ -0,0 +1,44 @@
1
+ import { MessageBox } from '../Message';
2
+ import { useGetMessagesQuery } from '../../core';
3
+ import { Next } from '../Next';
4
+ import { SendingMessageBox } from '../SendingMessage';
5
+ import { SystemMessageBox } from '../SystemMessage/SystemMessageBox';
6
+ import { MessageSkeleton } from '../MessageSkeleton';
7
+ import { customize } from '../customize';
8
+
9
+ export interface ChatBodyProps {
10
+ id: string;
11
+ }
12
+
13
+ export const ChatBody = customize('ChatBody', (props: ChatBodyProps) => {
14
+ const { id } = props;
15
+ const { data: messages } = useGetMessagesQuery({ chatId: id });
16
+
17
+ return (
18
+ <div className="wxchtf-chat-body">
19
+ {!messages && <MessageSkeleton count={5} />}
20
+ {messages?.map((x, index) => {
21
+ if (x.type === 'message' && x.sentBy.id === 'chatify::system') {
22
+ return <SystemMessageBox key={x.id} message={x} />;
23
+ }
24
+
25
+ switch (x.type) {
26
+ case 'message': {
27
+ return <MessageBox message={x} key={x.id} />;
28
+ }
29
+
30
+ case 'sending': {
31
+ return <SendingMessageBox key={x.requestId} text={x.text} files={x.files} />;
32
+ }
33
+
34
+ case 'next': {
35
+ return <Next key={'next-' + messages.length + '-' + index} chatId={id} />;
36
+ }
37
+
38
+ default:
39
+ return null;
40
+ }
41
+ })}
42
+ </div>
43
+ );
44
+ });
@@ -0,0 +1,33 @@
1
+ import { Col, Row, Space } from 'antd';
2
+ import { ChatHeaderMembers } from './ChatHeaderMembers';
3
+ import { ChatMembersButton } from './ChatMembersButton';
4
+ import { customize } from '../customize';
5
+ import { ChatHeaderName } from './ChatHeaderName';
6
+ import { useSelect } from '../../core';
7
+
8
+ export interface ChatHeaderProps {
9
+ id: string;
10
+ }
11
+
12
+ export const ChatHeader = customize('ChatHeader', (props: ChatHeaderProps) => {
13
+ const { id } = props;
14
+ const chat = useSelect((x) => x.query.chatList.data!.find((x) => x.id === id)!, [id]);
15
+
16
+ return (
17
+ <div className="wxchtf-chat-header">
18
+ <Row justify="space-between" align="middle">
19
+ <Col>
20
+ <ChatHeaderName id={id} />
21
+ </Col>
22
+ {chat.active && (
23
+ <Col className="wxchtf-chat-members">
24
+ <Space align="center">
25
+ <ChatHeaderMembers id={id} />
26
+ <ChatMembersButton id={id} />
27
+ </Space>
28
+ </Col>
29
+ )}
30
+ </Row>
31
+ </div>
32
+ );
33
+ });
@@ -1,30 +1,26 @@
1
- import { FC } from 'react';
2
- import { useChat } from '../core';
3
- import { Avatar, Tooltip } from 'antd';
4
- import { customize } from '../util';
5
-
6
- export interface ChatHeaderMembersProps {
7
- id: string;
8
- }
9
-
10
- const _ChatHeaderMembers: FC<ChatHeaderMembersProps> = (props) => {
11
- const { id } = props;
12
- const { data: chat } = useChat({ chatId: id });
13
-
14
- if (!chat?.members) {
15
- return null;
16
- }
17
-
18
- return (
19
- <Avatar.Group maxCount={5}>
20
- {chat.members.map((x) => (
21
- <Tooltip key={x.id} title={x.name}>
22
- <Avatar src={x.avatar}>{x.name}</Avatar>
23
- </Tooltip>
24
- ))}
25
- </Avatar.Group>
26
- );
27
- };
28
-
29
- _ChatHeaderMembers.displayName = 'ChatHeaderMembers';
30
- export const ChatHeaderMembers = customize('ChatHeaderMembers', _ChatHeaderMembers);
1
+ import { useGetChatQuery } from '../../core';
2
+ import { Avatar, Tooltip } from 'antd';
3
+ import { customize } from '../customize';
4
+
5
+ export interface ChatHeaderMembersProps {
6
+ id: string;
7
+ }
8
+
9
+ export const ChatHeaderMembers = customize('ChatHeaderMembers', (props: ChatHeaderMembersProps) => {
10
+ const { id } = props;
11
+ const { data: chat } = useGetChatQuery({ chatId: id });
12
+
13
+ if (!chat?.members) {
14
+ return null;
15
+ }
16
+
17
+ return (
18
+ <Avatar.Group maxCount={5}>
19
+ {chat.members.map((x) => (
20
+ <Tooltip key={x.id} title={x.name}>
21
+ <Avatar src={x.avatar}>{x.name}</Avatar>
22
+ </Tooltip>
23
+ ))}
24
+ </Avatar.Group>
25
+ );
26
+ });
@@ -0,0 +1,67 @@
1
+ import { Input, Tooltip } from 'antd';
2
+ import { useSelect, useUpdateChatNameMutation } from '../../core';
3
+ import { ChatName } from '../ChatName';
4
+ import { customize } from '../customize';
5
+ import { useEffect, useState } from 'react';
6
+ import isHotkey from 'is-hotkey';
7
+
8
+ export interface ChatHeaderNameProps {
9
+ id: string;
10
+ }
11
+
12
+ const isEscape = isHotkey('escape');
13
+ const isEnter = isHotkey('enter');
14
+
15
+ function useUpdateChatName(id: string, value: string) {
16
+ const [updateChatName] = useUpdateChatNameMutation();
17
+ return () => updateChatName({ id, name: value });
18
+ }
19
+
20
+ export const ChatHeaderName = customize('ChatHeaderName', (props: ChatHeaderNameProps) => {
21
+ const { id } = props;
22
+ const chat = useSelect((x) => x.query.chatList.data!.find((x) => x.id === id)!, [id]);
23
+ const name = chat.name;
24
+ const [editNameValue, setEditNameValue] = useState('');
25
+ const [edit, setEdit] = useState(false);
26
+ const updateChatName = useUpdateChatName(id, editNameValue);
27
+
28
+ useEffect(() => {
29
+ if (edit) {
30
+ setEditNameValue(name);
31
+ }
32
+ }, [edit, name]);
33
+
34
+ if (!chat.active) {
35
+ return <span className="wxchtf-chat-name">{name}</span>;
36
+ }
37
+
38
+ if (edit) {
39
+ return (
40
+ <Input
41
+ value={editNameValue}
42
+ onChange={(e) => setEditNameValue(e.target.value)}
43
+ onBlur={() => setEdit(false)}
44
+ onKeyDown={(e) => {
45
+ if (isEscape(e)) {
46
+ setEdit(false);
47
+ } else if (isEnter(e)) {
48
+ setEdit(false);
49
+
50
+ if (editNameValue !== name) {
51
+ updateChatName();
52
+ }
53
+ }
54
+ }}
55
+ autoFocus
56
+ />
57
+ );
58
+ }
59
+
60
+ return (
61
+ <Tooltip title="Click to edit name...">
62
+ <span className="wxchtf-chat-name --editable" onClick={() => setEdit(true)}>
63
+ <ChatName name={name} />
64
+ </span>
65
+ </Tooltip>
66
+ );
67
+ });
@@ -0,0 +1,21 @@
1
+ import { useDispatch } from '../../core';
2
+ import { Button } from 'antd';
3
+ import { useCallback } from 'react';
4
+ import { customize } from '../customize';
5
+ import { Icon } from '../Icon';
6
+
7
+ export interface ChatMembersButtonProps {
8
+ id: string;
9
+ }
10
+
11
+ export const ChatMembersButton = customize('ChatMembersButton', (_: ChatMembersButtonProps) => {
12
+ const dispatch = useDispatch();
13
+ const onSettingsClick = useCallback(
14
+ () => dispatch({ type: 'toggle_members_view', data: void 0 }),
15
+
16
+ // eslint-disable-next-line react-hooks/exhaustive-deps
17
+ [dispatch],
18
+ );
19
+
20
+ return <Button onClick={onSettingsClick} type="link" icon={<Icon type="team" />} />;
21
+ });
@@ -0,0 +1,117 @@
1
+ import { Button, List, Space, Tooltip } from 'antd';
2
+ import {
3
+ useAddMemberMutation,
4
+ useGetAccountsQuery,
5
+ useGetChatQuery,
6
+ useRemoveMemberMutation,
7
+ } from '../../core';
8
+ import { customize } from '../customize';
9
+ import { useCallback, useMemo } from 'react';
10
+ import { Icon } from '../Icon';
11
+ import { Avatar } from '../Avatar';
12
+
13
+ export interface ChatMembersPanelProps {
14
+ id: string;
15
+ }
16
+
17
+ interface ChatMemberListItemProps {
18
+ id: string;
19
+ chatId: string;
20
+ }
21
+
22
+ function useAdd(chatId: string, accountId: string, withHistory: boolean) {
23
+ const [add, state] = useAddMemberMutation();
24
+ const onAdd = useCallback(
25
+ () => add({ chatId, accountId, withHistory }),
26
+ [add, chatId, accountId, withHistory],
27
+ );
28
+ return [onAdd, state] as const;
29
+ }
30
+
31
+ function useRemove(chatId: string, accountId: string, deleteHistory: boolean) {
32
+ const [remove, state] = useRemoveMemberMutation();
33
+ const onRemove = useCallback(
34
+ () => remove({ chatId, accountId, deleteHistory }),
35
+ [remove, chatId, accountId, deleteHistory],
36
+ );
37
+ return [onRemove, state] as const;
38
+ }
39
+
40
+ const ChatMemberListItem = customize('ChatMemberListItem', (props: ChatMemberListItemProps) => {
41
+ const { chatId } = props;
42
+ const { data: chat } = useGetChatQuery({ chatId });
43
+ const { data: accounts } = useGetAccountsQuery();
44
+ const account = accounts!.find((x) => x.id === props.id)!;
45
+ const isMember = chat!.members.some((x) => x.id === account.id);
46
+ const [onAddWithoutHistory] = useAdd(chatId, account.id, false);
47
+ const [onAddWithHistory] = useAdd(chatId, account.id, true);
48
+ const [onRemoveKeepHistory] = useRemove(chatId, account.id, false);
49
+ const [onRemoveDeleteHistory] = useRemove(chatId, account.id, true);
50
+
51
+ return (
52
+ <List.Item
53
+ className="wxchtf-chat-members-list-item"
54
+ actions={
55
+ isMember
56
+ ? [
57
+ <Tooltip key="remove" title="Remove (keep history)">
58
+ <Button onClick={onRemoveKeepHistory} type="link" icon={<Icon type="remove" />} />
59
+ </Tooltip>,
60
+ <Tooltip key="remove_delete_history" title="Remove (delete history)">
61
+ <Button
62
+ onClick={onRemoveDeleteHistory}
63
+ type="link"
64
+ icon={<Icon type="remove_delete_history" />}
65
+ />
66
+ </Tooltip>,
67
+ ]
68
+ : [
69
+ <Tooltip key="add_no_history" title="Add (no history)">
70
+ <Button onClick={onAddWithoutHistory} type="link" icon={<Icon type="add" />} />
71
+ </Tooltip>,
72
+ <Tooltip key="add" title="Add (share history)">
73
+ <Button onClick={onAddWithHistory} type="link" icon={<Icon type="add_with_history" />} />
74
+ </Tooltip>,
75
+ ]
76
+ }
77
+ >
78
+ <Space>
79
+ <Avatar account={account} />
80
+ <span>{account.name}</span>
81
+ </Space>
82
+ </List.Item>
83
+ );
84
+ });
85
+
86
+ export const ChatMembersPanel = customize('ChatMembersPanel', (props: ChatMembersPanelProps) => {
87
+ const { id } = props;
88
+
89
+ const { data: chat } = useGetChatQuery({ chatId: id });
90
+ const { data: accounts } = useGetAccountsQuery();
91
+ const ordered = useMemo(
92
+ () =>
93
+ accounts
94
+ ?.slice()
95
+ .sort(
96
+ (a, b) =>
97
+ (chat?.members.some((m) => m.id === a.id) ? -100 : 0) -
98
+ (chat?.members.some((m) => m.id === b.id) ? -100 : 0) +
99
+ a.name.localeCompare(b.name),
100
+ ),
101
+ [accounts, chat],
102
+ );
103
+
104
+ if (!chat?.members || !accounts) {
105
+ return null;
106
+ }
107
+
108
+ return (
109
+ <div className="wxchtf-chat-members-panel">
110
+ <List
111
+ className="wxchtf-chat-members-list"
112
+ dataSource={ordered}
113
+ renderItem={(item) => <ChatMemberListItem id={item.id} chatId={id} />}
114
+ />
115
+ </div>
116
+ );
117
+ });
@@ -0,0 +1,27 @@
1
+ import { ChatHeader } from './ChatHeader';
2
+ import { ChatBody } from './ChatBody';
3
+ import { InputBox } from '../InputBox/InputBox';
4
+ import { useSelect } from '../../core';
5
+ import { customize } from '../customize';
6
+ import { ChatMembersPanel } from './ChatMembersPanel';
7
+
8
+ export interface ChatPanelProps {
9
+ id: string;
10
+ }
11
+
12
+ export const ChatPanel = customize('ChatPanel', (props: ChatPanelProps) => {
13
+ const { id } = props;
14
+ const chat = useSelect((x) => x.query.chatList.data!.find((x) => x.id === id)!, [id]);
15
+ const chatMembersOpen = useSelect((x) => x.ui.showMembers, []);
16
+
17
+ return (
18
+ <div className="wxchtf-chat-panel">
19
+ <div className="wxchtf-chat-main">
20
+ <ChatHeader id={id} />
21
+ <ChatBody id={id} />
22
+ {chat.active && <InputBox />}
23
+ </div>
24
+ {chatMembersOpen && <ChatMembersPanel id={id} />}
25
+ </div>
26
+ );
27
+ });
@@ -0,0 +1,6 @@
1
+ export * from './ChatBody';
2
+ export * from './ChatHeader';
3
+ export * from './ChatHeaderMembers';
4
+ export * from './ChatHeaderName';
5
+ export * from './ChatPanel';
6
+ export * from './ChatMembersButton';