@webinex/chatify 2.0.0-alpha1 → 2.0.0-alpha4

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 (234) hide show
  1. package/dist/css/chatify.css +117 -13
  2. package/dist/esm/index.js +2 -2
  3. package/dist/esm/index.js.map +1 -1
  4. package/dist/esm/types/core/api/api.d.ts +10703 -387
  5. package/dist/esm/types/core/api/baseApi.d.ts +1 -1
  6. package/dist/esm/types/core/client.d.ts +2 -2
  7. package/dist/esm/types/core/types.d.ts +3 -6
  8. package/dist/esm/types/ui/Conversation/Conversation.d.ts +2 -0
  9. package/dist/esm/types/ui/Conversation/ConversationContext.d.ts +2 -0
  10. package/dist/esm/types/ui/Conversation/InputBox/InputBoxFile.d.ts +8 -0
  11. package/dist/esm/types/ui/Conversation/InputBox/InputBoxFileList.d.ts +8 -0
  12. package/dist/esm/types/ui/Conversation/InputBox/InputFilesBox.d.ts +11 -1
  13. package/dist/esm/types/ui/Conversation/InputBox/InputSubmitButtonBox.d.ts +2 -0
  14. package/dist/esm/types/ui/Conversation/InputBox/InputTextBox.d.ts +1 -0
  15. package/dist/esm/types/ui/Conversation/InputBox/index.d.ts +8 -1
  16. package/dist/esm/types/ui/Conversation/Message/MessageFile.d.ts +6 -0
  17. package/dist/esm/types/ui/Conversation/Message/MessageFileList.d.ts +3 -0
  18. package/dist/esm/types/ui/Conversation/Message/index.d.ts +6 -0
  19. package/dist/esm/types/ui/common/Icon.d.ts +14 -12
  20. package/dist/esm/types/ui/customize.d.ts +2 -2
  21. package/dist/esm/types/ui/localizer.d.ts +5 -0
  22. package/dist/esm/types/ui/useFormatter.d.ts +3 -0
  23. package/dist/index.d.ts +10772 -415
  24. package/package.json +94 -93
  25. package/src/core/api/api.ts +639 -642
  26. package/src/core/api/baseApi.ts +38 -38
  27. package/src/core/api/index.ts +1 -1
  28. package/src/core/client.ts +280 -280
  29. package/src/core/constants.ts +1 -1
  30. package/src/core/debounce.ts +90 -90
  31. package/src/core/index.ts +4 -4
  32. package/src/core/types.tsx +149 -152
  33. package/src/index.ts +2 -2
  34. package/src/styles/aside.scss +162 -161
  35. package/src/styles/chat.scss +209 -208
  36. package/src/styles/index.scss +159 -110
  37. package/src/styles/input.scss +148 -74
  38. package/src/styles/keyframes.scss +14 -14
  39. package/src/styles/members.scss +13 -13
  40. package/src/styles/mixins.scss +25 -20
  41. package/src/styles/variables.scss +13 -10
  42. package/src/ui/Chat/ChatContext.tsx +30 -30
  43. package/src/ui/Chat/ChatEditableHeaderName.tsx +63 -63
  44. package/src/ui/Chat/ChatHeaderActions.tsx +19 -19
  45. package/src/ui/Chat/ChatPanel.tsx +30 -30
  46. package/src/ui/Chat/ChatView.tsx +115 -115
  47. package/src/ui/Chat/Members/ChatMembersButton.tsx +9 -9
  48. package/src/ui/Chat/Members/ChatMembersPanel.tsx +112 -112
  49. package/src/ui/Chat/Members/ChatMembersPreview.tsx +25 -25
  50. package/src/ui/Chat/Members/index.ts +13 -13
  51. package/src/ui/Chat/index.ts +6 -6
  52. package/src/ui/ChatGroup/ChatGroupContext.tsx +50 -50
  53. package/src/ui/ChatGroup/ChatGroupPanel.tsx +73 -73
  54. package/src/ui/ChatGroup/Create/CreateChatButton.tsx +15 -15
  55. package/src/ui/ChatGroup/Create/CreateChatForm.tsx +36 -36
  56. package/src/ui/ChatGroup/Create/CreateChatMemberInput.tsx +65 -65
  57. package/src/ui/ChatGroup/Create/CreateChatNameInput.tsx +25 -25
  58. package/src/ui/ChatGroup/Create/CreateChatPanel.tsx +45 -45
  59. package/src/ui/ChatGroup/Create/index.ts +19 -19
  60. package/src/ui/ChatGroup/Layout/ChatGroupAside.tsx +12 -12
  61. package/src/ui/ChatGroup/Layout/ChatGroupBody.tsx +10 -10
  62. package/src/ui/ChatGroup/Layout/ChatGroupFooter.tsx +3 -3
  63. package/src/ui/ChatGroup/Layout/ChatGroupHeader.tsx +5 -5
  64. package/src/ui/ChatGroup/Layout/ChatGroupMain.tsx +17 -17
  65. package/src/ui/ChatGroup/Layout/index.ts +19 -19
  66. package/src/ui/ChatGroup/List/ChatList.tsx +41 -42
  67. package/src/ui/ChatGroup/List/ChatListItemAvatar.tsx +22 -22
  68. package/src/ui/ChatGroup/List/ChatListItemBox.tsx +26 -26
  69. package/src/ui/ChatGroup/List/ChatListItemLastMessage.tsx +15 -15
  70. package/src/ui/ChatGroup/List/ChatListItemLastMessageAuthor.tsx +15 -15
  71. package/src/ui/ChatGroup/List/ChatListItemLastMessageContent.tsx +21 -21
  72. package/src/ui/ChatGroup/List/ChatListItemLastMessageSentAt.tsx +22 -22
  73. package/src/ui/ChatGroup/List/ChatListItemName.tsx +8 -8
  74. package/src/ui/ChatGroup/List/ChatListItemUnreadCount.tsx +12 -12
  75. package/src/ui/ChatGroup/List/index.ts +31 -31
  76. package/src/ui/ChatGroup/index.ts +5 -5
  77. package/src/ui/Chatify.tsx +9 -9
  78. package/src/ui/Conversation/Conversation.tsx +78 -76
  79. package/src/ui/Conversation/ConversationActions.tsx +5 -5
  80. package/src/ui/Conversation/ConversationBody.tsx +28 -28
  81. package/src/ui/Conversation/ConversationContext.ts +29 -27
  82. package/src/ui/Conversation/ConversationHeader.tsx +23 -23
  83. package/src/ui/Conversation/ConversationName.tsx +7 -7
  84. package/src/ui/Conversation/InputBox/InputBox.tsx +122 -40
  85. package/src/ui/Conversation/InputBox/InputBoxFile.tsx +38 -0
  86. package/src/ui/Conversation/InputBox/InputBoxFileList.tsx +21 -0
  87. package/src/ui/Conversation/InputBox/InputFilesBox.tsx +78 -9
  88. package/src/ui/Conversation/InputBox/InputSubmitButtonBox.tsx +26 -17
  89. package/src/ui/Conversation/InputBox/InputTextBox.tsx +61 -53
  90. package/src/ui/Conversation/InputBox/index.ts +23 -16
  91. package/src/ui/Conversation/Message/MessageAuthor.tsx +13 -13
  92. package/src/ui/Conversation/Message/MessageBox.tsx +20 -20
  93. package/src/ui/Conversation/Message/MessageContent.tsx +15 -11
  94. package/src/ui/Conversation/Message/MessageFile.tsx +54 -0
  95. package/src/ui/Conversation/Message/MessageFileList.tsx +14 -0
  96. package/src/ui/Conversation/Message/MessageInfoBox.tsx +28 -28
  97. package/src/ui/Conversation/Message/MessageRow.tsx +28 -28
  98. package/src/ui/Conversation/Message/MessageText.tsx +7 -7
  99. package/src/ui/Conversation/Message/index.ts +28 -22
  100. package/src/ui/Conversation/NextObserver/NextMessagesObserver.tsx +47 -47
  101. package/src/ui/Conversation/NextObserver/index.ts +1 -1
  102. package/src/ui/Conversation/ReadObserver/MessageReadObserver.tsx +49 -49
  103. package/src/ui/Conversation/ReadObserver/index.ts +1 -1
  104. package/src/ui/Conversation/SendingMessage/SendingMessageBox.tsx +16 -16
  105. package/src/ui/Conversation/SendingMessage/SendingMessageContent.tsx +13 -13
  106. package/src/ui/Conversation/SendingMessage/SendingMessageInfoBox.tsx +13 -13
  107. package/src/ui/Conversation/SendingMessage/SendingMessageText.tsx +7 -7
  108. package/src/ui/Conversation/SendingMessage/index.ts +16 -16
  109. package/src/ui/Conversation/SystemMessage/SystemMessageBox.tsx +20 -20
  110. package/src/ui/Conversation/SystemMessage/SystemMessageRow.tsx +28 -28
  111. package/src/ui/Conversation/SystemMessage/index.ts +10 -10
  112. package/src/ui/Conversation/index.ts +13 -13
  113. package/src/ui/Thread/ThreadActions.tsx +22 -22
  114. package/src/ui/Thread/ThreadContext.ts +13 -13
  115. package/src/ui/Thread/ThreadPanel.tsx +127 -127
  116. package/src/ui/Thread/index.tsx +3 -3
  117. package/src/ui/color.ts +20 -20
  118. package/src/ui/common/Avatar.tsx +20 -20
  119. package/src/ui/common/Icon.tsx +44 -40
  120. package/src/ui/common/MessageSkeleton.tsx +20 -20
  121. package/src/ui/common/index.ts +13 -13
  122. package/src/ui/customize.tsx +51 -53
  123. package/src/ui/index.ts +11 -11
  124. package/src/ui/localizer.tsx +96 -81
  125. package/src/ui/useFormatter.tsx +17 -0
  126. package/dist/esm/types/core/api/accountApi.d.ts +0 -5
  127. package/dist/esm/types/core/api/chatApi.d.ts +0 -16
  128. package/dist/esm/types/core/api/chatListApi.d.ts +0 -5
  129. package/dist/esm/types/core/api/chatMemberApi.d.ts +0 -6
  130. package/dist/esm/types/core/api/chatMessageApi.d.ts +0 -3
  131. package/dist/esm/types/core/api/threadApi.d.ts +0 -1
  132. package/dist/esm/types/core/api/threadMessageApi.d.ts +0 -6
  133. package/src/core/api/accountApi.ts +0 -11
  134. package/src/core/api/chatApi.ts +0 -87
  135. package/src/core/api/chatListApi.ts +0 -134
  136. package/src/core/api/chatMemberApi.ts +0 -20
  137. package/src/core/api/chatMessageApi.ts +0 -12
  138. package/src/core/api/threadApi.ts +0 -8
  139. package/src/core/api/threadMessageApi.ts +0 -20
  140. package/src/types/core/api/accountApi.d.ts +0 -5
  141. package/src/types/core/api/api.d.ts +0 -2380
  142. package/src/types/core/api/baseApi.d.ts +0 -15
  143. package/src/types/core/api/chatApi.d.ts +0 -16
  144. package/src/types/core/api/chatListApi.d.ts +0 -5
  145. package/src/types/core/api/chatMemberApi.d.ts +0 -6
  146. package/src/types/core/api/chatMessageApi.d.ts +0 -3
  147. package/src/types/core/api/index.d.ts +0 -1
  148. package/src/types/core/api/threadApi.d.ts +0 -1
  149. package/src/types/core/api/threadMessageApi.d.ts +0 -6
  150. package/src/types/core/client.d.ts +0 -83
  151. package/src/types/core/constants.d.ts +0 -1
  152. package/src/types/core/debounce.d.ts +0 -27
  153. package/src/types/core/index.d.ts +0 -4
  154. package/src/types/core/types.d.ts +0 -105
  155. package/src/types/index.d.ts +0 -2
  156. package/src/types/ui/Chat/ChatContext.d.ts +0 -10
  157. package/src/types/ui/Chat/ChatEditableHeaderName.d.ts +0 -2
  158. package/src/types/ui/Chat/ChatHeaderActions.d.ts +0 -2
  159. package/src/types/ui/Chat/ChatPanel.d.ts +0 -13
  160. package/src/types/ui/Chat/ChatView.d.ts +0 -17
  161. package/src/types/ui/Chat/Members/ChatMembersButton.d.ts +0 -2
  162. package/src/types/ui/Chat/Members/ChatMembersPanel.d.ts +0 -2
  163. package/src/types/ui/Chat/Members/ChatMembersPreview.d.ts +0 -2
  164. package/src/types/ui/Chat/Members/index.d.ts +0 -11
  165. package/src/types/ui/Chat/index.d.ts +0 -6
  166. package/src/types/ui/ChatGroup/ChatGroupContext.d.ts +0 -12
  167. package/src/types/ui/ChatGroup/ChatGroupPanel.d.ts +0 -15
  168. package/src/types/ui/ChatGroup/Create/CreateChatButton.d.ts +0 -2
  169. package/src/types/ui/ChatGroup/Create/CreateChatForm.d.ts +0 -11
  170. package/src/types/ui/ChatGroup/Create/CreateChatMemberInput.d.ts +0 -5
  171. package/src/types/ui/ChatGroup/Create/CreateChatNameInput.d.ts +0 -5
  172. package/src/types/ui/ChatGroup/Create/CreateChatPanel.d.ts +0 -2
  173. package/src/types/ui/ChatGroup/Create/index.d.ts +0 -17
  174. package/src/types/ui/ChatGroup/Layout/ChatGroupAside.d.ts +0 -2
  175. package/src/types/ui/ChatGroup/Layout/ChatGroupBody.d.ts +0 -2
  176. package/src/types/ui/ChatGroup/Layout/ChatGroupFooter.d.ts +0 -2
  177. package/src/types/ui/ChatGroup/Layout/ChatGroupHeader.d.ts +0 -2
  178. package/src/types/ui/ChatGroup/Layout/ChatGroupMain.d.ts +0 -2
  179. package/src/types/ui/ChatGroup/Layout/index.d.ts +0 -17
  180. package/src/types/ui/ChatGroup/List/ChatList.d.ts +0 -2
  181. package/src/types/ui/ChatGroup/List/ChatListItemAvatar.d.ts +0 -3
  182. package/src/types/ui/ChatGroup/List/ChatListItemBox.d.ts +0 -6
  183. package/src/types/ui/ChatGroup/List/ChatListItemLastMessage.d.ts +0 -3
  184. package/src/types/ui/ChatGroup/List/ChatListItemLastMessageAuthor.d.ts +0 -3
  185. package/src/types/ui/ChatGroup/List/ChatListItemLastMessageContent.d.ts +0 -3
  186. package/src/types/ui/ChatGroup/List/ChatListItemLastMessageSentAt.d.ts +0 -3
  187. package/src/types/ui/ChatGroup/List/ChatListItemName.d.ts +0 -3
  188. package/src/types/ui/ChatGroup/List/ChatListItemUnreadCount.d.ts +0 -3
  189. package/src/types/ui/ChatGroup/List/index.d.ts +0 -29
  190. package/src/types/ui/ChatGroup/index.d.ts +0 -5
  191. package/src/types/ui/Chatify.d.ts +0 -8
  192. package/src/types/ui/Conversation/Conversation.d.ts +0 -21
  193. package/src/types/ui/Conversation/ConversationActions.d.ts +0 -2
  194. package/src/types/ui/Conversation/ConversationBody.d.ts +0 -2
  195. package/src/types/ui/Conversation/ConversationContext.d.ts +0 -20
  196. package/src/types/ui/Conversation/ConversationHeader.d.ts +0 -2
  197. package/src/types/ui/Conversation/ConversationName.d.ts +0 -2
  198. package/src/types/ui/Conversation/InputBox/InputBox.d.ts +0 -2
  199. package/src/types/ui/Conversation/InputBox/InputFilesBox.d.ts +0 -2
  200. package/src/types/ui/Conversation/InputBox/InputSubmitButtonBox.d.ts +0 -5
  201. package/src/types/ui/Conversation/InputBox/InputTextBox.d.ts +0 -8
  202. package/src/types/ui/Conversation/InputBox/index.d.ts +0 -14
  203. package/src/types/ui/Conversation/Message/MessageAuthor.d.ts +0 -3
  204. package/src/types/ui/Conversation/Message/MessageBox.d.ts +0 -6
  205. package/src/types/ui/Conversation/Message/MessageContent.d.ts +0 -3
  206. package/src/types/ui/Conversation/Message/MessageInfoBox.d.ts +0 -3
  207. package/src/types/ui/Conversation/Message/MessageRow.d.ts +0 -6
  208. package/src/types/ui/Conversation/Message/MessageText.d.ts +0 -3
  209. package/src/types/ui/Conversation/Message/index.d.ts +0 -20
  210. package/src/types/ui/Conversation/NextObserver/NextMessagesObserver.d.ts +0 -5
  211. package/src/types/ui/Conversation/NextObserver/index.d.ts +0 -1
  212. package/src/types/ui/Conversation/ReadObserver/MessageReadObserver.d.ts +0 -6
  213. package/src/types/ui/Conversation/ReadObserver/index.d.ts +0 -1
  214. package/src/types/ui/Conversation/SendingMessage/SendingMessageBox.d.ts +0 -7
  215. package/src/types/ui/Conversation/SendingMessage/SendingMessageContent.d.ts +0 -3
  216. package/src/types/ui/Conversation/SendingMessage/SendingMessageInfoBox.d.ts +0 -3
  217. package/src/types/ui/Conversation/SendingMessage/SendingMessageText.d.ts +0 -3
  218. package/src/types/ui/Conversation/SendingMessage/index.d.ts +0 -14
  219. package/src/types/ui/Conversation/SystemMessage/SystemMessageBox.d.ts +0 -6
  220. package/src/types/ui/Conversation/SystemMessage/SystemMessageRow.d.ts +0 -9
  221. package/src/types/ui/Conversation/SystemMessage/index.d.ts +0 -8
  222. package/src/types/ui/Conversation/index.d.ts +0 -12
  223. package/src/types/ui/Thread/ThreadActions.d.ts +0 -2
  224. package/src/types/ui/Thread/ThreadContext.d.ts +0 -8
  225. package/src/types/ui/Thread/ThreadPanel.d.ts +0 -14
  226. package/src/types/ui/Thread/index.d.ts +0 -3
  227. package/src/types/ui/color.d.ts +0 -6
  228. package/src/types/ui/common/Avatar.d.ts +0 -6
  229. package/src/types/ui/common/Icon.d.ts +0 -20
  230. package/src/types/ui/common/MessageSkeleton.d.ts +0 -5
  231. package/src/types/ui/common/index.d.ts +0 -11
  232. package/src/types/ui/customize.d.ts +0 -9
  233. package/src/types/ui/index.d.ts +0 -11
  234. package/src/types/ui/localizer.d.ts +0 -35
@@ -1,38 +1,38 @@
1
- import { BaseQueryFn, EndpointBuilder, createApi, fakeBaseQuery } from '@reduxjs/toolkit/query/react';
2
- import { ChatifyClient } from '../client';
3
- import { Debounce } from '../debounce';
4
- import { chatId } from '../types';
5
-
6
- export const DEFAULT_MESSAGE_LIST_TAKE = 20;
7
-
8
- export const CHAT_MESSAGE_READ_QUEUE = new Debounce<string>({
9
- callback: (id) => __settings.client.readChatMessage({ id }),
10
- compare: (a, b) => -a.localeCompare(b),
11
- groupBy: (id) => chatId(id),
12
- timeout: 500,
13
- });
14
-
15
- export interface ChatifyApiSettings {
16
- me: () => string;
17
- client: ChatifyClient;
18
- }
19
-
20
- export const __settings: ChatifyApiSettings = {
21
- me: null!,
22
- client: null!,
23
- };
24
-
25
- const TAG_TYPES = ['chat', 'account', 'message', 'thread', 'thread-message'] as const;
26
-
27
- export interface BaseApiEndpointBuilder
28
- extends EndpointBuilder<BaseQueryFn, (typeof TAG_TYPES)[number], 'chatify'> {}
29
-
30
- const baseApi: ReturnType<typeof createApi<BaseQueryFn, {}, 'chatify', (typeof TAG_TYPES)[number]>> =
31
- createApi({
32
- baseQuery: fakeBaseQuery(),
33
- reducerPath: 'chatify',
34
- tagTypes: TAG_TYPES,
35
- endpoints: (_) => ({}),
36
- });
37
-
38
- export const __baseApi = baseApi;
1
+ import { BaseQueryFn, EndpointBuilder, createApi, fakeBaseQuery } from '@reduxjs/toolkit/query/react';
2
+ import { ChatifyClient } from '../client';
3
+ import { Debounce } from '../debounce';
4
+ import { chatId } from '../types';
5
+
6
+ export const DEFAULT_MESSAGE_LIST_TAKE = 20;
7
+
8
+ export const CHAT_MESSAGE_READ_QUEUE = new Debounce<string>({
9
+ callback: (id) => __settings.client.readChatMessage({ id }),
10
+ compare: (a, b) => -a.localeCompare(b),
11
+ groupBy: (id) => chatId(id),
12
+ timeout: 500,
13
+ });
14
+
15
+ export interface ChatifyApiSettings {
16
+ me: () => string;
17
+ client: ChatifyClient;
18
+ }
19
+
20
+ export const __settings: ChatifyApiSettings = {
21
+ me: null!,
22
+ client: null!,
23
+ };
24
+
25
+ const TAG_TYPES = ['chat', 'account', 'message', 'thread', 'thread-message'] as const;
26
+
27
+ export interface BaseApiEndpointBuilder
28
+ extends EndpointBuilder<BaseQueryFn, (typeof TAG_TYPES)[number], 'chatify'> {}
29
+
30
+ const baseApi: ReturnType<typeof createApi<BaseQueryFn, {}, 'chatify', (typeof TAG_TYPES)[number]>> =
31
+ createApi({
32
+ baseQuery: fakeBaseQuery(),
33
+ reducerPath: 'chatify',
34
+ tagTypes: TAG_TYPES,
35
+ endpoints: (_) => ({}),
36
+ });
37
+
38
+ export const __baseApi = baseApi;
@@ -1 +1 @@
1
- export * from './api';
1
+ export * from './api';
@@ -1,280 +1,280 @@
1
- import { AxiosInstance } from 'axios';
2
- import * as SignalR from '@microsoft/signalr';
3
- import {
4
- Account,
5
- AddChatRequest,
6
- AddChatMemberRequest,
7
- Chat,
8
- ChatListItem,
9
- ChatMessage,
10
- ReadChatMessageEvent,
11
- ReadChatMessageRequest,
12
- RemoveChatMemberRequest,
13
- SendChatMessageRequest,
14
- UpdateChatNameRequest,
15
- SendThreadMessageRequest,
16
- Thread,
17
- ThreadMessage,
18
- ThreadWatchListItem as ThreadListItem,
19
- } from './types';
20
-
21
- export interface ChatifySignalRConfig {
22
- hubUri?: string;
23
- accessTokenFactory?: () => Promise<string>;
24
- headersFactory?: () => Promise<Record<string, string>>;
25
- }
26
-
27
- const DEFAULT_SIGNALR_CONFIG: ChatifySignalRConfig = {
28
- hubUri: '/api/chatify/hub',
29
- headersFactory: () => Promise.resolve({}),
30
- };
31
-
32
- export interface ChatifyClientConfig {
33
- axios: AxiosInstance;
34
- signalR: ChatifySignalRConfig;
35
- }
36
-
37
- export const CHATIFY_SIGNALR_METHODS = [
38
- 'chatify://chat-new-message',
39
- 'chatify://chat-created',
40
- 'chatify://chat-message-read',
41
- 'chatify://chat-member-added',
42
- 'chatify://chat-member-removed',
43
- 'chatify://chat-name-changed',
44
-
45
- 'chatify://thread-created',
46
- 'chatify://thread-message-new',
47
- 'chatify://thread-message-read',
48
- 'chatify://thread-watch-added',
49
- 'chatify://thread-watch-removed',
50
- ] as const;
51
-
52
- export type ChatifySignalRMethod = (typeof CHATIFY_SIGNALR_METHODS)[number];
53
-
54
- export type ChatifySignalRArgsByMethod = {
55
- 'chatify://chat-new-message': [message: ChatMessage, requestId: string];
56
- 'chatify://chat-created': [chat: ChatListItem, requestId: string];
57
- 'chatify://chat-message-read': [events: ReadChatMessageEvent[]];
58
- 'chatify://chat-member-added': [
59
- chatId: string,
60
- chatName: string,
61
- account: Account,
62
- message: ChatMessage,
63
- withHistory: boolean,
64
- read: boolean,
65
- ];
66
- 'chatify://chat-member-removed': [
67
- chatId: string,
68
- accountId: string,
69
- deleteHistory: boolean,
70
- message: ChatMessage,
71
- read: boolean,
72
- ];
73
- 'chatify://chat-name-changed': [chatId: string, newName: string, message: ChatMessage, read: boolean];
74
-
75
- 'chatify://thread-message-new': [threadId: string, message: ThreadMessage, readForId: string | null];
76
- 'chatify://thread-message-read': [threadId: string, messageId: string];
77
- 'chatify://thread-watch-added': [thread: ThreadListItem];
78
- 'chatify://thread-watch-removed': [id: string];
79
- 'chatify://thread-created': [thread: ThreadListItem, watch: boolean];
80
- };
81
-
82
- export class ChatifyClient {
83
- private _config: ChatifyClientConfig;
84
- private _connection: SignalR.HubConnection = null!;
85
- private _connectionPromise: Promise<SignalR.HubConnection> | null = null!;
86
- private _subscribers: Record<string, ((args: any[]) => void)[]> = {};
87
- private _reconnectSubscribers: Array<() => void> = [];
88
- private _threadConnectionByThreadId = new Map<string, number>();
89
-
90
- constructor(config: ChatifyClientConfig) {
91
- this._config = {
92
- ...config,
93
- signalR: {
94
- ...DEFAULT_SIGNALR_CONFIG,
95
- ...config.signalR,
96
- },
97
- };
98
- }
99
-
100
- public connect = async () => {
101
- if (this._connection) {
102
- return;
103
- }
104
-
105
- if (this._connectionPromise) {
106
- return await this._connectionPromise;
107
- }
108
-
109
- this._connectionPromise = this.createAndStartConnection();
110
- this._connection = await this._connectionPromise;
111
- };
112
-
113
- private createAndStartConnection = async () => {
114
- const headers = await this._config.signalR!.headersFactory!();
115
-
116
- const connection = new SignalR.HubConnectionBuilder()
117
- .withUrl(this._config.signalR!.hubUri!, {
118
- accessTokenFactory: this._config.signalR!.accessTokenFactory
119
- ? this._config.signalR!.accessTokenFactory
120
- : undefined,
121
- headers,
122
- })
123
- .withAutomaticReconnect()
124
- .build();
125
-
126
- CHATIFY_SIGNALR_METHODS.forEach((x) => {
127
- connection.on(x, (...args) => {
128
- this._subscribers[x]?.forEach((s) => {
129
- try {
130
- s(args);
131
- } catch (ex) {
132
- console.error(`Failed to notify subscriber`, ex);
133
- }
134
- });
135
- });
136
- });
137
-
138
- connection.onreconnected(() => this._reconnectSubscribers.forEach((subscriber) => subscriber()));
139
-
140
- await connection.start();
141
- return connection;
142
- };
143
-
144
- public subscribe = <TMethod extends ChatifySignalRMethod>(
145
- method: TMethod,
146
- subscriber: (args: ChatifySignalRArgsByMethod[TMethod]) => void,
147
- ) => {
148
- this.connect().then(() => {
149
- this._subscribers[method] = this._subscribers[method] ?? [];
150
- this._subscribers[method].push(subscriber as any);
151
- });
152
- return () => this._subscribers[method].filter((x) => x !== subscriber);
153
- };
154
-
155
- public subscribeReconnect = (subscriber: () => any) => {
156
- this._reconnectSubscribers.push(subscriber);
157
- return () => this._reconnectSubscribers.filter((x) => x !== subscriber);
158
- };
159
-
160
- private get axios() {
161
- return this._config.axios;
162
- }
163
-
164
- public accounts = async () => {
165
- const { data } = await this.axios.get<Account[]>('account');
166
- return data;
167
- };
168
-
169
- public chats = async () => {
170
- const { data } = await this.axios.get<ChatListItem[]>('chat');
171
- return data;
172
- };
173
-
174
- public chat = async (id: string) => {
175
- const { data } = await this.axios.get<Chat>(`chat/${encodeURIComponent(id)}`);
176
- return data;
177
- };
178
-
179
- public addChat = async (args: AddChatRequest) => {
180
- const { data } = await this.axios.post<string>(`chat`, args);
181
- return data;
182
- };
183
-
184
- public chatMessages = async (args: { chatId: string; skip?: number; take?: number }) => {
185
- const { chatId, skip = 0, take = 20 } = args;
186
- const pagingRule = encodeURIComponent(JSON.stringify({ skip, take }));
187
- const { data } = await this.axios.get<ChatMessage[]>(
188
- `chat/${encodeURIComponent(chatId)}/message?pagingRule=${pagingRule}`,
189
- );
190
- return data;
191
- };
192
-
193
- public sendChatMessage = async (request: SendChatMessageRequest) => {
194
- const { chatId, ...rest } = request;
195
- await this.axios.post(`chat/${encodeURIComponent(chatId)}/message`, rest);
196
- };
197
-
198
- public readChatMessage = async (request: ReadChatMessageRequest) => {
199
- await this.axios.put(`chat/message/read`, request);
200
- };
201
-
202
- public removeChatMember = async (request: RemoveChatMemberRequest) => {
203
- await this.axios.delete(`chat/${encodeURIComponent(request.chatId)}/member`, { data: request });
204
- };
205
-
206
- public updateChatName = async (request: UpdateChatNameRequest) => {
207
- await this.axios.put(`chat/${encodeURIComponent(request.id)}/name`, request);
208
- };
209
-
210
- public addChatMember = async (request: AddChatMemberRequest) => {
211
- await this.axios.post(`chat/${encodeURIComponent(request.chatId)}/member`, request);
212
- };
213
-
214
- public sendThreadMessage = async ({ body, threadId }: SendThreadMessageRequest) => {
215
- const { data: id } = await this.axios.post<string>(`thread/${encodeURIComponent(threadId)}/message`, {
216
- body,
217
- });
218
- return id;
219
- };
220
-
221
- public readThreadMessage = async (id: string) => {
222
- await this.axios.put(`thread/message/${encodeURIComponent(id)}/read`);
223
- };
224
-
225
- public watchThreads = async () => {
226
- const { data } = await this.axios.get<ThreadListItem[]>(`thread/watch`);
227
- return data;
228
- };
229
-
230
- public thread = async (id: string) => {
231
- const { data } = await this.axios.get<Thread>(`thread/${encodeURIComponent(id)}`);
232
- return data;
233
- };
234
-
235
- public threadMessages = async ({
236
- threadId,
237
- skip,
238
- take,
239
- }: {
240
- threadId: string;
241
- skip: number;
242
- take: number;
243
- }) => {
244
- const searchParams = new URLSearchParams();
245
- searchParams.append('skip', skip.toString());
246
- searchParams.append('take', take.toString());
247
- const { data } = await this.axios.get<ThreadMessage[]>(
248
- `thread/${encodeURIComponent(threadId)}/message?${searchParams.toString()}`,
249
- );
250
- return data;
251
- };
252
-
253
- public watchThread = async (id: string, watch: boolean) => {
254
- await this.axios.put(`thread/${encodeURIComponent(id)}/watch`, { watch });
255
- };
256
-
257
- public connectToThread = async (id: string) => {
258
- const connectionCount = this._threadConnectionByThreadId.get(id) ?? 0;
259
- this._threadConnectionByThreadId.set(id, connectionCount + 1);
260
-
261
- if (connectionCount === 0) {
262
- this.connect().then(() => this._connection.invoke('ConnectToThread', id));
263
- }
264
- };
265
-
266
- public disconnectFromThread = async (id: string) => {
267
- const connectionCount = this._threadConnectionByThreadId.get(id) ?? 0;
268
- this._threadConnectionByThreadId.set(id, Math.max(0, connectionCount - 1));
269
-
270
- if (connectionCount === 1) {
271
- this.connect().then(() => this._connection.invoke('DisconnectFromThread', id));
272
- }
273
- };
274
- }
275
-
276
- export function unsubscribe(...subscribers: Array<() => void>) {
277
- const result = () => subscribers.forEach((x) => x());
278
- result.when = (promise: Promise<any>) => promise.then(result);
279
- return result;
280
- }
1
+ import { AxiosInstance } from 'axios';
2
+ import * as SignalR from '@microsoft/signalr';
3
+ import {
4
+ Account,
5
+ AddChatRequest,
6
+ AddChatMemberRequest,
7
+ Chat,
8
+ ChatListItem,
9
+ ChatMessage,
10
+ ReadChatMessageEvent,
11
+ ReadChatMessageRequest,
12
+ RemoveChatMemberRequest,
13
+ SendChatMessageRequest,
14
+ UpdateChatNameRequest,
15
+ SendThreadMessageRequest,
16
+ Thread,
17
+ ThreadMessage,
18
+ ThreadWatchListItem as ThreadListItem,
19
+ } from './types';
20
+
21
+ export interface ChatifySignalRConfig {
22
+ hubUri?: string;
23
+ accessTokenFactory?: () => Promise<string>;
24
+ headersFactory?: () => Promise<Record<string, string>>;
25
+ }
26
+
27
+ const DEFAULT_SIGNALR_CONFIG: ChatifySignalRConfig = {
28
+ hubUri: '/api/chatify/hub',
29
+ headersFactory: () => Promise.resolve({}),
30
+ };
31
+
32
+ export interface ChatifyClientConfig {
33
+ axios: AxiosInstance;
34
+ signalR: ChatifySignalRConfig;
35
+ }
36
+
37
+ export const CHATIFY_SIGNALR_METHODS = [
38
+ 'chatify://chat-new-message',
39
+ 'chatify://chat-created',
40
+ 'chatify://chat-message-read',
41
+ 'chatify://chat-member-added',
42
+ 'chatify://chat-member-removed',
43
+ 'chatify://chat-name-changed',
44
+
45
+ 'chatify://thread-created',
46
+ 'chatify://thread-message-new',
47
+ 'chatify://thread-message-read',
48
+ 'chatify://thread-watch-added',
49
+ 'chatify://thread-watch-removed',
50
+ ] as const;
51
+
52
+ export type ChatifySignalRMethod = (typeof CHATIFY_SIGNALR_METHODS)[number];
53
+
54
+ export type ChatifySignalRArgsByMethod = {
55
+ 'chatify://chat-new-message': [message: ChatMessage];
56
+ 'chatify://chat-created': [chat: ChatListItem];
57
+ 'chatify://chat-message-read': [events: ReadChatMessageEvent[]];
58
+ 'chatify://chat-member-added': [
59
+ chatId: string,
60
+ chatName: string,
61
+ account: Account,
62
+ message: ChatMessage,
63
+ withHistory: boolean,
64
+ read: boolean,
65
+ ];
66
+ 'chatify://chat-member-removed': [
67
+ chatId: string,
68
+ accountId: string,
69
+ deleteHistory: boolean,
70
+ message: ChatMessage,
71
+ read: boolean,
72
+ ];
73
+ 'chatify://chat-name-changed': [chatId: string, newName: string, message: ChatMessage, read: boolean];
74
+
75
+ 'chatify://thread-message-new': [threadId: string, message: ThreadMessage, readForId: string | null];
76
+ 'chatify://thread-message-read': [threadId: string, messageId: string];
77
+ 'chatify://thread-watch-added': [thread: ThreadListItem];
78
+ 'chatify://thread-watch-removed': [id: string];
79
+ 'chatify://thread-created': [thread: ThreadListItem, watch: boolean];
80
+ };
81
+
82
+ export class ChatifyClient {
83
+ private _config: ChatifyClientConfig;
84
+ private _connection: SignalR.HubConnection = null!;
85
+ private _connectionPromise: Promise<SignalR.HubConnection> | null = null!;
86
+ private _subscribers: Record<string, ((args: any[]) => void)[]> = {};
87
+ private _reconnectSubscribers: Array<() => void> = [];
88
+ private _threadConnectionByThreadId = new Map<string, number>();
89
+
90
+ constructor(config: ChatifyClientConfig) {
91
+ this._config = {
92
+ ...config,
93
+ signalR: {
94
+ ...DEFAULT_SIGNALR_CONFIG,
95
+ ...config.signalR,
96
+ },
97
+ };
98
+ }
99
+
100
+ public connect = async () => {
101
+ if (this._connection) {
102
+ return;
103
+ }
104
+
105
+ if (this._connectionPromise) {
106
+ return await this._connectionPromise;
107
+ }
108
+
109
+ this._connectionPromise = this.createAndStartConnection();
110
+ this._connection = await this._connectionPromise;
111
+ };
112
+
113
+ private createAndStartConnection = async () => {
114
+ const headers = await this._config.signalR!.headersFactory!();
115
+
116
+ const connection = new SignalR.HubConnectionBuilder()
117
+ .withUrl(this._config.signalR!.hubUri!, {
118
+ accessTokenFactory: this._config.signalR!.accessTokenFactory
119
+ ? this._config.signalR!.accessTokenFactory
120
+ : undefined,
121
+ headers,
122
+ })
123
+ .withAutomaticReconnect()
124
+ .build();
125
+
126
+ CHATIFY_SIGNALR_METHODS.forEach((x) => {
127
+ connection.on(x, (...args) => {
128
+ this._subscribers[x]?.forEach((s) => {
129
+ try {
130
+ s(args);
131
+ } catch (ex) {
132
+ console.error(`Failed to notify subscriber`, ex);
133
+ }
134
+ });
135
+ });
136
+ });
137
+
138
+ connection.onreconnected(() => this._reconnectSubscribers.forEach((subscriber) => subscriber()));
139
+
140
+ await connection.start();
141
+ return connection;
142
+ };
143
+
144
+ public subscribe = <TMethod extends ChatifySignalRMethod>(
145
+ method: TMethod,
146
+ subscriber: (args: ChatifySignalRArgsByMethod[TMethod]) => void,
147
+ ) => {
148
+ this.connect().then(() => {
149
+ this._subscribers[method] = this._subscribers[method] ?? [];
150
+ this._subscribers[method].push(subscriber as any);
151
+ });
152
+ return () => this._subscribers[method].filter((x) => x !== subscriber);
153
+ };
154
+
155
+ public subscribeReconnect = (subscriber: () => any) => {
156
+ this._reconnectSubscribers.push(subscriber);
157
+ return () => this._reconnectSubscribers.filter((x) => x !== subscriber);
158
+ };
159
+
160
+ private get axios() {
161
+ return this._config.axios;
162
+ }
163
+
164
+ public accounts = async () => {
165
+ const { data } = await this.axios.get<Account[]>('account');
166
+ return data;
167
+ };
168
+
169
+ public chats = async () => {
170
+ const { data } = await this.axios.get<ChatListItem[]>('chat');
171
+ return data;
172
+ };
173
+
174
+ public chat = async (id: string) => {
175
+ const { data } = await this.axios.get<Chat>(`chat/${encodeURIComponent(id)}`);
176
+ return data;
177
+ };
178
+
179
+ public addChat = async (args: AddChatRequest) => {
180
+ const { data } = await this.axios.post<string>(`chat`, args);
181
+ return data;
182
+ };
183
+
184
+ public chatMessages = async (args: { chatId: string; skip?: number; take?: number }) => {
185
+ const { chatId, skip = 0, take = 20 } = args;
186
+ const pagingRule = encodeURIComponent(JSON.stringify({ skip, take }));
187
+ const { data } = await this.axios.get<ChatMessage[]>(
188
+ `chat/${encodeURIComponent(chatId)}/message?pagingRule=${pagingRule}`,
189
+ );
190
+ return data;
191
+ };
192
+
193
+ public sendChatMessage = async (request: SendChatMessageRequest) => {
194
+ const { chatId, ...rest } = request;
195
+ await this.axios.post(`chat/${encodeURIComponent(chatId)}/message`, rest);
196
+ };
197
+
198
+ public readChatMessage = async (request: ReadChatMessageRequest) => {
199
+ await this.axios.put(`chat/message/read`, request);
200
+ };
201
+
202
+ public removeChatMember = async (request: RemoveChatMemberRequest) => {
203
+ await this.axios.delete(`chat/${encodeURIComponent(request.chatId)}/member`, { data: request });
204
+ };
205
+
206
+ public updateChatName = async (request: UpdateChatNameRequest) => {
207
+ await this.axios.put(`chat/${encodeURIComponent(request.id)}/name`, request);
208
+ };
209
+
210
+ public addChatMember = async (request: AddChatMemberRequest) => {
211
+ await this.axios.post(`chat/${encodeURIComponent(request.chatId)}/member`, request);
212
+ };
213
+
214
+ public sendThreadMessage = async ({ body, threadId }: SendThreadMessageRequest) => {
215
+ const { data: id } = await this.axios.post<string>(`thread/${encodeURIComponent(threadId)}/message`, {
216
+ body,
217
+ });
218
+ return id;
219
+ };
220
+
221
+ public readThreadMessage = async (id: string) => {
222
+ await this.axios.put(`thread/message/${encodeURIComponent(id)}/read`);
223
+ };
224
+
225
+ public watchThreads = async () => {
226
+ const { data } = await this.axios.get<ThreadListItem[]>(`thread/watch`);
227
+ return data;
228
+ };
229
+
230
+ public thread = async (id: string) => {
231
+ const { data } = await this.axios.get<Thread>(`thread/${encodeURIComponent(id)}`);
232
+ return data;
233
+ };
234
+
235
+ public threadMessages = async ({
236
+ threadId,
237
+ skip,
238
+ take,
239
+ }: {
240
+ threadId: string;
241
+ skip: number;
242
+ take: number;
243
+ }) => {
244
+ const searchParams = new URLSearchParams();
245
+ searchParams.append('skip', skip.toString());
246
+ searchParams.append('take', take.toString());
247
+ const { data } = await this.axios.get<ThreadMessage[]>(
248
+ `thread/${encodeURIComponent(threadId)}/message?${searchParams.toString()}`,
249
+ );
250
+ return data;
251
+ };
252
+
253
+ public watchThread = async (id: string, watch: boolean) => {
254
+ await this.axios.put(`thread/${encodeURIComponent(id)}/watch`, { watch });
255
+ };
256
+
257
+ public connectToThread = async (id: string) => {
258
+ const connectionCount = this._threadConnectionByThreadId.get(id) ?? 0;
259
+ this._threadConnectionByThreadId.set(id, connectionCount + 1);
260
+
261
+ if (connectionCount === 0) {
262
+ this.connect().then(() => this._connection.invoke('ConnectToThread', id));
263
+ }
264
+ };
265
+
266
+ public disconnectFromThread = async (id: string) => {
267
+ const connectionCount = this._threadConnectionByThreadId.get(id) ?? 0;
268
+ this._threadConnectionByThreadId.set(id, Math.max(0, connectionCount - 1));
269
+
270
+ if (connectionCount === 1) {
271
+ this.connect().then(() => this._connection.invoke('DisconnectFromThread', id));
272
+ }
273
+ };
274
+ }
275
+
276
+ export function unsubscribe(...subscribers: Array<() => void>) {
277
+ const result = () => subscribers.forEach((x) => x());
278
+ result.when = (promise: Promise<any>) => promise.then(result);
279
+ return result;
280
+ }
@@ -1 +1 @@
1
- export const SYSTEM_ID = 'chatify::system';
1
+ export const SYSTEM_ID = 'chatify::system';