@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.
Files changed (143) 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/ui/Chat/ChatContext.d.ts +2 -0
  9. package/dist/types/ui/Chat/ChatPanel.d.ts +7 -0
  10. package/dist/types/ui/Chat/ChatView.d.ts +4 -2
  11. package/dist/types/ui/ChatGroup/ChatGroupContext.d.ts +4 -1
  12. package/dist/types/ui/ChatGroup/ChatGroupPanel.d.ts +21 -2
  13. package/dist/types/ui/Conversation/Conversation.d.ts +1 -0
  14. package/dist/types/ui/Conversation/ConversationContext.d.ts +1 -0
  15. package/dist/types/ui/Conversation/ConversationHeader.d.ts +4 -1
  16. package/dist/types/ui/localizer.d.ts +4 -1
  17. package/dist/types/ui/useCompact.d.ts +4 -0
  18. package/package.json +81 -81
  19. package/src/audit/AuditChatList.tsx +25 -25
  20. package/src/audit/AuditConversationPanel.tsx +49 -48
  21. package/src/audit/AuditPanel.tsx +76 -76
  22. package/src/audit/AuditPanelCustomizeValue.ts +11 -11
  23. package/src/audit/AuditSearch.tsx +89 -89
  24. package/src/audit/AuditSearchValue.tsx +42 -42
  25. package/src/audit/auditApi.tsx +113 -113
  26. package/src/audit/index.d.ts +18 -18
  27. package/src/audit/index.tsx +28 -28
  28. package/src/audit/styles.scss +72 -72
  29. package/src/core/api/api.ts +675 -675
  30. package/src/core/api/baseApi.ts +38 -38
  31. package/src/core/api/index.ts +1 -1
  32. package/src/core/client.ts +298 -298
  33. package/src/core/constants.ts +1 -1
  34. package/src/core/debounce.ts +90 -90
  35. package/src/core/index.ts +4 -4
  36. package/src/core/types.tsx +182 -182
  37. package/src/index.ts +2 -2
  38. package/src/styles/aside.scss +34 -26
  39. package/src/styles/chat-list.scss +138 -138
  40. package/src/styles/chat.scss +11 -11
  41. package/src/styles/conversation.scss +199 -200
  42. package/src/styles/index.scss +227 -220
  43. package/src/styles/input.scss +148 -148
  44. package/src/styles/keyframes.scss +14 -14
  45. package/src/styles/members.scss +30 -13
  46. package/src/styles/mixins.scss +38 -25
  47. package/src/styles/variables.scss +13 -13
  48. package/src/ui/Chat/ChatContext.tsx +32 -30
  49. package/src/ui/Chat/ChatEditableHeaderName.tsx +63 -63
  50. package/src/ui/Chat/ChatHeaderActions.tsx +19 -19
  51. package/src/ui/Chat/ChatPanel.tsx +46 -30
  52. package/src/ui/Chat/ChatView.tsx +122 -115
  53. package/src/ui/Chat/Members/ChatMembersButton.tsx +9 -9
  54. package/src/ui/Chat/Members/ChatMembersPanel.tsx +128 -112
  55. package/src/ui/Chat/Members/ChatMembersPreview.tsx +25 -25
  56. package/src/ui/Chat/Members/index.ts +13 -13
  57. package/src/ui/Chat/index.ts +6 -6
  58. package/src/ui/ChatGroup/AutoReply/AutoReplyButton.tsx +21 -21
  59. package/src/ui/ChatGroup/AutoReply/AutoReplyForm.tsx +50 -50
  60. package/src/ui/ChatGroup/AutoReply/AutoReplyPanel.tsx +94 -94
  61. package/src/ui/ChatGroup/AutoReply/AutoReplyPeriodInput.tsx +22 -22
  62. package/src/ui/ChatGroup/AutoReply/AutoReplyTextInput.tsx +22 -22
  63. package/src/ui/ChatGroup/AutoReply/index.ts +19 -19
  64. package/src/ui/ChatGroup/ChatGroupContext.tsx +63 -61
  65. package/src/ui/ChatGroup/ChatGroupPanel.tsx +110 -75
  66. package/src/ui/ChatGroup/Create/CreateChatButton.tsx +15 -15
  67. package/src/ui/ChatGroup/Create/CreateChatForm.tsx +36 -36
  68. package/src/ui/ChatGroup/Create/CreateChatMemberInput.tsx +65 -65
  69. package/src/ui/ChatGroup/Create/CreateChatNameInput.tsx +25 -25
  70. package/src/ui/ChatGroup/Create/CreateChatPanel.tsx +45 -45
  71. package/src/ui/ChatGroup/Create/index.ts +19 -19
  72. package/src/ui/ChatGroup/Layout/ChatGroupActions.tsx +15 -15
  73. package/src/ui/ChatGroup/Layout/ChatGroupAside.tsx +12 -12
  74. package/src/ui/ChatGroup/Layout/ChatGroupBody.tsx +17 -10
  75. package/src/ui/ChatGroup/Layout/ChatGroupFooter.tsx +3 -3
  76. package/src/ui/ChatGroup/Layout/ChatGroupHeader.tsx +5 -5
  77. package/src/ui/ChatGroup/Layout/ChatGroupMain.tsx +21 -19
  78. package/src/ui/ChatGroup/Layout/index.ts +22 -22
  79. package/src/ui/ChatGroup/List/ChatListPanel.tsx +28 -28
  80. package/src/ui/ChatGroup/List/index.ts +8 -8
  81. package/src/ui/ChatGroup/index.ts +6 -6
  82. package/src/ui/Chatify.tsx +15 -15
  83. package/src/ui/Conversation/Conversation.tsx +96 -92
  84. package/src/ui/Conversation/ConversationActions.tsx +12 -12
  85. package/src/ui/Conversation/ConversationBody.tsx +28 -28
  86. package/src/ui/Conversation/ConversationContext.ts +31 -30
  87. package/src/ui/Conversation/ConversationHeader.tsx +35 -19
  88. package/src/ui/Conversation/ConversationName.tsx +7 -7
  89. package/src/ui/Conversation/InputBox/InputBox.tsx +126 -126
  90. package/src/ui/Conversation/InputBox/InputBoxFile.tsx +38 -38
  91. package/src/ui/Conversation/InputBox/InputBoxFileList.tsx +21 -21
  92. package/src/ui/Conversation/InputBox/InputFilesBox.tsx +78 -78
  93. package/src/ui/Conversation/InputBox/InputSubmitButtonBox.tsx +26 -26
  94. package/src/ui/Conversation/InputBox/InputTextBox.tsx +63 -61
  95. package/src/ui/Conversation/InputBox/index.ts +23 -23
  96. package/src/ui/Conversation/Message/MessageAuthor.tsx +13 -13
  97. package/src/ui/Conversation/Message/MessageBox.tsx +20 -20
  98. package/src/ui/Conversation/Message/MessageContent.tsx +15 -15
  99. package/src/ui/Conversation/Message/MessageFile.tsx +54 -54
  100. package/src/ui/Conversation/Message/MessageFileList.tsx +14 -14
  101. package/src/ui/Conversation/Message/MessageInfoBox.tsx +28 -28
  102. package/src/ui/Conversation/Message/MessageRow.tsx +28 -28
  103. package/src/ui/Conversation/Message/MessageText.tsx +7 -7
  104. package/src/ui/Conversation/Message/index.ts +28 -28
  105. package/src/ui/Conversation/NextObserver/NextMessagesObserver.tsx +47 -47
  106. package/src/ui/Conversation/NextObserver/index.ts +1 -1
  107. package/src/ui/Conversation/ReadObserver/MessageReadObserver.tsx +49 -49
  108. package/src/ui/Conversation/ReadObserver/index.ts +1 -1
  109. package/src/ui/Conversation/SendingMessage/SendingMessageBox.tsx +16 -16
  110. package/src/ui/Conversation/SendingMessage/SendingMessageContent.tsx +13 -13
  111. package/src/ui/Conversation/SendingMessage/SendingMessageInfoBox.tsx +13 -13
  112. package/src/ui/Conversation/SendingMessage/SendingMessageText.tsx +7 -7
  113. package/src/ui/Conversation/SendingMessage/index.ts +16 -16
  114. package/src/ui/Conversation/SystemMessage/SystemMessageBox.tsx +20 -20
  115. package/src/ui/Conversation/SystemMessage/SystemMessageRow.tsx +28 -28
  116. package/src/ui/Conversation/SystemMessage/index.ts +10 -10
  117. package/src/ui/Conversation/index.ts +13 -13
  118. package/src/ui/Thread/ThreadActions.tsx +22 -22
  119. package/src/ui/Thread/ThreadContext.ts +13 -13
  120. package/src/ui/Thread/ThreadPanel.tsx +128 -127
  121. package/src/ui/Thread/index.tsx +3 -3
  122. package/src/ui/color.ts +20 -20
  123. package/src/ui/common/Avatar.tsx +20 -20
  124. package/src/ui/common/ChatList/ChatList.tsx +83 -84
  125. package/src/ui/common/ChatList/ChatListItemAvatar.tsx +22 -22
  126. package/src/ui/common/ChatList/ChatListItemBox.tsx +32 -32
  127. package/src/ui/common/ChatList/ChatListItemLastMessage.tsx +15 -15
  128. package/src/ui/common/ChatList/ChatListItemLastMessageAuthor.tsx +15 -15
  129. package/src/ui/common/ChatList/ChatListItemLastMessageContent.tsx +21 -21
  130. package/src/ui/common/ChatList/ChatListItemLastMessageSentAt.tsx +22 -22
  131. package/src/ui/common/ChatList/ChatListItemName.tsx +8 -8
  132. package/src/ui/common/ChatList/ChatListItemUnreadCount.tsx +12 -12
  133. package/src/ui/common/ChatList/ChatListValue.ts +9 -9
  134. package/src/ui/common/ChatList/index.ts +32 -32
  135. package/src/ui/common/Icon.tsx +48 -48
  136. package/src/ui/common/MessageSkeleton.tsx +20 -20
  137. package/src/ui/common/index.ts +14 -14
  138. package/src/ui/customize.tsx +51 -51
  139. package/src/ui/index.ts +11 -11
  140. package/src/ui/localizer.tsx +148 -137
  141. package/src/ui/useCompact.tsx +32 -0
  142. package/src/ui/useFormatter.tsx +17 -17
  143. 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
+ });