@webinex/chatify 1.0.0-rc2 → 1.0.0-rc3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/css/chatify.css +183 -141
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/core/action.d.ts +110 -42
- package/dist/esm/types/core/client.d.ts +2 -1
- package/dist/esm/types/core/index.d.ts +11 -8
- package/dist/esm/types/core/models.d.ts +10 -4
- package/dist/esm/types/core/state.d.ts +36 -7
- package/dist/esm/types/core/useAddChatMutation.d.ts +2 -0
- package/dist/esm/types/core/useAddMemberMutation.d.ts +2 -0
- package/dist/esm/types/core/useFetchNextMutation.d.ts +3 -0
- package/dist/esm/types/core/useGetAccountsQuery.d.ts +1 -0
- package/dist/esm/types/core/useGetChatListQuery.d.ts +1 -0
- package/dist/{cjs/types/core/useChat.d.ts → esm/types/core/useGetChatQuery.d.ts} +1 -1
- package/dist/esm/types/core/useGetMessagesQuery.d.ts +4 -0
- package/dist/esm/types/core/useRemoveMemberMutation.d.ts +2 -0
- package/dist/esm/types/core/useSendMutation.d.ts +2 -0
- package/dist/esm/types/core/useUpdateChatNameMutation.d.ts +2 -0
- package/dist/esm/types/ui/AddChatButton.d.ts +2 -2
- package/dist/esm/types/ui/Avatar.d.ts +2 -2
- package/dist/esm/types/ui/ChatList/ChatList.d.ts +2 -0
- package/dist/esm/types/ui/ChatList/ChatListItemBox.d.ts +6 -0
- package/dist/esm/types/ui/ChatList/ChatListItemLastMessage.d.ts +3 -0
- package/dist/esm/types/ui/ChatList/ChatListItemLastMessageAuthor.d.ts +3 -0
- package/dist/esm/types/ui/ChatList/ChatListItemLastMessageContent.d.ts +3 -0
- package/dist/esm/types/ui/ChatList/ChatListItemName.d.ts +3 -0
- package/dist/esm/types/ui/ChatList/ChatListItemUnreadCount.d.ts +3 -0
- package/dist/esm/types/ui/ChatList/index.d.ts +7 -0
- package/dist/esm/types/ui/ChatName.d.ts +2 -2
- package/dist/esm/types/ui/ChatPanel/ChatBody.d.ts +5 -0
- package/dist/esm/types/ui/ChatPanel/ChatHeader.d.ts +5 -0
- package/dist/esm/types/ui/ChatPanel/ChatHeaderMembers.d.ts +5 -0
- package/dist/esm/types/ui/ChatPanel/ChatHeaderName.d.ts +5 -0
- package/dist/esm/types/ui/ChatPanel/ChatMembersButton.d.ts +5 -0
- package/dist/esm/types/ui/ChatPanel/ChatMembersPanel.d.ts +5 -0
- package/dist/esm/types/ui/ChatPanel/ChatPanel.d.ts +5 -0
- package/dist/esm/types/ui/ChatPanel/index.d.ts +6 -0
- package/dist/esm/types/ui/Chatify.d.ts +45 -23
- package/dist/esm/types/ui/CreateChatPanel/CreateChatForm.d.ts +11 -0
- package/dist/esm/types/ui/CreateChatPanel/CreateChatMemberInput.d.ts +5 -0
- package/dist/esm/types/ui/CreateChatPanel/CreateChatNameInput.d.ts +5 -0
- package/dist/esm/types/ui/CreateChatPanel/CreateChatPanel.d.ts +2 -0
- package/dist/esm/types/ui/CreateChatPanel/index.d.ts +4 -0
- package/dist/esm/types/ui/Icon.d.ts +13 -4
- package/dist/esm/types/ui/InputBox/InputBox.d.ts +2 -0
- package/dist/esm/types/ui/InputBox/InputFilesBox.d.ts +2 -0
- package/dist/esm/types/ui/InputBox/InputSubmitButtonBox.d.ts +5 -0
- package/dist/esm/types/ui/InputBox/InputTextBox.d.ts +7 -0
- package/dist/esm/types/ui/InputBox/index.d.ts +4 -0
- package/dist/esm/types/ui/Layout/Aside.d.ts +2 -0
- package/dist/esm/types/ui/Layout/Body.d.ts +2 -0
- package/dist/esm/types/ui/Layout/Footer.d.ts +2 -0
- package/dist/esm/types/ui/Layout/Header.d.ts +2 -0
- package/dist/esm/types/ui/Layout/Main.d.ts +2 -0
- package/dist/esm/types/ui/Layout/index.d.ts +5 -0
- package/dist/esm/types/ui/Message/MessageAuthor.d.ts +3 -0
- package/dist/esm/types/ui/Message/MessageBox.d.ts +6 -0
- package/dist/esm/types/ui/Message/MessageContent.d.ts +3 -0
- package/dist/esm/types/ui/Message/MessageInfoBox.d.ts +3 -0
- package/dist/esm/types/ui/Message/MessageRow.d.ts +6 -0
- package/dist/esm/types/ui/Message/MessageText.d.ts +3 -0
- package/dist/esm/types/ui/Message/index.d.ts +6 -0
- package/dist/esm/types/ui/MessageReadObserver.d.ts +6 -0
- package/dist/esm/types/ui/Next.d.ts +4 -0
- package/dist/esm/types/ui/SendingMessage/SendingMessageBox.d.ts +7 -0
- package/dist/esm/types/ui/SendingMessage/SendingMessageContent.d.ts +3 -0
- package/dist/esm/types/ui/SendingMessage/SendingMessageInfoBox.d.ts +3 -0
- package/dist/esm/types/ui/SendingMessage/SendingMessageText.d.ts +3 -0
- package/dist/esm/types/ui/SendingMessage/index.d.ts +4 -0
- package/dist/esm/types/ui/SystemMessage/SystemMessageBox.d.ts +6 -0
- package/dist/esm/types/ui/SystemMessage/SystemMessageRow.d.ts +9 -0
- package/dist/esm/types/ui/SystemMessage/index.d.ts +2 -0
- package/dist/esm/types/{util → ui}/customize.d.ts +2 -3
- package/dist/esm/types/ui/index.d.ts +6 -6
- package/dist/esm/types/ui/localizer.d.ts +5 -0
- package/dist/esm/types/util/index.d.ts +0 -1
- package/dist/index.d.ts +353 -142
- package/package.json +3 -1
- package/src/core/action.tsx +319 -233
- package/src/core/client.ts +6 -0
- package/src/core/index.ts +11 -8
- package/src/core/models.tsx +11 -4
- package/src/core/reducer.tsx +2 -1
- package/src/core/state.ts +68 -14
- package/src/core/useAddChatMutation.tsx +22 -0
- package/src/core/useAddMemberMutation.tsx +25 -0
- package/src/core/useFetchNextMutation.tsx +28 -0
- package/src/core/useGetAccountsQuery.tsx +33 -0
- package/src/core/useGetChatListQuery.tsx +33 -0
- package/src/core/useGetChatQuery.tsx +34 -0
- package/src/core/useGetMessagesQuery.tsx +35 -0
- package/src/core/useReadMonitor.tsx +8 -7
- package/src/core/useRemoveMemberMutation.tsx +23 -0
- package/src/core/useSendMutation.tsx +24 -0
- package/src/core/useSignalRMonitor.tsx +19 -5
- package/src/core/useUpdateChatNameMutation.tsx +23 -0
- package/src/{ui/styles → styles}/aside.scss +1 -1
- package/src/styles/chat.scss +222 -0
- package/src/styles/index.scss +79 -0
- package/src/styles/settings.scss +5 -0
- package/src/ui/AddChatButton.tsx +4 -8
- package/src/ui/Avatar.tsx +1 -1
- package/src/ui/ChatList/ChatList.tsx +42 -0
- package/src/ui/ChatList/ChatListItemBox.tsx +22 -0
- package/src/ui/ChatList/ChatListItemLastMessage.tsx +13 -0
- package/src/ui/ChatList/ChatListItemLastMessageAuthor.tsx +20 -0
- package/src/ui/ChatList/ChatListItemLastMessageContent.tsx +21 -0
- package/src/ui/ChatList/ChatListItemName.tsx +13 -0
- package/src/ui/ChatList/ChatListItemUnreadCount.tsx +12 -0
- package/src/ui/ChatList/index.ts +7 -0
- package/src/ui/ChatName.tsx +3 -8
- package/src/ui/ChatPanel/ChatBody.tsx +44 -0
- package/src/ui/ChatPanel/ChatHeader.tsx +33 -0
- package/src/ui/{ChatHeaderMembers.tsx → ChatPanel/ChatHeaderMembers.tsx} +5 -9
- package/src/ui/ChatPanel/ChatHeaderName.tsx +67 -0
- package/src/ui/ChatPanel/ChatMembersButton.tsx +21 -0
- package/src/ui/ChatPanel/ChatMembersPanel.tsx +117 -0
- package/src/ui/ChatPanel/ChatPanel.tsx +27 -0
- package/src/ui/ChatPanel/index.ts +6 -0
- package/src/ui/Chatify.tsx +78 -36
- package/src/ui/CreateChatPanel/CreateChatForm.tsx +36 -0
- package/src/ui/CreateChatPanel/CreateChatMemberInput.tsx +66 -0
- package/src/ui/CreateChatPanel/CreateChatNameInput.tsx +25 -0
- package/src/ui/CreateChatPanel/CreateChatPanel.tsx +33 -0
- package/src/ui/CreateChatPanel/index.ts +4 -0
- package/src/ui/Icon.tsx +18 -6
- package/src/ui/InputBox/InputBox.tsx +38 -0
- package/src/ui/InputBox/InputFilesBox.tsx +9 -0
- package/src/ui/InputBox/InputSubmitButtonBox.tsx +17 -0
- package/src/ui/InputBox/InputTextBox.tsx +50 -0
- package/src/ui/InputBox/index.ts +4 -0
- package/src/ui/Layout/Aside.tsx +10 -0
- package/src/ui/Layout/Body.tsx +10 -0
- package/src/ui/Layout/Footer.tsx +3 -0
- package/src/ui/Layout/Header.tsx +10 -0
- package/src/ui/Layout/Main.tsx +15 -0
- package/src/ui/Layout/index.ts +5 -0
- package/src/ui/Message/MessageAuthor.tsx +13 -0
- package/src/ui/Message/MessageBox.tsx +20 -0
- package/src/ui/Message/MessageContent.tsx +13 -0
- package/src/ui/Message/MessageInfoBox.tsx +25 -0
- package/src/ui/Message/MessageRow.tsx +24 -0
- package/src/ui/Message/MessageText.tsx +7 -0
- package/src/ui/Message/index.ts +6 -0
- package/src/ui/MessageReadObserver.tsx +45 -0
- package/src/ui/{LoadMore.tsx → Next.tsx} +16 -8
- package/src/ui/SendingMessage/SendingMessageBox.tsx +16 -0
- package/src/ui/SendingMessage/SendingMessageContent.tsx +13 -0
- package/src/ui/SendingMessage/SendingMessageInfoBox.tsx +13 -0
- package/src/ui/SendingMessage/SendingMessageText.tsx +7 -0
- package/src/ui/SendingMessage/index.ts +4 -0
- package/src/ui/SystemMessage/SystemMessageBox.tsx +20 -0
- package/src/ui/SystemMessage/SystemMessageRow.tsx +43 -0
- package/src/ui/SystemMessage/index.ts +2 -0
- package/src/{util → ui}/customize.tsx +5 -5
- package/src/ui/index.ts +6 -6
- package/src/ui/localizer.tsx +12 -0
- package/src/util/index.ts +0 -1
- package/dist/cjs/index.js +0 -2
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/types/ChatifyContext.d.ts +0 -11
- package/dist/cjs/types/core/action.d.ts +0 -76
- package/dist/cjs/types/core/client.d.ts +0 -35
- package/dist/cjs/types/core/index.d.ts +0 -14
- package/dist/cjs/types/core/models.d.ts +0 -64
- package/dist/cjs/types/core/reducer.d.ts +0 -11
- package/dist/cjs/types/core/state.d.ts +0 -25
- package/dist/cjs/types/core/useAccounts.d.ts +0 -1
- package/dist/cjs/types/core/useAddChat.d.ts +0 -2
- package/dist/cjs/types/core/useAddMember.d.ts +0 -2
- package/dist/cjs/types/core/useAddMessage.d.ts +0 -5
- package/dist/cjs/types/core/useChatList.d.ts +0 -1
- package/dist/cjs/types/core/useLoadMore.d.ts +0 -3
- package/dist/cjs/types/core/useMessages.d.ts +0 -15
- package/dist/cjs/types/core/useMutation.d.ts +0 -12
- package/dist/cjs/types/core/useQuery.d.ts +0 -7
- package/dist/cjs/types/core/useReadMonitor.d.ts +0 -1
- package/dist/cjs/types/core/useRemoveMember.d.ts +0 -2
- package/dist/cjs/types/core/useSignalRMonitor.d.ts +0 -2
- package/dist/cjs/types/index.d.ts +0 -3
- package/dist/cjs/types/ui/AddChat.d.ts +0 -1
- package/dist/cjs/types/ui/AddChatButton.d.ts +0 -2
- package/dist/cjs/types/ui/Aside.d.ts +0 -1
- package/dist/cjs/types/ui/Avatar.d.ts +0 -6
- package/dist/cjs/types/ui/Chat.d.ts +0 -4
- package/dist/cjs/types/ui/ChatBody.d.ts +0 -4
- package/dist/cjs/types/ui/ChatHeader.d.ts +0 -4
- package/dist/cjs/types/ui/ChatHeaderMembers.d.ts +0 -5
- package/dist/cjs/types/ui/ChatHeaderSettingsButton.d.ts +0 -5
- package/dist/cjs/types/ui/ChatListItem.d.ts +0 -11
- package/dist/cjs/types/ui/ChatName.d.ts +0 -5
- package/dist/cjs/types/ui/ChatSettings.d.ts +0 -1
- package/dist/cjs/types/ui/Chatify.d.ts +0 -49
- package/dist/cjs/types/ui/Footer.d.ts +0 -2
- package/dist/cjs/types/ui/Header.d.ts +0 -2
- package/dist/cjs/types/ui/Icon.d.ts +0 -7
- package/dist/cjs/types/ui/InputForm.d.ts +0 -1
- package/dist/cjs/types/ui/LoadMore.d.ts +0 -4
- package/dist/cjs/types/ui/Main.d.ts +0 -1
- package/dist/cjs/types/ui/Message.d.ts +0 -18
- package/dist/cjs/types/ui/MessageSkeleton.d.ts +0 -4
- package/dist/cjs/types/ui/SendingMessage.d.ts +0 -10
- package/dist/cjs/types/ui/SystemMessage.d.ts +0 -8
- package/dist/cjs/types/ui/index.d.ts +0 -11
- package/dist/cjs/types/ui/localizer.d.ts +0 -32
- package/dist/cjs/types/util/customize.d.ts +0 -12
- package/dist/cjs/types/util/index.d.ts +0 -3
- package/dist/cjs/types/util/uniqBy.d.ts +0 -1
- package/dist/cjs/types/util/uniqId.d.ts +0 -1
- package/dist/esm/types/core/useAccounts.d.ts +0 -1
- package/dist/esm/types/core/useAddChat.d.ts +0 -2
- package/dist/esm/types/core/useAddMember.d.ts +0 -2
- package/dist/esm/types/core/useAddMessage.d.ts +0 -5
- package/dist/esm/types/core/useChat.d.ts +0 -3
- package/dist/esm/types/core/useChatList.d.ts +0 -1
- package/dist/esm/types/core/useLoadMore.d.ts +0 -3
- package/dist/esm/types/core/useMessages.d.ts +0 -15
- package/dist/esm/types/core/useMutation.d.ts +0 -12
- package/dist/esm/types/core/useQuery.d.ts +0 -7
- package/dist/esm/types/core/useRemoveMember.d.ts +0 -2
- package/dist/esm/types/ui/AddChat.d.ts +0 -1
- package/dist/esm/types/ui/Aside.d.ts +0 -1
- package/dist/esm/types/ui/Chat.d.ts +0 -4
- package/dist/esm/types/ui/ChatBody.d.ts +0 -4
- package/dist/esm/types/ui/ChatHeader.d.ts +0 -4
- package/dist/esm/types/ui/ChatHeaderMembers.d.ts +0 -5
- package/dist/esm/types/ui/ChatHeaderSettingsButton.d.ts +0 -5
- package/dist/esm/types/ui/ChatListItem.d.ts +0 -11
- package/dist/esm/types/ui/ChatSettings.d.ts +0 -1
- package/dist/esm/types/ui/Footer.d.ts +0 -2
- package/dist/esm/types/ui/Header.d.ts +0 -2
- package/dist/esm/types/ui/InputForm.d.ts +0 -1
- package/dist/esm/types/ui/LoadMore.d.ts +0 -4
- package/dist/esm/types/ui/Main.d.ts +0 -1
- package/dist/esm/types/ui/Message.d.ts +0 -18
- package/dist/esm/types/ui/SendingMessage.d.ts +0 -10
- package/dist/esm/types/ui/SystemMessage.d.ts +0 -8
- package/src/core/useAccounts.tsx +0 -11
- package/src/core/useAddChat.tsx +0 -12
- package/src/core/useAddMember.tsx +0 -12
- package/src/core/useAddMessage.tsx +0 -40
- package/src/core/useChat.tsx +0 -12
- package/src/core/useChatList.tsx +0 -10
- package/src/core/useLoadMore.tsx +0 -42
- package/src/core/useMessages.tsx +0 -23
- package/src/core/useMutation.tsx +0 -48
- package/src/core/useQuery.tsx +0 -45
- package/src/core/useRemoveMember.tsx +0 -12
- package/src/ui/AddChat.tsx +0 -55
- package/src/ui/Aside.tsx +0 -41
- package/src/ui/Chat.tsx +0 -26
- package/src/ui/ChatBody.tsx +0 -43
- package/src/ui/ChatHeader.tsx +0 -33
- package/src/ui/ChatHeaderSettingsButton.tsx +0 -26
- package/src/ui/ChatListItem.tsx +0 -101
- package/src/ui/ChatSettings.tsx +0 -59
- package/src/ui/Footer.tsx +0 -7
- package/src/ui/Header.tsx +0 -14
- package/src/ui/InputForm.tsx +0 -51
- package/src/ui/Main.tsx +0 -16
- package/src/ui/Message.tsx +0 -118
- package/src/ui/SendingMessage.tsx +0 -50
- package/src/ui/SystemMessage.tsx +0 -32
- package/src/ui/styles/index.scss +0 -248
- /package/src/{ui/styles → styles}/keyframes.scss +0 -0
- /package/src/{ui/styles → styles}/mixins.scss +0 -0
- /package/src/{ui/styles → styles}/variables.scss +0 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Input } from 'antd';
|
|
2
|
+
import { customize } from '../customize';
|
|
3
|
+
import isHotkey from 'is-hotkey';
|
|
4
|
+
import { memo, useCallback } from 'react';
|
|
5
|
+
import { useLocalizer } from '../localizer';
|
|
6
|
+
|
|
7
|
+
export interface TextInputBoxProps {
|
|
8
|
+
value: string;
|
|
9
|
+
onChange: (value: string) => void;
|
|
10
|
+
onSend: (value: string) => void;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const isSend = isHotkey('ctrl+enter');
|
|
14
|
+
|
|
15
|
+
const AUTO_SIZE = { maxRows: 5 };
|
|
16
|
+
|
|
17
|
+
export const InputTextBox = customize(
|
|
18
|
+
'InputTextBox',
|
|
19
|
+
memo((props: TextInputBoxProps) => {
|
|
20
|
+
const { value, onChange, onSend } = props;
|
|
21
|
+
const localizer = useLocalizer();
|
|
22
|
+
|
|
23
|
+
const onInputChange = useCallback(
|
|
24
|
+
(e: React.ChangeEvent<HTMLTextAreaElement>) => onChange(e.target.value),
|
|
25
|
+
[onChange],
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
const onKeyDown = useCallback(
|
|
29
|
+
(e: React.KeyboardEvent<HTMLTextAreaElement>) => {
|
|
30
|
+
if (isSend(e)) {
|
|
31
|
+
onSend(value);
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
[onSend, value],
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<div className="wxchtf-text-input-box">
|
|
39
|
+
<Input.TextArea
|
|
40
|
+
value={value}
|
|
41
|
+
onChange={onInputChange}
|
|
42
|
+
autoSize={AUTO_SIZE}
|
|
43
|
+
className="wxchtf-text-input-textarea"
|
|
44
|
+
placeholder={localizer.input.placeholder()}
|
|
45
|
+
onKeyDown={onKeyDown}
|
|
46
|
+
/>
|
|
47
|
+
</div>
|
|
48
|
+
);
|
|
49
|
+
}),
|
|
50
|
+
);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useSelect } from '../../core';
|
|
2
|
+
import { customize } from '../customize';
|
|
3
|
+
import { CreateChatPanel } from '../CreateChatPanel';
|
|
4
|
+
import { ChatPanel } from '../ChatPanel';
|
|
5
|
+
|
|
6
|
+
export const Main = customize('Main', () => {
|
|
7
|
+
const { view, chatId } = useSelect((x) => ({ view: x.ui.view, chatId: x.ui.chatId }), []);
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div className="wxchtf-main">
|
|
11
|
+
{view === 'chat' && chatId && <ChatPanel id={chatId} key={chatId} />}
|
|
12
|
+
{view === 'new-chat' && <CreateChatPanel />}
|
|
13
|
+
</div>
|
|
14
|
+
);
|
|
15
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { customize } from '../customize';
|
|
2
|
+
import { Avatar } from '../Avatar';
|
|
3
|
+
import type { MessageBoxProps } from './MessageBox';
|
|
4
|
+
|
|
5
|
+
export const MessageAuthor = customize('MessageAuthor', (props: MessageBoxProps) => {
|
|
6
|
+
const { sentBy } = props.message;
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<div className="wxchtf-message-author">
|
|
10
|
+
<Avatar account={sentBy} />
|
|
11
|
+
</div>
|
|
12
|
+
);
|
|
13
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useRef } from 'react';
|
|
2
|
+
import { Message } from '../../core';
|
|
3
|
+
import { customize } from '../customize';
|
|
4
|
+
import { MessageReadObserver } from '../MessageReadObserver';
|
|
5
|
+
import { MessageRow } from './MessageRow';
|
|
6
|
+
|
|
7
|
+
export interface MessageBoxProps {
|
|
8
|
+
message: Message;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const MessageBox = customize('MessageBox', (props: MessageBoxProps) => {
|
|
12
|
+
const ref = useRef<HTMLDivElement | null>(null);
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<>
|
|
16
|
+
<MessageReadObserver messageRef={ref} {...props} />
|
|
17
|
+
<MessageRow containerRef={ref} {...props} />
|
|
18
|
+
</>
|
|
19
|
+
);
|
|
20
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { customize } from '../customize';
|
|
2
|
+
import { MessageText } from './MessageText';
|
|
3
|
+
import { MessageInfoBox } from './MessageInfoBox';
|
|
4
|
+
import type { MessageBoxProps } from './MessageBox';
|
|
5
|
+
|
|
6
|
+
export const MessageContent = customize('MessageContent', (props: MessageBoxProps) => {
|
|
7
|
+
return (
|
|
8
|
+
<div className="wxchtf-message-content">
|
|
9
|
+
<MessageText {...props} />
|
|
10
|
+
<MessageInfoBox {...props} />
|
|
11
|
+
</div>
|
|
12
|
+
);
|
|
13
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { useMe } from '../../ChatifyContext';
|
|
2
|
+
import { useSelect } from '../../core';
|
|
3
|
+
import { customize } from '../customize';
|
|
4
|
+
import { useLocalizer } from '../localizer';
|
|
5
|
+
import type { MessageBoxProps } from './MessageBox';
|
|
6
|
+
|
|
7
|
+
export const MessageInfoBox = customize('MessageInfoBox', (props: MessageBoxProps) => {
|
|
8
|
+
const { message } = props;
|
|
9
|
+
const { id, sentBy, sentAt } = message;
|
|
10
|
+
const me = useMe();
|
|
11
|
+
const my = sentBy.id === me;
|
|
12
|
+
const localizer = useLocalizer();
|
|
13
|
+
const reading = useSelect((x) => x.queue.read.queued.includes(id), []);
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<div className="wxchtf-message-info-box">
|
|
17
|
+
<div className="wxchtf-message-sent-at">{localizer.timestamp(sentAt)}</div>
|
|
18
|
+
{!my && (
|
|
19
|
+
<div className="wxchtf-message-read-box">
|
|
20
|
+
{reading ? localizer.message.reading() : localizer.message.read()}
|
|
21
|
+
</div>
|
|
22
|
+
)}
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { useMe } from '../../ChatifyContext';
|
|
2
|
+
import { Ref } from 'react';
|
|
3
|
+
import { customize } from '../customize';
|
|
4
|
+
import { MessageAuthor } from './MessageAuthor';
|
|
5
|
+
import { MessageContent } from './MessageContent';
|
|
6
|
+
import { MessageBoxProps } from './MessageBox';
|
|
7
|
+
|
|
8
|
+
export interface MessageRowProps extends MessageBoxProps {
|
|
9
|
+
containerRef?: Ref<HTMLDivElement>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const MessageRow = customize('MessageRow', (props: MessageRowProps) => {
|
|
13
|
+
const { message, containerRef } = props;
|
|
14
|
+
const { sentBy } = message;
|
|
15
|
+
const me = useMe();
|
|
16
|
+
const my = sentBy.id === me;
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<div ref={containerRef} className={'wxchtf-message' + (my ? ' --my' : '')}>
|
|
20
|
+
<MessageAuthor {...props} />
|
|
21
|
+
<MessageContent {...props} />
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { customize } from '../customize';
|
|
2
|
+
import { MessageBoxProps } from './MessageBox';
|
|
3
|
+
|
|
4
|
+
export const MessageText = customize('MessageText', (props: MessageBoxProps) => {
|
|
5
|
+
const { text } = props.message;
|
|
6
|
+
return <div className="wxchtf-message-text">{text}</div>;
|
|
7
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { FC, RefObject, useEffect, useMemo, useRef } from 'react';
|
|
2
|
+
import { useDispatch, useSelect } from '../core';
|
|
3
|
+
import { customize } from './customize';
|
|
4
|
+
import { MessageBoxProps } from './Message/MessageBox';
|
|
5
|
+
|
|
6
|
+
export interface MessageReadObserverProps extends MessageBoxProps {
|
|
7
|
+
messageRef: RefObject<HTMLDivElement | null>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const MessageReadObserver = customize<FC<MessageReadObserverProps>>('MessageReadObserver', (props) => {
|
|
11
|
+
const { message, messageRef } = props;
|
|
12
|
+
const dispatch = useDispatch();
|
|
13
|
+
const isRead = useSelect((x) => {
|
|
14
|
+
const lastReadMessageId = x.query.chatList.data!.find((x) => x.id === message.chatId)!.lastReadMessageId;
|
|
15
|
+
return lastReadMessageId != null && message.id.localeCompare(lastReadMessageId) <= 0;
|
|
16
|
+
}, []);
|
|
17
|
+
|
|
18
|
+
const readRef = useRef(isRead);
|
|
19
|
+
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
readRef.current = readRef.current || isRead;
|
|
22
|
+
}, [isRead]);
|
|
23
|
+
|
|
24
|
+
const observer = useMemo(
|
|
25
|
+
() =>
|
|
26
|
+
new IntersectionObserver(([entry]) => {
|
|
27
|
+
if (entry.isIntersecting && !readRef.current) {
|
|
28
|
+
readRef.current = true;
|
|
29
|
+
dispatch({ type: 'read', data: { id: message.id, timestamp: new Date().getTime() } });
|
|
30
|
+
}
|
|
31
|
+
}),
|
|
32
|
+
|
|
33
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
34
|
+
[],
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
observer.observe(messageRef.current!);
|
|
39
|
+
return () => observer.disconnect();
|
|
40
|
+
|
|
41
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
42
|
+
}, [observer]);
|
|
43
|
+
|
|
44
|
+
return <></>;
|
|
45
|
+
});
|
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { useFetchNextMutation } from '../core';
|
|
3
3
|
import { MessageSkeleton } from './MessageSkeleton';
|
|
4
4
|
|
|
5
|
-
export interface
|
|
5
|
+
export interface NextProps {
|
|
6
6
|
chatId: string;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
export function
|
|
9
|
+
export function Next(props: NextProps) {
|
|
10
10
|
const { chatId } = props;
|
|
11
|
-
const [
|
|
11
|
+
const [fetchNext, { isFetching }] = useFetchNextMutation({ chatId });
|
|
12
12
|
const [intersecting, setIntersecting] = useState(false);
|
|
13
13
|
const ref = useRef<HTMLDivElement | null>(null);
|
|
14
|
+
const timerRef = useRef<NodeJS.Timer>();
|
|
14
15
|
|
|
15
16
|
const observer = useMemo(
|
|
16
|
-
() =>
|
|
17
|
+
() =>
|
|
18
|
+
new IntersectionObserver(([entry]) => {
|
|
19
|
+
if (entry.isIntersecting) {
|
|
20
|
+
timerRef.current = setTimeout(() => setIntersecting(true), 200);
|
|
21
|
+
} else {
|
|
22
|
+
clearTimeout(timerRef.current!);
|
|
23
|
+
}
|
|
24
|
+
}),
|
|
17
25
|
[],
|
|
18
26
|
);
|
|
19
27
|
|
|
@@ -27,14 +35,14 @@ export function LoadMore(props: LoadMoreProps) {
|
|
|
27
35
|
return;
|
|
28
36
|
}
|
|
29
37
|
|
|
30
|
-
|
|
38
|
+
fetchNext();
|
|
31
39
|
|
|
32
40
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
33
41
|
}, [intersecting]);
|
|
34
42
|
|
|
35
|
-
if (isFetching) {
|
|
43
|
+
if (isFetching || intersecting) {
|
|
36
44
|
return <MessageSkeleton count={4} />;
|
|
37
45
|
}
|
|
38
46
|
|
|
39
|
-
return <div ref={ref}
|
|
47
|
+
return <div className="wxchtf-next" ref={ref}></div>;
|
|
40
48
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { File } from '../../core';
|
|
2
|
+
import { customize } from '../customize';
|
|
3
|
+
import { SendingMessageContent } from './SendingMessageContent';
|
|
4
|
+
|
|
5
|
+
export interface SendingMessageBoxProps {
|
|
6
|
+
text: string;
|
|
7
|
+
files: File[];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const SendingMessageBox = customize('SendingMessageBox', (props: SendingMessageBoxProps) => {
|
|
11
|
+
return (
|
|
12
|
+
<div className="wxchtf-sending-message">
|
|
13
|
+
<SendingMessageContent {...props} />
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { customize } from '../customize';
|
|
2
|
+
import { SendingMessageText } from './SendingMessageText';
|
|
3
|
+
import { SendingMessageInfoBox } from './SendingMessageInfoBox';
|
|
4
|
+
import type { SendingMessageBoxProps } from './SendingMessageBox';
|
|
5
|
+
|
|
6
|
+
export const SendingMessageContent = customize('SendingMessageContent', (props: SendingMessageBoxProps) => {
|
|
7
|
+
return (
|
|
8
|
+
<div className="wxchtf-sending-message-content">
|
|
9
|
+
<SendingMessageText {...props} />
|
|
10
|
+
<SendingMessageInfoBox {...props} />
|
|
11
|
+
</div>
|
|
12
|
+
);
|
|
13
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { customize } from '../customize';
|
|
2
|
+
import { useLocalizer } from '../localizer';
|
|
3
|
+
import type { SendingMessageBoxProps } from './SendingMessageBox';
|
|
4
|
+
|
|
5
|
+
export const SendingMessageInfoBox = customize('SendingMessageInfoBox', (_: SendingMessageBoxProps) => {
|
|
6
|
+
const localizer = useLocalizer();
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<div className="wxchtf-sending-message-info-box">
|
|
10
|
+
<div className="wxchtf-sending-message-sending-box">{localizer.message.sending()}</div>
|
|
11
|
+
</div>
|
|
12
|
+
);
|
|
13
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { customize } from '../customize';
|
|
2
|
+
import type { SendingMessageBoxProps } from './SendingMessageBox';
|
|
3
|
+
|
|
4
|
+
export const SendingMessageText = customize('SendingMessageText', (props: SendingMessageBoxProps) => {
|
|
5
|
+
const { text } = props;
|
|
6
|
+
return <div className="wxchtf-sending-message-text">{text}</div>;
|
|
7
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useRef } from 'react';
|
|
2
|
+
import { customize } from '../customize';
|
|
3
|
+
import { Message } from '../../core';
|
|
4
|
+
import { MessageReadObserver } from '../MessageReadObserver';
|
|
5
|
+
import { SystemMessageRow } from './SystemMessageRow';
|
|
6
|
+
|
|
7
|
+
export interface SystemMessageBoxProps {
|
|
8
|
+
message: Message;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const SystemMessageBox = customize('SystemMessageBox', (props: SystemMessageBoxProps) => {
|
|
12
|
+
const ref = useRef<HTMLDivElement | null>(null);
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<>
|
|
16
|
+
<MessageReadObserver messageRef={ref} {...props} />
|
|
17
|
+
<SystemMessageRow containerRef={ref} {...props} />
|
|
18
|
+
</>
|
|
19
|
+
);
|
|
20
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Ref } from 'react';
|
|
2
|
+
import { customize } from '../customize';
|
|
3
|
+
import { Localizer, useLocalizer } from '../localizer';
|
|
4
|
+
import { Message } from '../../core';
|
|
5
|
+
|
|
6
|
+
export interface SystemMessageRowProps {
|
|
7
|
+
message: Message;
|
|
8
|
+
containerRef?: Ref<HTMLDivElement>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function formatSystemMessage(localizer: Localizer, text: string): React.ReactNode {
|
|
12
|
+
if (text === 'chatify://chat-created') {
|
|
13
|
+
return localizer.system.chatCreated();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (text.startsWith('chatify://member-added')) {
|
|
17
|
+
return localizer.system.memberAdded();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (text.startsWith('chatify://member-removed')) {
|
|
21
|
+
return localizer.system.memberRemoved();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (text.startsWith('chatify://chat-name-changed::')) {
|
|
25
|
+
const data = JSON.parse(text.substring('chatify://chat-name-changed::'.length));
|
|
26
|
+
return localizer.system.chatNameChanged(data.newName);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return text;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const SystemMessageRow = customize('SystemMessageRow', (props: SystemMessageRowProps) => {
|
|
33
|
+
const { message, containerRef } = props;
|
|
34
|
+
const { text, sentAt } = message;
|
|
35
|
+
const localizer = useLocalizer();
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<div ref={containerRef} className="wxchtf-system-message">
|
|
39
|
+
<div className="wxchtf-text">{formatSystemMessage(localizer, text)}</div>
|
|
40
|
+
<div className="wxchtf-timestamp">{localizer.timestamp(sentAt)}</div>
|
|
41
|
+
</div>
|
|
42
|
+
);
|
|
43
|
+
});
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import React, { FC, PropsWithChildren, useContext } from 'react';
|
|
2
2
|
|
|
3
|
-
export type Customizable<TComponent extends React.ComponentType<any
|
|
3
|
+
export type Customizable<TComponent extends React.ComponentType<any>> = TComponent & {
|
|
4
4
|
Component: TComponent;
|
|
5
|
-
key: TKey;
|
|
6
5
|
};
|
|
7
6
|
|
|
8
7
|
const CustomizeContext = React.createContext<CustomizeProviderValue>(null!);
|
|
@@ -21,10 +20,10 @@ function useCustom<TComponent extends React.ComponentType>(key: string): TCompon
|
|
|
21
20
|
return value[key] as TComponent | null | undefined;
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
export function customize<TComponent extends React.ComponentType<any
|
|
25
|
-
key:
|
|
23
|
+
export function customize<TComponent extends React.ComponentType<any>>(
|
|
24
|
+
key: string,
|
|
26
25
|
Component: TComponent,
|
|
27
|
-
):
|
|
26
|
+
): TComponent extends React.ComponentType<infer X> ? Customizable<React.ComponentType<X>> : never {
|
|
28
27
|
const Result: FC<any> = React.forwardRef<TComponent, any>((props: any, forwardRef) => {
|
|
29
28
|
const Custom = useCustom(key);
|
|
30
29
|
|
|
@@ -39,6 +38,7 @@ export function customize<TComponent extends React.ComponentType<any>, TKey exte
|
|
|
39
38
|
return <Component {...props} ref={forwardRef} />;
|
|
40
39
|
});
|
|
41
40
|
|
|
41
|
+
Component.displayName = Component.displayName || key;
|
|
42
42
|
Result.displayName = 'Customizable.' + Component.displayName;
|
|
43
43
|
|
|
44
44
|
return Object.assign(Result, { key, Component }) as any;
|
package/src/ui/index.ts
CHANGED
|
@@ -2,10 +2,10 @@ export * from './Chatify';
|
|
|
2
2
|
export * from './Avatar';
|
|
3
3
|
export * from './localizer';
|
|
4
4
|
export * from './AddChatButton';
|
|
5
|
-
export * from './Header';
|
|
6
|
-
export * from './ChatHeader';
|
|
7
|
-
export * from './ChatHeaderMembers';
|
|
8
|
-
export * from './
|
|
9
|
-
export * from './Message';
|
|
10
|
-
export * from './SystemMessage';
|
|
5
|
+
export * from './Layout/Header';
|
|
6
|
+
export * from './ChatPanel/ChatHeader';
|
|
7
|
+
export * from './ChatPanel/ChatHeaderMembers';
|
|
8
|
+
export * from './ChatList/ChatListItemBox';
|
|
9
|
+
export * from './Message/MessageBox';
|
|
10
|
+
export * from './SystemMessage/SystemMessageBox';
|
|
11
11
|
export * from './Icon';
|
package/src/ui/localizer.tsx
CHANGED
|
@@ -6,6 +6,8 @@ export interface Localizer {
|
|
|
6
6
|
system: {
|
|
7
7
|
chatCreated: () => string;
|
|
8
8
|
memberAdded: () => string;
|
|
9
|
+
memberRemoved: () => string;
|
|
10
|
+
chatNameChanged: (newName: string) => string;
|
|
9
11
|
};
|
|
10
12
|
message: {
|
|
11
13
|
read: () => React.ReactNode;
|
|
@@ -29,6 +31,10 @@ export interface Localizer {
|
|
|
29
31
|
input: {
|
|
30
32
|
placeholder: () => string;
|
|
31
33
|
};
|
|
34
|
+
|
|
35
|
+
settings: {
|
|
36
|
+
members: () => string;
|
|
37
|
+
};
|
|
32
38
|
}
|
|
33
39
|
|
|
34
40
|
export const LocalizerContext = React.createContext<Localizer>(null!);
|
|
@@ -60,9 +66,15 @@ export const defaultLocalizer: Localizer = {
|
|
|
60
66
|
system: {
|
|
61
67
|
chatCreated: () => 'Chat created',
|
|
62
68
|
memberAdded: () => 'New member added',
|
|
69
|
+
memberRemoved: () => 'Member removed',
|
|
70
|
+
chatNameChanged: (newName: string) => `Chat name changed to '${newName}'`,
|
|
63
71
|
},
|
|
64
72
|
|
|
65
73
|
input: {
|
|
66
74
|
placeholder: () => 'Start typing (Ctrl/⌘Cmd + Enter to send) ...',
|
|
67
75
|
},
|
|
76
|
+
|
|
77
|
+
settings: {
|
|
78
|
+
members: () => 'Members',
|
|
79
|
+
},
|
|
68
80
|
};
|
package/src/util/index.ts
CHANGED
package/dist/cjs/index.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var e=require("react/jsx-runtime"),t=require("@microsoft/signalr"),s=require("react"),a=require("shallow-equal"),n=require("antd"),i=require("dayjs"),c=require("@ant-design/icons"),r=require("is-hotkey"),d=require("@ant-design/icons/SendOutlined"),o=require("@ant-design/icons/FileAddOutlined");function u(e){var t=Object.create(null);return e&&Object.keys(e).forEach((function(s){if("default"!==s){var a=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(t,s,a.get?a:{enumerable:!0,get:function(){return e[s]}})}})),t.default=e,Object.freeze(t)}var l=u(t);function h(e,t,s,a){return new(s||(s=Promise))((function(n,i){function c(e){try{d(a.next(e))}catch(e){i(e)}}function r(e){try{d(a.throw(e))}catch(e){i(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(c,r)}d((a=a.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const m={hubUri:"/api/chatify/hub",headersFactory:()=>Promise.resolve({})},g=["chatify://new-message","chatify://chat-created","chatify://read","chatify://member-added","chatify://member-removed"];function x(e,t,s){const a=s((e=Object.assign(Object.assign({},e),{query:Object.assign({},e.query)})).query[t]);return a&&(e.query[t]=a),e}function j(e,t,s){const a=s((e=Object.assign(Object.assign({},e),{mutation:Object.assign({},e.mutation)})).mutation[t]);return a&&(e.mutation[t]=a),e}const b={query_fetch:(e,{key:t})=>x(e,t,(e=>Object.assign(Object.assign({},e),{isFetching:!0,uninitialized:!1}))),query_resolve:(e,{key:t,data:s})=>x(e,t,(e=>Object.assign(Object.assign({},e),{isFetching:!1,error:void 0,data:s}))),query_reject:(e,{key:t,error:s})=>x(e,t,(e=>Object.assign(Object.assign({},e),{isFetching:!1,error:s}))),mutation_fetch:(e,{key:t})=>j(e,t,(e=>Object.assign(Object.assign({},e),{isFetching:!0}))),mutation_resolve:(e,{key:t})=>j(e,t,(e=>Object.assign(Object.assign({},e),{isFetching:!1,error:void 0}))),mutation_reject:(e,{key:t,error:s})=>j(e,t,(e=>Object.assign(Object.assign({},e),{isFetching:!1,error:s}))),update:(e,{mutation:t})=>t(e),chat_open:(e,{chatId:t})=>Object.assign(Object.assign({},e),{ui:Object.assign(Object.assign({},e.ui),{view:"chat",chatId:t})}),new_chat_open:e=>Object.assign(Object.assign({},e),{ui:Object.assign(Object.assign({},e.ui),{view:"new-chat",chatId:void 0})}),chat_settings_open:(e,{chatId:t})=>Object.assign(Object.assign({},e),{ui:Object.assign(Object.assign({},e.ui),{view:"chat-settings",chatId:t})}),message_received:(e,{message:t,requestId:s})=>{var a;return void 0!==(null===(a=e.query["messages."+t.chatId])||void 0===a?void 0:a.data)&&(e=Object.assign(Object.assign({},e),{query:Object.assign(Object.assign({},e.query),{["messages."+t.chatId]:Object.assign(Object.assign({},e.query["messages."+t.chatId]),{data:[Object.assign({type:"message"},t),...e.query["messages."+t.chatId].data].filter((e=>"sending"!==e.type||e.requestId!==s))})})})),void 0!==e.query["chat-list"].data&&(e=Object.assign(Object.assign({},e),{query:Object.assign(Object.assign({},e.query),{"chat-list":Object.assign(Object.assign({},e.query["chat-list"]),{data:e.query["chat-list"].data.map((e=>e.id===t.chatId?Object.assign(Object.assign({},e),{message:t,unreadCount:t.read?e.unreadCount:e.unreadCount+1}):e))})})})),e},chat_created:(e,{chat:t})=>{var s;return void 0===(null===(s=e.query["chat-list"])||void 0===s?void 0:s.data)?e:Object.assign(Object.assign({},e),{query:Object.assign(Object.assign({},e.query),{"chat-list":Object.assign(Object.assign({},e.query["chat-list"]),{data:[t,...e.query["chat-list"].data]})})})},read:(e,{id:t,timestamp:s})=>Object.assign(Object.assign({},e),{read:Object.assign(Object.assign({},e.read),{queued:[...e.read.queued,t],timestamp:s})}),read_send:(e,{ids:t})=>Object.assign(Object.assign({},e),{read:Object.assign(Object.assign({},e.read),{queued:e.read.queued.filter((e=>!t.includes(e))),sent:[...e.read.sent,...t]})}),read_reject:(e,{ids:t,timestamp:s})=>Object.assign(Object.assign({},e),{read:Object.assign(Object.assign({},e.read),{queued:[...e.read.queued,...t],sent:e.read.sent.filter((e=>!t.includes(e))),timestamp:s})}),read_received:(e,{events:t})=>{var s,a;const n=t.map((e=>e.messageId));e=Object.assign(Object.assign({},e),{query:Object.assign({},e.query),read:Object.assign(Object.assign({},e.read),{sent:e.read.sent.filter((e=>!n.includes(e)))})}),Object.keys(e.query).filter((e=>e.startsWith("messages."))).forEach((t=>{var s;e.query[t]=Object.assign({},e.query[t]);const a=e.query[t];a.data=null===(s=a.data)||void 0===s?void 0:s.map((e=>"message"===e.type&&n.includes(e.id)?Object.assign(Object.assign({},e),{read:!0}):e))})),e.query["chat-list"]=Object.assign({},e.query["chat-list"]);const i=e.query["chat-list"];return i.data=null===(s=i.data)||void 0===s?void 0:s.map((e=>n.includes(e.message.id)?Object.assign(Object.assign({},e),{message:Object.assign(Object.assign({},e.message),{read:!0})}):e)),i.data=null===(a=i.data)||void 0===a?void 0:a.map((e=>Object.assign(Object.assign({},e),{unreadCount:e.unreadCount-t.filter((t=>t.chatId===e.id)).length}))),e},member_added:(e,{chatId:t,chatName:s,account:a,me:n,message:i})=>{var c,r;if(void 0!==(null===(c=(e=Object.assign(Object.assign({},e),{query:Object.assign({},e.query)})).query["chat."+t])||void 0===c?void 0:c.data)&&(e.query["chat."+t]=Object.assign(Object.assign({},e.query["chat."+t]),{data:Object.assign({},e.query["chat."+t].data)}),e.query["chat."+t].data.members=[...e.query["chat."+t].data.members,a]),void 0!==(null===(r=e.query["messages."+t])||void 0===r?void 0:r.data)&&(e.query["messages."+t]=Object.assign(Object.assign({},e.query["messages."+t]),{data:[Object.assign({type:"message"},i),...e.query["messages."+t].data]})),a.id!==n&&void 0!==e.query["chat-list"].data&&(e.query["chat-list"]=Object.assign({},e.query["chat-list"]),e.query["chat-list"].data=e.query["chat-list"].data.map((e=>e.id===t?Object.assign(Object.assign({},e),{message:Object.assign({},i)}):e))),a.id===n&&void 0!==e.query["chat-list"].data){const a={id:t,name:s,message:Object.assign({},i),unreadCount:0};e.query["chat-list"]=Object.assign(Object.assign({},e.query["chat-list"]),{data:[...e.query["chat-list"].data,a]})}return e},member_removed:(e,{chatId:t,accountId:s,deleteHistory:a,me:n})=>{var i,c,r,d,o;return void 0!==(null===(i=(e=Object.assign(Object.assign({},e),{query:Object.assign({},e.query)})).query["chat."+t])||void 0===i?void 0:i.data)&&(e.query["chat."+t]=Object.assign(Object.assign({},e.query["chat."+t]),{data:Object.assign({},e.query["chat."+t].data)}),e.query["chat."+t].data.members=e.query["chat."+t].data.members.filter((e=>e.id!==s))),s===n&&a&&(null===(c=e.query["chat-list"])||void 0===c?void 0:c.data)&&(e.query["chat-list"]=Object.assign({},e.query["chat-list"]),e.query["chat-list"].data=e.query["chat-list"].data.filter((e=>e.id!==t))),s===n&&a&&(null===(r=e.query["chat-list"])||void 0===r?void 0:r.data)&&e.ui.chatId===t&&(e.ui=Object.assign(Object.assign({},e.ui),{chatId:null===(o=null===(d=e.query["chat-list"])||void 0===d?void 0:d.data.at(0))||void 0===o?void 0:o.id})),e}},y={ui:{},query:{},mutation:{},read:{queued:[],sent:[],timestamp:0}};function f(){const e=s.useRef(y),t=s.useRef([]),a=s.useCallback((s=>{const a=function(e,t){const s=b[t.type](e,t.data);return console.debug("[Chatify]: ",t,s),s}(e.current,s);e.current!==a&&(e.current=a,t.current.forEach((e=>e(a))))}),[]),n=s.useCallback((e=>(t.current.push(e),()=>{t.current=t.current.filter((t=>t!==e))})),[]);return[e,a,n]}const p=s.createContext(null);function v({children:t}){const s=f();return e.jsx(p.Provider,{value:s,children:t})}function O(){return s.useContext(p)[1]}function q(){const[e]=s.useContext(p);return e}function C(e,t){const[n,,i]=s.useContext(p),c=s.useRef(e(n.current)),[r,d]=s.useState(c.current);return s.useEffect((()=>{const t=e(n.current);return a.shallowEqual(c.current,t)||(c.current=t,d(t)),i((t=>{const s=e(t);a.shallowEqual(s,c.current)||(c.current=s,d(s))}))}),[]),r}function I(e,t){const a=O();s.useEffect((()=>{let s=[];return t.connect().then((()=>{s.push(t.subscribe("chatify://new-message",(([e,t])=>{a({type:"message_received",data:{message:e,requestId:t}})}))),s.push(t.subscribe("chatify://chat-created",(([e,t])=>{a({type:"chat_created",data:{chat:e,requestId:t}})}))),s.push(t.subscribe("chatify://read",(([e])=>{a({type:"read_received",data:{events:e}})}))),s.push(t.subscribe("chatify://member-added",(([t,s,n,i])=>{a({type:"member_added",data:{chatId:t,chatName:s,account:n,me:e,message:i}})}))),s.push(t.subscribe("chatify://member-removed",(([t,s,n])=>{a({type:"member_removed",data:{chatId:t,accountId:s,deleteHistory:n,me:e}})})))})),()=>{s.forEach((e=>e()))}}),[])}const w=s.createContext(null),N=s.createContext(null);function k(){return s.useContext(N)}function _(){return s.useContext(w)}function M(t){const{children:s}=t;return I(_(),k()),e.jsx(e.Fragment,{children:s})}const S={uninitialized:!1,isFetching:!0,data:void 0,error:void 0};function F(e,t){return e.query[t]}function R(e){const{key:t,queryFn:a}=e,n=q(),i=O(),c=function(e){return C((t=>F(t,e)))}(e.key);return s.useEffect((()=>{F(n.current,t)||(i({type:"query_fetch",data:{key:t}}),a().then((e=>i({type:"query_resolve",data:{key:t,data:e}}))).catch((e=>i({type:"query_reject",data:{key:t,error:e}}))))}),[]),null!=c?c:S}function B(e){const{chatId:t}=e,s=k();return R({key:"chat."+t,queryFn:()=>s.chat(t)})}function A(){const e=k();return R({key:"chat-list",queryFn:()=>e.chats()})}const L={isFetching:!1,error:void 0};function E(e){const{key:t,queryFn:a,onQueryStarted:n}=e,i=O(),c=q(),r=C((t=>t.mutation[e.key])),d=s.useCallback((e=>{i({type:"mutation_fetch",data:{key:t}});const s=a(e);s.then((()=>{i({type:"mutation_resolve",data:{key:t}})})).catch((e=>i({type:"mutation_reject",data:{key:t,error:e}}))),n&&n(e,{promise:s,state:c.current,updateState:e=>{i({type:"update",data:{mutation:e}})}})}),[]);return[d,null!=r?r:L]}function H({chatId:e}){const t=q(),s=k();return E({key:"more."+e,queryFn:()=>s.messages({chatId:e,skip:t.current.query["messages."+e].data.filter((e=>"message"===e.type)).length,take:15}),onQueryStarted:(t,{promise:s,updateState:a})=>h(this,void 0,void 0,(function*(){const t=yield s;a((s=>{var a;(s=Object.assign({},s)).query=Object.assign({},s.query),s.query["messages."+e]=Object.assign({},s.query["messages."+e]);const n=s.query["messages."+e];return n.data=null===(a=n.data)||void 0===a?void 0:a.filter((e=>"more"!==e.type)),n.data=[...n.data,...t.map((e=>Object.assign(Object.assign({type:"message"},e),{proceed:!0})))],15===t.length&&(n.data=[...n.data,{type:"more"}]),s}))}))})}function T(e){const{chatId:t}=e,s=k();return R({key:"messages."+t,queryFn:()=>s.messages({chatId:t,skip:0,take:15}).then((e=>{const t=e.map((e=>Object.assign(Object.assign({type:"message"},e),{proceed:!0})));return 15===e.length?[...t,{type:"more"}]:t}))})}function P(){const e=k();return R({key:"accounts",queryFn:()=>e.accounts()})}function z(){const e=k();return E({key:"add-chat",queryFn:t=>e.addChat(t)})}function U(){const e=k(),[t,a]=C((e=>[e.read.queued,e.read.timestamp])),n=O(),i=s.useRef(null);s.useEffect((()=>{0!==t.length&&(i.current&&clearTimeout(i.current),i.current=setTimeout((()=>{n({type:"read_send",data:{ids:t}}),e.read({ids:t}).catch((()=>n({type:"read_reject",data:{ids:t,timestamp:(new Date).getTime()}})))}),100))}),[a])}function D(){const e=k();return E({key:"add-member",queryFn:t=>e.addMember(t)})}function $(){const e=k();return E({key:"remove-member",queryFn:t=>e.removeMember(t)})}const K=s.createContext(null);function Q(){return s.useContext(K)}const W={timestamp:e=>i(e).format("HH:mm"),message:{read:()=>"Read",reading:()=>"Reading...",sending:()=>"Sending..."},addChat:{title:()=>"Add chat",name:{label:()=>"Name",required:()=>"Name is required",max250:()=>"Max 250 characters allowed"},members:{label:()=>"Members",required:()=>"Members is required"},submitBtn:()=>"Submit"},system:{chatCreated:()=>"Chat created",memberAdded:()=>"New member added"},input:{placeholder:()=>"Start typing (Ctrl/⌘Cmd + Enter to send) ..."}};function G(){return Date.now().toString(36)+Math.random().toString(36).substring(2)}const J=s.createContext(null);function V(t){const{children:s,value:a}=t;return e.jsx(J.Provider,{value:a,children:s})}function X(t,a){const n=s.forwardRef(((n,i)=>{const c=function(e){return s.useContext(J)[e]}(t);return null===c?null:c?e.jsx(c,Object.assign({},n,{ref:i})):e.jsx(a,Object.assign({},n,{ref:i}))}));return n.displayName="Customizable."+a.displayName,Object.assign(n,{key:t,Component:a})}function Y(e,t){return"chatify://chat-created"===t?e.system.chatCreated():t.startsWith("chatify://member-added::")?e.system.memberAdded():t}const Z=X("SystemMessage",(t=>{const{text:s,sentAt:a}=t,n=Q();return e.jsxs("div",{className:"wxchtf-system-message",children:[e.jsx("div",{className:"wxchtf-text",children:Y(n,s)}),e.jsx("div",{className:"wxchtf-timestamp",children:n.timestamp(a)})]})})),ee=t=>{const{account:s}=t;return e.jsx(n.Avatar,{src:s.avatar})};ee.displayName="Avatar";const te=X("Avatar",ee),se=t=>{const{name:s}=t;return e.jsx(e.Fragment,{children:s})};se.displayName="ChatName";const ae=X("ChatName",se),ne=t=>{const{name:s}=t.chat;return e.jsx("div",{className:"wxchtf-chat-name",children:e.jsx(ae,{name:s})})};ne.displayName="ChatListItemName";const ie=X("ChatListItemName",ne),ce=t=>{const{unreadCount:s}=t.chat;return s<=0?null:e.jsx("div",{className:"wxchtf-unread-count",children:s})};ce.displayName="ChatListItemUnreadCount";const re=X("ChatListItemUnreadCount",ce),de=t=>e.jsxs("div",{className:"wxchtf-chat-last",children:[e.jsx(ue,Object.assign({},t)),e.jsx(le,Object.assign({},t))]});de.displayName="ChatListItemLastMessage";const oe=X("ChatListItemLastMessage",de),ue=X("ChatListItemLastMessageAuthor",(t=>{const{message:s}=t.chat;return"chatify::system"===s.sentBy.id?null:e.jsxs("div",{className:"wxchtf-chat-last-author",children:[e.jsx(te,{account:s.sentBy})," ",s.sentBy.name]})})),le=X("ChatListItemLastMessageContent",(t=>{const{message:s}=t.chat,a=Q();return e.jsx("div",{className:"wxchtf-chat-last-message",children:"chatify::system"===s.sentBy.id?Y(a,s.text):s.text})})),he=t=>{const{message:s}=t.chat;return e.jsxs("div",{className:"wxchtf-chat"+(s.read?"":" --unread"),children:[e.jsx(ie,Object.assign({},t)),e.jsx(re,Object.assign({},t)),e.jsx(oe,Object.assign({},t))]})};he.displayName="ChatListItemBox";const me=X("ChatListItemBox",he);function ge(){const t=C((e=>e.ui.chatId)),a=O(),i=s.useMemo((()=>t?[t]:[]),[t]),c=s.useCallback((e=>a({type:"chat_open",data:{chatId:e.selectedKeys[0]}})),[a]),{data:r}=A(),d=s.useMemo((()=>r?r.map((t=>({key:t.id,label:e.jsx(me,{chat:t})}))):[]),[r]);return s.useEffect((()=>{!t&&r&&r.length>0&&a({type:"chat_open",data:{chatId:r[0].id}})}),[r,a]),e.jsx("div",{className:"wxchtf-aside",children:r&&e.jsx(n.Menu,{className:"wxchtf-chats",selectedKeys:i,onSelect:c,items:d})})}function xe(){const[t,{isFetching:a}]=z(),{data:i,isFetching:c}=P(),r=Q(),d=s.useMemo((()=>null==i?void 0:i.map((e=>({value:e.id,label:e.name})))),[i]),o=s.useCallback((e=>t({name:e.name,members:e.members,requestId:G()})),[t]);return e.jsxs("div",{className:"wxchtf-add-chat",children:[e.jsx("h3",{children:r.addChat.title()}),e.jsxs(n.Form,{onFinish:o,layout:"vertical",disabled:a,children:[e.jsx(n.Form.Item,{name:"name",label:r.addChat.name.label(),rules:[{required:!0,message:r.addChat.name.required()},{max:250,message:r.addChat.name.max250()}],children:e.jsx(n.Input,{})}),e.jsx(n.Form.Item,{name:"members",label:r.addChat.members.label(),rules:[{required:!0,message:r.addChat.members.required()}],children:e.jsx(n.Select,{mode:"multiple",loading:c,options:d})}),e.jsx(n.Button,{loading:a,type:"primary",block:!0,htmlType:"submit",children:r.addChat.submitBtn()})]})]})}const je=t=>{const{id:s}=t,{data:a}=B({chatId:s});return(null==a?void 0:a.members)?e.jsx(n.Avatar.Group,{maxCount:5,children:a.members.map((t=>e.jsx(n.Tooltip,{title:t.name,children:e.jsx(n.Avatar,{src:t.avatar,children:t.name})},t.id)))}):null};je.displayName="ChatHeaderMembers";const be=X("ChatHeaderMembers",je),ye=t=>{const{id:a}=t,i=O(),r=s.useCallback((()=>i({type:"chat_settings_open",data:{chatId:a}})),[i]);return e.jsx(n.Button,{onClick:r,type:"link",icon:e.jsx(c.SettingOutlined,{})})};ye.displayName="ChatSettingsButton";const fe=X("ChatSettingsButton",ye);function pe(t){var s;const{id:a}=t,{data:i}=B({chatId:a}),c=C((e=>{var t;return null===(t=e.query["chat-list"].data)||void 0===t?void 0:t.find((e=>e.id===a))})),r=null!==(s=null==i?void 0:i.name)&&void 0!==s?s:null==c?void 0:c.name;return e.jsx("div",{className:"wxchtf-chat-header",children:e.jsxs(n.Row,{justify:"space-between",align:"middle",children:[e.jsx(n.Col,{className:"wxchtf-chat-name",children:r&&e.jsx(ae,{name:r})}),e.jsx(n.Col,{className:"wxchtf-chat-members",children:e.jsxs(n.Space,{align:"center",children:[e.jsx(be,{id:a}),e.jsx(fe,{id:a})]})})]})})}const ve=X("MessageAuthor",(t=>{const{sentBy:s}=t.message;return e.jsx("div",{className:"wxchtf-message-author",children:e.jsx(te,{account:s})})})),Oe=X("MessageText",(t=>{const{text:s}=t.message;return e.jsx("div",{className:"wxchtf-message-text",children:s})})),qe=X("MessageInfoBox",(t=>{const{message:s}=t,{id:a,sentBy:n,sentAt:i,read:c}=s,r=_(),d=n.id===r,o=Q(),u=C((e=>e.read.queued.includes(a)));return e.jsxs("div",{className:"wxchtf-message-info-box",children:[e.jsx("div",{className:"wxchtf-message-sent-at",children:o.timestamp(i)}),void 0!==c&&!d&&e.jsx("div",{className:"wxchtf-message-read-box",children:u?o.message.reading():o.message.read()})]})})),Ce=X("MessageContent",(t=>e.jsxs("div",{className:"wxchtf-message-content",children:[e.jsx(Oe,Object.assign({},t)),e.jsx(qe,Object.assign({},t))]}))),Ie=X("MessageRow",(t=>{const{message:s,containerRef:a}=t,{sentBy:n}=s,i=_(),c=n.id===i;return e.jsxs("div",{ref:a,className:"wxchtf-message"+(c?" --my":""),children:[e.jsx(ve,Object.assign({},t)),e.jsx(Ce,Object.assign({},t))]})})),we=X("MessageBox",(t=>{const a=s.useRef(null);return e.jsxs(e.Fragment,{children:[e.jsx(Ne,Object.assign({messageRef:a},t)),e.jsx(Ie,Object.assign({containerRef:a},t))]})})),Ne=X("MessageReadObserver",(t=>{const{message:a,messageRef:n}=t,i=O(),c=s.useRef(!1),r=s.useMemo((()=>new IntersectionObserver((([e])=>{!e.isIntersecting||c.current||a.read||(c.current=!0,i({type:"read",data:{id:a.id,timestamp:(new Date).getTime()}}))}))),[]);return s.useEffect((()=>(r.observe(n.current),()=>r.disconnect())),[r]),e.jsx(e.Fragment,{})}));function ke(t){const{count:s=1}=t;return e.jsx(e.Fragment,{children:Array.from(Array(s)).map(((t,s)=>e.jsxs("div",{className:"wxchtf-message-skeleton",children:[e.jsx(n.Skeleton.Avatar,{className:"wxchtf-avatar",active:!0}),e.jsx(n.Skeleton.Button,{active:!0,className:"wxchtf-content"})]},s)))})}function _e(t){const{chatId:a}=t,[n,{isFetching:i}]=H({chatId:a}),[c,r]=s.useState(!1),d=s.useRef(null),o=s.useMemo((()=>new IntersectionObserver((([e])=>r((t=>t||e.isIntersecting))))),[]);return s.useEffect((()=>(o.observe(d.current),()=>o.disconnect())),[o]),s.useEffect((()=>{c&&n()}),[c]),i?e.jsx(ke,{count:4}):e.jsx("div",{ref:d})}const Me=X("SendingMessageText",(t=>{const{text:s}=t;return e.jsx("div",{className:"wxchtf-sending-message-text",children:s})})),Se=X("SendingMessageInfoBox",(()=>{const t=Q();return e.jsx("div",{className:"wxchtf-sending-message-info-box",children:e.jsx("div",{className:"wxchtf-sending-message-sending-box",children:t.message.sending()})})})),Fe=X("SendingMessageContent",(t=>e.jsxs("div",{className:"wxchtf-sending-message-content",children:[e.jsx(Me,Object.assign({},t)),e.jsx(Se,Object.assign({},t))]}))),Re=X("SendingMessage",(t=>e.jsx("div",{className:"wxchtf-sending-message",children:e.jsx(Fe,Object.assign({},t))})));function Be(t){const{id:s}=t,{data:a}=T({chatId:s});return e.jsxs("div",{className:"wxchtf-chat-body",children:[!a&&e.jsx(ke,{count:5}),null==a?void 0:a.map(((t,a)=>{if("message"===t.type&&"chatify::system"===t.sentBy.id)return e.jsx(Z,{text:t.text,sentAt:t.sentAt});switch(t.type){case"message":return e.jsx(we,{message:t},t.id);case"sending":return e.jsx(Re,{text:t.text,files:t.files},t.requestId);case"more":return e.jsx(_e,{chatId:s},a);default:return null}}))]})}const Ae={attach:o,send:d},Le=X("Icon",(t=>{const{type:s}=t,a=Ae[s];return a?e.jsx(a,{}):null})),Ee=r("ctrl+enter");function He(){const t=C((e=>e.ui.chatId)),[a]=function(e){const{chatId:t}=e,s=k();return E({key:"add."+t,queryFn:e=>s.send(Object.assign({chatId:t},e)),onQueryStarted:(e,{updateState:s})=>h(this,void 0,void 0,(function*(){s((s=>{const a=(s=Object.assign(Object.assign({},s),{query:Object.assign(Object.assign({},s.query),{["messages."+t]:Object.assign({},s.query["messages."+t])})})).query["messages."+t];return a.data=[{type:"sending",text:e.text,requestId:e.requestId,files:e.files},...a.data],s}))}))})}({chatId:t}),[i,c]=s.useState(""),r=Q(),d=s.useCallback((()=>{c(""),a({text:i,files:[],requestId:G()})}),[t,i]);return e.jsx("div",{className:"wxchtf-input-form",children:e.jsxs("div",{className:"wxchtf-input-box",children:[e.jsx("div",{className:"wxchtf-add-files-box",children:e.jsx(n.Button,{type:"link",icon:e.jsx(Le,{type:"attach"}),className:"wxchtf-add-files-btn"})}),e.jsx("div",{className:"wxchtf-text-input-box",children:e.jsx(n.Input.TextArea,{value:i,onChange:e=>c(e.target.value),autoSize:{maxRows:5},className:"wxchtf-text-input-textarea",placeholder:r.input.placeholder(),onKeyDown:e=>{Ee(e)&&d()}})}),e.jsx("div",{className:"wxchtf-submit-btn-box",children:e.jsx(n.Button,{onClick:d,type:"link",icon:e.jsx(Le,{type:"send"}),className:"wxchtf-submit-btn"})})]})})}function Te(t){const{id:s}=t,a=_(),{data:n}=B({chatId:s}),i=!0===(null==n?void 0:n.members.map((e=>e.id)).includes(a));return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"wxchtf-chat",children:[e.jsx(pe,{id:s}),e.jsx(Be,{id:s})]}),i&&e.jsx(He,{})]})}function Pe(t){const{account:a,chatId:i}=t,[r]=$(),d=s.useCallback((()=>r({chatId:i,accountId:a.id,deleteHistory:!1})),[r,i,a.id]);return e.jsxs(n.List.Item,{children:[a.name," ",e.jsx(n.Button,{onClick:d,type:"link",icon:e.jsx(c.CloseOutlined,{})})]})}function ze(){const[t]=C((e=>[e.ui.chatId])),{data:a}=B({chatId:t}),[i]=D(),{data:r}=P(),d=s.useMemo((()=>null==r?void 0:r.map((e=>({value:e.id,label:e.name})))),[r]),o=s.useCallback((e=>i({chatId:t,accountId:e,withHistory:!0})),[i,t]);return a?e.jsxs("div",{className:"wxchtf-chat-settings",children:[e.jsxs(n.Row,{justify:"space-between",children:[e.jsx(n.Col,{children:e.jsx("h3",{className:"wxchtf-title",children:a.name})}),e.jsx(n.Col,{children:e.jsx(n.Button,{type:"link",icon:e.jsx(c.CloseOutlined,{})})})]}),e.jsx("h4",{children:"Members"}),e.jsx(n.List,{dataSource:a.members,rowKey:"id",renderItem:s=>e.jsx(Pe,{account:s,chatId:t})}),e.jsx(n.Select,{style:{width:"350px"},options:d,value:null,onSelect:o})]}):null}function Ue(){const{view:t,chatId:s}=C((e=>({view:e.ui.view,chatId:e.ui.chatId})));return e.jsxs("div",{className:"wxchtf-main",children:["chat"===t&&s&&e.jsx(Te,{id:s},s),"new-chat"===t&&e.jsx(xe,{}),"chat-settings"===t&&e.jsx(ze,{})]})}const De=()=>{const t=O(),a=s.useCallback((()=>t({type:"new_chat_open",data:void 0})),[t]);return e.jsx(n.Button,{onClick:a,icon:"+",type:"link",children:"Add chat"})};De.displayName="AddChatButton";const $e=X("AddChatButton",De),Ke=()=>e.jsx("div",{className:"wxchtf-header",children:e.jsx($e,{})});Ke.displayName="Header";const Qe=X("Header",Ke),We=()=>e.jsx("div",{className:"wxchtf-footer"});We.displayName="Footer";const Ge=X("Footer",We);function Je(t){const{className:s="",style:a}=t;return U(),e.jsxs("div",{className:s+" wxchtf-chatify",style:a,children:[e.jsx(Qe,{}),e.jsxs("div",{className:"wxchtf-body",children:[e.jsx(ge,{}),e.jsx(Ue,{})]}),e.jsx(Ge,{})]})}const Ve={},Xe=t=>{const{localizer:s=W,customize:a=Ve}=t;return e.jsx(K.Provider,{value:s,children:e.jsx(V,{value:a,children:e.jsx(Je,Object.assign({},t))})})};Xe.displayName="Chatify",exports.ACTIONS=b,exports.AddChatButton=$e,exports.Avatar=te,exports.ChatHeader=pe,exports.ChatHeaderMembers=be,exports.ChatListItemBox=me,exports.ChatListItemLastMessage=oe,exports.ChatListItemLastMessageAuthor=ue,exports.ChatListItemLastMessageContent=le,exports.ChatListItemName=ie,exports.ChatListItemUnreadCount=re,exports.Chatify=Xe,exports.ChatifyClient=class{constructor(e){this._connection=null,this._subscribers={},this._reconnectSubscribers=[],this.connect=()=>h(this,void 0,void 0,(function*(){const e=yield this._config.signalR.headersFactory();this._connection=(new l.HubConnectionBuilder).withUrl(this._config.signalR.hubUri,{accessTokenFactory:this._config.signalR.accessTokenFactory?this._config.signalR.accessTokenFactory:void 0,headers:e}).withAutomaticReconnect().build(),g.forEach((e=>{this._connection.on(e,((...t)=>{var s;null===(s=this._subscribers[e])||void 0===s||s.forEach((e=>e(t)))}))})),this._connection.onreconnected((()=>this._reconnectSubscribers.forEach((e=>e())))),yield this._connection.start()})),this.subscribe=(e,t)=>{var s;return this._subscribers[e]=null!==(s=this._subscribers[e])&&void 0!==s?s:[],this._subscribers[e].push(t),()=>this._subscribers[e].filter((e=>e!==t))},this.subscribeReconnect=e=>(this._reconnectSubscribers.push(e),()=>this._reconnectSubscribers.filter((t=>t!==e))),this.accounts=()=>h(this,void 0,void 0,(function*(){const{data:e}=yield this.axios.get("account");return e})),this.chats=()=>h(this,void 0,void 0,(function*(){const{data:e}=yield this.axios.get("chat");return e})),this.chat=e=>h(this,void 0,void 0,(function*(){const{data:t}=yield this.axios.get(`chat/${e}`);return t})),this.addChat=e=>h(this,void 0,void 0,(function*(){const{data:t}=yield this.axios.post("chat",e);return t})),this.messages=e=>h(this,void 0,void 0,(function*(){const{chatId:t,skip:s=0,take:a=20}=e,n=encodeURIComponent(JSON.stringify({skip:s,take:a})),{data:i}=yield this.axios.get(`chat/${t}/message?pagingRule=${n}`);return i})),this.send=e=>h(this,void 0,void 0,(function*(){const{chatId:t}=e,s=function(e,t){var s={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(s[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(a=Object.getOwnPropertySymbols(e);n<a.length;n++)t.indexOf(a[n])<0&&Object.prototype.propertyIsEnumerable.call(e,a[n])&&(s[a[n]]=e[a[n]])}return s}(e,["chatId"]);yield this.axios.post(`chat/${t}/message`,s)})),this.read=e=>h(this,void 0,void 0,(function*(){yield this.axios.put("chat/message/read",e)})),this.removeMember=e=>h(this,void 0,void 0,(function*(){yield this.axios.delete(`chat/${e.chatId}/member`,{data:e})})),this.addMember=e=>h(this,void 0,void 0,(function*(){yield this.axios.post(`chat/${e.chatId}/member`,e)})),this._config=Object.assign(Object.assign({},e),{signalR:Object.assign(Object.assign({},m),e.signalR)})}get axios(){return this._config.axios}},exports.ChatifyContext=function({value:t,children:s}){return e.jsx(N.Provider,{value:t.client,children:e.jsx(w.Provider,{value:t.me,children:e.jsx(v,{children:e.jsx(M,{children:s})})})})},exports.Header=Qe,exports.ICONS=Ae,exports.Icon=Le,exports.LocalizerContext=K,exports.MessageAuthor=ve,exports.MessageBox=we,exports.MessageContent=Ce,exports.MessageInfoBox=qe,exports.MessageReadObserver=Ne,exports.MessageRow=Ie,exports.MessageText=Oe,exports.ReducerProvider=v,exports.SystemMessage=Z,exports.defaultLocalizer=W,exports.formatSystemMessage=Y,exports.useAccounts=P,exports.useAddChat=z,exports.useAddMember=D,exports.useChat=B,exports.useChatList=A,exports.useClient=k,exports.useDispatch=O,exports.useLoadMore=H,exports.useLocalizer=Q,exports.useMe=_,exports.useMessages=T,exports.useReadMonitor=U,exports.useReducer=f,exports.useRemoveMember=$,exports.useSelect=C,exports.useSignalRMonitor=I,exports.useStateRef=q;
|
|
2
|
-
//# sourceMappingURL=index.js.map
|