@webinex/chatify 2.0.0-alpha13 → 2.0.0-alpha14
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/{Chatify-CwAfN1wu.js → Chatify-CP2jgo8d.js} +191 -118
- package/dist/Chatify-CP2jgo8d.js.map +1 -0
- package/dist/Chatify.css +28 -0
- package/dist/audit.js +3 -2
- package/dist/audit.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/types/audit/index.d.ts +17 -15
- package/dist/types/ui/Chat/ChatContext.d.ts +2 -0
- package/dist/types/ui/Chat/ChatPanel.d.ts +7 -0
- package/dist/types/ui/Chat/ChatView.d.ts +4 -2
- package/dist/types/ui/ChatGroup/ChatGroupContext.d.ts +4 -1
- package/dist/types/ui/ChatGroup/ChatGroupPanel.d.ts +21 -2
- package/dist/types/ui/Conversation/Conversation.d.ts +1 -0
- package/dist/types/ui/Conversation/ConversationContext.d.ts +1 -0
- package/dist/types/ui/Conversation/ConversationHeader.d.ts +4 -1
- package/dist/types/ui/localizer.d.ts +4 -1
- package/dist/types/ui/useCompact.d.ts +4 -0
- package/package.json +81 -81
- package/src/audit/AuditChatList.tsx +25 -25
- package/src/audit/AuditConversationPanel.tsx +49 -48
- package/src/audit/AuditPanel.tsx +76 -76
- package/src/audit/AuditPanelCustomizeValue.ts +11 -11
- package/src/audit/AuditSearch.tsx +89 -89
- package/src/audit/AuditSearchValue.tsx +42 -42
- package/src/audit/auditApi.tsx +113 -113
- package/src/audit/index.d.ts +18 -18
- package/src/audit/index.tsx +28 -28
- package/src/audit/styles.scss +72 -72
- package/src/core/api/api.ts +675 -675
- package/src/core/api/baseApi.ts +38 -38
- package/src/core/api/index.ts +1 -1
- package/src/core/client.ts +298 -298
- 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 +182 -182
- package/src/index.ts +2 -2
- package/src/styles/aside.scss +34 -26
- package/src/styles/chat-list.scss +138 -138
- package/src/styles/chat.scss +11 -11
- package/src/styles/conversation.scss +199 -200
- package/src/styles/index.scss +227 -220
- package/src/styles/input.scss +148 -148
- package/src/styles/keyframes.scss +14 -14
- package/src/styles/members.scss +30 -13
- package/src/styles/mixins.scss +38 -25
- package/src/styles/variables.scss +13 -13
- package/src/ui/Chat/ChatContext.tsx +32 -30
- package/src/ui/Chat/ChatEditableHeaderName.tsx +63 -63
- package/src/ui/Chat/ChatHeaderActions.tsx +19 -19
- package/src/ui/Chat/ChatPanel.tsx +46 -30
- package/src/ui/Chat/ChatView.tsx +122 -115
- package/src/ui/Chat/Members/ChatMembersButton.tsx +9 -9
- package/src/ui/Chat/Members/ChatMembersPanel.tsx +128 -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/AutoReply/AutoReplyButton.tsx +21 -21
- package/src/ui/ChatGroup/AutoReply/AutoReplyForm.tsx +50 -50
- package/src/ui/ChatGroup/AutoReply/AutoReplyPanel.tsx +94 -94
- package/src/ui/ChatGroup/AutoReply/AutoReplyPeriodInput.tsx +22 -22
- package/src/ui/ChatGroup/AutoReply/AutoReplyTextInput.tsx +22 -22
- package/src/ui/ChatGroup/AutoReply/index.ts +19 -19
- package/src/ui/ChatGroup/ChatGroupContext.tsx +63 -61
- package/src/ui/ChatGroup/ChatGroupPanel.tsx +110 -75
- 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/ChatGroupActions.tsx +15 -15
- package/src/ui/ChatGroup/Layout/ChatGroupAside.tsx +12 -12
- package/src/ui/ChatGroup/Layout/ChatGroupBody.tsx +17 -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 +21 -19
- package/src/ui/ChatGroup/Layout/index.ts +22 -22
- package/src/ui/ChatGroup/List/ChatListPanel.tsx +28 -28
- package/src/ui/ChatGroup/List/index.ts +8 -8
- package/src/ui/ChatGroup/index.ts +6 -6
- package/src/ui/Chatify.tsx +15 -15
- package/src/ui/Conversation/Conversation.tsx +96 -92
- package/src/ui/Conversation/ConversationActions.tsx +12 -12
- package/src/ui/Conversation/ConversationBody.tsx +28 -28
- package/src/ui/Conversation/ConversationContext.ts +31 -30
- package/src/ui/Conversation/ConversationHeader.tsx +35 -19
- package/src/ui/Conversation/ConversationName.tsx +7 -7
- package/src/ui/Conversation/InputBox/InputBox.tsx +126 -126
- package/src/ui/Conversation/InputBox/InputBoxFile.tsx +38 -38
- package/src/ui/Conversation/InputBox/InputBoxFileList.tsx +21 -21
- package/src/ui/Conversation/InputBox/InputFilesBox.tsx +78 -78
- package/src/ui/Conversation/InputBox/InputSubmitButtonBox.tsx +26 -26
- package/src/ui/Conversation/InputBox/InputTextBox.tsx +63 -61
- package/src/ui/Conversation/InputBox/index.ts +23 -23
- 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 -15
- package/src/ui/Conversation/Message/MessageFile.tsx +54 -54
- package/src/ui/Conversation/Message/MessageFileList.tsx +14 -14
- 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 -28
- 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 +128 -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/ChatList/ChatList.tsx +83 -84
- package/src/ui/common/ChatList/ChatListItemAvatar.tsx +22 -22
- package/src/ui/common/ChatList/ChatListItemBox.tsx +32 -32
- package/src/ui/common/ChatList/ChatListItemLastMessage.tsx +15 -15
- package/src/ui/common/ChatList/ChatListItemLastMessageAuthor.tsx +15 -15
- package/src/ui/common/ChatList/ChatListItemLastMessageContent.tsx +21 -21
- package/src/ui/common/ChatList/ChatListItemLastMessageSentAt.tsx +22 -22
- package/src/ui/common/ChatList/ChatListItemName.tsx +8 -8
- package/src/ui/common/ChatList/ChatListItemUnreadCount.tsx +12 -12
- package/src/ui/common/ChatList/ChatListValue.ts +9 -9
- package/src/ui/common/ChatList/index.ts +32 -32
- package/src/ui/common/Icon.tsx +48 -48
- package/src/ui/common/MessageSkeleton.tsx +20 -20
- package/src/ui/common/index.ts +14 -14
- package/src/ui/customize.tsx +51 -51
- package/src/ui/index.ts +11 -11
- package/src/ui/localizer.tsx +148 -137
- package/src/ui/useCompact.tsx +32 -0
- package/src/ui/useFormatter.tsx +17 -17
- package/dist/Chatify-CwAfN1wu.js.map +0 -1
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import { customize } from '../../customize';
|
|
2
|
-
import { ChatListItemName } from './ChatListItemName';
|
|
3
|
-
import { ChatListItemUnreadCount } from './ChatListItemUnreadCount';
|
|
4
|
-
import { ChatListItemLastMessage } from './ChatListItemLastMessage';
|
|
5
|
-
import { ChatListItemAvatar } from './ChatListItemAvatar';
|
|
6
|
-
import { ChatListValue } from './ChatListValue';
|
|
7
|
-
|
|
8
|
-
export interface ChatListItemBoxProps {
|
|
9
|
-
chat: ChatListValue;
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* If true, do not show read status.
|
|
13
|
-
*/
|
|
14
|
-
noRead?: boolean;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export const ChatListItemBox = customize('ChatListItemBox', (props: ChatListItemBoxProps) => {
|
|
18
|
-
const { noRead = false } = props;
|
|
19
|
-
const { lastMessage, lastReadMessageId } = props.chat;
|
|
20
|
-
const read = lastReadMessageId != null && lastReadMessageId.localeCompare(lastMessage.id) >= 0;
|
|
21
|
-
|
|
22
|
-
return (
|
|
23
|
-
<div className={'wxchtf-chat' + (!read && !noRead ? ' --unread' : '')}>
|
|
24
|
-
<ChatListItemAvatar {...props} />
|
|
25
|
-
<span className="wxchtf-chat-info">
|
|
26
|
-
<ChatListItemName {...props} />
|
|
27
|
-
<ChatListItemUnreadCount {...props} />
|
|
28
|
-
<ChatListItemLastMessage {...props} />
|
|
29
|
-
</span>
|
|
30
|
-
</div>
|
|
31
|
-
);
|
|
32
|
-
});
|
|
1
|
+
import { customize } from '../../customize';
|
|
2
|
+
import { ChatListItemName } from './ChatListItemName';
|
|
3
|
+
import { ChatListItemUnreadCount } from './ChatListItemUnreadCount';
|
|
4
|
+
import { ChatListItemLastMessage } from './ChatListItemLastMessage';
|
|
5
|
+
import { ChatListItemAvatar } from './ChatListItemAvatar';
|
|
6
|
+
import { ChatListValue } from './ChatListValue';
|
|
7
|
+
|
|
8
|
+
export interface ChatListItemBoxProps {
|
|
9
|
+
chat: ChatListValue;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* If true, do not show read status.
|
|
13
|
+
*/
|
|
14
|
+
noRead?: boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const ChatListItemBox = customize('ChatListItemBox', (props: ChatListItemBoxProps) => {
|
|
18
|
+
const { noRead = false } = props;
|
|
19
|
+
const { lastMessage, lastReadMessageId } = props.chat;
|
|
20
|
+
const read = lastReadMessageId != null && lastReadMessageId.localeCompare(lastMessage.id) >= 0;
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<div className={'wxchtf-chat' + (!read && !noRead ? ' --unread' : '')}>
|
|
24
|
+
<ChatListItemAvatar {...props} />
|
|
25
|
+
<span className="wxchtf-chat-info">
|
|
26
|
+
<ChatListItemName {...props} />
|
|
27
|
+
<ChatListItemUnreadCount {...props} />
|
|
28
|
+
<ChatListItemLastMessage {...props} />
|
|
29
|
+
</span>
|
|
30
|
+
</div>
|
|
31
|
+
);
|
|
32
|
+
});
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { customize } from '../../customize';
|
|
2
|
-
import type { ChatListItemBoxProps } from './ChatListItemBox';
|
|
3
|
-
import { ChatListItemLastMessageContent } from './ChatListItemLastMessageContent';
|
|
4
|
-
import { ChatListItemLastMessageAuthor } from './ChatListItemLastMessageAuthor';
|
|
5
|
-
import { ChatListItemLastMessageSentAt } from './ChatListItemLastMessageSentAt';
|
|
6
|
-
|
|
7
|
-
export const ChatListItemLastMessage = customize('ChatListItemLastMessage', (props: ChatListItemBoxProps) => {
|
|
8
|
-
return (
|
|
9
|
-
<div className="wxchtf-chat-last">
|
|
10
|
-
<ChatListItemLastMessageAuthor {...props} />
|
|
11
|
-
<ChatListItemLastMessageContent {...props} />
|
|
12
|
-
<ChatListItemLastMessageSentAt {...props} />
|
|
13
|
-
</div>
|
|
14
|
-
);
|
|
15
|
-
});
|
|
1
|
+
import { customize } from '../../customize';
|
|
2
|
+
import type { ChatListItemBoxProps } from './ChatListItemBox';
|
|
3
|
+
import { ChatListItemLastMessageContent } from './ChatListItemLastMessageContent';
|
|
4
|
+
import { ChatListItemLastMessageAuthor } from './ChatListItemLastMessageAuthor';
|
|
5
|
+
import { ChatListItemLastMessageSentAt } from './ChatListItemLastMessageSentAt';
|
|
6
|
+
|
|
7
|
+
export const ChatListItemLastMessage = customize('ChatListItemLastMessage', (props: ChatListItemBoxProps) => {
|
|
8
|
+
return (
|
|
9
|
+
<div className="wxchtf-chat-last">
|
|
10
|
+
<ChatListItemLastMessageAuthor {...props} />
|
|
11
|
+
<ChatListItemLastMessageContent {...props} />
|
|
12
|
+
<ChatListItemLastMessageSentAt {...props} />
|
|
13
|
+
</div>
|
|
14
|
+
);
|
|
15
|
+
});
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { customize } from '../../customize';
|
|
2
|
-
import type { ChatListItemBoxProps } from './ChatListItemBox';
|
|
3
|
-
|
|
4
|
-
export const ChatListItemLastMessageAuthor = customize(
|
|
5
|
-
'ChatListItemLastMessageAuthor',
|
|
6
|
-
(props: ChatListItemBoxProps) => {
|
|
7
|
-
const { lastMessage } = props.chat;
|
|
8
|
-
|
|
9
|
-
if (lastMessage.sentBy.id === 'chatify::system') {
|
|
10
|
-
return null;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
return <div className="wxchtf-chat-last-author">{lastMessage.sentBy.name}</div>;
|
|
14
|
-
},
|
|
15
|
-
);
|
|
1
|
+
import { customize } from '../../customize';
|
|
2
|
+
import type { ChatListItemBoxProps } from './ChatListItemBox';
|
|
3
|
+
|
|
4
|
+
export const ChatListItemLastMessageAuthor = customize(
|
|
5
|
+
'ChatListItemLastMessageAuthor',
|
|
6
|
+
(props: ChatListItemBoxProps) => {
|
|
7
|
+
const { lastMessage } = props.chat;
|
|
8
|
+
|
|
9
|
+
if (lastMessage.sentBy.id === 'chatify::system') {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return <div className="wxchtf-chat-last-author">{lastMessage.sentBy.name}</div>;
|
|
14
|
+
},
|
|
15
|
+
);
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { useLocalizer } from '../../localizer';
|
|
2
|
-
import { formatSystemMessage } from '../../Conversation/SystemMessage';
|
|
3
|
-
import { FC } from 'react';
|
|
4
|
-
import { customize } from '../../customize';
|
|
5
|
-
import type { ChatListItemBoxProps } from './ChatListItemBox';
|
|
6
|
-
|
|
7
|
-
export const ChatListItemLastMessageContent = customize<FC<ChatListItemBoxProps>>(
|
|
8
|
-
'ChatListItemLastMessageContent',
|
|
9
|
-
(props) => {
|
|
10
|
-
const { lastMessage } = props.chat;
|
|
11
|
-
const localizer = useLocalizer();
|
|
12
|
-
|
|
13
|
-
return (
|
|
14
|
-
<div className="wxchtf-chat-last-message">
|
|
15
|
-
{lastMessage.sentBy.id === 'chatify::system'
|
|
16
|
-
? lastMessage.text && formatSystemMessage(localizer, lastMessage.text)
|
|
17
|
-
: lastMessage.text}
|
|
18
|
-
</div>
|
|
19
|
-
);
|
|
20
|
-
},
|
|
21
|
-
);
|
|
1
|
+
import { useLocalizer } from '../../localizer';
|
|
2
|
+
import { formatSystemMessage } from '../../Conversation/SystemMessage';
|
|
3
|
+
import { FC } from 'react';
|
|
4
|
+
import { customize } from '../../customize';
|
|
5
|
+
import type { ChatListItemBoxProps } from './ChatListItemBox';
|
|
6
|
+
|
|
7
|
+
export const ChatListItemLastMessageContent = customize<FC<ChatListItemBoxProps>>(
|
|
8
|
+
'ChatListItemLastMessageContent',
|
|
9
|
+
(props) => {
|
|
10
|
+
const { lastMessage } = props.chat;
|
|
11
|
+
const localizer = useLocalizer();
|
|
12
|
+
|
|
13
|
+
return (
|
|
14
|
+
<div className="wxchtf-chat-last-message">
|
|
15
|
+
{lastMessage.sentBy.id === 'chatify::system'
|
|
16
|
+
? lastMessage.text && formatSystemMessage(localizer, lastMessage.text)
|
|
17
|
+
: lastMessage.text}
|
|
18
|
+
</div>
|
|
19
|
+
);
|
|
20
|
+
},
|
|
21
|
+
);
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { customize } from '../../customize';
|
|
2
|
-
import { useLocalizer } from '../../localizer';
|
|
3
|
-
import { ChatListItemBoxProps } from './ChatListItemBox';
|
|
4
|
-
|
|
5
|
-
export const ChatListItemLastMessageSentAt = customize(
|
|
6
|
-
'ChatListItemLastMessageSentAt',
|
|
7
|
-
(props: ChatListItemBoxProps) => {
|
|
8
|
-
const {
|
|
9
|
-
chat: {
|
|
10
|
-
lastMessage: { sentAt },
|
|
11
|
-
},
|
|
12
|
-
} = props;
|
|
13
|
-
|
|
14
|
-
const localizer = useLocalizer();
|
|
15
|
-
|
|
16
|
-
return (
|
|
17
|
-
<div className="wxchtf-chat-last-sent-at">
|
|
18
|
-
{localizer.isToday(sentAt) ? localizer.timestamp(sentAt) : localizer.dateTime(sentAt)}
|
|
19
|
-
</div>
|
|
20
|
-
);
|
|
21
|
-
},
|
|
22
|
-
);
|
|
1
|
+
import { customize } from '../../customize';
|
|
2
|
+
import { useLocalizer } from '../../localizer';
|
|
3
|
+
import { ChatListItemBoxProps } from './ChatListItemBox';
|
|
4
|
+
|
|
5
|
+
export const ChatListItemLastMessageSentAt = customize(
|
|
6
|
+
'ChatListItemLastMessageSentAt',
|
|
7
|
+
(props: ChatListItemBoxProps) => {
|
|
8
|
+
const {
|
|
9
|
+
chat: {
|
|
10
|
+
lastMessage: { sentAt },
|
|
11
|
+
},
|
|
12
|
+
} = props;
|
|
13
|
+
|
|
14
|
+
const localizer = useLocalizer();
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<div className="wxchtf-chat-last-sent-at">
|
|
18
|
+
{localizer.isToday(sentAt) ? localizer.timestamp(sentAt) : localizer.dateTime(sentAt)}
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
},
|
|
22
|
+
);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { customize } from '../../customize';
|
|
2
|
-
import type { ChatListItemBoxProps } from './ChatListItemBox';
|
|
3
|
-
|
|
4
|
-
export const ChatListItemName = customize('ChatListItemName', (props: ChatListItemBoxProps) => {
|
|
5
|
-
const { chat } = props;
|
|
6
|
-
|
|
7
|
-
return <div className="wxchtf-chat-name">{chat.name}</div>;
|
|
8
|
-
});
|
|
1
|
+
import { customize } from '../../customize';
|
|
2
|
+
import type { ChatListItemBoxProps } from './ChatListItemBox';
|
|
3
|
+
|
|
4
|
+
export const ChatListItemName = customize('ChatListItemName', (props: ChatListItemBoxProps) => {
|
|
5
|
+
const { chat } = props;
|
|
6
|
+
|
|
7
|
+
return <div className="wxchtf-chat-name">{chat.name}</div>;
|
|
8
|
+
});
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { customize } from '../../customize';
|
|
2
|
-
import { ChatListItemBoxProps } from './ChatListItemBox';
|
|
3
|
-
|
|
4
|
-
export const ChatListItemUnreadCount = customize('ChatListItemUnreadCount', (props: ChatListItemBoxProps) => {
|
|
5
|
-
const { totalUnreadCount: unreadCount } = props.chat;
|
|
6
|
-
|
|
7
|
-
if (unreadCount == null || unreadCount <= 0) {
|
|
8
|
-
return null;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
return <div className="wxchtf-unread-count">{unreadCount}</div>;
|
|
12
|
-
});
|
|
1
|
+
import { customize } from '../../customize';
|
|
2
|
+
import { ChatListItemBoxProps } from './ChatListItemBox';
|
|
3
|
+
|
|
4
|
+
export const ChatListItemUnreadCount = customize('ChatListItemUnreadCount', (props: ChatListItemBoxProps) => {
|
|
5
|
+
const { totalUnreadCount: unreadCount } = props.chat;
|
|
6
|
+
|
|
7
|
+
if (unreadCount == null || unreadCount <= 0) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return <div className="wxchtf-unread-count">{unreadCount}</div>;
|
|
12
|
+
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { MessageBase } from '../../../core';
|
|
2
|
-
|
|
3
|
-
export interface ChatListValue {
|
|
4
|
-
id: string;
|
|
5
|
-
name: string;
|
|
6
|
-
lastMessage: MessageBase;
|
|
7
|
-
totalUnreadCount?: number;
|
|
8
|
-
lastReadMessageId?: string | null;
|
|
9
|
-
}
|
|
1
|
+
import { MessageBase } from '../../../core';
|
|
2
|
+
|
|
3
|
+
export interface ChatListValue {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
lastMessage: MessageBase;
|
|
7
|
+
totalUnreadCount?: number;
|
|
8
|
+
lastReadMessageId?: string | null;
|
|
9
|
+
}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import { ChatList } from './ChatList';
|
|
2
|
-
import { ChatListItemAvatar } from './ChatListItemAvatar';
|
|
3
|
-
import { ChatListItemBox } from './ChatListItemBox';
|
|
4
|
-
import { ChatListItemLastMessage } from './ChatListItemLastMessage';
|
|
5
|
-
import { ChatListItemLastMessageAuthor } from './ChatListItemLastMessageAuthor';
|
|
6
|
-
import { ChatListItemLastMessageContent } from './ChatListItemLastMessageContent';
|
|
7
|
-
import { ChatListItemLastMessageSentAt } from './ChatListItemLastMessageSentAt';
|
|
8
|
-
import { ChatListItemName } from './ChatListItemName';
|
|
9
|
-
import { ChatListItemUnreadCount } from './ChatListItemUnreadCount';
|
|
10
|
-
|
|
11
|
-
export * from './ChatList';
|
|
12
|
-
export * from './ChatListItemAvatar';
|
|
13
|
-
export * from './ChatListItemBox';
|
|
14
|
-
export * from './ChatListItemLastMessage';
|
|
15
|
-
export * from './ChatListItemLastMessageAuthor';
|
|
16
|
-
export * from './ChatListItemLastMessageContent';
|
|
17
|
-
export * from './ChatListItemLastMessageSentAt';
|
|
18
|
-
export * from './ChatListItemName';
|
|
19
|
-
export * from './ChatListItemUnreadCount';
|
|
20
|
-
export * from './ChatListValue';
|
|
21
|
-
|
|
22
|
-
export interface ChatListCustomizeValue {
|
|
23
|
-
ChatList?: typeof ChatList.Component | null;
|
|
24
|
-
ChatListItemAvatar?: typeof ChatListItemAvatar.Component | null;
|
|
25
|
-
ChatListItemBox?: typeof ChatListItemBox.Component | null;
|
|
26
|
-
ChatListItemLastMessage?: typeof ChatListItemLastMessage.Component | null;
|
|
27
|
-
ChatListItemLastMessageAuthor?: typeof ChatListItemLastMessageAuthor.Component | null;
|
|
28
|
-
ChatListItemLastMessageContent?: typeof ChatListItemLastMessageContent.Component | null;
|
|
29
|
-
ChatListItemLastMessageSentAt?: typeof ChatListItemLastMessageSentAt.Component | null;
|
|
30
|
-
ChatListItemName?: typeof ChatListItemName.Component | null;
|
|
31
|
-
ChatListItemUnreadCount?: typeof ChatListItemUnreadCount.Component | null;
|
|
32
|
-
}
|
|
1
|
+
import { ChatList } from './ChatList';
|
|
2
|
+
import { ChatListItemAvatar } from './ChatListItemAvatar';
|
|
3
|
+
import { ChatListItemBox } from './ChatListItemBox';
|
|
4
|
+
import { ChatListItemLastMessage } from './ChatListItemLastMessage';
|
|
5
|
+
import { ChatListItemLastMessageAuthor } from './ChatListItemLastMessageAuthor';
|
|
6
|
+
import { ChatListItemLastMessageContent } from './ChatListItemLastMessageContent';
|
|
7
|
+
import { ChatListItemLastMessageSentAt } from './ChatListItemLastMessageSentAt';
|
|
8
|
+
import { ChatListItemName } from './ChatListItemName';
|
|
9
|
+
import { ChatListItemUnreadCount } from './ChatListItemUnreadCount';
|
|
10
|
+
|
|
11
|
+
export * from './ChatList';
|
|
12
|
+
export * from './ChatListItemAvatar';
|
|
13
|
+
export * from './ChatListItemBox';
|
|
14
|
+
export * from './ChatListItemLastMessage';
|
|
15
|
+
export * from './ChatListItemLastMessageAuthor';
|
|
16
|
+
export * from './ChatListItemLastMessageContent';
|
|
17
|
+
export * from './ChatListItemLastMessageSentAt';
|
|
18
|
+
export * from './ChatListItemName';
|
|
19
|
+
export * from './ChatListItemUnreadCount';
|
|
20
|
+
export * from './ChatListValue';
|
|
21
|
+
|
|
22
|
+
export interface ChatListCustomizeValue {
|
|
23
|
+
ChatList?: typeof ChatList.Component | null;
|
|
24
|
+
ChatListItemAvatar?: typeof ChatListItemAvatar.Component | null;
|
|
25
|
+
ChatListItemBox?: typeof ChatListItemBox.Component | null;
|
|
26
|
+
ChatListItemLastMessage?: typeof ChatListItemLastMessage.Component | null;
|
|
27
|
+
ChatListItemLastMessageAuthor?: typeof ChatListItemLastMessageAuthor.Component | null;
|
|
28
|
+
ChatListItemLastMessageContent?: typeof ChatListItemLastMessageContent.Component | null;
|
|
29
|
+
ChatListItemLastMessageSentAt?: typeof ChatListItemLastMessageSentAt.Component | null;
|
|
30
|
+
ChatListItemName?: typeof ChatListItemName.Component | null;
|
|
31
|
+
ChatListItemUnreadCount?: typeof ChatListItemUnreadCount.Component | null;
|
|
32
|
+
}
|
package/src/ui/common/Icon.tsx
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import { FC } from 'react';
|
|
2
|
-
import { customize } from '../customize';
|
|
3
|
-
import {
|
|
4
|
-
SendOutlined,
|
|
5
|
-
PaperClipOutlined,
|
|
6
|
-
UserAddOutlined,
|
|
7
|
-
UsergroupAddOutlined,
|
|
8
|
-
UserDeleteOutlined,
|
|
9
|
-
UsergroupDeleteOutlined,
|
|
10
|
-
TeamOutlined,
|
|
11
|
-
EditOutlined,
|
|
12
|
-
CloseOutlined,
|
|
13
|
-
EyeInvisibleOutlined,
|
|
14
|
-
EyeOutlined,
|
|
15
|
-
DeleteOutlined,
|
|
16
|
-
DownloadOutlined,
|
|
17
|
-
SettingOutlined,
|
|
18
|
-
} from '@ant-design/icons';
|
|
19
|
-
|
|
20
|
-
export type IconType = keyof typeof ICONS;
|
|
21
|
-
|
|
22
|
-
export interface IconProps {
|
|
23
|
-
type: IconType;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export const ICONS = {
|
|
27
|
-
attach: PaperClipOutlined,
|
|
28
|
-
send: SendOutlined,
|
|
29
|
-
'remove-member': UserDeleteOutlined,
|
|
30
|
-
'remove-member-delete-history': UsergroupDeleteOutlined,
|
|
31
|
-
'add-member': UserAddOutlined,
|
|
32
|
-
'add-member-with-history': UsergroupAddOutlined,
|
|
33
|
-
members: TeamOutlined,
|
|
34
|
-
edit: EditOutlined,
|
|
35
|
-
close: CloseOutlined,
|
|
36
|
-
chat: TeamOutlined,
|
|
37
|
-
watch: EyeOutlined,
|
|
38
|
-
unwatch: EyeInvisibleOutlined,
|
|
39
|
-
'delete-file': DeleteOutlined,
|
|
40
|
-
'open-file': DownloadOutlined,
|
|
41
|
-
settings: SettingOutlined,
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
export const Icon = customize<FC<IconProps>>('Icon', (props) => {
|
|
45
|
-
const { type } = props;
|
|
46
|
-
const IconComponent = ICONS[type];
|
|
47
|
-
return IconComponent ? <IconComponent /> : null;
|
|
48
|
-
});
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { customize } from '../customize';
|
|
3
|
+
import {
|
|
4
|
+
SendOutlined,
|
|
5
|
+
PaperClipOutlined,
|
|
6
|
+
UserAddOutlined,
|
|
7
|
+
UsergroupAddOutlined,
|
|
8
|
+
UserDeleteOutlined,
|
|
9
|
+
UsergroupDeleteOutlined,
|
|
10
|
+
TeamOutlined,
|
|
11
|
+
EditOutlined,
|
|
12
|
+
CloseOutlined,
|
|
13
|
+
EyeInvisibleOutlined,
|
|
14
|
+
EyeOutlined,
|
|
15
|
+
DeleteOutlined,
|
|
16
|
+
DownloadOutlined,
|
|
17
|
+
SettingOutlined,
|
|
18
|
+
} from '@ant-design/icons';
|
|
19
|
+
|
|
20
|
+
export type IconType = keyof typeof ICONS;
|
|
21
|
+
|
|
22
|
+
export interface IconProps {
|
|
23
|
+
type: IconType;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const ICONS = {
|
|
27
|
+
attach: PaperClipOutlined,
|
|
28
|
+
send: SendOutlined,
|
|
29
|
+
'remove-member': UserDeleteOutlined,
|
|
30
|
+
'remove-member-delete-history': UsergroupDeleteOutlined,
|
|
31
|
+
'add-member': UserAddOutlined,
|
|
32
|
+
'add-member-with-history': UsergroupAddOutlined,
|
|
33
|
+
members: TeamOutlined,
|
|
34
|
+
edit: EditOutlined,
|
|
35
|
+
close: CloseOutlined,
|
|
36
|
+
chat: TeamOutlined,
|
|
37
|
+
watch: EyeOutlined,
|
|
38
|
+
unwatch: EyeInvisibleOutlined,
|
|
39
|
+
'delete-file': DeleteOutlined,
|
|
40
|
+
'open-file': DownloadOutlined,
|
|
41
|
+
settings: SettingOutlined,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const Icon = customize<FC<IconProps>>('Icon', (props) => {
|
|
45
|
+
const { type } = props;
|
|
46
|
+
const IconComponent = ICONS[type];
|
|
47
|
+
return IconComponent ? <IconComponent /> : null;
|
|
48
|
+
});
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { Skeleton } from 'antd';
|
|
2
|
-
import { customize } from '../customize';
|
|
3
|
-
|
|
4
|
-
export interface MessageSkeletonProps {
|
|
5
|
-
count?: number;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export const MessageSkeleton = customize('MessageSkeleton', (props: MessageSkeletonProps) => {
|
|
9
|
-
const { count = 1 } = props;
|
|
10
|
-
return (
|
|
11
|
-
<>
|
|
12
|
-
{Array.from(Array(count)).map((_, index) => (
|
|
13
|
-
<div className="wxchtf-message-skeleton" key={index}>
|
|
14
|
-
<Skeleton.Avatar className="wxchtf-avatar" active />
|
|
15
|
-
<Skeleton.Button active className="wxchtf-content" />
|
|
16
|
-
</div>
|
|
17
|
-
))}
|
|
18
|
-
</>
|
|
19
|
-
);
|
|
20
|
-
});
|
|
1
|
+
import { Skeleton } from 'antd';
|
|
2
|
+
import { customize } from '../customize';
|
|
3
|
+
|
|
4
|
+
export interface MessageSkeletonProps {
|
|
5
|
+
count?: number;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const MessageSkeleton = customize('MessageSkeleton', (props: MessageSkeletonProps) => {
|
|
9
|
+
const { count = 1 } = props;
|
|
10
|
+
return (
|
|
11
|
+
<>
|
|
12
|
+
{Array.from(Array(count)).map((_, index) => (
|
|
13
|
+
<div className="wxchtf-message-skeleton" key={index}>
|
|
14
|
+
<Skeleton.Avatar className="wxchtf-avatar" active />
|
|
15
|
+
<Skeleton.Button active className="wxchtf-content" />
|
|
16
|
+
</div>
|
|
17
|
+
))}
|
|
18
|
+
</>
|
|
19
|
+
);
|
|
20
|
+
});
|
package/src/ui/common/index.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { Avatar } from './Avatar';
|
|
2
|
-
import { Icon } from './Icon';
|
|
3
|
-
import { MessageSkeleton } from './MessageSkeleton';
|
|
4
|
-
|
|
5
|
-
export * from './Avatar';
|
|
6
|
-
export * from './Icon';
|
|
7
|
-
export * from './MessageSkeleton';
|
|
8
|
-
export * from './ChatList';
|
|
9
|
-
|
|
10
|
-
export interface CommonCustomizeValue {
|
|
11
|
-
Avatar?: typeof Avatar.Component | null;
|
|
12
|
-
Icon?: typeof Icon.Component | null;
|
|
13
|
-
MessageSkeleton?: typeof MessageSkeleton.Component | null;
|
|
14
|
-
}
|
|
1
|
+
import { Avatar } from './Avatar';
|
|
2
|
+
import { Icon } from './Icon';
|
|
3
|
+
import { MessageSkeleton } from './MessageSkeleton';
|
|
4
|
+
|
|
5
|
+
export * from './Avatar';
|
|
6
|
+
export * from './Icon';
|
|
7
|
+
export * from './MessageSkeleton';
|
|
8
|
+
export * from './ChatList';
|
|
9
|
+
|
|
10
|
+
export interface CommonCustomizeValue {
|
|
11
|
+
Avatar?: typeof Avatar.Component | null;
|
|
12
|
+
Icon?: typeof Icon.Component | null;
|
|
13
|
+
MessageSkeleton?: typeof MessageSkeleton.Component | null;
|
|
14
|
+
}
|
package/src/ui/customize.tsx
CHANGED
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
import React, { FC, useContext } from 'react';
|
|
2
|
-
|
|
3
|
-
export type Customizable<TComponent extends React.ComponentType<any>> = TComponent & {
|
|
4
|
-
Component: TComponent;
|
|
5
|
-
key: string;
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export const CustomizeContext = React.createContext<Record<string, any>>(null!);
|
|
9
|
-
|
|
10
|
-
export function useCustomizeContext<TValue>() {
|
|
11
|
-
return useContext(CustomizeContext) as TValue;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
function useCustom<TComponent extends React.ComponentType>(key: string): TComponent | undefined | null {
|
|
15
|
-
const value = useContext(CustomizeContext);
|
|
16
|
-
return value ? (value[key] as TComponent | null | undefined) : undefined;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function useCustomize<TCustom extends Customizable<React.ComponentType<any>>>(custom: TCustom) {
|
|
20
|
-
const Custom = useCustom<TCustom['Component']>(custom.key);
|
|
21
|
-
|
|
22
|
-
if (Custom == null) {
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return Custom ?? custom.Component;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function customize<TComponent extends React.ComponentType<any>>(
|
|
30
|
-
key: string,
|
|
31
|
-
Component: TComponent,
|
|
32
|
-
): TComponent extends React.ComponentType<infer X> ? Customizable<React.ComponentType<X>> : never {
|
|
33
|
-
const Result: FC<any> = React.forwardRef<TComponent, any>((props: any, forwardRef) => {
|
|
34
|
-
const Custom = useCustom(key);
|
|
35
|
-
|
|
36
|
-
if (Custom === null) {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (Custom) {
|
|
41
|
-
return <Custom {...props} ref={forwardRef} />;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return <Component {...props} ref={forwardRef} />;
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
Component.displayName = Component.displayName || key;
|
|
48
|
-
Result.displayName = 'Customizable.' + Component.displayName;
|
|
49
|
-
|
|
50
|
-
return Object.assign(Result, { key, Component }) as any;
|
|
51
|
-
}
|
|
1
|
+
import React, { FC, useContext } from 'react';
|
|
2
|
+
|
|
3
|
+
export type Customizable<TComponent extends React.ComponentType<any>> = TComponent & {
|
|
4
|
+
Component: TComponent;
|
|
5
|
+
key: string;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const CustomizeContext = React.createContext<Record<string, any>>(null!);
|
|
9
|
+
|
|
10
|
+
export function useCustomizeContext<TValue>() {
|
|
11
|
+
return useContext(CustomizeContext) as TValue;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function useCustom<TComponent extends React.ComponentType>(key: string): TComponent | undefined | null {
|
|
15
|
+
const value = useContext(CustomizeContext);
|
|
16
|
+
return value ? (value[key] as TComponent | null | undefined) : undefined;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function useCustomize<TCustom extends Customizable<React.ComponentType<any>>>(custom: TCustom) {
|
|
20
|
+
const Custom = useCustom<TCustom['Component']>(custom.key);
|
|
21
|
+
|
|
22
|
+
if (Custom == null) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return Custom ?? custom.Component;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function customize<TComponent extends React.ComponentType<any>>(
|
|
30
|
+
key: string,
|
|
31
|
+
Component: TComponent,
|
|
32
|
+
): TComponent extends React.ComponentType<infer X> ? Customizable<React.ComponentType<X>> : never {
|
|
33
|
+
const Result: FC<any> = React.forwardRef<TComponent, any>((props: any, forwardRef) => {
|
|
34
|
+
const Custom = useCustom(key);
|
|
35
|
+
|
|
36
|
+
if (Custom === null) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (Custom) {
|
|
41
|
+
return <Custom {...props} ref={forwardRef} />;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return <Component {...props} ref={forwardRef} />;
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
Component.displayName = Component.displayName || key;
|
|
48
|
+
Result.displayName = 'Customizable.' + Component.displayName;
|
|
49
|
+
|
|
50
|
+
return Object.assign(Result, { key, Component }) as any;
|
|
51
|
+
}
|
package/src/ui/index.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import '../styles/index.scss';
|
|
2
|
-
|
|
3
|
-
export * from './color';
|
|
4
|
-
export * from './customize';
|
|
5
|
-
export * from './Chatify';
|
|
6
|
-
export * from './localizer';
|
|
7
|
-
export * from './Chat';
|
|
8
|
-
export * from './ChatGroup';
|
|
9
|
-
export * from './Conversation';
|
|
10
|
-
export * from './Thread';
|
|
11
|
-
export * from './common';
|
|
1
|
+
import '../styles/index.scss';
|
|
2
|
+
|
|
3
|
+
export * from './color';
|
|
4
|
+
export * from './customize';
|
|
5
|
+
export * from './Chatify';
|
|
6
|
+
export * from './localizer';
|
|
7
|
+
export * from './Chat';
|
|
8
|
+
export * from './ChatGroup';
|
|
9
|
+
export * from './Conversation';
|
|
10
|
+
export * from './Thread';
|
|
11
|
+
export * from './common';
|