@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.
- package/dist/css/chatify.css +111 -12
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/core/api/api.d.ts +10784 -232
- package/dist/esm/types/core/api/baseApi.d.ts +1 -1
- package/dist/esm/types/ui/Conversation/Conversation.d.ts +2 -0
- package/dist/esm/types/ui/Conversation/ConversationContext.d.ts +2 -0
- package/dist/esm/types/ui/Conversation/InputBox/InputBoxFile.d.ts +8 -0
- package/dist/esm/types/ui/Conversation/InputBox/InputBoxFileList.d.ts +8 -0
- package/dist/esm/types/ui/Conversation/InputBox/InputFilesBox.d.ts +11 -1
- package/dist/esm/types/ui/Conversation/InputBox/InputSubmitButtonBox.d.ts +2 -0
- package/dist/esm/types/ui/Conversation/InputBox/InputTextBox.d.ts +1 -0
- package/dist/esm/types/ui/Conversation/InputBox/index.d.ts +8 -1
- package/dist/esm/types/ui/Conversation/Message/MessageFile.d.ts +6 -0
- package/dist/esm/types/ui/Conversation/Message/MessageFileList.d.ts +3 -0
- package/dist/esm/types/ui/Conversation/Message/index.d.ts +6 -0
- package/dist/esm/types/ui/common/Icon.d.ts +2 -0
- package/dist/esm/types/ui/customize.d.ts +2 -2
- package/dist/esm/types/ui/localizer.d.ts +5 -0
- package/dist/esm/types/ui/useFormatter.d.ts +3 -0
- package/dist/index.d.ts +10835 -239
- package/package.json +94 -93
- package/src/core/api/api.ts +643 -642
- package/src/core/api/baseApi.ts +38 -38
- package/src/core/api/index.ts +1 -1
- package/src/core/client.ts +280 -280
- package/src/core/constants.ts +1 -1
- package/src/core/debounce.ts +90 -90
- package/src/core/index.ts +4 -4
- package/src/core/types.tsx +152 -152
- package/src/index.ts +2 -2
- package/src/styles/aside.scss +162 -161
- package/src/styles/chat.scss +209 -208
- package/src/styles/index.scss +153 -110
- package/src/styles/input.scss +147 -74
- package/src/styles/keyframes.scss +14 -14
- package/src/styles/members.scss +13 -13
- package/src/styles/mixins.scss +25 -20
- package/src/styles/variables.scss +13 -10
- package/src/ui/Chat/ChatContext.tsx +30 -30
- package/src/ui/Chat/ChatEditableHeaderName.tsx +63 -63
- package/src/ui/Chat/ChatHeaderActions.tsx +19 -19
- package/src/ui/Chat/ChatPanel.tsx +30 -30
- package/src/ui/Chat/ChatView.tsx +115 -115
- package/src/ui/Chat/Members/ChatMembersButton.tsx +9 -9
- package/src/ui/Chat/Members/ChatMembersPanel.tsx +112 -112
- package/src/ui/Chat/Members/ChatMembersPreview.tsx +25 -25
- package/src/ui/Chat/Members/index.ts +13 -13
- package/src/ui/Chat/index.ts +6 -6
- package/src/ui/ChatGroup/ChatGroupContext.tsx +50 -50
- package/src/ui/ChatGroup/ChatGroupPanel.tsx +73 -73
- package/src/ui/ChatGroup/Create/CreateChatButton.tsx +15 -15
- package/src/ui/ChatGroup/Create/CreateChatForm.tsx +36 -36
- package/src/ui/ChatGroup/Create/CreateChatMemberInput.tsx +65 -65
- package/src/ui/ChatGroup/Create/CreateChatNameInput.tsx +25 -25
- package/src/ui/ChatGroup/Create/CreateChatPanel.tsx +45 -45
- package/src/ui/ChatGroup/Create/index.ts +19 -19
- package/src/ui/ChatGroup/Layout/ChatGroupAside.tsx +12 -12
- package/src/ui/ChatGroup/Layout/ChatGroupBody.tsx +10 -10
- package/src/ui/ChatGroup/Layout/ChatGroupFooter.tsx +3 -3
- package/src/ui/ChatGroup/Layout/ChatGroupHeader.tsx +5 -5
- package/src/ui/ChatGroup/Layout/ChatGroupMain.tsx +17 -17
- package/src/ui/ChatGroup/Layout/index.ts +19 -19
- package/src/ui/ChatGroup/List/ChatList.tsx +41 -41
- package/src/ui/ChatGroup/List/ChatListItemAvatar.tsx +22 -22
- package/src/ui/ChatGroup/List/ChatListItemBox.tsx +26 -26
- package/src/ui/ChatGroup/List/ChatListItemLastMessage.tsx +15 -15
- package/src/ui/ChatGroup/List/ChatListItemLastMessageAuthor.tsx +15 -15
- package/src/ui/ChatGroup/List/ChatListItemLastMessageContent.tsx +21 -21
- package/src/ui/ChatGroup/List/ChatListItemLastMessageSentAt.tsx +22 -22
- package/src/ui/ChatGroup/List/ChatListItemName.tsx +8 -8
- package/src/ui/ChatGroup/List/ChatListItemUnreadCount.tsx +12 -12
- package/src/ui/ChatGroup/List/index.ts +31 -31
- package/src/ui/ChatGroup/index.ts +5 -5
- package/src/ui/Chatify.tsx +9 -9
- package/src/ui/Conversation/Conversation.tsx +78 -76
- package/src/ui/Conversation/ConversationActions.tsx +5 -5
- package/src/ui/Conversation/ConversationBody.tsx +28 -28
- package/src/ui/Conversation/ConversationContext.ts +29 -27
- package/src/ui/Conversation/ConversationHeader.tsx +23 -23
- package/src/ui/Conversation/ConversationName.tsx +7 -7
- package/src/ui/Conversation/InputBox/InputBox.tsx +113 -40
- package/src/ui/Conversation/InputBox/InputBoxFile.tsx +38 -0
- package/src/ui/Conversation/InputBox/InputBoxFileList.tsx +21 -0
- package/src/ui/Conversation/InputBox/InputFilesBox.tsx +78 -9
- package/src/ui/Conversation/InputBox/InputSubmitButtonBox.tsx +26 -17
- package/src/ui/Conversation/InputBox/InputTextBox.tsx +55 -53
- package/src/ui/Conversation/InputBox/index.ts +23 -16
- package/src/ui/Conversation/Message/MessageAuthor.tsx +13 -13
- package/src/ui/Conversation/Message/MessageBox.tsx +20 -20
- package/src/ui/Conversation/Message/MessageContent.tsx +15 -11
- package/src/ui/Conversation/Message/MessageFile.tsx +52 -0
- package/src/ui/Conversation/Message/MessageFileList.tsx +14 -0
- package/src/ui/Conversation/Message/MessageInfoBox.tsx +28 -28
- package/src/ui/Conversation/Message/MessageRow.tsx +28 -28
- package/src/ui/Conversation/Message/MessageText.tsx +7 -7
- package/src/ui/Conversation/Message/index.ts +28 -22
- package/src/ui/Conversation/NextObserver/NextMessagesObserver.tsx +47 -47
- package/src/ui/Conversation/NextObserver/index.ts +1 -1
- package/src/ui/Conversation/ReadObserver/MessageReadObserver.tsx +49 -49
- package/src/ui/Conversation/ReadObserver/index.ts +1 -1
- package/src/ui/Conversation/SendingMessage/SendingMessageBox.tsx +16 -16
- package/src/ui/Conversation/SendingMessage/SendingMessageContent.tsx +13 -13
- package/src/ui/Conversation/SendingMessage/SendingMessageInfoBox.tsx +13 -13
- package/src/ui/Conversation/SendingMessage/SendingMessageText.tsx +7 -7
- package/src/ui/Conversation/SendingMessage/index.ts +16 -16
- package/src/ui/Conversation/SystemMessage/SystemMessageBox.tsx +20 -20
- package/src/ui/Conversation/SystemMessage/SystemMessageRow.tsx +28 -28
- package/src/ui/Conversation/SystemMessage/index.ts +10 -10
- package/src/ui/Conversation/index.ts +13 -13
- package/src/ui/Thread/ThreadActions.tsx +22 -22
- package/src/ui/Thread/ThreadContext.ts +13 -13
- package/src/ui/Thread/ThreadPanel.tsx +127 -127
- package/src/ui/Thread/index.tsx +3 -3
- package/src/ui/color.ts +20 -20
- package/src/ui/common/Avatar.tsx +20 -20
- package/src/ui/common/Icon.tsx +44 -40
- package/src/ui/common/MessageSkeleton.tsx +20 -20
- package/src/ui/common/index.ts +13 -13
- package/src/ui/customize.tsx +51 -53
- package/src/ui/index.ts +11 -11
- package/src/ui/localizer.tsx +96 -81
- package/src/ui/useFormatter.tsx +17 -0
- package/dist/esm/types/core/api/accountApi.d.ts +0 -5
- package/dist/esm/types/core/api/chatApi.d.ts +0 -16
- package/dist/esm/types/core/api/chatListApi.d.ts +0 -5
- package/dist/esm/types/core/api/chatMemberApi.d.ts +0 -6
- package/dist/esm/types/core/api/chatMessageApi.d.ts +0 -3
- package/dist/esm/types/core/api/threadApi.d.ts +0 -1
- package/dist/esm/types/core/api/threadMessageApi.d.ts +0 -6
- package/src/core/api/accountApi.ts +0 -11
- package/src/core/api/chatApi.ts +0 -87
- package/src/core/api/chatListApi.ts +0 -134
- package/src/core/api/chatMemberApi.ts +0 -20
- package/src/core/api/chatMessageApi.ts +0 -12
- package/src/core/api/threadApi.ts +0 -8
- package/src/core/api/threadMessageApi.ts +0 -20
- package/src/types/core/api/accountApi.d.ts +0 -5
- package/src/types/core/api/api.d.ts +0 -2380
- package/src/types/core/api/baseApi.d.ts +0 -15
- package/src/types/core/api/chatApi.d.ts +0 -16
- package/src/types/core/api/chatListApi.d.ts +0 -5
- package/src/types/core/api/chatMemberApi.d.ts +0 -6
- package/src/types/core/api/chatMessageApi.d.ts +0 -3
- package/src/types/core/api/index.d.ts +0 -1
- package/src/types/core/api/threadApi.d.ts +0 -1
- package/src/types/core/api/threadMessageApi.d.ts +0 -6
- package/src/types/core/client.d.ts +0 -83
- package/src/types/core/constants.d.ts +0 -1
- package/src/types/core/debounce.d.ts +0 -27
- package/src/types/core/index.d.ts +0 -4
- package/src/types/core/types.d.ts +0 -105
- package/src/types/index.d.ts +0 -2
- package/src/types/ui/Chat/ChatContext.d.ts +0 -10
- package/src/types/ui/Chat/ChatEditableHeaderName.d.ts +0 -2
- package/src/types/ui/Chat/ChatHeaderActions.d.ts +0 -2
- package/src/types/ui/Chat/ChatPanel.d.ts +0 -13
- package/src/types/ui/Chat/ChatView.d.ts +0 -17
- package/src/types/ui/Chat/Members/ChatMembersButton.d.ts +0 -2
- package/src/types/ui/Chat/Members/ChatMembersPanel.d.ts +0 -2
- package/src/types/ui/Chat/Members/ChatMembersPreview.d.ts +0 -2
- package/src/types/ui/Chat/Members/index.d.ts +0 -11
- package/src/types/ui/Chat/index.d.ts +0 -6
- package/src/types/ui/ChatGroup/ChatGroupContext.d.ts +0 -12
- package/src/types/ui/ChatGroup/ChatGroupPanel.d.ts +0 -15
- package/src/types/ui/ChatGroup/Create/CreateChatButton.d.ts +0 -2
- package/src/types/ui/ChatGroup/Create/CreateChatForm.d.ts +0 -11
- package/src/types/ui/ChatGroup/Create/CreateChatMemberInput.d.ts +0 -5
- package/src/types/ui/ChatGroup/Create/CreateChatNameInput.d.ts +0 -5
- package/src/types/ui/ChatGroup/Create/CreateChatPanel.d.ts +0 -2
- package/src/types/ui/ChatGroup/Create/index.d.ts +0 -17
- package/src/types/ui/ChatGroup/Layout/ChatGroupAside.d.ts +0 -2
- package/src/types/ui/ChatGroup/Layout/ChatGroupBody.d.ts +0 -2
- package/src/types/ui/ChatGroup/Layout/ChatGroupFooter.d.ts +0 -2
- package/src/types/ui/ChatGroup/Layout/ChatGroupHeader.d.ts +0 -2
- package/src/types/ui/ChatGroup/Layout/ChatGroupMain.d.ts +0 -2
- package/src/types/ui/ChatGroup/Layout/index.d.ts +0 -17
- package/src/types/ui/ChatGroup/List/ChatList.d.ts +0 -2
- package/src/types/ui/ChatGroup/List/ChatListItemAvatar.d.ts +0 -3
- package/src/types/ui/ChatGroup/List/ChatListItemBox.d.ts +0 -6
- package/src/types/ui/ChatGroup/List/ChatListItemLastMessage.d.ts +0 -3
- package/src/types/ui/ChatGroup/List/ChatListItemLastMessageAuthor.d.ts +0 -3
- package/src/types/ui/ChatGroup/List/ChatListItemLastMessageContent.d.ts +0 -3
- package/src/types/ui/ChatGroup/List/ChatListItemLastMessageSentAt.d.ts +0 -3
- package/src/types/ui/ChatGroup/List/ChatListItemName.d.ts +0 -3
- package/src/types/ui/ChatGroup/List/ChatListItemUnreadCount.d.ts +0 -3
- package/src/types/ui/ChatGroup/List/index.d.ts +0 -29
- package/src/types/ui/ChatGroup/index.d.ts +0 -5
- package/src/types/ui/Chatify.d.ts +0 -8
- package/src/types/ui/Conversation/Conversation.d.ts +0 -21
- package/src/types/ui/Conversation/ConversationActions.d.ts +0 -2
- package/src/types/ui/Conversation/ConversationBody.d.ts +0 -2
- package/src/types/ui/Conversation/ConversationContext.d.ts +0 -20
- package/src/types/ui/Conversation/ConversationHeader.d.ts +0 -2
- package/src/types/ui/Conversation/ConversationName.d.ts +0 -2
- package/src/types/ui/Conversation/InputBox/InputBox.d.ts +0 -2
- package/src/types/ui/Conversation/InputBox/InputFilesBox.d.ts +0 -2
- package/src/types/ui/Conversation/InputBox/InputSubmitButtonBox.d.ts +0 -5
- package/src/types/ui/Conversation/InputBox/InputTextBox.d.ts +0 -8
- package/src/types/ui/Conversation/InputBox/index.d.ts +0 -14
- package/src/types/ui/Conversation/Message/MessageAuthor.d.ts +0 -3
- package/src/types/ui/Conversation/Message/MessageBox.d.ts +0 -6
- package/src/types/ui/Conversation/Message/MessageContent.d.ts +0 -3
- package/src/types/ui/Conversation/Message/MessageInfoBox.d.ts +0 -3
- package/src/types/ui/Conversation/Message/MessageRow.d.ts +0 -6
- package/src/types/ui/Conversation/Message/MessageText.d.ts +0 -3
- package/src/types/ui/Conversation/Message/index.d.ts +0 -20
- package/src/types/ui/Conversation/NextObserver/NextMessagesObserver.d.ts +0 -5
- package/src/types/ui/Conversation/NextObserver/index.d.ts +0 -1
- package/src/types/ui/Conversation/ReadObserver/MessageReadObserver.d.ts +0 -6
- package/src/types/ui/Conversation/ReadObserver/index.d.ts +0 -1
- package/src/types/ui/Conversation/SendingMessage/SendingMessageBox.d.ts +0 -7
- package/src/types/ui/Conversation/SendingMessage/SendingMessageContent.d.ts +0 -3
- package/src/types/ui/Conversation/SendingMessage/SendingMessageInfoBox.d.ts +0 -3
- package/src/types/ui/Conversation/SendingMessage/SendingMessageText.d.ts +0 -3
- package/src/types/ui/Conversation/SendingMessage/index.d.ts +0 -14
- package/src/types/ui/Conversation/SystemMessage/SystemMessageBox.d.ts +0 -6
- package/src/types/ui/Conversation/SystemMessage/SystemMessageRow.d.ts +0 -9
- package/src/types/ui/Conversation/SystemMessage/index.d.ts +0 -8
- package/src/types/ui/Conversation/index.d.ts +0 -12
- package/src/types/ui/Thread/ThreadActions.d.ts +0 -2
- package/src/types/ui/Thread/ThreadContext.d.ts +0 -8
- package/src/types/ui/Thread/ThreadPanel.d.ts +0 -14
- package/src/types/ui/Thread/index.d.ts +0 -3
- package/src/types/ui/color.d.ts +0 -6
- package/src/types/ui/common/Avatar.d.ts +0 -6
- package/src/types/ui/common/Icon.d.ts +0 -20
- package/src/types/ui/common/MessageSkeleton.d.ts +0 -5
- package/src/types/ui/common/index.d.ts +0 -11
- package/src/types/ui/customize.d.ts +0 -9
- package/src/types/ui/index.d.ts +0 -11
- package/src/types/ui/localizer.d.ts +0 -35
package/src/core/api/baseApi.ts
CHANGED
|
@@ -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;
|
package/src/core/api/index.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './api';
|
|
1
|
+
export * from './api';
|
package/src/core/client.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/core/constants.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const SYSTEM_ID = 'chatify::system';
|
|
1
|
+
export const SYSTEM_ID = 'chatify::system';
|