@satek-team-intern/chatbot-widget 0.10.6 → 0.10.8
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/README.md +57 -61
- package/dist/chatbot-widget.es.js +3816 -2907
- package/dist/chatbot-widget.umd.js +20 -18
- package/dist/locales/en.json.d.ts +161 -35
- package/dist/locales/vi.json.d.ts +161 -35
- package/dist/src/assets/Icons.d.ts +3 -0
- package/dist/src/assets/createIcon.d.ts +3 -2
- package/dist/src/assets/index.d.ts +1 -0
- package/dist/src/components/modals/AddGroup.d.ts +1 -0
- package/dist/src/components/modals/AddMember.d.ts +1 -0
- package/dist/src/components/modals/UpdateGroup.d.ts +1 -0
- package/dist/src/components/modals/index.d.ts +0 -1
- package/dist/src/components/sidebar/AppSideBar.d.ts +3 -4
- package/dist/src/components/sidebar/ChatInfoPanel.d.ts +1 -0
- package/dist/src/components/view/ImageFileItem.d.ts +10 -0
- package/dist/src/components/view/MessageFiles.d.ts +14 -1
- package/dist/src/components/view/ThemeSetting.d.ts +3 -0
- package/dist/src/components/view/index.d.ts +2 -0
- package/dist/src/constants/common.d.ts +12 -0
- package/dist/src/constants/file.d.ts +1 -0
- package/dist/src/hooks/useSetting.d.ts +5 -2
- package/dist/src/hooks/useTranslation.d.ts +2 -1
- package/dist/src/services/language.service.d.ts +1 -1
- package/dist/src/store/selectors/setting.d.ts +3 -3
- package/dist/src/store/slices/chatSlice.d.ts +4 -1
- package/dist/src/store/slices/settingSlice.d.ts +5 -1
- package/dist/src/types/chat.type.d.ts +3 -5
- package/dist/src/types/types.d.ts +11 -1
- package/dist/src/utils/chat.utils.d.ts +15 -2
- package/dist/src/utils/file.utils.d.ts +8 -4
- package/dist/src/utils/format.utils.d.ts +6 -1
- package/package.json +2 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare const useTranslation: () => {
|
|
2
|
-
t: (path:
|
|
2
|
+
t: (path: import('../../services').NestedKeys<import('../../services').TranslationSchema>, params?: Record<string, string>) => string;
|
|
3
|
+
currentLanguage: import('../types').LanguageOption;
|
|
3
4
|
toggleChangeLanguage: () => void;
|
|
4
5
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { en } from '../../locales';
|
|
2
2
|
import { LanguageOption } from '../../types';
|
|
3
3
|
export type TranslationSchema = typeof en;
|
|
4
|
-
type NestedKeys<T> = T extends object ? {
|
|
4
|
+
export type NestedKeys<T> = T extends object ? {
|
|
5
5
|
[K in keyof T]: `${Exclude<K, symbol>}${'' | `.${NestedKeys<T[K]>}`}`;
|
|
6
6
|
}[keyof T] : '';
|
|
7
7
|
declare class TranslationManager {
|
|
@@ -16,14 +16,14 @@ export declare const selectWidgetFeatures: ((state: {
|
|
|
16
16
|
resultsCount: () => number;
|
|
17
17
|
resetResultsCount: () => void;
|
|
18
18
|
} & {
|
|
19
|
-
resultFunc: (resultFuncArgs_0: WidgetFeature) => WidgetSettings;
|
|
20
|
-
memoizedResultFunc: ((resultFuncArgs_0: WidgetFeature) => WidgetSettings) & {
|
|
19
|
+
resultFunc: (resultFuncArgs_0: WidgetFeature, resultFuncArgs_1: boolean) => WidgetSettings;
|
|
20
|
+
memoizedResultFunc: ((resultFuncArgs_0: WidgetFeature, resultFuncArgs_1: boolean) => WidgetSettings) & {
|
|
21
21
|
clearCache: () => void;
|
|
22
22
|
resultsCount: () => number;
|
|
23
23
|
resetResultsCount: () => void;
|
|
24
24
|
};
|
|
25
25
|
lastResult: () => WidgetSettings;
|
|
26
|
-
dependencies: [(state: RootState) => WidgetFeature];
|
|
26
|
+
dependencies: [(state: RootState) => WidgetFeature, (state: RootState) => boolean];
|
|
27
27
|
recomputations: () => number;
|
|
28
28
|
resetRecomputations: () => void;
|
|
29
29
|
dependencyRecomputations: () => number;
|
|
@@ -10,6 +10,9 @@ export interface ChatState {
|
|
|
10
10
|
totalMessagesUnread: number;
|
|
11
11
|
messagesPagination: PaginationInfo | null;
|
|
12
12
|
replyingMessage: ChatMessage | null;
|
|
13
|
+
memberSocketMap: Record<number, string[]>;
|
|
14
|
+
disconnectedSockets: Record<string, boolean>;
|
|
15
|
+
isChatLoading: boolean;
|
|
13
16
|
}
|
|
14
17
|
export declare const clearAll: import('@reduxjs/toolkit').ActionCreatorWithoutPayload<"widget-chatslice/clearAll">, 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
18
|
chatId: number;
|
|
@@ -18,5 +21,5 @@ export declare const clearAll: import('@reduxjs/toolkit').ActionCreatorWithoutPa
|
|
|
18
21
|
}, "widget-chatslice/updateMemberReadStatus">, toggleChatSetting: import('@reduxjs/toolkit').ActionCreatorWithPayload<{
|
|
19
22
|
chatId: number;
|
|
20
23
|
setting: "is_muted" | "is_pined";
|
|
21
|
-
}, "widget-chatslice/toggleChatSetting">;
|
|
24
|
+
}, "widget-chatslice/toggleChatSetting">, renewMemberActivity: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/renewMemberActivity">, memberJoinChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/memberJoinChat">, memberLeaveChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/memberLeaveChat">, setIsChatLoading: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setIsChatLoading">;
|
|
22
25
|
export declare const chatReducer: import('redux').Reducer<ChatState>;
|
|
@@ -4,6 +4,10 @@ export interface SettingState {
|
|
|
4
4
|
primaryColor: string;
|
|
5
5
|
features: WidgetFeature;
|
|
6
6
|
currentLanguage: LanguageOption;
|
|
7
|
+
hasMultipleLanguages: boolean;
|
|
7
8
|
}
|
|
8
|
-
export declare const setConfig: import('@reduxjs/toolkit').ActionCreatorWithPayload<
|
|
9
|
+
export declare const setConfig: import('@reduxjs/toolkit').ActionCreatorWithPayload<{
|
|
10
|
+
features?: WidgetFeature;
|
|
11
|
+
language?: LanguageOption;
|
|
12
|
+
}, "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
13
|
export declare const settingReducer: import('redux').Reducer<SettingState>;
|
|
@@ -5,12 +5,9 @@ export interface ChatUser {
|
|
|
5
5
|
name: string;
|
|
6
6
|
avatar?: string;
|
|
7
7
|
phone?: string;
|
|
8
|
-
email
|
|
8
|
+
email: string;
|
|
9
9
|
socket_at?: string;
|
|
10
10
|
socket_id?: string;
|
|
11
|
-
socket_ids?: string[];
|
|
12
|
-
last_active?: number;
|
|
13
|
-
status?: string;
|
|
14
11
|
last_read_id?: number;
|
|
15
12
|
}
|
|
16
13
|
export interface ChatResponse<T = unknown> {
|
|
@@ -104,6 +101,7 @@ export interface ChatEventPayloads {
|
|
|
104
101
|
};
|
|
105
102
|
'chats.member': {
|
|
106
103
|
type: 'join' | 'leave';
|
|
104
|
+
chat?: ChatConversation;
|
|
107
105
|
chat_id?: number;
|
|
108
106
|
member?: ChatUser;
|
|
109
107
|
member_id?: number;
|
|
@@ -120,7 +118,7 @@ export interface ChatEventPayloads {
|
|
|
120
118
|
'chats.message': {
|
|
121
119
|
chat: ChatConversation;
|
|
122
120
|
message: ChatMessage;
|
|
123
|
-
type: 'add' | 'remove';
|
|
121
|
+
type: 'add' | 'remove' | 'revoke' | 'like' | 'love';
|
|
124
122
|
chat_id: number;
|
|
125
123
|
message_id: number;
|
|
126
124
|
};
|
|
@@ -6,6 +6,14 @@ export interface AuthInfo {
|
|
|
6
6
|
phone?: string;
|
|
7
7
|
email: string;
|
|
8
8
|
}
|
|
9
|
+
/** Vị trí tính theo tọa độ
|
|
10
|
+
* - x: Khoảng cách từ mép phải của cửa sổ trình duyệt đến điểm đặt widget.
|
|
11
|
+
* - y: Khoảng cách từ mép dưới của cửa sổ trình duyệt đến điểm đặt widget.
|
|
12
|
+
*/
|
|
13
|
+
export interface PositionType {
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
}
|
|
9
17
|
/** Các loại định dạng tập tin được phép đính kèm từ thiết bị */
|
|
10
18
|
export type AttachmentType = 'image' | 'video' | 'audio' | 'file' | 'multiple';
|
|
11
19
|
/** Các tùy chọn ngôn ngữ hiển thị trên giao diện */
|
|
@@ -26,7 +34,7 @@ export type WidgetChatMode = 'single' | 'group';
|
|
|
26
34
|
* - 'change-color': Người dùng cuối có thể tự chọn màu chủ đạo (Primary Color).
|
|
27
35
|
* - '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
36
|
*/
|
|
29
|
-
export type WidgetCustomizationOptions = 'change-color' | 'change-theme'
|
|
37
|
+
export type WidgetCustomizationOptions = 'change-color' | 'change-theme';
|
|
30
38
|
export interface WidgetFeature {
|
|
31
39
|
/** 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
40
|
attachments?: AttachmentType[];
|
|
@@ -48,4 +56,6 @@ export interface ChatWidgetProps {
|
|
|
48
56
|
auth: AuthInfo;
|
|
49
57
|
chatKey: string;
|
|
50
58
|
features?: WidgetFeature;
|
|
59
|
+
language?: LanguageOption;
|
|
60
|
+
initPosition?: PositionType;
|
|
51
61
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AttachmentType, ChatConversation, CommunicationFeature, WidgetChatMode, WidgetCustomizationOptions, WidgetFeature } from '../../types';
|
|
1
|
+
import { AttachmentType, ChatConversation, ChatUser, CommunicationFeature, WidgetChatMode, WidgetCustomizationOptions, WidgetFeature } from '../../types';
|
|
2
2
|
export declare const getChatName: (chat?: ChatConversation | null, currentUserId?: number, fallback?: string) => string;
|
|
3
3
|
export interface FeatureSet {
|
|
4
4
|
attachments: Set<AttachmentType>;
|
|
@@ -16,7 +16,20 @@ export interface FeatureAnalysis {
|
|
|
16
16
|
hasChangeColor: boolean;
|
|
17
17
|
hasMultipleLanguages: boolean;
|
|
18
18
|
}
|
|
19
|
-
export declare const analyzeFeatures: (features: WidgetFeature) => FeatureAnalysis;
|
|
19
|
+
export declare const analyzeFeatures: (features: WidgetFeature, hasMultipleLanguages?: boolean) => FeatureAnalysis;
|
|
20
20
|
export declare const getAcceptFilter: (featureSet: FeatureSet) => string;
|
|
21
21
|
export declare const createFileTypeChecker: (featureSet: FeatureSet) => (file: File) => boolean;
|
|
22
22
|
export declare const isConnected: (socketAt: string | undefined) => boolean;
|
|
23
|
+
export declare const addSocketToMap: (memberSocketMap: Record<string, string[]>, memberId: string | number, // Chấp nhận cả string và number cho key
|
|
24
|
+
socketId: string | undefined) => void;
|
|
25
|
+
export declare const transformMember: (member: ChatUser, memberSocketMap: Record<string, string[]>, disconnectedSockets: Record<string, boolean>) => {
|
|
26
|
+
socket_id: string | undefined;
|
|
27
|
+
socket_at: string | undefined;
|
|
28
|
+
id: number;
|
|
29
|
+
code: string;
|
|
30
|
+
name: string;
|
|
31
|
+
avatar?: string;
|
|
32
|
+
phone?: string;
|
|
33
|
+
email: string;
|
|
34
|
+
last_read_id?: number;
|
|
35
|
+
};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { CSSProperties, JSX } from 'react';
|
|
1
2
|
/**
|
|
2
3
|
* Lấy icon dựa trên tên file hoặc extension
|
|
3
4
|
* @param fileNameOrExt Có thể là "image.png" hoặc chỉ "png"
|
|
4
5
|
*/
|
|
5
|
-
export declare const getFileIcon: (fileNameOrExt: string) =>
|
|
6
|
+
export declare const getFileIcon: (fileNameOrExt: string) => JSX.Element;
|
|
6
7
|
export declare const getFileKey: (file: File) => string | undefined;
|
|
7
8
|
export declare const formatFileSize: (bytes: number) => string;
|
|
8
9
|
export declare const getFileType: (fileName: string) => "image" | "video" | "audio" | "pdf" | "other";
|
|
@@ -10,7 +11,10 @@ export declare const getImagePreview: (file: File) => string;
|
|
|
10
11
|
export declare const isImageFile: (file: File) => boolean;
|
|
11
12
|
export declare const sortFilesByType: (files: File[]) => File[];
|
|
12
13
|
export declare const sanitizeImage: (file: File) => Promise<File>;
|
|
13
|
-
export declare const getFilesValidationError: (files: File[], hasMultipleAttachments: boolean, isFileTypeAllowed: (file: File) => boolean) => {
|
|
14
|
+
export declare const getFilesValidationError: (files: File[], hasMultipleAttachments: boolean, isFileTypeAllowed: (file: File) => boolean) => Promise<{
|
|
14
15
|
message: string;
|
|
15
|
-
type:
|
|
16
|
-
} | null
|
|
16
|
+
type: "warning" | "error";
|
|
17
|
+
} | null>;
|
|
18
|
+
export declare const validateFileContent: (file: File) => Promise<boolean>;
|
|
19
|
+
export declare const validateFileUrlContent: (url: string, type: string) => Promise<boolean>;
|
|
20
|
+
export declare function getImageRatioStyleFromLink(imgUrl: string): Promise<CSSProperties>;
|
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { LanguageOption } from '../../types';
|
|
2
|
+
export declare const formatDateLabel: (dateStr: string | Date, currentLanguage: LanguageOption) => string;
|
|
2
3
|
export declare const formatDuration: (ms: number) => string;
|
|
4
|
+
export declare const removeVietnameseTones: (str: string) => string;
|
|
5
|
+
export declare const formatToDateTimeString: (dateInput: string | number | Date) => string;
|
|
6
|
+
export declare const getCleanTitle: (url: string) => string | null;
|
|
7
|
+
export declare const formatMessageTime: (dateInput: Date, language: LanguageOption) => string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@satek-team-intern/chatbot-widget",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.8",
|
|
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",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@reduxjs/toolkit": "^2.11.2",
|
|
44
44
|
"react-redux": "^9.2.0",
|
|
45
|
+
"tldts": "^7.0.30",
|
|
45
46
|
"wasm-media-encoders": "^0.7.0"
|
|
46
47
|
},
|
|
47
48
|
"peerDependencies": {
|