@droppii-org/chat-sdk 0.0.70 → 0.1.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.
- package/dist/assets/sdk/sql-wasm.wasm +0 -0
- package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
- package/dist/components/message/footer/ActionBar.js +18 -22
- package/dist/components/message/footer/PasteAndDropPlugin.d.ts +6 -0
- package/dist/components/message/footer/PasteAndDropPlugin.d.ts.map +1 -0
- package/dist/components/message/footer/PasteAndDropPlugin.js +115 -0
- package/dist/components/message/footer/index.d.ts.map +1 -1
- package/dist/components/message/footer/index.js +2 -1
- package/dist/components/thread/SessionSection.d.ts.map +1 -1
- package/dist/components/thread/SessionSection.js +52 -18
- package/dist/constants/sdk.d.ts.map +1 -1
- package/dist/constants/sdk.js +1 -2
- package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -1
- package/dist/hooks/global/useGlobalEvent.js +16 -6
- package/dist/services/api.js +49 -0
- package/dist/store/auth.d.ts.map +1 -1
- package/dist/store/auth.js +5 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/chat.d.ts +12 -1
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/utils/fileValidation.d.ts +26 -0
- package/dist/utils/fileValidation.d.ts.map +1 -0
- package/dist/utils/fileValidation.js +84 -0
- package/package.json +10 -11
package/dist/types/chat.d.ts
CHANGED
|
@@ -54,7 +54,7 @@ export interface MessageFooterContextType {
|
|
|
54
54
|
type: "text" | "file";
|
|
55
55
|
}) => void;
|
|
56
56
|
listUploadFiles: UploadFile[];
|
|
57
|
-
setListUploadFiles: (files: UploadFile[]) => void;
|
|
57
|
+
setListUploadFiles: (files: UploadFile[] | ((prev: UploadFile[]) => UploadFile[])) => void;
|
|
58
58
|
}
|
|
59
59
|
export interface ImageMsgParamsByFile extends ImageMsgParamsByURL {
|
|
60
60
|
file: File;
|
|
@@ -92,6 +92,17 @@ export interface DChatInitAndLoginConfig {
|
|
|
92
92
|
userID: string;
|
|
93
93
|
applicationType: DChatApplicationType;
|
|
94
94
|
isCrm?: boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Callback to refresh access token when 401 detected.
|
|
97
|
+
* Consumer app should call refresh token API and return new accessToken.
|
|
98
|
+
* If not provided, 401s will trigger authFailed event.
|
|
99
|
+
*/
|
|
100
|
+
onTokenRefresh?: () => Promise<string>;
|
|
101
|
+
/**
|
|
102
|
+
* Callback when authentication fails (e.g., refresh token expired).
|
|
103
|
+
* Consumer should handle logout and redirect.
|
|
104
|
+
*/
|
|
105
|
+
onAuthError?: (error: Error) => void;
|
|
95
106
|
}
|
|
96
107
|
export declare enum SessionStatus {
|
|
97
108
|
UNASSIGNED = "UNASSIGNED",
|
package/dist/types/chat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/types/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAElC,oBAAY,oBAAoB;IAC9B,KAAK,UAAU;CAChB;AAED,oBAAY,aAAa;IACvB,YAAY,IAAI;IAChB,SAAS,IAAI;IACb,UAAU,IAAI;CACf;AAED,oBAAY,UAAU;IACpB,OAAO,IAAI;IACX,OAAO,IAAI;IACX,MAAM,IAAI;CACX;AAED,oBAAY,UAAU;IACpB,aAAa,MAAM;IACnB,aAAa,MAAM;IACnB,aAAa,MAAM;IACnB,aAAa,MAAM;IACnB,aAAa,MAAM;CACpB;AAED,oBAAY,iBAAiB;IAC3B,GAAG,MAAM;CACV;AAED,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,WAAW,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,mBAAmB,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IACrD,gBAAgB,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,cAAc,CAAC;QACrB,IAAI,EAAE;YACJ,IAAI,EAAE,WAAW,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,oBAAoB,CAAC;CACvC;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,CAAC,EACd,SAAS,EACT,QAAQ,EACR,IAAI,GACL,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;KACvB,KAAK,IAAI,CAAC;IACX,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B,kBAAkB,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/types/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAElC,oBAAY,oBAAoB;IAC9B,KAAK,UAAU;CAChB;AAED,oBAAY,aAAa;IACvB,YAAY,IAAI;IAChB,SAAS,IAAI;IACb,UAAU,IAAI;CACf;AAED,oBAAY,UAAU;IACpB,OAAO,IAAI;IACX,OAAO,IAAI;IACX,MAAM,IAAI;CACX;AAED,oBAAY,UAAU;IACpB,aAAa,MAAM;IACnB,aAAa,MAAM;IACnB,aAAa,MAAM;IACnB,aAAa,MAAM;IACnB,aAAa,MAAM;CACpB;AAED,oBAAY,iBAAiB;IAC3B,GAAG,MAAM;CACV;AAED,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,WAAW,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,mBAAmB,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IACrD,gBAAgB,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,cAAc,CAAC;QACrB,IAAI,EAAE;YACJ,IAAI,EAAE,WAAW,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,oBAAoB,CAAC;CACvC;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,CAAC,EACd,SAAS,EACT,QAAQ,EACR,IAAI,GACL,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;KACvB,KAAK,IAAI,CAAC;IACX,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B,kBAAkB,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,CAAC,KAAK,IAAI,CAAC;CAC5F;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,sBAAsB;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,cAAc,CAAC;QACrB,IAAI,EAAE;YACJ,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,WAAW,CAAC;QAClB,IAAI,EAAE;YACJ,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,QAAQ,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,oBAAoB,CAAC;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACtC;AAED,oBAAY,aAAa;IACvB,UAAU,eAAe;IACzB,eAAe,oBAAoB;IACnC,UAAU,eAAe;IACzB,SAAS,cAAc;CACxB;AAED,oBAAY,UAAU;IACpB,IAAI,SAAS;IACb,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;IACjC,kBAAkB,uBAAuB;CAC1C;AAED,oBAAY,wBAAwB;IAClC,qBAAqB,0BAA0B;IAC/C,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;CACpC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { UploadFile } from "antd";
|
|
2
|
+
import { TFunction } from "i18next";
|
|
3
|
+
export declare const ACCEPTED_IMAGE_TYPES: string[];
|
|
4
|
+
export declare const MAX_IMAGE_SIZE_MB = 5;
|
|
5
|
+
export declare const MAX_VIDEO_SIZE_MB = 200;
|
|
6
|
+
export interface FileValidationOptions {
|
|
7
|
+
t: TFunction;
|
|
8
|
+
currentUploadedFiles?: UploadFile[];
|
|
9
|
+
}
|
|
10
|
+
export interface FileValidationResult {
|
|
11
|
+
isValid: boolean;
|
|
12
|
+
error?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Validates a single file for type and size
|
|
16
|
+
*/
|
|
17
|
+
export declare const validateFile: (file: File, t: TFunction) => FileValidationResult;
|
|
18
|
+
/**
|
|
19
|
+
* Validates video count limit (max 1 video)
|
|
20
|
+
*/
|
|
21
|
+
export declare const validateVideoLimit: (newFiles: File[], currentUploadedFiles: UploadFile[], t: TFunction) => FileValidationResult;
|
|
22
|
+
/**
|
|
23
|
+
* Process and validate multiple files, converting to UploadFile format
|
|
24
|
+
*/
|
|
25
|
+
export declare const processAndValidateFiles: (files: File[], options: FileValidationOptions) => UploadFile[];
|
|
26
|
+
//# sourceMappingURL=fileValidation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileValidation.d.ts","sourceRoot":"","sources":["../../src/utils/fileValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,UAAU,EAAE,MAAM,MAAM,CAAC;AAE1D,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,eAAO,MAAM,oBAAoB,UAA2C,CAAC;AAC7E,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,MAAM,WAAW,qBAAqB;IACpC,CAAC,EAAE,SAAS,CAAC;IACb,oBAAoB,CAAC,EAAE,UAAU,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,IAAI,EACV,GAAG,SAAS,KACX,oBAyBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAC7B,UAAU,IAAI,EAAE,EAChB,sBAAsB,UAAU,EAAE,EAClC,GAAG,SAAS,KACX,oBAcF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAClC,OAAO,IAAI,EAAE,EACb,SAAS,qBAAqB,KAC7B,UAAU,EAyCZ,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { message as antdMessage } from "antd";
|
|
2
|
+
export const ACCEPTED_IMAGE_TYPES = ["image/jpeg", "image/png", "image/jpg"];
|
|
3
|
+
export const MAX_IMAGE_SIZE_MB = 5;
|
|
4
|
+
export const MAX_VIDEO_SIZE_MB = 200;
|
|
5
|
+
/**
|
|
6
|
+
* Validates a single file for type and size
|
|
7
|
+
*/
|
|
8
|
+
export const validateFile = (file, t) => {
|
|
9
|
+
const isImage = ACCEPTED_IMAGE_TYPES.includes(file.type);
|
|
10
|
+
const isVideo = file.type.startsWith("video/");
|
|
11
|
+
if (!isImage && !isVideo) {
|
|
12
|
+
const error = t("invalid_file_format", {
|
|
13
|
+
defaultValue: `${file.name} không đúng định dạng JPG, JPEG, PNG hoặc VIDEO`,
|
|
14
|
+
fileName: file.name,
|
|
15
|
+
});
|
|
16
|
+
return { isValid: false, error };
|
|
17
|
+
}
|
|
18
|
+
const maxSize = isVideo ? MAX_VIDEO_SIZE_MB : MAX_IMAGE_SIZE_MB;
|
|
19
|
+
const fileSizeMB = file.size / 1024 / 1024;
|
|
20
|
+
if (fileSizeMB > maxSize) {
|
|
21
|
+
const error = t("file_size_exceeded", {
|
|
22
|
+
defaultValue: `${file.name} có kích thước tập tin vượt quá ${maxSize}MB`,
|
|
23
|
+
fileName: file.name,
|
|
24
|
+
maxSize,
|
|
25
|
+
});
|
|
26
|
+
return { isValid: false, error };
|
|
27
|
+
}
|
|
28
|
+
return { isValid: true };
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Validates video count limit (max 1 video)
|
|
32
|
+
*/
|
|
33
|
+
export const validateVideoLimit = (newFiles, currentUploadedFiles, t) => {
|
|
34
|
+
const newVideos = newFiles.filter((f) => f.type.startsWith("video/"));
|
|
35
|
+
const currentVideos = currentUploadedFiles.filter((f) => { var _a; return (_a = f.type) === null || _a === void 0 ? void 0 : _a.startsWith("video/"); });
|
|
36
|
+
if (newVideos.length > 1 || currentVideos.length + newVideos.length > 1) {
|
|
37
|
+
const error = t("video_limit_exceeded", {
|
|
38
|
+
defaultValue: "Chỉ được phép tải lên 1 video duy nhất",
|
|
39
|
+
});
|
|
40
|
+
return { isValid: false, error };
|
|
41
|
+
}
|
|
42
|
+
return { isValid: true };
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Process and validate multiple files, converting to UploadFile format
|
|
46
|
+
*/
|
|
47
|
+
export const processAndValidateFiles = (files, options) => {
|
|
48
|
+
const { t, currentUploadedFiles = [] } = options;
|
|
49
|
+
try {
|
|
50
|
+
const validFiles = [];
|
|
51
|
+
// Check video limit first
|
|
52
|
+
const videoLimitCheck = validateVideoLimit(files, currentUploadedFiles, t);
|
|
53
|
+
if (!videoLimitCheck.isValid) {
|
|
54
|
+
antdMessage.error(videoLimitCheck.error);
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
// Validate each file
|
|
58
|
+
files.forEach((file) => {
|
|
59
|
+
const validation = validateFile(file, t);
|
|
60
|
+
if (validation.isValid) {
|
|
61
|
+
const uploadFile = {
|
|
62
|
+
uid: `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`,
|
|
63
|
+
name: file.name,
|
|
64
|
+
status: "done",
|
|
65
|
+
type: file.type,
|
|
66
|
+
size: file.size,
|
|
67
|
+
originFileObj: file,
|
|
68
|
+
};
|
|
69
|
+
validFiles.push(uploadFile);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
antdMessage.error(validation.error);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
return validFiles;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error("Error processing files:", error);
|
|
79
|
+
antdMessage.error(t("file_processing_error", {
|
|
80
|
+
defaultValue: "Đã xảy ra lỗi khi xử lý tệp",
|
|
81
|
+
}));
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@droppii-org/chat-sdk",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "Droppii React Chat SDK",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -55,15 +55,6 @@
|
|
|
55
55
|
"files": [
|
|
56
56
|
"dist"
|
|
57
57
|
],
|
|
58
|
-
"scripts": {
|
|
59
|
-
"build": "pnpm build:css && tsc -p tsconfig.build.json && pnpm copy-assets",
|
|
60
|
-
"build:css": "tailwindcss -i ./src/styles/global.css -o ./dist/styles/global.css --minify",
|
|
61
|
-
"dev": "tsc --noEmit --watch",
|
|
62
|
-
"lint": "eslint src/",
|
|
63
|
-
"type-check": "tsc --noEmit",
|
|
64
|
-
"prepublishOnly": "pnpm build",
|
|
65
|
-
"copy-assets": "cp -R src/assets dist && cp -R src/locales dist"
|
|
66
|
-
},
|
|
67
58
|
"keywords": [
|
|
68
59
|
"chat",
|
|
69
60
|
"sdk",
|
|
@@ -119,5 +110,13 @@
|
|
|
119
110
|
"@types/react": "^18.2.37",
|
|
120
111
|
"@types/react-dom": "^18.2.15",
|
|
121
112
|
"typescript": "^5.2.2"
|
|
113
|
+
},
|
|
114
|
+
"scripts": {
|
|
115
|
+
"build": "pnpm build:css && tsc -p tsconfig.build.json && pnpm copy-assets",
|
|
116
|
+
"build:css": "tailwindcss -i ./src/styles/global.css -o ./dist/styles/global.css --minify",
|
|
117
|
+
"dev": "tsc --noEmit --watch",
|
|
118
|
+
"lint": "eslint src/",
|
|
119
|
+
"type-check": "tsc --noEmit",
|
|
120
|
+
"copy-assets": "cp -R src/assets dist && cp -R src/locales dist"
|
|
122
121
|
}
|
|
123
|
-
}
|
|
122
|
+
}
|