@webinex/chatify 2.0.1-alpha1 → 2.0.2-alpha2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/dist/css/chatify.css +111 -12
  2. package/dist/esm/index.js +2 -2
  3. package/dist/esm/index.js.map +1 -1
  4. package/dist/esm/types/core/api/api.d.ts +10784 -232
  5. package/dist/esm/types/core/api/baseApi.d.ts +1 -1
  6. package/dist/esm/types/ui/Conversation/Conversation.d.ts +2 -0
  7. package/dist/esm/types/ui/Conversation/ConversationContext.d.ts +2 -0
  8. package/dist/esm/types/ui/Conversation/InputBox/InputBoxFile.d.ts +8 -0
  9. package/dist/esm/types/ui/Conversation/InputBox/InputBoxFileList.d.ts +8 -0
  10. package/dist/esm/types/ui/Conversation/InputBox/InputFilesBox.d.ts +11 -1
  11. package/dist/esm/types/ui/Conversation/InputBox/InputSubmitButtonBox.d.ts +2 -0
  12. package/dist/esm/types/ui/Conversation/InputBox/InputTextBox.d.ts +1 -0
  13. package/dist/esm/types/ui/Conversation/InputBox/index.d.ts +8 -1
  14. package/dist/esm/types/ui/Conversation/Message/MessageFile.d.ts +6 -0
  15. package/dist/esm/types/ui/Conversation/Message/MessageFileList.d.ts +3 -0
  16. package/dist/esm/types/ui/Conversation/Message/index.d.ts +6 -0
  17. package/dist/esm/types/ui/common/Icon.d.ts +2 -0
  18. package/dist/esm/types/ui/customize.d.ts +2 -2
  19. package/dist/esm/types/ui/localizer.d.ts +5 -0
  20. package/dist/esm/types/ui/useFormatter.d.ts +3 -0
  21. package/dist/index.d.ts +10835 -239
  22. package/package.json +94 -93
  23. package/src/core/api/api.ts +643 -642
  24. package/src/core/api/baseApi.ts +38 -38
  25. package/src/core/api/index.ts +1 -1
  26. package/src/core/client.ts +280 -280
  27. package/src/core/constants.ts +1 -1
  28. package/src/core/debounce.ts +90 -90
  29. package/src/core/index.ts +4 -4
  30. package/src/core/types.tsx +152 -152
  31. package/src/index.ts +2 -2
  32. package/src/styles/aside.scss +162 -161
  33. package/src/styles/chat.scss +209 -208
  34. package/src/styles/index.scss +153 -110
  35. package/src/styles/input.scss +147 -74
  36. package/src/styles/keyframes.scss +14 -14
  37. package/src/styles/members.scss +13 -13
  38. package/src/styles/mixins.scss +25 -20
  39. package/src/styles/variables.scss +13 -10
  40. package/src/ui/Chat/ChatContext.tsx +30 -30
  41. package/src/ui/Chat/ChatEditableHeaderName.tsx +63 -63
  42. package/src/ui/Chat/ChatHeaderActions.tsx +19 -19
  43. package/src/ui/Chat/ChatPanel.tsx +30 -30
  44. package/src/ui/Chat/ChatView.tsx +115 -115
  45. package/src/ui/Chat/Members/ChatMembersButton.tsx +9 -9
  46. package/src/ui/Chat/Members/ChatMembersPanel.tsx +112 -112
  47. package/src/ui/Chat/Members/ChatMembersPreview.tsx +25 -25
  48. package/src/ui/Chat/Members/index.ts +13 -13
  49. package/src/ui/Chat/index.ts +6 -6
  50. package/src/ui/ChatGroup/ChatGroupContext.tsx +50 -50
  51. package/src/ui/ChatGroup/ChatGroupPanel.tsx +73 -73
  52. package/src/ui/ChatGroup/Create/CreateChatButton.tsx +15 -15
  53. package/src/ui/ChatGroup/Create/CreateChatForm.tsx +36 -36
  54. package/src/ui/ChatGroup/Create/CreateChatMemberInput.tsx +65 -65
  55. package/src/ui/ChatGroup/Create/CreateChatNameInput.tsx +25 -25
  56. package/src/ui/ChatGroup/Create/CreateChatPanel.tsx +45 -45
  57. package/src/ui/ChatGroup/Create/index.ts +19 -19
  58. package/src/ui/ChatGroup/Layout/ChatGroupAside.tsx +12 -12
  59. package/src/ui/ChatGroup/Layout/ChatGroupBody.tsx +10 -10
  60. package/src/ui/ChatGroup/Layout/ChatGroupFooter.tsx +3 -3
  61. package/src/ui/ChatGroup/Layout/ChatGroupHeader.tsx +5 -5
  62. package/src/ui/ChatGroup/Layout/ChatGroupMain.tsx +17 -17
  63. package/src/ui/ChatGroup/Layout/index.ts +19 -19
  64. package/src/ui/ChatGroup/List/ChatList.tsx +41 -41
  65. package/src/ui/ChatGroup/List/ChatListItemAvatar.tsx +22 -22
  66. package/src/ui/ChatGroup/List/ChatListItemBox.tsx +26 -26
  67. package/src/ui/ChatGroup/List/ChatListItemLastMessage.tsx +15 -15
  68. package/src/ui/ChatGroup/List/ChatListItemLastMessageAuthor.tsx +15 -15
  69. package/src/ui/ChatGroup/List/ChatListItemLastMessageContent.tsx +21 -21
  70. package/src/ui/ChatGroup/List/ChatListItemLastMessageSentAt.tsx +22 -22
  71. package/src/ui/ChatGroup/List/ChatListItemName.tsx +8 -8
  72. package/src/ui/ChatGroup/List/ChatListItemUnreadCount.tsx +12 -12
  73. package/src/ui/ChatGroup/List/index.ts +31 -31
  74. package/src/ui/ChatGroup/index.ts +5 -5
  75. package/src/ui/Chatify.tsx +9 -9
  76. package/src/ui/Conversation/Conversation.tsx +78 -76
  77. package/src/ui/Conversation/ConversationActions.tsx +5 -5
  78. package/src/ui/Conversation/ConversationBody.tsx +28 -28
  79. package/src/ui/Conversation/ConversationContext.ts +29 -27
  80. package/src/ui/Conversation/ConversationHeader.tsx +23 -23
  81. package/src/ui/Conversation/ConversationName.tsx +7 -7
  82. package/src/ui/Conversation/InputBox/InputBox.tsx +113 -40
  83. package/src/ui/Conversation/InputBox/InputBoxFile.tsx +38 -0
  84. package/src/ui/Conversation/InputBox/InputBoxFileList.tsx +21 -0
  85. package/src/ui/Conversation/InputBox/InputFilesBox.tsx +78 -9
  86. package/src/ui/Conversation/InputBox/InputSubmitButtonBox.tsx +26 -17
  87. package/src/ui/Conversation/InputBox/InputTextBox.tsx +55 -53
  88. package/src/ui/Conversation/InputBox/index.ts +23 -16
  89. package/src/ui/Conversation/Message/MessageAuthor.tsx +13 -13
  90. package/src/ui/Conversation/Message/MessageBox.tsx +20 -20
  91. package/src/ui/Conversation/Message/MessageContent.tsx +15 -11
  92. package/src/ui/Conversation/Message/MessageFile.tsx +52 -0
  93. package/src/ui/Conversation/Message/MessageFileList.tsx +14 -0
  94. package/src/ui/Conversation/Message/MessageInfoBox.tsx +28 -28
  95. package/src/ui/Conversation/Message/MessageRow.tsx +28 -28
  96. package/src/ui/Conversation/Message/MessageText.tsx +7 -7
  97. package/src/ui/Conversation/Message/index.ts +28 -22
  98. package/src/ui/Conversation/NextObserver/NextMessagesObserver.tsx +47 -47
  99. package/src/ui/Conversation/NextObserver/index.ts +1 -1
  100. package/src/ui/Conversation/ReadObserver/MessageReadObserver.tsx +49 -49
  101. package/src/ui/Conversation/ReadObserver/index.ts +1 -1
  102. package/src/ui/Conversation/SendingMessage/SendingMessageBox.tsx +16 -16
  103. package/src/ui/Conversation/SendingMessage/SendingMessageContent.tsx +13 -13
  104. package/src/ui/Conversation/SendingMessage/SendingMessageInfoBox.tsx +13 -13
  105. package/src/ui/Conversation/SendingMessage/SendingMessageText.tsx +7 -7
  106. package/src/ui/Conversation/SendingMessage/index.ts +16 -16
  107. package/src/ui/Conversation/SystemMessage/SystemMessageBox.tsx +20 -20
  108. package/src/ui/Conversation/SystemMessage/SystemMessageRow.tsx +28 -28
  109. package/src/ui/Conversation/SystemMessage/index.ts +10 -10
  110. package/src/ui/Conversation/index.ts +13 -13
  111. package/src/ui/Thread/ThreadActions.tsx +22 -22
  112. package/src/ui/Thread/ThreadContext.ts +13 -13
  113. package/src/ui/Thread/ThreadPanel.tsx +127 -127
  114. package/src/ui/Thread/index.tsx +3 -3
  115. package/src/ui/color.ts +20 -20
  116. package/src/ui/common/Avatar.tsx +20 -20
  117. package/src/ui/common/Icon.tsx +44 -40
  118. package/src/ui/common/MessageSkeleton.tsx +20 -20
  119. package/src/ui/common/index.ts +13 -13
  120. package/src/ui/customize.tsx +51 -53
  121. package/src/ui/index.ts +11 -11
  122. package/src/ui/localizer.tsx +96 -81
  123. package/src/ui/useFormatter.tsx +17 -0
  124. package/dist/esm/types/core/api/accountApi.d.ts +0 -5
  125. package/dist/esm/types/core/api/chatApi.d.ts +0 -16
  126. package/dist/esm/types/core/api/chatListApi.d.ts +0 -5
  127. package/dist/esm/types/core/api/chatMemberApi.d.ts +0 -6
  128. package/dist/esm/types/core/api/chatMessageApi.d.ts +0 -3
  129. package/dist/esm/types/core/api/threadApi.d.ts +0 -1
  130. package/dist/esm/types/core/api/threadMessageApi.d.ts +0 -6
  131. package/src/core/api/accountApi.ts +0 -11
  132. package/src/core/api/chatApi.ts +0 -87
  133. package/src/core/api/chatListApi.ts +0 -134
  134. package/src/core/api/chatMemberApi.ts +0 -20
  135. package/src/core/api/chatMessageApi.ts +0 -12
  136. package/src/core/api/threadApi.ts +0 -8
  137. package/src/core/api/threadMessageApi.ts +0 -20
  138. package/src/types/core/api/accountApi.d.ts +0 -5
  139. package/src/types/core/api/api.d.ts +0 -2380
  140. package/src/types/core/api/baseApi.d.ts +0 -15
  141. package/src/types/core/api/chatApi.d.ts +0 -16
  142. package/src/types/core/api/chatListApi.d.ts +0 -5
  143. package/src/types/core/api/chatMemberApi.d.ts +0 -6
  144. package/src/types/core/api/chatMessageApi.d.ts +0 -3
  145. package/src/types/core/api/index.d.ts +0 -1
  146. package/src/types/core/api/threadApi.d.ts +0 -1
  147. package/src/types/core/api/threadMessageApi.d.ts +0 -6
  148. package/src/types/core/client.d.ts +0 -83
  149. package/src/types/core/constants.d.ts +0 -1
  150. package/src/types/core/debounce.d.ts +0 -27
  151. package/src/types/core/index.d.ts +0 -4
  152. package/src/types/core/types.d.ts +0 -105
  153. package/src/types/index.d.ts +0 -2
  154. package/src/types/ui/Chat/ChatContext.d.ts +0 -10
  155. package/src/types/ui/Chat/ChatEditableHeaderName.d.ts +0 -2
  156. package/src/types/ui/Chat/ChatHeaderActions.d.ts +0 -2
  157. package/src/types/ui/Chat/ChatPanel.d.ts +0 -13
  158. package/src/types/ui/Chat/ChatView.d.ts +0 -17
  159. package/src/types/ui/Chat/Members/ChatMembersButton.d.ts +0 -2
  160. package/src/types/ui/Chat/Members/ChatMembersPanel.d.ts +0 -2
  161. package/src/types/ui/Chat/Members/ChatMembersPreview.d.ts +0 -2
  162. package/src/types/ui/Chat/Members/index.d.ts +0 -11
  163. package/src/types/ui/Chat/index.d.ts +0 -6
  164. package/src/types/ui/ChatGroup/ChatGroupContext.d.ts +0 -12
  165. package/src/types/ui/ChatGroup/ChatGroupPanel.d.ts +0 -15
  166. package/src/types/ui/ChatGroup/Create/CreateChatButton.d.ts +0 -2
  167. package/src/types/ui/ChatGroup/Create/CreateChatForm.d.ts +0 -11
  168. package/src/types/ui/ChatGroup/Create/CreateChatMemberInput.d.ts +0 -5
  169. package/src/types/ui/ChatGroup/Create/CreateChatNameInput.d.ts +0 -5
  170. package/src/types/ui/ChatGroup/Create/CreateChatPanel.d.ts +0 -2
  171. package/src/types/ui/ChatGroup/Create/index.d.ts +0 -17
  172. package/src/types/ui/ChatGroup/Layout/ChatGroupAside.d.ts +0 -2
  173. package/src/types/ui/ChatGroup/Layout/ChatGroupBody.d.ts +0 -2
  174. package/src/types/ui/ChatGroup/Layout/ChatGroupFooter.d.ts +0 -2
  175. package/src/types/ui/ChatGroup/Layout/ChatGroupHeader.d.ts +0 -2
  176. package/src/types/ui/ChatGroup/Layout/ChatGroupMain.d.ts +0 -2
  177. package/src/types/ui/ChatGroup/Layout/index.d.ts +0 -17
  178. package/src/types/ui/ChatGroup/List/ChatList.d.ts +0 -2
  179. package/src/types/ui/ChatGroup/List/ChatListItemAvatar.d.ts +0 -3
  180. package/src/types/ui/ChatGroup/List/ChatListItemBox.d.ts +0 -6
  181. package/src/types/ui/ChatGroup/List/ChatListItemLastMessage.d.ts +0 -3
  182. package/src/types/ui/ChatGroup/List/ChatListItemLastMessageAuthor.d.ts +0 -3
  183. package/src/types/ui/ChatGroup/List/ChatListItemLastMessageContent.d.ts +0 -3
  184. package/src/types/ui/ChatGroup/List/ChatListItemLastMessageSentAt.d.ts +0 -3
  185. package/src/types/ui/ChatGroup/List/ChatListItemName.d.ts +0 -3
  186. package/src/types/ui/ChatGroup/List/ChatListItemUnreadCount.d.ts +0 -3
  187. package/src/types/ui/ChatGroup/List/index.d.ts +0 -29
  188. package/src/types/ui/ChatGroup/index.d.ts +0 -5
  189. package/src/types/ui/Chatify.d.ts +0 -8
  190. package/src/types/ui/Conversation/Conversation.d.ts +0 -21
  191. package/src/types/ui/Conversation/ConversationActions.d.ts +0 -2
  192. package/src/types/ui/Conversation/ConversationBody.d.ts +0 -2
  193. package/src/types/ui/Conversation/ConversationContext.d.ts +0 -20
  194. package/src/types/ui/Conversation/ConversationHeader.d.ts +0 -2
  195. package/src/types/ui/Conversation/ConversationName.d.ts +0 -2
  196. package/src/types/ui/Conversation/InputBox/InputBox.d.ts +0 -2
  197. package/src/types/ui/Conversation/InputBox/InputFilesBox.d.ts +0 -2
  198. package/src/types/ui/Conversation/InputBox/InputSubmitButtonBox.d.ts +0 -5
  199. package/src/types/ui/Conversation/InputBox/InputTextBox.d.ts +0 -8
  200. package/src/types/ui/Conversation/InputBox/index.d.ts +0 -14
  201. package/src/types/ui/Conversation/Message/MessageAuthor.d.ts +0 -3
  202. package/src/types/ui/Conversation/Message/MessageBox.d.ts +0 -6
  203. package/src/types/ui/Conversation/Message/MessageContent.d.ts +0 -3
  204. package/src/types/ui/Conversation/Message/MessageInfoBox.d.ts +0 -3
  205. package/src/types/ui/Conversation/Message/MessageRow.d.ts +0 -6
  206. package/src/types/ui/Conversation/Message/MessageText.d.ts +0 -3
  207. package/src/types/ui/Conversation/Message/index.d.ts +0 -20
  208. package/src/types/ui/Conversation/NextObserver/NextMessagesObserver.d.ts +0 -5
  209. package/src/types/ui/Conversation/NextObserver/index.d.ts +0 -1
  210. package/src/types/ui/Conversation/ReadObserver/MessageReadObserver.d.ts +0 -6
  211. package/src/types/ui/Conversation/ReadObserver/index.d.ts +0 -1
  212. package/src/types/ui/Conversation/SendingMessage/SendingMessageBox.d.ts +0 -7
  213. package/src/types/ui/Conversation/SendingMessage/SendingMessageContent.d.ts +0 -3
  214. package/src/types/ui/Conversation/SendingMessage/SendingMessageInfoBox.d.ts +0 -3
  215. package/src/types/ui/Conversation/SendingMessage/SendingMessageText.d.ts +0 -3
  216. package/src/types/ui/Conversation/SendingMessage/index.d.ts +0 -14
  217. package/src/types/ui/Conversation/SystemMessage/SystemMessageBox.d.ts +0 -6
  218. package/src/types/ui/Conversation/SystemMessage/SystemMessageRow.d.ts +0 -9
  219. package/src/types/ui/Conversation/SystemMessage/index.d.ts +0 -8
  220. package/src/types/ui/Conversation/index.d.ts +0 -12
  221. package/src/types/ui/Thread/ThreadActions.d.ts +0 -2
  222. package/src/types/ui/Thread/ThreadContext.d.ts +0 -8
  223. package/src/types/ui/Thread/ThreadPanel.d.ts +0 -14
  224. package/src/types/ui/Thread/index.d.ts +0 -3
  225. package/src/types/ui/color.d.ts +0 -6
  226. package/src/types/ui/common/Avatar.d.ts +0 -6
  227. package/src/types/ui/common/Icon.d.ts +0 -20
  228. package/src/types/ui/common/MessageSkeleton.d.ts +0 -5
  229. package/src/types/ui/common/index.d.ts +0 -11
  230. package/src/types/ui/customize.d.ts +0 -9
  231. package/src/types/ui/index.d.ts +0 -11
  232. package/src/types/ui/localizer.d.ts +0 -35
@@ -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, 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 +1 @@
1
- export const SYSTEM_ID = 'chatify::system';
1
+ export const SYSTEM_ID = 'chatify::system';