@tradly/asset 1.0.6 → 1.0.7

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.
@@ -18,20 +18,82 @@ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructur
18
18
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
19
19
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
20
20
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
21
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
22
- var FileUpload = function FileUpload(_ref) {
23
- var loadMedia = _ref.loadMedia,
24
- accept = _ref.accept,
25
- title = _ref.title,
26
- apiService = _ref.apiService,
27
- onUploadStart = _ref.onUploadStart,
28
- onUploadComplete = _ref.onUploadComplete,
29
- onUploadError = _ref.onUploadError,
30
- className = _ref.className,
31
- buttonClassName = _ref.buttonClassName,
32
- iconContainerClassName = _ref.iconContainerClassName,
33
- titleClassName = _ref.titleClassName,
34
- loadingClassName = _ref.loadingClassName;
21
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } // Helper: compress image on the client before upload
22
+ var compressImage = function compressImage(file) {
23
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
24
+ _ref$maxWidth = _ref.maxWidth,
25
+ maxWidth = _ref$maxWidth === void 0 ? 1600 : _ref$maxWidth,
26
+ _ref$maxHeight = _ref.maxHeight,
27
+ maxHeight = _ref$maxHeight === void 0 ? 1600 : _ref$maxHeight,
28
+ _ref$quality = _ref.quality,
29
+ quality = _ref$quality === void 0 ? 0.85 : _ref$quality;
30
+ return new Promise(function (resolve) {
31
+ // Non-image or SVG: skip compression to avoid losing vector quality
32
+ if (!file.type.startsWith("image/") || file.type === "image/svg+xml") {
33
+ resolve(file);
34
+ return;
35
+ }
36
+ var img = new Image();
37
+ img.onload = function () {
38
+ var width = img.width,
39
+ height = img.height;
40
+
41
+ // If the image is already small, keep it as-is
42
+ if (width <= maxWidth && height <= maxHeight) {
43
+ resolve(file);
44
+ return;
45
+ }
46
+ var scale = Math.min(maxWidth / width, maxHeight / height);
47
+ var targetWidth = Math.round(width * scale);
48
+ var targetHeight = Math.round(height * scale);
49
+ var canvas = document.createElement("canvas");
50
+ canvas.width = targetWidth;
51
+ canvas.height = targetHeight;
52
+ var ctx = canvas.getContext("2d");
53
+ if (!ctx) {
54
+ resolve(file);
55
+ return;
56
+ }
57
+ ctx.drawImage(img, 0, 0, targetWidth, targetHeight);
58
+ canvas.toBlob(function (blob) {
59
+ if (!blob) {
60
+ resolve(file);
61
+ return;
62
+ }
63
+ var compressedFile = new File([blob], file.name, {
64
+ type: file.type,
65
+ lastModified: Date.now()
66
+ });
67
+ resolve(compressedFile);
68
+ }, file.type, quality);
69
+ };
70
+ img.onerror = function () {
71
+ resolve(file);
72
+ };
73
+ var reader = new FileReader();
74
+ reader.onload = function (event) {
75
+ var _event$target;
76
+ img.src = (_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.result;
77
+ };
78
+ reader.onerror = function () {
79
+ return resolve(file);
80
+ };
81
+ reader.readAsDataURL(file);
82
+ });
83
+ };
84
+ var FileUpload = function FileUpload(_ref2) {
85
+ var loadMedia = _ref2.loadMedia,
86
+ accept = _ref2.accept,
87
+ title = _ref2.title,
88
+ apiService = _ref2.apiService,
89
+ onUploadStart = _ref2.onUploadStart,
90
+ onUploadComplete = _ref2.onUploadComplete,
91
+ onUploadError = _ref2.onUploadError,
92
+ className = _ref2.className,
93
+ buttonClassName = _ref2.buttonClassName,
94
+ iconContainerClassName = _ref2.iconContainerClassName,
95
+ titleClassName = _ref2.titleClassName,
96
+ loadingClassName = _ref2.loadingClassName;
35
97
  var _useState = (0, _react.useState)([]),
36
98
  _useState2 = _slicedToArray(_useState, 2),
37
99
  files = _useState2[0],
@@ -47,8 +109,8 @@ var FileUpload = function FileUpload(_ref) {
47
109
 
48
110
  // Upload files
49
111
  var uploadFiles = /*#__PURE__*/function () {
50
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(fileList) {
51
- var uploadedUrls, _t;
112
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(fileList) {
113
+ var filesToUpload, uploadedUrls, _t;
52
114
  return _regenerator().w(function (_context) {
53
115
  while (1) switch (_context.p = _context.n) {
54
116
  case 0:
@@ -58,9 +120,25 @@ var FileUpload = function FileUpload(_ref) {
58
120
  setISLoading(true);
59
121
  setLength(fileList.length);
60
122
  _context.p = 1;
123
+ filesToUpload = fileList; // For image uploads, compress on the client before sending
124
+ if (!(accept && accept.includes("image"))) {
125
+ _context.n = 3;
126
+ break;
127
+ }
61
128
  _context.n = 2;
62
- return apiService.uploadMedia(fileList, apiService.authKey);
129
+ return Promise.all(fileList.map(function (file) {
130
+ return compressImage(file, {
131
+ maxWidth: 1600,
132
+ maxHeight: 1600,
133
+ quality: 0.85
134
+ });
135
+ }));
63
136
  case 2:
137
+ filesToUpload = _context.v;
138
+ case 3:
139
+ _context.n = 4;
140
+ return apiService.uploadMedia(filesToUpload, apiService.authKey);
141
+ case 4:
64
142
  uploadedUrls = _context.v;
65
143
  if (onUploadComplete) {
66
144
  onUploadComplete(uploadedUrls);
@@ -69,35 +147,35 @@ var FileUpload = function FileUpload(_ref) {
69
147
  if (loadMedia) {
70
148
  loadMedia();
71
149
  }
72
- _context.n = 4;
150
+ _context.n = 6;
73
151
  break;
74
- case 3:
75
- _context.p = 3;
152
+ case 5:
153
+ _context.p = 5;
76
154
  _t = _context.v;
77
- console.error('Upload error:', _t);
155
+ console.error("Upload error:", _t);
78
156
  if (onUploadError) {
79
157
  onUploadError(_t);
80
158
  }
81
- case 4:
82
- _context.p = 4;
159
+ case 6:
160
+ _context.p = 6;
83
161
  setISLoading(false);
84
- return _context.f(4);
85
- case 5:
162
+ return _context.f(6);
163
+ case 7:
86
164
  return _context.a(2);
87
165
  }
88
- }, _callee, null, [[1, 3, 4, 5]]);
166
+ }, _callee, null, [[1, 5, 6, 7]]);
89
167
  }));
90
168
  return function uploadFiles(_x) {
91
- return _ref2.apply(this, arguments);
169
+ return _ref3.apply(this, arguments);
92
170
  };
93
171
  }();
94
172
 
95
173
  // Default classes with customization support
96
- var defaultContainerClass = 'min-w-40 h-40';
97
- var defaultButtonClass = 'w-full h-full flex flex-col justify-center items-center text-sm border border-primary border-dashed rounded-lg hover:bg-gray-50 transition-colors';
98
- var defaultIconContainerClass = 'p-[10px] bg-primary rounded-full';
99
- var defaultTitleClass = 'mt-2';
100
- var defaultLoadingClass = 'flex items-center justify-center h-40 bg-gray-200 rounded-lg shadow-md animate-pulse';
174
+ var defaultContainerClass = "min-w-40 h-40";
175
+ var defaultButtonClass = "w-full h-full flex flex-col justify-center items-center text-sm border border-primary border-dashed rounded-lg hover:bg-gray-50 transition-colors";
176
+ var defaultIconContainerClass = "p-[10px] bg-primary rounded-full";
177
+ var defaultTitleClass = "mt-2";
178
+ var defaultLoadingClass = "flex items-center justify-center h-40 bg-gray-200 rounded-lg shadow-md animate-pulse";
101
179
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
102
180
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
103
181
  className: className || defaultContainerClass,
@@ -109,13 +187,13 @@ var FileUpload = function FileUpload(_ref) {
109
187
  accept: accept,
110
188
  placeholder: "",
111
189
  onChange: (/*#__PURE__*/function () {
112
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(e) {
190
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(e) {
113
191
  var all_files;
114
192
  return _regenerator().w(function (_context2) {
115
193
  while (1) switch (_context2.n) {
116
194
  case 0:
117
195
  e.stopPropagation();
118
- all_files = Array.from(e.target.files);
196
+ all_files = Array.from(e.target.files || []);
119
197
  if (!((all_files === null || all_files === void 0 ? void 0 : all_files.length) > 0)) {
120
198
  _context2.n = 1;
121
199
  break;
@@ -124,14 +202,14 @@ var FileUpload = function FileUpload(_ref) {
124
202
  return uploadFiles(all_files);
125
203
  case 1:
126
204
  // Reset input
127
- e.target.value = '';
205
+ e.target.value = "";
128
206
  case 2:
129
207
  return _context2.a(2);
130
208
  }
131
209
  }, _callee2);
132
210
  }));
133
211
  return function (_x2) {
134
- return _ref3.apply(this, arguments);
212
+ return _ref4.apply(this, arguments);
135
213
  };
136
214
  }()),
137
215
  multiple: true
@@ -8,22 +8,86 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
8
8
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
9
9
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
10
10
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
11
- import React, { useState } from 'react';
12
- import { CameraIcon } from './Icons';
11
+ import React, { useState } from "react";
12
+ import { CameraIcon } from "./Icons";
13
+
14
+ // Helper: compress image on the client before upload
13
15
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
14
- var FileUpload = function FileUpload(_ref) {
15
- var loadMedia = _ref.loadMedia,
16
- accept = _ref.accept,
17
- title = _ref.title,
18
- apiService = _ref.apiService,
19
- onUploadStart = _ref.onUploadStart,
20
- onUploadComplete = _ref.onUploadComplete,
21
- onUploadError = _ref.onUploadError,
22
- className = _ref.className,
23
- buttonClassName = _ref.buttonClassName,
24
- iconContainerClassName = _ref.iconContainerClassName,
25
- titleClassName = _ref.titleClassName,
26
- loadingClassName = _ref.loadingClassName;
16
+ var compressImage = function compressImage(file) {
17
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
18
+ _ref$maxWidth = _ref.maxWidth,
19
+ maxWidth = _ref$maxWidth === void 0 ? 1600 : _ref$maxWidth,
20
+ _ref$maxHeight = _ref.maxHeight,
21
+ maxHeight = _ref$maxHeight === void 0 ? 1600 : _ref$maxHeight,
22
+ _ref$quality = _ref.quality,
23
+ quality = _ref$quality === void 0 ? 0.85 : _ref$quality;
24
+ return new Promise(function (resolve) {
25
+ // Non-image or SVG: skip compression to avoid losing vector quality
26
+ if (!file.type.startsWith("image/") || file.type === "image/svg+xml") {
27
+ resolve(file);
28
+ return;
29
+ }
30
+ var img = new Image();
31
+ img.onload = function () {
32
+ var width = img.width,
33
+ height = img.height;
34
+
35
+ // If the image is already small, keep it as-is
36
+ if (width <= maxWidth && height <= maxHeight) {
37
+ resolve(file);
38
+ return;
39
+ }
40
+ var scale = Math.min(maxWidth / width, maxHeight / height);
41
+ var targetWidth = Math.round(width * scale);
42
+ var targetHeight = Math.round(height * scale);
43
+ var canvas = document.createElement("canvas");
44
+ canvas.width = targetWidth;
45
+ canvas.height = targetHeight;
46
+ var ctx = canvas.getContext("2d");
47
+ if (!ctx) {
48
+ resolve(file);
49
+ return;
50
+ }
51
+ ctx.drawImage(img, 0, 0, targetWidth, targetHeight);
52
+ canvas.toBlob(function (blob) {
53
+ if (!blob) {
54
+ resolve(file);
55
+ return;
56
+ }
57
+ var compressedFile = new File([blob], file.name, {
58
+ type: file.type,
59
+ lastModified: Date.now()
60
+ });
61
+ resolve(compressedFile);
62
+ }, file.type, quality);
63
+ };
64
+ img.onerror = function () {
65
+ resolve(file);
66
+ };
67
+ var reader = new FileReader();
68
+ reader.onload = function (event) {
69
+ var _event$target;
70
+ img.src = (_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.result;
71
+ };
72
+ reader.onerror = function () {
73
+ return resolve(file);
74
+ };
75
+ reader.readAsDataURL(file);
76
+ });
77
+ };
78
+ var FileUpload = function FileUpload(_ref2) {
79
+ var loadMedia = _ref2.loadMedia,
80
+ accept = _ref2.accept,
81
+ title = _ref2.title,
82
+ apiService = _ref2.apiService,
83
+ onUploadStart = _ref2.onUploadStart,
84
+ onUploadComplete = _ref2.onUploadComplete,
85
+ onUploadError = _ref2.onUploadError,
86
+ className = _ref2.className,
87
+ buttonClassName = _ref2.buttonClassName,
88
+ iconContainerClassName = _ref2.iconContainerClassName,
89
+ titleClassName = _ref2.titleClassName,
90
+ loadingClassName = _ref2.loadingClassName;
27
91
  var _useState = useState([]),
28
92
  _useState2 = _slicedToArray(_useState, 2),
29
93
  files = _useState2[0],
@@ -39,8 +103,8 @@ var FileUpload = function FileUpload(_ref) {
39
103
 
40
104
  // Upload files
41
105
  var uploadFiles = /*#__PURE__*/function () {
42
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(fileList) {
43
- var uploadedUrls, _t;
106
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(fileList) {
107
+ var filesToUpload, uploadedUrls, _t;
44
108
  return _regenerator().w(function (_context) {
45
109
  while (1) switch (_context.p = _context.n) {
46
110
  case 0:
@@ -50,9 +114,25 @@ var FileUpload = function FileUpload(_ref) {
50
114
  setISLoading(true);
51
115
  setLength(fileList.length);
52
116
  _context.p = 1;
117
+ filesToUpload = fileList; // For image uploads, compress on the client before sending
118
+ if (!(accept && accept.includes("image"))) {
119
+ _context.n = 3;
120
+ break;
121
+ }
53
122
  _context.n = 2;
54
- return apiService.uploadMedia(fileList, apiService.authKey);
123
+ return Promise.all(fileList.map(function (file) {
124
+ return compressImage(file, {
125
+ maxWidth: 1600,
126
+ maxHeight: 1600,
127
+ quality: 0.85
128
+ });
129
+ }));
55
130
  case 2:
131
+ filesToUpload = _context.v;
132
+ case 3:
133
+ _context.n = 4;
134
+ return apiService.uploadMedia(filesToUpload, apiService.authKey);
135
+ case 4:
56
136
  uploadedUrls = _context.v;
57
137
  if (onUploadComplete) {
58
138
  onUploadComplete(uploadedUrls);
@@ -61,35 +141,35 @@ var FileUpload = function FileUpload(_ref) {
61
141
  if (loadMedia) {
62
142
  loadMedia();
63
143
  }
64
- _context.n = 4;
144
+ _context.n = 6;
65
145
  break;
66
- case 3:
67
- _context.p = 3;
146
+ case 5:
147
+ _context.p = 5;
68
148
  _t = _context.v;
69
- console.error('Upload error:', _t);
149
+ console.error("Upload error:", _t);
70
150
  if (onUploadError) {
71
151
  onUploadError(_t);
72
152
  }
73
- case 4:
74
- _context.p = 4;
153
+ case 6:
154
+ _context.p = 6;
75
155
  setISLoading(false);
76
- return _context.f(4);
77
- case 5:
156
+ return _context.f(6);
157
+ case 7:
78
158
  return _context.a(2);
79
159
  }
80
- }, _callee, null, [[1, 3, 4, 5]]);
160
+ }, _callee, null, [[1, 5, 6, 7]]);
81
161
  }));
82
162
  return function uploadFiles(_x) {
83
- return _ref2.apply(this, arguments);
163
+ return _ref3.apply(this, arguments);
84
164
  };
85
165
  }();
86
166
 
87
167
  // Default classes with customization support
88
- var defaultContainerClass = 'min-w-40 h-40';
89
- var defaultButtonClass = 'w-full h-full flex flex-col justify-center items-center text-sm border border-primary border-dashed rounded-lg hover:bg-gray-50 transition-colors';
90
- var defaultIconContainerClass = 'p-[10px] bg-primary rounded-full';
91
- var defaultTitleClass = 'mt-2';
92
- var defaultLoadingClass = 'flex items-center justify-center h-40 bg-gray-200 rounded-lg shadow-md animate-pulse';
168
+ var defaultContainerClass = "min-w-40 h-40";
169
+ var defaultButtonClass = "w-full h-full flex flex-col justify-center items-center text-sm border border-primary border-dashed rounded-lg hover:bg-gray-50 transition-colors";
170
+ var defaultIconContainerClass = "p-[10px] bg-primary rounded-full";
171
+ var defaultTitleClass = "mt-2";
172
+ var defaultLoadingClass = "flex items-center justify-center h-40 bg-gray-200 rounded-lg shadow-md animate-pulse";
93
173
  return /*#__PURE__*/_jsxs(_Fragment, {
94
174
  children: [/*#__PURE__*/_jsxs("div", {
95
175
  className: className || defaultContainerClass,
@@ -101,13 +181,13 @@ var FileUpload = function FileUpload(_ref) {
101
181
  accept: accept,
102
182
  placeholder: "",
103
183
  onChange: (/*#__PURE__*/function () {
104
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(e) {
184
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(e) {
105
185
  var all_files;
106
186
  return _regenerator().w(function (_context2) {
107
187
  while (1) switch (_context2.n) {
108
188
  case 0:
109
189
  e.stopPropagation();
110
- all_files = Array.from(e.target.files);
190
+ all_files = Array.from(e.target.files || []);
111
191
  if (!((all_files === null || all_files === void 0 ? void 0 : all_files.length) > 0)) {
112
192
  _context2.n = 1;
113
193
  break;
@@ -116,14 +196,14 @@ var FileUpload = function FileUpload(_ref) {
116
196
  return uploadFiles(all_files);
117
197
  case 1:
118
198
  // Reset input
119
- e.target.value = '';
199
+ e.target.value = "";
120
200
  case 2:
121
201
  return _context2.a(2);
122
202
  }
123
203
  }, _callee2);
124
204
  }));
125
205
  return function (_x2) {
126
- return _ref3.apply(this, arguments);
206
+ return _ref4.apply(this, arguments);
127
207
  };
128
208
  }()),
129
209
  multiple: true
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tradly/asset",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
4
  "description": "A reusable media gallery component for uploading and selecting images, videos, and files with Tradly authentication",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/esm/index.js",