@satek-team-intern/chatbot-widget 0.8.10 → 0.10.0

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 (35) hide show
  1. package/README.md +928 -61
  2. package/dist/chatbot-widget.es.js +3627 -1662
  3. package/dist/chatbot-widget.umd.js +10 -7
  4. package/dist/locales/en.json.d.ts +129 -5
  5. package/dist/locales/vi.json.d.ts +129 -5
  6. package/dist/src/assets/Icons.d.ts +43 -0
  7. package/dist/src/assets/createIcon.d.ts +19 -0
  8. package/dist/src/assets/index.d.ts +1 -0
  9. package/dist/src/components/ChatWindow.d.ts +16 -0
  10. package/dist/src/components/modals/UpdateGroup.d.ts +1 -1
  11. package/dist/src/components/modals/UserProfileModal.d.ts +10 -0
  12. package/dist/src/components/shared/ToastContainer.d.ts +3 -0
  13. package/dist/src/components/sidebar/AppSideBar.d.ts +8 -0
  14. package/dist/src/components/sidebar/ChatList.d.ts +0 -1
  15. package/dist/src/components/sidebar/ChatSearchBar.d.ts +1 -0
  16. package/dist/src/components/sidebar/SideBarInfoChat.d.ts +11 -0
  17. package/dist/src/components/sidebar/index.d.ts +1 -0
  18. package/dist/src/components/view/ChatHeader.d.ts +1 -0
  19. package/dist/src/components/view/ContactList.d.ts +8 -0
  20. package/dist/src/components/view/GroupList.d.ts +9 -0
  21. package/dist/src/components/view/index.d.ts +2 -0
  22. package/dist/src/contexts/ToastContext.d.ts +4 -0
  23. package/dist/src/contexts/toast-context.d.ts +16 -0
  24. package/dist/src/hooks/useSetting.d.ts +1 -1
  25. package/dist/src/hooks/useToast.d.ts +1 -0
  26. package/dist/src/hooks/useTranslation.d.ts +3 -0
  27. package/dist/src/services/chat.service.d.ts +3 -2
  28. package/dist/src/store/selectors/setting.d.ts +15 -45
  29. package/dist/src/store/slices/chatSlice.d.ts +5 -2
  30. package/dist/src/store/slices/settingSlice.d.ts +3 -3
  31. package/dist/src/types/chat.type.d.ts +33 -4
  32. package/dist/src/types/types.d.ts +38 -14
  33. package/dist/src/utils/chat.utils.d.ts +14 -7
  34. package/dist/src/utils/formatDateLabel.d.ts +1 -0
  35. package/package.json +1 -1
@@ -1,60 +1,29 @@
1
1
  import { RootState } from '../store';
2
+ import { FeatureAnalysis } from '../../utils/chat.utils';
3
+ import { WidgetFeature } from '../../types';
4
+ interface WidgetSettings extends FeatureAnalysis {
5
+ acceptFilter: string;
6
+ isFileTypeAllowed: (file: File) => boolean;
7
+ allowDeleteChat: boolean;
8
+ allowDeleteMessage: (messageCreatedTime: string) => boolean;
9
+ allowRevokeMessage: (messageCreatedTime: string) => boolean;
10
+ }
2
11
  export declare const selectWidgetFeatures: ((state: {
3
12
  chat: import('../slices/chatSlice').ChatState;
4
13
  setting: import('../slices/settingSlice').SettingState;
5
- }) => {
6
- acceptFilter: string;
7
- isFileTypeAllowed: (file: File) => boolean;
8
- featureSet: Set<import('../../types').WidgetFeature>;
9
- hasVoice: boolean;
10
- hasAttachment: boolean;
11
- hasMultipleAttachments: boolean;
12
- hasGroupChat: boolean;
13
- hasChangeColor: boolean;
14
- hasMultipleLanguages: boolean;
15
- }) & {
14
+ }) => WidgetSettings) & {
16
15
  clearCache: () => void;
17
16
  resultsCount: () => number;
18
17
  resetResultsCount: () => void;
19
18
  } & {
20
- resultFunc: (resultFuncArgs_0: import('../../types').WidgetFeature[]) => {
21
- acceptFilter: string;
22
- isFileTypeAllowed: (file: File) => boolean;
23
- featureSet: Set<import('../../types').WidgetFeature>;
24
- hasVoice: boolean;
25
- hasAttachment: boolean;
26
- hasMultipleAttachments: boolean;
27
- hasGroupChat: boolean;
28
- hasChangeColor: boolean;
29
- hasMultipleLanguages: boolean;
30
- };
31
- memoizedResultFunc: ((resultFuncArgs_0: import('../../types').WidgetFeature[]) => {
32
- acceptFilter: string;
33
- isFileTypeAllowed: (file: File) => boolean;
34
- featureSet: Set<import('../../types').WidgetFeature>;
35
- hasVoice: boolean;
36
- hasAttachment: boolean;
37
- hasMultipleAttachments: boolean;
38
- hasGroupChat: boolean;
39
- hasChangeColor: boolean;
40
- hasMultipleLanguages: boolean;
41
- }) & {
19
+ resultFunc: (resultFuncArgs_0: WidgetFeature) => WidgetSettings;
20
+ memoizedResultFunc: ((resultFuncArgs_0: WidgetFeature) => WidgetSettings) & {
42
21
  clearCache: () => void;
43
22
  resultsCount: () => number;
44
23
  resetResultsCount: () => void;
45
24
  };
46
- lastResult: () => {
47
- acceptFilter: string;
48
- isFileTypeAllowed: (file: File) => boolean;
49
- featureSet: Set<import('../../types').WidgetFeature>;
50
- hasVoice: boolean;
51
- hasAttachment: boolean;
52
- hasMultipleAttachments: boolean;
53
- hasGroupChat: boolean;
54
- hasChangeColor: boolean;
55
- hasMultipleLanguages: boolean;
56
- };
57
- dependencies: [(state: RootState) => import('../../types').WidgetFeature[]];
25
+ lastResult: () => WidgetSettings;
26
+ dependencies: [(state: RootState) => WidgetFeature];
58
27
  recomputations: () => number;
59
28
  resetRecomputations: () => void;
60
29
  dependencyRecomputations: () => number;
@@ -63,3 +32,4 @@ export declare const selectWidgetFeatures: ((state: {
63
32
  memoize: typeof import('reselect').weakMapMemoize;
64
33
  argsMemoize: typeof import('reselect').weakMapMemoize;
65
34
  };
35
+ export {};
@@ -11,10 +11,13 @@ export interface ChatState {
11
11
  messagesPagination: PaginationInfo | null;
12
12
  replyingMessage: ChatMessage | null;
13
13
  }
14
- export declare const setCurrentUser: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentUser">, setChats: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setChats">, setCurrentChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentChat">, setCurrentChatMessages: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentChatMessages">, setCurrentChatMembers: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentChatMembers">, setMembers: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setMembers">, setMessagesPagination: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setMessagesPagination">, prependMessages: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/prependMessages">, addNewMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/addNewMessage">, removeChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/removeChat">, addChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/addChat">, updateChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/updateChat">, updateChatAvatar: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/updateChatAvatar">, removeMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/removeMessage">, updateMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/updateMessage">, setReplyingMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setReplyingMessage">, setTotalMessagesUnread: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setTotalMessagesUnread">, updateMemberReadStatus: import('@reduxjs/toolkit').ActionCreatorWithPayload<{
14
+ export declare const setCurrentUser: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentUser">, setChats: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setChats">, setCurrentChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentChat">, setCurrentChatMessages: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentChatMessages">, setCurrentChatMembers: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentChatMembers">, setMembers: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setMembers">, setMember: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setMember">, setMemberDisconnect: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setMemberDisconnect">, setMessagesPagination: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setMessagesPagination">, prependMessages: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/prependMessages">, addNewMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/addNewMessage">, removeChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/removeChat">, addChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/addChat">, updateChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/updateChat">, updateChatAvatar: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/updateChatAvatar">, removeMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/removeMessage">, updateMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/updateMessage">, setReplyingMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setReplyingMessage">, setTotalMessagesUnread: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setTotalMessagesUnread">, updateMemberReadStatus: import('@reduxjs/toolkit').ActionCreatorWithPayload<{
15
15
  chatId: number;
16
16
  memberId: number;
17
17
  lastReadId: number;
18
- }, "widget-chatslice/updateMemberReadStatus">;
18
+ }, "widget-chatslice/updateMemberReadStatus">, toggleChatSetting: import('@reduxjs/toolkit').ActionCreatorWithPayload<{
19
+ chatId: number;
20
+ setting: "is_muted" | "is_pined";
21
+ }, "widget-chatslice/toggleChatSetting">;
19
22
  declare const _default: import('redux').Reducer<ChatState>;
20
23
  export default _default;
@@ -2,9 +2,9 @@ import { LanguageOption, WidgetFeature } from '../../types';
2
2
  export interface SettingState {
3
3
  theme: 'light' | 'dark';
4
4
  primaryColor: string;
5
- features: WidgetFeature[];
6
- language: LanguageOption;
5
+ features: WidgetFeature;
6
+ currentLanguage: LanguageOption;
7
7
  }
8
- export declare const setConfig: import('@reduxjs/toolkit').ActionCreatorWithPayload<WidgetFeature[], "widget-settingslice/setConfig">, toggleTheme: import('@reduxjs/toolkit').ActionCreatorWithoutPayload<"widget-settingslice/toggleTheme">, setFeatures: import('@reduxjs/toolkit').ActionCreatorWithPayload<WidgetFeature[], "widget-settingslice/setFeatures">, setPrimaryColor: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-settingslice/setPrimaryColor">, setLanguage: import('@reduxjs/toolkit').ActionCreatorWithPayload<LanguageOption, "widget-settingslice/setLanguage">;
8
+ export declare const setConfig: import('@reduxjs/toolkit').ActionCreatorWithPayload<WidgetFeature, "widget-settingslice/setConfig">, toggleTheme: import('@reduxjs/toolkit').ActionCreatorWithoutPayload<"widget-settingslice/toggleTheme">, setFeatures: import('@reduxjs/toolkit').ActionCreatorWithPayload<WidgetFeature, "widget-settingslice/setFeatures">, setPrimaryColor: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-settingslice/setPrimaryColor">, setLanguage: import('@reduxjs/toolkit').ActionCreatorWithPayload<LanguageOption, "widget-settingslice/setLanguage">;
9
9
  declare const _default: import('redux').Reducer<SettingState>;
10
10
  export default _default;
@@ -6,6 +6,10 @@ export interface ChatUser {
6
6
  avatar?: string;
7
7
  phone?: string;
8
8
  email?: string;
9
+ socket_at?: string;
10
+ socket_id?: string;
11
+ socket_ids?: string[];
12
+ last_active?: number;
9
13
  status?: string;
10
14
  last_read_id?: number;
11
15
  }
@@ -38,10 +42,14 @@ export interface ChatConversation {
38
42
  type: 'single' | 'group';
39
43
  avatar?: string | null;
40
44
  message: ChatMessage | null;
41
- members: ChatUser[];
45
+ members?: ChatUser[];
42
46
  new: Record<number, number>;
47
+ owner_id?: number;
43
48
  updated_at: string;
44
49
  create_at: string;
50
+ is_muted?: boolean;
51
+ is_pined?: boolean;
52
+ member?: number;
45
53
  [key: string]: unknown;
46
54
  }
47
55
  export interface ChatEvent {
@@ -51,7 +59,8 @@ export interface ChatEvent {
51
59
  chats_member: 'chats.member';
52
60
  chats_action: 'chats.action';
53
61
  chats_message: 'chats.message';
54
- projects_member: 'projects.member';
62
+ members_connect: 'members.connect';
63
+ members_disconnect: 'members.disconnect';
55
64
  new_message: 'new_message';
56
65
  }
57
66
  export interface ChatFile {
@@ -66,6 +75,15 @@ export interface ChatConfig {
66
75
  maxRetries?: number;
67
76
  [key: string]: unknown;
68
77
  }
78
+ export interface ChatSetting {
79
+ allow_delete_chat: boolean;
80
+ allow_delete_message: boolean;
81
+ allow_revoke_message: boolean;
82
+ delete_duration: number;
83
+ delete_duration_unit: 'minutes' | 'hours' | 'days';
84
+ revoke_duration: number;
85
+ revoke_duration_unit: 'minutes' | 'hours' | 'days';
86
+ }
69
87
  export type MessageAction = 'like' | 'love' | 'revoke' | 'remove';
70
88
  export interface PaginationInfo {
71
89
  count: number;
@@ -106,12 +124,23 @@ export interface ChatEventPayloads {
106
124
  chat_id: number;
107
125
  message_id: number;
108
126
  };
109
- 'projects.member': unknown;
127
+ 'members.connect': {
128
+ member: ChatUser;
129
+ socketId: string;
130
+ timestamp: number;
131
+ };
132
+ 'members.disconnect': {
133
+ socketId: string;
134
+ };
110
135
  new_message: {
111
136
  new: number;
112
137
  };
113
138
  }
114
139
  export interface ChatInstance {
140
+ /**
141
+ * Thuộc tính setting trả về cấu hình hiện tại của SDK, bao gồm các quyền hạn và giới hạn như allow_delete_chat, delete_duration...
142
+ */
143
+ setting: ChatSetting;
115
144
  /**
116
145
  * Thiết lập cấu hình tùy chỉnh cho SDK.
117
146
  * @param config (Object): Các tùy chọn cấu hình như debugMode, maxRetries...
@@ -200,7 +229,7 @@ export interface ChatInstance {
200
229
  * @param avatar URL ảnh đại diện mới (String, tùy chọn)
201
230
  * @returns Promise trả về object nhóm đã được cập nhật
202
231
  */
203
- updateGroup(chatId: number, name: string, avatar?: string): Promise<ChatResponse<ChatConversation>>;
232
+ updateGroup(chatId: number, name: string, avatar?: string | File): Promise<ChatResponse<ChatConversation>>;
204
233
  /**
205
234
  * Xóa một cuộc trò chuyện (chat 1-1 hoặc nhóm).
206
235
  * @param chatId ID cuộc trò chuyện (Number, bắt buộc)
@@ -7,25 +7,49 @@ export interface AuthInfo {
7
7
  email: string;
8
8
  }
9
9
  /** Các loại định dạng tập tin được phép đính kèm từ thiết bị */
10
- export type AttachmentType = 'image' | 'video' | 'audio' | 'file';
10
+ export type AttachmentType = 'image' | 'video' | 'audio' | 'file' | 'multiple';
11
+ /** Các tùy chọn ngôn ngữ hiển thị trên giao diện */
11
12
  export type LanguageOption = 'english' | 'vietnamese';
12
- /** * Danh sách các tính năng được kích hoạt trên Widget.
13
- * - 'group-chat': Bật chế độ chat nhóm.
14
- * - 'voice': Bật tính năng ghi âm trực tiếp và gửi đi dưới dạng file tin nhắn thoại (audio file).
15
- * - 'attachment:[type]': Bật tính năng chọn và tải lên loại file tương ứng từ thiết bị.
16
- * - 'attachment:multiple': Cho phép chọn và tải lên nhiều file cùng lúc.
17
- * - 'change-color': Cho phép người dùng thay đổi màu sắc chủ đạo của widget.
18
- * - 'language:[option]': Cho phép người dùng chọn ngôn ngữ cho widget. Nếu có nhiều hơn một tùy chọn ngôn ngữ được kích hoạt, widget sẽ hiển thị giao diện cho phép người dùng chuyển đổi giữa các ngôn ngữ đó.
13
+ /**
14
+ * Các phương thức truyền thông ghi hình.
15
+ * - 'voice': Ghi âm và gửi tin nhắn thoại.
19
16
  */
20
- export type WidgetFeature = 'group-chat' | 'voice' | `attachment:${AttachmentType}` | 'attachment:multiple' | 'change-color' | `language:${LanguageOption}`;
17
+ export type CommunicationFeature = 'voice';
18
+ /**
19
+ * Chế độ vận hành của cửa sổ chat.
20
+ * - 'single': Chat 1-1.
21
+ * - 'group': Chế độ chat nhóm nhiều người tham gia.
22
+ */
23
+ export type WidgetChatMode = 'single' | 'group';
24
+ /**
25
+ * Các tùy chọn can thiệp và mở rộng giao diện Widget.
26
+ * - 'change-color': Người dùng cuối có thể tự chọn màu chủ đạo (Primary Color).
27
+ * - 'change-theme': Người dùng cuối có thể chuyển đổi giữa các chủ đề (ví dụ: Sáng/Tối).
28
+ */
29
+ export type WidgetCustomizationOptions = 'change-color' | 'change-theme';
30
+ export interface WidgetFeature {
31
+ /** Danh sách các loại tập tin cho phép tải lên. Nếu có 'multiple', cho phép chọn nhiều file. */
32
+ attachments?: AttachmentType[];
33
+ /**
34
+ * Danh sách ngôn ngữ hỗ trợ. Nếu có từ 2 ngôn ngữ trở lên, widget sẽ hiển thị menu chuyển đổi.
35
+ * Nếu không truyền, mặc định là ['english']
36
+ */
37
+ languages?: LanguageOption[];
38
+ /** Các tính năng tương tác trực tiếp bằng âm thanh và hình ảnh. */
39
+ communication?: CommunicationFeature[];
40
+ /**
41
+ * Xác định các hình thức hội thoại mà widget hỗ trợ.
42
+ * Nếu không truyền, mặc định là ['single']
43
+ */
44
+ chatModes?: WidgetChatMode[];
45
+ /** Các quyền tùy biến giao diện cho phép người dùng thực hiện. */
46
+ customizations?: WidgetCustomizationOptions[];
47
+ }
21
48
  export interface ChatWidgetProps {
22
49
  chatKey: string;
23
50
  title?: string;
51
+ logoUrl?: string;
24
52
  primaryColor?: string;
25
53
  auth: AuthInfo;
26
- /**
27
- * Mảng chứa các tính năng muốn kích hoạt.
28
- * @example features: ['group-chat', 'voice', 'attachment:image']
29
- */
30
- features?: WidgetFeature[];
54
+ features?: WidgetFeature;
31
55
  }
@@ -1,7 +1,14 @@
1
- import { ChatConversation, WidgetFeature } from '../types';
1
+ import { AttachmentType, ChatConversation, CommunicationFeature, LanguageOption, WidgetChatMode, WidgetCustomizationOptions, WidgetFeature } from '../types';
2
2
  export declare const getChatName: (chat?: ChatConversation | null, currentUserId?: number, fallback?: string) => string;
3
- interface FeatureAnalysis {
4
- featureSet: Set<WidgetFeature>;
3
+ export interface FeatureSet {
4
+ attachments: Set<AttachmentType>;
5
+ languages: Set<LanguageOption>;
6
+ communication: Set<CommunicationFeature>;
7
+ chatModes: Set<WidgetChatMode>;
8
+ customizations: Set<WidgetCustomizationOptions>;
9
+ }
10
+ export interface FeatureAnalysis {
11
+ featureSet: FeatureSet;
5
12
  hasVoice: boolean;
6
13
  hasAttachment: boolean;
7
14
  hasMultipleAttachments: boolean;
@@ -9,7 +16,7 @@ interface FeatureAnalysis {
9
16
  hasChangeColor: boolean;
10
17
  hasMultipleLanguages: boolean;
11
18
  }
12
- export declare const analyzeFeatures: (features: WidgetFeature[]) => FeatureAnalysis;
13
- export declare const getAcceptFilter: (featureSet: Set<WidgetFeature>) => string;
14
- export declare const createFileTypeChecker: (featureSet: Set<WidgetFeature>) => (file: File) => boolean;
15
- export {};
19
+ export declare const analyzeFeatures: (features: WidgetFeature) => FeatureAnalysis;
20
+ export declare const getAcceptFilter: (featureSet: FeatureSet) => string;
21
+ export declare const createFileTypeChecker: (featureSet: FeatureSet) => (file: File) => boolean;
22
+ export declare const isConnected: (socketAt: string | undefined) => boolean;
@@ -0,0 +1 @@
1
+ export declare const formatDateLabel: (dateStr: string | Date) => string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@satek-team-intern/chatbot-widget",
3
- "version": "0.8.10",
3
+ "version": "0.10.0",
4
4
  "description": "A widget chatbot can be integrated into any website, providing a seamless and interactive user experience. It is designed to be easily embedded and customizable, allowing businesses to engage with their customers effectively.",
5
5
  "author": "Satek Team Intern",
6
6
  "license": "MIT",