@webinex/chatify 2.0.0-alpha12 → 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.
Files changed (144) hide show
  1. package/dist/{Chatify-CwAfN1wu.js → Chatify-CP2jgo8d.js} +191 -118
  2. package/dist/Chatify-CP2jgo8d.js.map +1 -0
  3. package/dist/Chatify.css +28 -0
  4. package/dist/audit.js +3 -2
  5. package/dist/audit.js.map +1 -1
  6. package/dist/index.js +1 -1
  7. package/dist/types/audit/index.d.ts +17 -15
  8. package/dist/types/core/api/api.d.ts +146 -0
  9. package/dist/types/ui/Chat/ChatContext.d.ts +2 -0
  10. package/dist/types/ui/Chat/ChatPanel.d.ts +7 -0
  11. package/dist/types/ui/Chat/ChatView.d.ts +4 -2
  12. package/dist/types/ui/ChatGroup/ChatGroupContext.d.ts +4 -1
  13. package/dist/types/ui/ChatGroup/ChatGroupPanel.d.ts +21 -2
  14. package/dist/types/ui/Conversation/Conversation.d.ts +1 -0
  15. package/dist/types/ui/Conversation/ConversationContext.d.ts +1 -0
  16. package/dist/types/ui/Conversation/ConversationHeader.d.ts +4 -1
  17. package/dist/types/ui/localizer.d.ts +4 -1
  18. package/dist/types/ui/useCompact.d.ts +4 -0
  19. package/package.json +81 -81
  20. package/src/audit/AuditChatList.tsx +25 -25
  21. package/src/audit/AuditConversationPanel.tsx +49 -48
  22. package/src/audit/AuditPanel.tsx +76 -76
  23. package/src/audit/AuditPanelCustomizeValue.ts +11 -11
  24. package/src/audit/AuditSearch.tsx +89 -89
  25. package/src/audit/AuditSearchValue.tsx +42 -42
  26. package/src/audit/auditApi.tsx +113 -113
  27. package/src/audit/index.d.ts +18 -18
  28. package/src/audit/index.tsx +28 -28
  29. package/src/audit/styles.scss +72 -72
  30. package/src/core/api/api.ts +675 -669
  31. package/src/core/api/baseApi.ts +38 -38
  32. package/src/core/api/index.ts +1 -1
  33. package/src/core/client.ts +298 -298
  34. package/src/core/constants.ts +1 -1
  35. package/src/core/debounce.ts +90 -90
  36. package/src/core/index.ts +4 -4
  37. package/src/core/types.tsx +182 -182
  38. package/src/index.ts +2 -2
  39. package/src/styles/aside.scss +34 -26
  40. package/src/styles/chat-list.scss +138 -138
  41. package/src/styles/chat.scss +11 -11
  42. package/src/styles/conversation.scss +199 -200
  43. package/src/styles/index.scss +227 -220
  44. package/src/styles/input.scss +148 -148
  45. package/src/styles/keyframes.scss +14 -14
  46. package/src/styles/members.scss +30 -13
  47. package/src/styles/mixins.scss +38 -25
  48. package/src/styles/variables.scss +13 -13
  49. package/src/ui/Chat/ChatContext.tsx +32 -30
  50. package/src/ui/Chat/ChatEditableHeaderName.tsx +63 -63
  51. package/src/ui/Chat/ChatHeaderActions.tsx +19 -19
  52. package/src/ui/Chat/ChatPanel.tsx +46 -30
  53. package/src/ui/Chat/ChatView.tsx +122 -115
  54. package/src/ui/Chat/Members/ChatMembersButton.tsx +9 -9
  55. package/src/ui/Chat/Members/ChatMembersPanel.tsx +128 -112
  56. package/src/ui/Chat/Members/ChatMembersPreview.tsx +25 -25
  57. package/src/ui/Chat/Members/index.ts +13 -13
  58. package/src/ui/Chat/index.ts +6 -6
  59. package/src/ui/ChatGroup/AutoReply/AutoReplyButton.tsx +21 -21
  60. package/src/ui/ChatGroup/AutoReply/AutoReplyForm.tsx +50 -50
  61. package/src/ui/ChatGroup/AutoReply/AutoReplyPanel.tsx +94 -94
  62. package/src/ui/ChatGroup/AutoReply/AutoReplyPeriodInput.tsx +22 -22
  63. package/src/ui/ChatGroup/AutoReply/AutoReplyTextInput.tsx +22 -22
  64. package/src/ui/ChatGroup/AutoReply/index.ts +19 -19
  65. package/src/ui/ChatGroup/ChatGroupContext.tsx +63 -61
  66. package/src/ui/ChatGroup/ChatGroupPanel.tsx +110 -75
  67. package/src/ui/ChatGroup/Create/CreateChatButton.tsx +15 -15
  68. package/src/ui/ChatGroup/Create/CreateChatForm.tsx +36 -36
  69. package/src/ui/ChatGroup/Create/CreateChatMemberInput.tsx +65 -65
  70. package/src/ui/ChatGroup/Create/CreateChatNameInput.tsx +25 -25
  71. package/src/ui/ChatGroup/Create/CreateChatPanel.tsx +45 -45
  72. package/src/ui/ChatGroup/Create/index.ts +19 -19
  73. package/src/ui/ChatGroup/Layout/ChatGroupActions.tsx +15 -15
  74. package/src/ui/ChatGroup/Layout/ChatGroupAside.tsx +12 -12
  75. package/src/ui/ChatGroup/Layout/ChatGroupBody.tsx +17 -10
  76. package/src/ui/ChatGroup/Layout/ChatGroupFooter.tsx +3 -3
  77. package/src/ui/ChatGroup/Layout/ChatGroupHeader.tsx +5 -5
  78. package/src/ui/ChatGroup/Layout/ChatGroupMain.tsx +21 -19
  79. package/src/ui/ChatGroup/Layout/index.ts +22 -22
  80. package/src/ui/ChatGroup/List/ChatListPanel.tsx +28 -28
  81. package/src/ui/ChatGroup/List/index.ts +8 -8
  82. package/src/ui/ChatGroup/index.ts +6 -6
  83. package/src/ui/Chatify.tsx +15 -15
  84. package/src/ui/Conversation/Conversation.tsx +96 -92
  85. package/src/ui/Conversation/ConversationActions.tsx +12 -12
  86. package/src/ui/Conversation/ConversationBody.tsx +28 -28
  87. package/src/ui/Conversation/ConversationContext.ts +31 -30
  88. package/src/ui/Conversation/ConversationHeader.tsx +35 -19
  89. package/src/ui/Conversation/ConversationName.tsx +7 -7
  90. package/src/ui/Conversation/InputBox/InputBox.tsx +126 -126
  91. package/src/ui/Conversation/InputBox/InputBoxFile.tsx +38 -38
  92. package/src/ui/Conversation/InputBox/InputBoxFileList.tsx +21 -21
  93. package/src/ui/Conversation/InputBox/InputFilesBox.tsx +78 -78
  94. package/src/ui/Conversation/InputBox/InputSubmitButtonBox.tsx +26 -26
  95. package/src/ui/Conversation/InputBox/InputTextBox.tsx +63 -61
  96. package/src/ui/Conversation/InputBox/index.ts +23 -23
  97. package/src/ui/Conversation/Message/MessageAuthor.tsx +13 -13
  98. package/src/ui/Conversation/Message/MessageBox.tsx +20 -20
  99. package/src/ui/Conversation/Message/MessageContent.tsx +15 -15
  100. package/src/ui/Conversation/Message/MessageFile.tsx +54 -54
  101. package/src/ui/Conversation/Message/MessageFileList.tsx +14 -14
  102. package/src/ui/Conversation/Message/MessageInfoBox.tsx +28 -28
  103. package/src/ui/Conversation/Message/MessageRow.tsx +28 -28
  104. package/src/ui/Conversation/Message/MessageText.tsx +7 -7
  105. package/src/ui/Conversation/Message/index.ts +28 -28
  106. package/src/ui/Conversation/NextObserver/NextMessagesObserver.tsx +47 -47
  107. package/src/ui/Conversation/NextObserver/index.ts +1 -1
  108. package/src/ui/Conversation/ReadObserver/MessageReadObserver.tsx +49 -49
  109. package/src/ui/Conversation/ReadObserver/index.ts +1 -1
  110. package/src/ui/Conversation/SendingMessage/SendingMessageBox.tsx +16 -16
  111. package/src/ui/Conversation/SendingMessage/SendingMessageContent.tsx +13 -13
  112. package/src/ui/Conversation/SendingMessage/SendingMessageInfoBox.tsx +13 -13
  113. package/src/ui/Conversation/SendingMessage/SendingMessageText.tsx +7 -7
  114. package/src/ui/Conversation/SendingMessage/index.ts +16 -16
  115. package/src/ui/Conversation/SystemMessage/SystemMessageBox.tsx +20 -20
  116. package/src/ui/Conversation/SystemMessage/SystemMessageRow.tsx +28 -28
  117. package/src/ui/Conversation/SystemMessage/index.ts +10 -10
  118. package/src/ui/Conversation/index.ts +13 -13
  119. package/src/ui/Thread/ThreadActions.tsx +22 -22
  120. package/src/ui/Thread/ThreadContext.ts +13 -13
  121. package/src/ui/Thread/ThreadPanel.tsx +128 -127
  122. package/src/ui/Thread/index.tsx +3 -3
  123. package/src/ui/color.ts +20 -20
  124. package/src/ui/common/Avatar.tsx +20 -20
  125. package/src/ui/common/ChatList/ChatList.tsx +83 -84
  126. package/src/ui/common/ChatList/ChatListItemAvatar.tsx +22 -22
  127. package/src/ui/common/ChatList/ChatListItemBox.tsx +32 -32
  128. package/src/ui/common/ChatList/ChatListItemLastMessage.tsx +15 -15
  129. package/src/ui/common/ChatList/ChatListItemLastMessageAuthor.tsx +15 -15
  130. package/src/ui/common/ChatList/ChatListItemLastMessageContent.tsx +21 -21
  131. package/src/ui/common/ChatList/ChatListItemLastMessageSentAt.tsx +22 -22
  132. package/src/ui/common/ChatList/ChatListItemName.tsx +8 -8
  133. package/src/ui/common/ChatList/ChatListItemUnreadCount.tsx +12 -12
  134. package/src/ui/common/ChatList/ChatListValue.ts +9 -9
  135. package/src/ui/common/ChatList/index.ts +32 -32
  136. package/src/ui/common/Icon.tsx +48 -48
  137. package/src/ui/common/MessageSkeleton.tsx +20 -20
  138. package/src/ui/common/index.ts +14 -14
  139. package/src/ui/customize.tsx +51 -51
  140. package/src/ui/index.ts +11 -11
  141. package/src/ui/localizer.tsx +148 -137
  142. package/src/ui/useCompact.tsx +32 -0
  143. package/src/ui/useFormatter.tsx +17 -17
  144. package/dist/Chatify-CwAfN1wu.js.map +0 -1
@@ -1,61 +1,63 @@
1
- import React, { PropsWithChildren, useContext, useMemo, useState } from 'react';
2
-
3
- export interface ChatGroupContext {
4
- view: 'chat' | 'new-chat' | 'auto-reply' | null;
5
- chatId: string | null;
6
- showMembers: boolean;
7
-
8
- none(): void;
9
- openChat(chatId: string): void;
10
- toggleNewChat(): void;
11
- toggleMembers(): void;
12
- toggleAutoReply(): void;
13
- }
14
-
15
- const ChatGroupReactContext = React.createContext<ChatGroupContext>(null!);
16
-
17
- export function useChatGroupContext() {
18
- return useContext(ChatGroupReactContext);
19
- }
20
-
21
- // eslint-disable-next-line @typescript-eslint/no-redeclare
22
- export function ChatGroupContext(props: PropsWithChildren<{}>) {
23
- const { children } = props;
24
- const [state, setState] = useState<Pick<ChatGroupContext, 'view' | 'chatId' | 'showMembers'>>({
25
- chatId: null,
26
- view: null,
27
- showMembers: false,
28
- });
29
-
30
- const value = useMemo<ChatGroupContext>(
31
- () => ({
32
- ...state,
33
- openChat: (chatId: string) => setState((prev) => ({ ...prev, view: 'chat', chatId })),
34
- none: () => setState((prev) => ({ ...prev, view: null, chatId: null })),
35
- toggleMembers: () => setState((prev) => ({ ...prev, showMembers: !prev.showMembers })),
36
- toggleNewChat: () =>
37
- setState((prev) => {
38
- if (prev.view === 'new-chat' && !prev.chatId) {
39
- return { ...prev, view: null };
40
- } else if (prev.view === 'new-chat' && prev.chatId) {
41
- return { ...prev, view: 'chat' };
42
- } else {
43
- return { ...prev, view: 'new-chat' };
44
- }
45
- }),
46
- toggleAutoReply: () =>
47
- setState((prev) => {
48
- if (prev.view === 'auto-reply' && prev.chatId) {
49
- return { ...prev, view: 'chat' };
50
- } else if (prev.view === 'auto-reply' && !prev.chatId) {
51
- return { ...prev, view: null };
52
- } else {
53
- return { ...prev, view: 'auto-reply' };
54
- }
55
- }),
56
- }),
57
- [state],
58
- );
59
-
60
- return <ChatGroupReactContext.Provider value={value}>{children}</ChatGroupReactContext.Provider>;
61
- }
1
+ import React, { PropsWithChildren, useContext, useMemo, useState } from 'react';
2
+
3
+ export interface ChatGroupContext {
4
+ view: 'chat' | 'new-chat' | 'auto-reply' | null;
5
+ chatId: string | null;
6
+ showMembers: boolean;
7
+ compact: boolean;
8
+
9
+ none(): void;
10
+ openChat(chatId: string): void;
11
+ toggleNewChat(): void;
12
+ toggleMembers(): void;
13
+ toggleAutoReply(): void;
14
+ }
15
+
16
+ const ChatGroupReactContext = React.createContext<ChatGroupContext>(null!);
17
+
18
+ export function useChatGroupContext() {
19
+ return useContext(ChatGroupReactContext);
20
+ }
21
+
22
+ // eslint-disable-next-line @typescript-eslint/no-redeclare
23
+ export function ChatGroupContext(props: PropsWithChildren<{ compact: boolean }>) {
24
+ const { children, compact } = props;
25
+ const [state, setState] = useState<Pick<ChatGroupContext, 'view' | 'chatId' | 'showMembers'>>({
26
+ chatId: null,
27
+ view: null,
28
+ showMembers: false,
29
+ });
30
+
31
+ const value = useMemo<ChatGroupContext>(
32
+ () => ({
33
+ ...state,
34
+ compact,
35
+ openChat: (chatId: string) => setState((prev) => ({ ...prev, view: 'chat', chatId })),
36
+ none: () => setState((prev) => ({ ...prev, view: null, chatId: null })),
37
+ toggleMembers: () => setState((prev) => ({ ...prev, showMembers: !prev.showMembers })),
38
+ toggleNewChat: () =>
39
+ setState((prev) => {
40
+ if (prev.view === 'new-chat' && !prev.chatId) {
41
+ return { ...prev, view: null };
42
+ } else if (prev.view === 'new-chat' && prev.chatId) {
43
+ return { ...prev, view: 'chat' };
44
+ } else {
45
+ return { ...prev, view: 'new-chat' };
46
+ }
47
+ }),
48
+ toggleAutoReply: () =>
49
+ setState((prev) => {
50
+ if (prev.view === 'auto-reply' && prev.chatId) {
51
+ return { ...prev, view: 'chat' };
52
+ } else if (prev.view === 'auto-reply' && !prev.chatId) {
53
+ return { ...prev, view: null };
54
+ } else {
55
+ return { ...prev, view: 'auto-reply' };
56
+ }
57
+ }),
58
+ }),
59
+ [state, compact],
60
+ );
61
+
62
+ return <ChatGroupReactContext.Provider value={value}>{children}</ChatGroupReactContext.Provider>;
63
+ }
@@ -1,75 +1,110 @@
1
- import { CSSProperties, FC, useEffect, useMemo, useRef } from 'react';
2
- import { Localizer, LocalizerContext, defaultLocalizer } from '../localizer';
3
- import { CreateChatPanelCustomizeValue } from './Create';
4
- import { ChatGroupBody, ChatGroupFooter, ChatGroupHeader, ChatGroupLayoutCustomizeValue } from './Layout';
5
- import { ChatListPanelCustomizeValue } from './List';
6
- import { ChatGroupContext, useChatGroupContext } from './ChatGroupContext';
7
- import { chatifyApi } from '../../core';
8
- import { CustomizeContext } from '../customize';
9
- import { ChatViewCustomizeValue } from '../Chat';
10
- import { AutoReplyCustomizeValue } from './AutoReply';
11
-
12
- export interface ChatGroupCustomizeValue
13
- extends ChatViewCustomizeValue,
14
- AutoReplyCustomizeValue,
15
- CreateChatPanelCustomizeValue,
16
- ChatListPanelCustomizeValue,
17
- ChatGroupLayoutCustomizeValue {}
18
-
19
- export interface ChatifyProps {
20
- className?: string;
21
- style?: CSSProperties;
22
- localizer?: Localizer;
23
- customize?: ChatGroupCustomizeValue;
24
- }
25
-
26
- function Content(props: Pick<ChatifyProps, 'className' | 'style'>) {
27
- const { className = '', style } = props;
28
- const { data: chats } = chatifyApi.useGetChatListQuery();
29
- const { openChat, none, chatId } = useChatGroupContext();
30
- const openFirstChatRef = useRef(false);
31
-
32
- useEffect(() => {
33
- if (chats && !chats.some((x) => x.id === chatId)) {
34
- chats.length ? openChat(chats[0].id) : none();
35
- }
36
-
37
- // eslint-disable-next-line react-hooks/exhaustive-deps
38
- }, [chats, chatId]);
39
-
40
- useEffect(() => {
41
- if (chats && !openFirstChatRef.current) {
42
- openFirstChatRef.current = true;
43
- chats.length && openChat(chats[0].id);
44
- }
45
- // eslint-disable-next-line react-hooks/exhaustive-deps
46
- }, [chats]);
47
-
48
- return (
49
- <div className={className + ' wxchtf-chatify wxchtf-chat-group'} style={style}>
50
- <ChatGroupHeader />
51
- <ChatGroupBody />
52
- <ChatGroupFooter />
53
- </div>
54
- );
55
- }
56
-
57
- const DEFAULT_CUSTOMIZE: ChatGroupCustomizeValue = {
58
- ChatGroupHeader: null,
59
- ChatGroupFooter: null,
60
- };
61
-
62
- export const ChatGroupPanel: FC<ChatifyProps> = (props) => {
63
- const { localizer = defaultLocalizer, customize = DEFAULT_CUSTOMIZE } = props;
64
- const customizeValue = useMemo(() => Object.assign({}, DEFAULT_CUSTOMIZE, customize), [customize]);
65
-
66
- return (
67
- <LocalizerContext.Provider value={localizer}>
68
- <CustomizeContext.Provider value={customizeValue as any}>
69
- <ChatGroupContext>
70
- <Content {...props} />
71
- </ChatGroupContext>
72
- </CustomizeContext.Provider>
73
- </LocalizerContext.Provider>
74
- );
75
- };
1
+ import { CSSProperties, FC, useEffect, useMemo, useRef } from 'react';
2
+ import { Localizer, LocalizerContext, defaultLocalizer } from '../localizer';
3
+ import { CreateChatPanelCustomizeValue } from './Create';
4
+ import { ChatGroupBody, ChatGroupFooter, ChatGroupHeader, ChatGroupLayoutCustomizeValue } from './Layout';
5
+ import { ChatListPanelCustomizeValue } from './List';
6
+ import { ChatGroupContext, useChatGroupContext } from './ChatGroupContext';
7
+ import { chatifyApi } from '../../core';
8
+ import { CustomizeContext } from '../customize';
9
+ import { ChatViewCustomizeValue } from '../Chat';
10
+ import { AutoReplyCustomizeValue } from './AutoReply';
11
+ import { useCompact } from '../useCompact';
12
+
13
+ export interface ChatGroupCustomizeValue
14
+ extends ChatViewCustomizeValue,
15
+ AutoReplyCustomizeValue,
16
+ CreateChatPanelCustomizeValue,
17
+ ChatListPanelCustomizeValue,
18
+ ChatGroupLayoutCustomizeValue {}
19
+
20
+ export interface ChatGroupPanelProps {
21
+ /**
22
+ * Class name to be applied to the chat group panel container.
23
+ */
24
+ className?: string;
25
+
26
+ /**
27
+ * Style to be applied to the chat group panel container.
28
+ */
29
+ style?: CSSProperties;
30
+
31
+ /**
32
+ * Localizer to be used for the chat group panel. If not provided, the default localizer will be used.
33
+ */
34
+ localizer?: Localizer;
35
+
36
+ /**
37
+ * Chat group panel components customization. If not provided, the default customization will be used.
38
+ */
39
+ customize?: ChatGroupCustomizeValue;
40
+
41
+ /**
42
+ * If true, the chat group panel will be displayed in compact mode.
43
+ * If a number is provided, the chat group panel will be displayed in compact mode if its width is less than the provided number of pixels.
44
+ *
45
+ * @default 768
46
+ */
47
+ compact?: boolean | number;
48
+ }
49
+
50
+ interface ContentProps extends Pick<ChatGroupPanelProps, 'className' | 'style'> {
51
+ containerRef: React.RefObject<HTMLDivElement>;
52
+ }
53
+
54
+ function Content(props: ContentProps) {
55
+ const { className = '', style, containerRef } = props;
56
+ const { data: chats } = chatifyApi.useGetChatListQuery();
57
+ const { openChat, none, chatId, compact } = useChatGroupContext();
58
+ const openFirstChatRef = useRef(false);
59
+
60
+ useEffect(() => {
61
+ if (chats && chatId && !chats.some((x) => x.id === chatId)) {
62
+ chats.length ? openChat(chats[0].id) : none();
63
+ }
64
+
65
+ // eslint-disable-next-line react-hooks/exhaustive-deps
66
+ }, [chats, chatId]);
67
+
68
+ useEffect(() => {
69
+ if (chats && !openFirstChatRef.current && !compact) {
70
+ openFirstChatRef.current = true;
71
+ chats.length && openChat(chats[0].id);
72
+ }
73
+ // eslint-disable-next-line react-hooks/exhaustive-deps
74
+ }, [chats, compact]);
75
+
76
+ return (
77
+ <div
78
+ className={['wxchtf-chatify', 'wxchtf-chat-group', compact && '--compact', className]
79
+ .filter(Boolean)
80
+ .join(' ')}
81
+ style={style}
82
+ ref={containerRef}
83
+ >
84
+ <ChatGroupHeader />
85
+ <ChatGroupBody />
86
+ <ChatGroupFooter />
87
+ </div>
88
+ );
89
+ }
90
+
91
+ const DEFAULT_CUSTOMIZE: ChatGroupCustomizeValue = {
92
+ ChatGroupHeader: null,
93
+ ChatGroupFooter: null,
94
+ };
95
+
96
+ export const ChatGroupPanel: FC<ChatGroupPanelProps> = (props) => {
97
+ const { localizer = defaultLocalizer, customize = DEFAULT_CUSTOMIZE, compact: compactProp } = props;
98
+ const customizeValue = useMemo(() => Object.assign({}, DEFAULT_CUSTOMIZE, customize), [customize]);
99
+ const [containerRef, compact] = useCompact(compactProp);
100
+
101
+ return (
102
+ <LocalizerContext.Provider value={localizer}>
103
+ <CustomizeContext.Provider value={customizeValue as any}>
104
+ <ChatGroupContext compact={compact ?? true}>
105
+ <Content {...props} containerRef={containerRef} />
106
+ </ChatGroupContext>
107
+ </CustomizeContext.Provider>
108
+ </LocalizerContext.Provider>
109
+ );
110
+ };
@@ -1,15 +1,15 @@
1
- import { Button } from 'antd';
2
- import { customize } from '../../customize';
3
- import { useChatGroupContext } from '../ChatGroupContext';
4
-
5
- export const CreateChatButton = customize('CreateChatButton', () => {
6
- const { toggleNewChat } = useChatGroupContext();
7
-
8
- return (
9
- <span className="wxchtf-add-btn-wrapper">
10
- <Button className="wxchtf-add-btn" onClick={toggleNewChat} icon="+">
11
- Add chat
12
- </Button>
13
- </span>
14
- );
15
- });
1
+ import { Button } from 'antd';
2
+ import { customize } from '../../customize';
3
+ import { useChatGroupContext } from '../ChatGroupContext';
4
+
5
+ export const CreateChatButton = customize('CreateChatButton', () => {
6
+ const { toggleNewChat } = useChatGroupContext();
7
+
8
+ return (
9
+ <span className="wxchtf-add-btn-wrapper">
10
+ <Button className="wxchtf-add-btn" onClick={toggleNewChat} icon="+">
11
+ Add chat
12
+ </Button>
13
+ </span>
14
+ );
15
+ });
@@ -1,36 +1,36 @@
1
- import { Button, Form } from 'antd';
2
- import { customize } from '../../customize';
3
- import { CreateChatNameInput } from './CreateChatNameInput';
4
- import { CreateChatMemberInput } from './CreateChatMemberInput';
5
- import { useLocalizer } from '../../localizer';
6
-
7
- export interface CreateChatFormValue {
8
- name: string;
9
- members: string[];
10
- }
11
-
12
- export interface CreateChatFormProps {
13
- value?: CreateChatFormValue;
14
- onSubmit: (value: CreateChatFormValue) => void;
15
- busy?: boolean;
16
- }
17
-
18
- const INITIAL_VALUE: CreateChatFormValue = {
19
- name: '',
20
- members: [],
21
- };
22
-
23
- export const CreateChatForm = customize('CreateChatForm', (props: CreateChatFormProps) => {
24
- const { value = INITIAL_VALUE, onSubmit, busy = false } = props;
25
- const localizer = useLocalizer();
26
-
27
- return (
28
- <Form onFinish={onSubmit} layout="vertical" disabled={busy} initialValues={value}>
29
- <CreateChatNameInput name="name" />
30
- <CreateChatMemberInput name="members" />
31
- <Button loading={busy} type="primary" block htmlType="submit">
32
- {localizer.addChat.submitBtn()}
33
- </Button>
34
- </Form>
35
- );
36
- });
1
+ import { Button, Form } from 'antd';
2
+ import { customize } from '../../customize';
3
+ import { CreateChatNameInput } from './CreateChatNameInput';
4
+ import { CreateChatMemberInput } from './CreateChatMemberInput';
5
+ import { useLocalizer } from '../../localizer';
6
+
7
+ export interface CreateChatFormValue {
8
+ name: string;
9
+ members: string[];
10
+ }
11
+
12
+ export interface CreateChatFormProps {
13
+ value?: CreateChatFormValue;
14
+ onSubmit: (value: CreateChatFormValue) => void;
15
+ busy?: boolean;
16
+ }
17
+
18
+ const INITIAL_VALUE: CreateChatFormValue = {
19
+ name: '',
20
+ members: [],
21
+ };
22
+
23
+ export const CreateChatForm = customize('CreateChatForm', (props: CreateChatFormProps) => {
24
+ const { value = INITIAL_VALUE, onSubmit, busy = false } = props;
25
+ const localizer = useLocalizer();
26
+
27
+ return (
28
+ <Form onFinish={onSubmit} layout="vertical" disabled={busy} initialValues={value}>
29
+ <CreateChatNameInput name="name" />
30
+ <CreateChatMemberInput name="members" />
31
+ <Button loading={busy} type="primary" block htmlType="submit">
32
+ {localizer.addChat.submitBtn()}
33
+ </Button>
34
+ </Form>
35
+ );
36
+ });
@@ -1,65 +1,65 @@
1
- import { useMemo } from 'react';
2
- import { chatifyApi } from '../../../core';
3
- import { customize } from '../../customize';
4
- import { Checkbox, Form, List } from 'antd';
5
- import { useLocalizer } from '../../localizer';
6
- import { Avatar } from '../../common/Avatar';
7
-
8
- export interface CreateChatMemberInputProps {
9
- name: string;
10
- }
11
-
12
- interface CheckboxListProps {
13
- value?: string[];
14
- onChange?: (value: string[]) => void;
15
- }
16
-
17
- function CheckboxList(props: CheckboxListProps) {
18
- const { value, onChange } = props;
19
- const { data: accounts, isFetching } = chatifyApi.useGetAccountListQuery({});
20
- const me = chatifyApi.settings.me();
21
- const dataSource = useMemo(() => accounts?.filter((x) => x.id !== me) ?? [], [accounts, me]);
22
-
23
- return (
24
- <List
25
- rowKey="id"
26
- className="wxchtf-create-chat-member-input-list"
27
- loading={isFetching}
28
- dataSource={dataSource}
29
- renderItem={(x) => {
30
- const checked = value!.includes(x.id);
31
-
32
- return (
33
- <List.Item className={checked ? '--selected' : ''}>
34
- <Checkbox
35
- checked={checked}
36
- onChange={() =>
37
- onChange!(value!.includes(x.id) ? value!.filter((y) => y !== x.id) : [...value!, x.id])
38
- }
39
- >
40
- <List.Item.Meta avatar={<Avatar account={x} />} title={x.name} />
41
- </Checkbox>
42
- </List.Item>
43
- );
44
- }}
45
- />
46
- );
47
- }
48
-
49
- export const CreateChatMemberInput = customize(
50
- 'CreateChatMemberInput',
51
- (props: CreateChatMemberInputProps) => {
52
- const { name } = props;
53
- const localizer = useLocalizer();
54
-
55
- return (
56
- <Form.Item
57
- label={localizer.addChat.members.label()}
58
- rules={[{ required: true, message: localizer.addChat.members.required() }]}
59
- name={name}
60
- >
61
- <CheckboxList />
62
- </Form.Item>
63
- );
64
- },
65
- );
1
+ import { useMemo } from 'react';
2
+ import { chatifyApi } from '../../../core';
3
+ import { customize } from '../../customize';
4
+ import { Checkbox, Form, List } from 'antd';
5
+ import { useLocalizer } from '../../localizer';
6
+ import { Avatar } from '../../common/Avatar';
7
+
8
+ export interface CreateChatMemberInputProps {
9
+ name: string;
10
+ }
11
+
12
+ interface CheckboxListProps {
13
+ value?: string[];
14
+ onChange?: (value: string[]) => void;
15
+ }
16
+
17
+ function CheckboxList(props: CheckboxListProps) {
18
+ const { value, onChange } = props;
19
+ const { data: accounts, isFetching } = chatifyApi.useGetAccountListQuery({});
20
+ const me = chatifyApi.settings.me();
21
+ const dataSource = useMemo(() => accounts?.filter((x) => x.id !== me) ?? [], [accounts, me]);
22
+
23
+ return (
24
+ <List
25
+ rowKey="id"
26
+ className="wxchtf-create-chat-member-input-list"
27
+ loading={isFetching}
28
+ dataSource={dataSource}
29
+ renderItem={(x) => {
30
+ const checked = value!.includes(x.id);
31
+
32
+ return (
33
+ <List.Item className={checked ? '--selected' : ''}>
34
+ <Checkbox
35
+ checked={checked}
36
+ onChange={() =>
37
+ onChange!(value!.includes(x.id) ? value!.filter((y) => y !== x.id) : [...value!, x.id])
38
+ }
39
+ >
40
+ <List.Item.Meta avatar={<Avatar account={x} />} title={x.name} />
41
+ </Checkbox>
42
+ </List.Item>
43
+ );
44
+ }}
45
+ />
46
+ );
47
+ }
48
+
49
+ export const CreateChatMemberInput = customize(
50
+ 'CreateChatMemberInput',
51
+ (props: CreateChatMemberInputProps) => {
52
+ const { name } = props;
53
+ const localizer = useLocalizer();
54
+
55
+ return (
56
+ <Form.Item
57
+ label={localizer.addChat.members.label()}
58
+ rules={[{ required: true, message: localizer.addChat.members.required() }]}
59
+ name={name}
60
+ >
61
+ <CheckboxList />
62
+ </Form.Item>
63
+ );
64
+ },
65
+ );
@@ -1,25 +1,25 @@
1
- import { Form, Input } from 'antd';
2
- import { customize } from '../../customize';
3
- import { useLocalizer } from '../../localizer';
4
-
5
- export interface CreateChatNameInputProps {
6
- name: string;
7
- }
8
-
9
- export const CreateChatNameInput = customize('CreateChatNameInput', (props: CreateChatNameInputProps) => {
10
- const { name } = props;
11
- const localizer = useLocalizer();
12
-
13
- return (
14
- <Form.Item
15
- name={name}
16
- label={localizer.addChat.name.label()}
17
- rules={[
18
- { required: true, message: localizer.addChat.name.required() },
19
- { max: 250, message: localizer.addChat.name.max250() },
20
- ]}
21
- >
22
- <Input />
23
- </Form.Item>
24
- );
25
- });
1
+ import { Form, Input } from 'antd';
2
+ import { customize } from '../../customize';
3
+ import { useLocalizer } from '../../localizer';
4
+
5
+ export interface CreateChatNameInputProps {
6
+ name: string;
7
+ }
8
+
9
+ export const CreateChatNameInput = customize('CreateChatNameInput', (props: CreateChatNameInputProps) => {
10
+ const { name } = props;
11
+ const localizer = useLocalizer();
12
+
13
+ return (
14
+ <Form.Item
15
+ name={name}
16
+ label={localizer.addChat.name.label()}
17
+ rules={[
18
+ { required: true, message: localizer.addChat.name.required() },
19
+ { max: 250, message: localizer.addChat.name.max250() },
20
+ ]}
21
+ >
22
+ <Input />
23
+ </Form.Item>
24
+ );
25
+ });