@tradly/asset 1.0.20 → 1.0.21

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.
@@ -164,26 +164,123 @@ var MediaApiService = /*#__PURE__*/function () {
164
164
  return fetchMedia;
165
165
  }()
166
166
  /**
167
- * Get S3 signed upload URLs from API
167
+ * Upload a single file to S3 using signed URL
168
+ * Handles both web File objects and React Native file URIs
168
169
  */
169
170
  )
170
171
  }, {
171
- key: "getS3SignedUrls",
172
+ key: "uploadFileToS3",
172
173
  value: (function () {
173
- var _getS3SignedUrls = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(files, authKey) {
174
- var auth_key, fileData, headers, _response$data$data, response, _t2;
174
+ var _uploadFileToS = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(signedUrl, fileUriOrFile, mimeType) {
175
+ var blob, response, _response, uploadResponse, errorText, _t2;
175
176
  return _regenerator().w(function (_context3) {
176
177
  while (1) switch (_context3.p = _context3.n) {
178
+ case 0:
179
+ _context3.p = 0;
180
+ if (!(typeof fileUriOrFile === "string")) {
181
+ _context3.n = 4;
182
+ break;
183
+ }
184
+ _context3.n = 1;
185
+ return fetch(fileUriOrFile);
186
+ case 1:
187
+ response = _context3.v;
188
+ if (response.ok) {
189
+ _context3.n = 2;
190
+ break;
191
+ }
192
+ throw new Error("Failed to fetch file: ".concat(response.status, " ").concat(response.statusText));
193
+ case 2:
194
+ _context3.n = 3;
195
+ return response.blob();
196
+ case 3:
197
+ blob = _context3.v;
198
+ _context3.n = 9;
199
+ break;
200
+ case 4:
201
+ if (!(fileUriOrFile && fileUriOrFile.uri)) {
202
+ _context3.n = 8;
203
+ break;
204
+ }
205
+ _context3.n = 5;
206
+ return fetch(fileUriOrFile.uri);
207
+ case 5:
208
+ _response = _context3.v;
209
+ if (_response.ok) {
210
+ _context3.n = 6;
211
+ break;
212
+ }
213
+ throw new Error("Failed to fetch file: ".concat(_response.status, " ").concat(_response.statusText));
214
+ case 6:
215
+ _context3.n = 7;
216
+ return _response.blob();
217
+ case 7:
218
+ blob = _context3.v;
219
+ _context3.n = 9;
220
+ break;
221
+ case 8:
222
+ // Web: fileUriOrFile is already a File/Blob object
223
+ blob = fileUriOrFile;
224
+ case 9:
225
+ _context3.n = 10;
226
+ return fetch(signedUrl, {
227
+ method: "PUT",
228
+ body: blob,
229
+ headers: {
230
+ "Content-Type": mimeType
231
+ }
232
+ });
233
+ case 10:
234
+ uploadResponse = _context3.v;
235
+ if (uploadResponse.ok) {
236
+ _context3.n = 12;
237
+ break;
238
+ }
239
+ _context3.n = 11;
240
+ return uploadResponse.text().catch(function () {
241
+ return "";
242
+ });
243
+ case 11:
244
+ errorText = _context3.v;
245
+ throw new Error("S3 upload failed: ".concat(uploadResponse.status, " ").concat(uploadResponse.statusText).concat(errorText ? " - ".concat(errorText) : ""));
246
+ case 12:
247
+ _context3.n = 14;
248
+ break;
249
+ case 13:
250
+ _context3.p = 13;
251
+ _t2 = _context3.v;
252
+ throw new Error(_t2.message || "Failed to upload file to S3");
253
+ case 14:
254
+ return _context3.a(2);
255
+ }
256
+ }, _callee3, null, [[0, 13]]);
257
+ }));
258
+ function uploadFileToS3(_x3, _x4, _x5) {
259
+ return _uploadFileToS.apply(this, arguments);
260
+ }
261
+ return uploadFileToS3;
262
+ }()
263
+ /**
264
+ * Get S3 signed upload URLs from API
265
+ */
266
+ )
267
+ }, {
268
+ key: "getS3SignedUrls",
269
+ value: (function () {
270
+ var _getS3SignedUrls = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(files, authKey) {
271
+ var auth_key, fileData, headers, _response$data$data, response, _t3;
272
+ return _regenerator().w(function (_context4) {
273
+ while (1) switch (_context4.p = _context4.n) {
177
274
  case 0:
178
275
  auth_key = authKey || this.authKey;
179
276
  if (auth_key) {
180
- _context3.n = 1;
277
+ _context4.n = 1;
181
278
  break;
182
279
  }
183
280
  throw new Error("Authentication key is required for upload");
184
281
  case 1:
185
282
  if (this.apiBaseUrl) {
186
- _context3.n = 2;
283
+ _context4.n = 2;
187
284
  break;
188
285
  }
189
286
  throw new Error('API base URL is required. The package automatically detects it from ENVIRONMENT, or you can set apiBaseUrl in config: new MediaApiService({ apiBaseUrl: "https://api.tradly.app" })');
@@ -203,8 +300,8 @@ var MediaApiService = /*#__PURE__*/function () {
203
300
  if (this.bearerToken) {
204
301
  headers["Authorization"] = "Bearer ".concat(this.bearerToken);
205
302
  }
206
- _context3.p = 3;
207
- _context3.n = 4;
303
+ _context4.p = 3;
304
+ _context4.n = 4;
208
305
  return (0, _axios.default)({
209
306
  method: "POST",
210
307
  url: "".concat(this.apiBaseUrl, "/v1/utils/S3signedUploadURL"),
@@ -214,28 +311,28 @@ var MediaApiService = /*#__PURE__*/function () {
214
311
  }
215
312
  });
216
313
  case 4:
217
- response = _context3.v;
314
+ response = _context4.v;
218
315
  if (!response.data.error) {
219
- _context3.n = 5;
316
+ _context4.n = 5;
220
317
  break;
221
318
  }
222
319
  throw new Error(response.data.error);
223
320
  case 5:
224
- return _context3.a(2, response.data.result || ((_response$data$data = response.data.data) === null || _response$data$data === void 0 ? void 0 : _response$data$data.result) || response.data);
321
+ return _context4.a(2, response.data.result || ((_response$data$data = response.data.data) === null || _response$data$data === void 0 ? void 0 : _response$data$data.result) || response.data);
225
322
  case 6:
226
- _context3.p = 6;
227
- _t2 = _context3.v;
228
- console.error("Error getting S3 signed URLs:", _t2);
323
+ _context4.p = 6;
324
+ _t3 = _context4.v;
325
+ console.error("Error getting S3 signed URLs:", _t3);
229
326
  if (this.onError) {
230
- this.onError(_t2);
327
+ this.onError(_t3);
231
328
  }
232
- throw _t2;
329
+ throw _t3;
233
330
  case 7:
234
- return _context3.a(2);
331
+ return _context4.a(2);
235
332
  }
236
- }, _callee3, this, [[3, 6]]);
333
+ }, _callee4, this, [[3, 6]]);
237
334
  }));
238
- function getS3SignedUrls(_x3, _x4) {
335
+ function getS3SignedUrls(_x6, _x7) {
239
336
  return _getS3SignedUrls.apply(this, arguments);
240
337
  }
241
338
  return getS3SignedUrls;
@@ -248,14 +345,14 @@ var MediaApiService = /*#__PURE__*/function () {
248
345
  }, {
249
346
  key: "uploadMedia",
250
347
  value: (function () {
251
- var _uploadMedia = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(files, authKey) {
252
- var auth_key, all_files_uri, upload_files, upload_full_files, i, element, cleanFileName, file_data, responseFiles, index, path, fileURI, originalFile, fileBody, uri, fileResponse, arrayBuffer, res, errorText, errorMsg, mediaData, _t3, _t4, _t5;
253
- return _regenerator().w(function (_context4) {
254
- while (1) switch (_context4.p = _context4.n) {
348
+ var _uploadMedia = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(files, authKey) {
349
+ var auth_key, all_files_uri, upload_files, upload_full_files, i, element, cleanFileName, file_data, responseFiles, index, path, fileURI, originalFile, mimeType, fileInput, mediaData, _t4, _t5;
350
+ return _regenerator().w(function (_context5) {
351
+ while (1) switch (_context5.p = _context5.n) {
255
352
  case 0:
256
353
  auth_key = authKey || this.authKey;
257
354
  if (auth_key) {
258
- _context4.n = 1;
355
+ _context5.n = 1;
259
356
  break;
260
357
  }
261
358
  throw new Error("Authentication key is required for upload");
@@ -266,7 +363,7 @@ var MediaApiService = /*#__PURE__*/function () {
266
363
  i = 0;
267
364
  case 2:
268
365
  if (!(i < files.length)) {
269
- _context4.n = 27;
366
+ _context5.n = 14;
270
367
  break;
271
368
  }
272
369
  element = files[i]; // Check if file already has a path (from previous upload)
@@ -286,133 +383,47 @@ var MediaApiService = /*#__PURE__*/function () {
286
383
 
287
384
  // Upload files when we've processed all files
288
385
  if (!(files.length === i + 1 && upload_files.length > 0)) {
289
- _context4.n = 26;
386
+ _context5.n = 13;
290
387
  break;
291
388
  }
292
- _context4.p = 3;
293
- _context4.n = 4;
389
+ _context5.p = 3;
390
+ _context5.n = 4;
294
391
  return this.getS3SignedUrls(upload_full_files, auth_key);
295
392
  case 4:
296
- responseFiles = _context4.v;
393
+ responseFiles = _context5.v;
297
394
  index = 0;
298
395
  case 5:
299
396
  if (!(index < responseFiles.length)) {
300
- _context4.n = 23;
397
+ _context5.n = 10;
301
398
  break;
302
399
  }
303
400
  path = responseFiles[index].signedUrl;
304
401
  fileURI = responseFiles[index].fileUri;
305
402
  originalFile = upload_full_files[index];
306
- _context4.p = 6;
307
- fileBody = originalFile; // Handle React Native file URIs
308
- // If file has a uri property, it's from React Native - fetch it first
309
- if (!(originalFile.uri && typeof originalFile.uri === "string")) {
310
- _context4.n = 16;
311
- break;
312
- }
313
- // For React Native, handle file://, content://, or http:// URIs
314
- uri = originalFile.uri;
315
- _context4.p = 7;
316
- _context4.n = 8;
317
- return fetch(uri);
318
- case 8:
319
- fileResponse = _context4.v;
320
- if (fileResponse.ok) {
321
- _context4.n = 9;
322
- break;
323
- }
324
- throw new Error("Failed to fetch file: ".concat(fileResponse.status, " ").concat(fileResponse.statusText));
325
- case 9:
326
- if (!fileResponse.blob) {
327
- _context4.n = 11;
328
- break;
329
- }
330
- _context4.n = 10;
331
- return fileResponse.blob();
332
- case 10:
333
- fileBody = _context4.v;
334
- _context4.n = 14;
335
- break;
336
- case 11:
337
- if (!fileResponse.arrayBuffer) {
338
- _context4.n = 13;
339
- break;
340
- }
341
- _context4.n = 12;
342
- return fileResponse.arrayBuffer();
343
- case 12:
344
- arrayBuffer = _context4.v;
345
- // Check if Blob constructor is available
346
- if (typeof Blob !== "undefined") {
347
- fileBody = new Blob([arrayBuffer], {
348
- type: upload_files[index].type
349
- });
350
- } else {
351
- // If Blob is not available, use arrayBuffer directly
352
- fileBody = arrayBuffer;
353
- }
354
- _context4.n = 14;
355
- break;
356
- case 13:
357
- // Last resort: use response directly (might not work for all cases)
358
- fileBody = fileResponse;
359
- case 14:
360
- _context4.n = 16;
361
- break;
362
- case 15:
363
- _context4.p = 15;
364
- _t3 = _context4.v;
365
- console.error("Error fetching file from URI:", _t3);
366
- console.error("URI was:", uri);
367
- console.error("File details:", {
368
- name: originalFile.name,
369
- type: originalFile.type
370
- });
371
- throw new Error("Failed to read file from URI: ".concat(uri, ". Error: ").concat(_t3.message, ". Make sure the file URI is accessible."));
372
- case 16:
373
- _context4.n = 17;
374
- return fetch(path, {
375
- method: "PUT",
376
- headers: {
377
- "Content-Type": upload_files[index].type
378
- },
379
- body: fileBody
380
- });
381
- case 17:
382
- res = _context4.v;
383
- if (!res.ok) {
384
- _context4.n = 18;
385
- break;
386
- }
403
+ mimeType = upload_files[index].type;
404
+ _context5.p = 6;
405
+ // Upload file to S3 using the signed URL
406
+ // uploadFileToS3 handles both web File objects and React Native URIs
407
+ fileInput = originalFile.uri || originalFile;
408
+ _context5.n = 7;
409
+ return this.uploadFileToS3(path, fileInput, mimeType);
410
+ case 7:
387
411
  all_files_uri.push(fileURI);
388
- _context4.n = 20;
412
+ _context5.n = 9;
389
413
  break;
390
- case 18:
391
- _context4.n = 19;
392
- return res.text().catch(function () {
393
- return "";
394
- });
395
- case 19:
396
- errorText = _context4.v;
397
- console.error("Failed to upload file ".concat(index + 1, ":"), res.status, res.statusText, errorText);
398
- errorMsg = errorText ? "S3 upload failed: ".concat(res.status, " ").concat(res.statusText, " - ").concat(errorText) : "S3 upload failed: ".concat(res.status, " ").concat(res.statusText);
399
- throw new Error(errorMsg);
400
- case 20:
401
- _context4.n = 22;
402
- break;
403
- case 21:
404
- _context4.p = 21;
405
- _t4 = _context4.v;
414
+ case 8:
415
+ _context5.p = 8;
416
+ _t4 = _context5.v;
406
417
  console.error("Error uploading file ".concat(index + 1, ":"), _t4);
407
418
  // Re-throw to stop the upload process
408
419
  throw _t4;
409
- case 22:
420
+ case 9:
410
421
  index++;
411
- _context4.n = 5;
422
+ _context5.n = 5;
412
423
  break;
413
- case 23:
424
+ case 10:
414
425
  if (!(all_files_uri.length > 0)) {
415
- _context4.n = 24;
426
+ _context5.n = 11;
416
427
  break;
417
428
  }
418
429
  mediaData = all_files_uri.map(function (url, index) {
@@ -425,7 +436,7 @@ var MediaApiService = /*#__PURE__*/function () {
425
436
  mime_type: originalFile.type
426
437
  };
427
438
  }); // Save to media API - POST /v1/media with { media: [...] }
428
- _context4.n = 24;
439
+ _context5.n = 11;
429
440
  return this.apiCall({
430
441
  method: "POST",
431
442
  path: "/v1/media",
@@ -433,27 +444,27 @@ var MediaApiService = /*#__PURE__*/function () {
433
444
  media: mediaData
434
445
  }
435
446
  });
436
- case 24:
437
- _context4.n = 26;
447
+ case 11:
448
+ _context5.n = 13;
438
449
  break;
439
- case 25:
440
- _context4.p = 25;
441
- _t5 = _context4.v;
450
+ case 12:
451
+ _context5.p = 12;
452
+ _t5 = _context5.v;
442
453
  console.error("Upload error:", _t5);
443
454
  if (this.onError) {
444
455
  this.onError(_t5);
445
456
  }
446
457
  throw _t5;
447
- case 26:
458
+ case 13:
448
459
  i++;
449
- _context4.n = 2;
460
+ _context5.n = 2;
450
461
  break;
451
- case 27:
452
- return _context4.a(2, all_files_uri);
462
+ case 14:
463
+ return _context5.a(2, all_files_uri);
453
464
  }
454
- }, _callee4, this, [[7, 15], [6, 21], [3, 25]]);
465
+ }, _callee5, this, [[6, 8], [3, 12]]);
455
466
  }));
456
- function uploadMedia(_x5, _x6) {
467
+ function uploadMedia(_x8, _x9) {
457
468
  return _uploadMedia.apply(this, arguments);
458
469
  }
459
470
  return uploadMedia;
@@ -158,26 +158,123 @@ var MediaApiService = /*#__PURE__*/function () {
158
158
  return fetchMedia;
159
159
  }()
160
160
  /**
161
- * Get S3 signed upload URLs from API
161
+ * Upload a single file to S3 using signed URL
162
+ * Handles both web File objects and React Native file URIs
162
163
  */
163
164
  )
164
165
  }, {
165
- key: "getS3SignedUrls",
166
+ key: "uploadFileToS3",
166
167
  value: (function () {
167
- var _getS3SignedUrls = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(files, authKey) {
168
- var auth_key, fileData, headers, _response$data$data, response, _t2;
168
+ var _uploadFileToS = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(signedUrl, fileUriOrFile, mimeType) {
169
+ var blob, response, _response, uploadResponse, errorText, _t2;
169
170
  return _regenerator().w(function (_context3) {
170
171
  while (1) switch (_context3.p = _context3.n) {
172
+ case 0:
173
+ _context3.p = 0;
174
+ if (!(typeof fileUriOrFile === "string")) {
175
+ _context3.n = 4;
176
+ break;
177
+ }
178
+ _context3.n = 1;
179
+ return fetch(fileUriOrFile);
180
+ case 1:
181
+ response = _context3.v;
182
+ if (response.ok) {
183
+ _context3.n = 2;
184
+ break;
185
+ }
186
+ throw new Error("Failed to fetch file: ".concat(response.status, " ").concat(response.statusText));
187
+ case 2:
188
+ _context3.n = 3;
189
+ return response.blob();
190
+ case 3:
191
+ blob = _context3.v;
192
+ _context3.n = 9;
193
+ break;
194
+ case 4:
195
+ if (!(fileUriOrFile && fileUriOrFile.uri)) {
196
+ _context3.n = 8;
197
+ break;
198
+ }
199
+ _context3.n = 5;
200
+ return fetch(fileUriOrFile.uri);
201
+ case 5:
202
+ _response = _context3.v;
203
+ if (_response.ok) {
204
+ _context3.n = 6;
205
+ break;
206
+ }
207
+ throw new Error("Failed to fetch file: ".concat(_response.status, " ").concat(_response.statusText));
208
+ case 6:
209
+ _context3.n = 7;
210
+ return _response.blob();
211
+ case 7:
212
+ blob = _context3.v;
213
+ _context3.n = 9;
214
+ break;
215
+ case 8:
216
+ // Web: fileUriOrFile is already a File/Blob object
217
+ blob = fileUriOrFile;
218
+ case 9:
219
+ _context3.n = 10;
220
+ return fetch(signedUrl, {
221
+ method: "PUT",
222
+ body: blob,
223
+ headers: {
224
+ "Content-Type": mimeType
225
+ }
226
+ });
227
+ case 10:
228
+ uploadResponse = _context3.v;
229
+ if (uploadResponse.ok) {
230
+ _context3.n = 12;
231
+ break;
232
+ }
233
+ _context3.n = 11;
234
+ return uploadResponse.text().catch(function () {
235
+ return "";
236
+ });
237
+ case 11:
238
+ errorText = _context3.v;
239
+ throw new Error("S3 upload failed: ".concat(uploadResponse.status, " ").concat(uploadResponse.statusText).concat(errorText ? " - ".concat(errorText) : ""));
240
+ case 12:
241
+ _context3.n = 14;
242
+ break;
243
+ case 13:
244
+ _context3.p = 13;
245
+ _t2 = _context3.v;
246
+ throw new Error(_t2.message || "Failed to upload file to S3");
247
+ case 14:
248
+ return _context3.a(2);
249
+ }
250
+ }, _callee3, null, [[0, 13]]);
251
+ }));
252
+ function uploadFileToS3(_x3, _x4, _x5) {
253
+ return _uploadFileToS.apply(this, arguments);
254
+ }
255
+ return uploadFileToS3;
256
+ }()
257
+ /**
258
+ * Get S3 signed upload URLs from API
259
+ */
260
+ )
261
+ }, {
262
+ key: "getS3SignedUrls",
263
+ value: (function () {
264
+ var _getS3SignedUrls = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(files, authKey) {
265
+ var auth_key, fileData, headers, _response$data$data, response, _t3;
266
+ return _regenerator().w(function (_context4) {
267
+ while (1) switch (_context4.p = _context4.n) {
171
268
  case 0:
172
269
  auth_key = authKey || this.authKey;
173
270
  if (auth_key) {
174
- _context3.n = 1;
271
+ _context4.n = 1;
175
272
  break;
176
273
  }
177
274
  throw new Error("Authentication key is required for upload");
178
275
  case 1:
179
276
  if (this.apiBaseUrl) {
180
- _context3.n = 2;
277
+ _context4.n = 2;
181
278
  break;
182
279
  }
183
280
  throw new Error('API base URL is required. The package automatically detects it from ENVIRONMENT, or you can set apiBaseUrl in config: new MediaApiService({ apiBaseUrl: "https://api.tradly.app" })');
@@ -197,8 +294,8 @@ var MediaApiService = /*#__PURE__*/function () {
197
294
  if (this.bearerToken) {
198
295
  headers["Authorization"] = "Bearer ".concat(this.bearerToken);
199
296
  }
200
- _context3.p = 3;
201
- _context3.n = 4;
297
+ _context4.p = 3;
298
+ _context4.n = 4;
202
299
  return axios({
203
300
  method: "POST",
204
301
  url: "".concat(this.apiBaseUrl, "/v1/utils/S3signedUploadURL"),
@@ -208,28 +305,28 @@ var MediaApiService = /*#__PURE__*/function () {
208
305
  }
209
306
  });
210
307
  case 4:
211
- response = _context3.v;
308
+ response = _context4.v;
212
309
  if (!response.data.error) {
213
- _context3.n = 5;
310
+ _context4.n = 5;
214
311
  break;
215
312
  }
216
313
  throw new Error(response.data.error);
217
314
  case 5:
218
- return _context3.a(2, response.data.result || ((_response$data$data = response.data.data) === null || _response$data$data === void 0 ? void 0 : _response$data$data.result) || response.data);
315
+ return _context4.a(2, response.data.result || ((_response$data$data = response.data.data) === null || _response$data$data === void 0 ? void 0 : _response$data$data.result) || response.data);
219
316
  case 6:
220
- _context3.p = 6;
221
- _t2 = _context3.v;
222
- console.error("Error getting S3 signed URLs:", _t2);
317
+ _context4.p = 6;
318
+ _t3 = _context4.v;
319
+ console.error("Error getting S3 signed URLs:", _t3);
223
320
  if (this.onError) {
224
- this.onError(_t2);
321
+ this.onError(_t3);
225
322
  }
226
- throw _t2;
323
+ throw _t3;
227
324
  case 7:
228
- return _context3.a(2);
325
+ return _context4.a(2);
229
326
  }
230
- }, _callee3, this, [[3, 6]]);
327
+ }, _callee4, this, [[3, 6]]);
231
328
  }));
232
- function getS3SignedUrls(_x3, _x4) {
329
+ function getS3SignedUrls(_x6, _x7) {
233
330
  return _getS3SignedUrls.apply(this, arguments);
234
331
  }
235
332
  return getS3SignedUrls;
@@ -242,14 +339,14 @@ var MediaApiService = /*#__PURE__*/function () {
242
339
  }, {
243
340
  key: "uploadMedia",
244
341
  value: (function () {
245
- var _uploadMedia = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(files, authKey) {
246
- var auth_key, all_files_uri, upload_files, upload_full_files, i, element, cleanFileName, file_data, responseFiles, index, path, fileURI, originalFile, fileBody, uri, fileResponse, arrayBuffer, res, errorText, errorMsg, mediaData, _t3, _t4, _t5;
247
- return _regenerator().w(function (_context4) {
248
- while (1) switch (_context4.p = _context4.n) {
342
+ var _uploadMedia = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(files, authKey) {
343
+ var auth_key, all_files_uri, upload_files, upload_full_files, i, element, cleanFileName, file_data, responseFiles, index, path, fileURI, originalFile, mimeType, fileInput, mediaData, _t4, _t5;
344
+ return _regenerator().w(function (_context5) {
345
+ while (1) switch (_context5.p = _context5.n) {
249
346
  case 0:
250
347
  auth_key = authKey || this.authKey;
251
348
  if (auth_key) {
252
- _context4.n = 1;
349
+ _context5.n = 1;
253
350
  break;
254
351
  }
255
352
  throw new Error("Authentication key is required for upload");
@@ -260,7 +357,7 @@ var MediaApiService = /*#__PURE__*/function () {
260
357
  i = 0;
261
358
  case 2:
262
359
  if (!(i < files.length)) {
263
- _context4.n = 27;
360
+ _context5.n = 14;
264
361
  break;
265
362
  }
266
363
  element = files[i]; // Check if file already has a path (from previous upload)
@@ -280,133 +377,47 @@ var MediaApiService = /*#__PURE__*/function () {
280
377
 
281
378
  // Upload files when we've processed all files
282
379
  if (!(files.length === i + 1 && upload_files.length > 0)) {
283
- _context4.n = 26;
380
+ _context5.n = 13;
284
381
  break;
285
382
  }
286
- _context4.p = 3;
287
- _context4.n = 4;
383
+ _context5.p = 3;
384
+ _context5.n = 4;
288
385
  return this.getS3SignedUrls(upload_full_files, auth_key);
289
386
  case 4:
290
- responseFiles = _context4.v;
387
+ responseFiles = _context5.v;
291
388
  index = 0;
292
389
  case 5:
293
390
  if (!(index < responseFiles.length)) {
294
- _context4.n = 23;
391
+ _context5.n = 10;
295
392
  break;
296
393
  }
297
394
  path = responseFiles[index].signedUrl;
298
395
  fileURI = responseFiles[index].fileUri;
299
396
  originalFile = upload_full_files[index];
300
- _context4.p = 6;
301
- fileBody = originalFile; // Handle React Native file URIs
302
- // If file has a uri property, it's from React Native - fetch it first
303
- if (!(originalFile.uri && typeof originalFile.uri === "string")) {
304
- _context4.n = 16;
305
- break;
306
- }
307
- // For React Native, handle file://, content://, or http:// URIs
308
- uri = originalFile.uri;
309
- _context4.p = 7;
310
- _context4.n = 8;
311
- return fetch(uri);
312
- case 8:
313
- fileResponse = _context4.v;
314
- if (fileResponse.ok) {
315
- _context4.n = 9;
316
- break;
317
- }
318
- throw new Error("Failed to fetch file: ".concat(fileResponse.status, " ").concat(fileResponse.statusText));
319
- case 9:
320
- if (!fileResponse.blob) {
321
- _context4.n = 11;
322
- break;
323
- }
324
- _context4.n = 10;
325
- return fileResponse.blob();
326
- case 10:
327
- fileBody = _context4.v;
328
- _context4.n = 14;
329
- break;
330
- case 11:
331
- if (!fileResponse.arrayBuffer) {
332
- _context4.n = 13;
333
- break;
334
- }
335
- _context4.n = 12;
336
- return fileResponse.arrayBuffer();
337
- case 12:
338
- arrayBuffer = _context4.v;
339
- // Check if Blob constructor is available
340
- if (typeof Blob !== "undefined") {
341
- fileBody = new Blob([arrayBuffer], {
342
- type: upload_files[index].type
343
- });
344
- } else {
345
- // If Blob is not available, use arrayBuffer directly
346
- fileBody = arrayBuffer;
347
- }
348
- _context4.n = 14;
349
- break;
350
- case 13:
351
- // Last resort: use response directly (might not work for all cases)
352
- fileBody = fileResponse;
353
- case 14:
354
- _context4.n = 16;
355
- break;
356
- case 15:
357
- _context4.p = 15;
358
- _t3 = _context4.v;
359
- console.error("Error fetching file from URI:", _t3);
360
- console.error("URI was:", uri);
361
- console.error("File details:", {
362
- name: originalFile.name,
363
- type: originalFile.type
364
- });
365
- throw new Error("Failed to read file from URI: ".concat(uri, ". Error: ").concat(_t3.message, ". Make sure the file URI is accessible."));
366
- case 16:
367
- _context4.n = 17;
368
- return fetch(path, {
369
- method: "PUT",
370
- headers: {
371
- "Content-Type": upload_files[index].type
372
- },
373
- body: fileBody
374
- });
375
- case 17:
376
- res = _context4.v;
377
- if (!res.ok) {
378
- _context4.n = 18;
379
- break;
380
- }
397
+ mimeType = upload_files[index].type;
398
+ _context5.p = 6;
399
+ // Upload file to S3 using the signed URL
400
+ // uploadFileToS3 handles both web File objects and React Native URIs
401
+ fileInput = originalFile.uri || originalFile;
402
+ _context5.n = 7;
403
+ return this.uploadFileToS3(path, fileInput, mimeType);
404
+ case 7:
381
405
  all_files_uri.push(fileURI);
382
- _context4.n = 20;
406
+ _context5.n = 9;
383
407
  break;
384
- case 18:
385
- _context4.n = 19;
386
- return res.text().catch(function () {
387
- return "";
388
- });
389
- case 19:
390
- errorText = _context4.v;
391
- console.error("Failed to upload file ".concat(index + 1, ":"), res.status, res.statusText, errorText);
392
- errorMsg = errorText ? "S3 upload failed: ".concat(res.status, " ").concat(res.statusText, " - ").concat(errorText) : "S3 upload failed: ".concat(res.status, " ").concat(res.statusText);
393
- throw new Error(errorMsg);
394
- case 20:
395
- _context4.n = 22;
396
- break;
397
- case 21:
398
- _context4.p = 21;
399
- _t4 = _context4.v;
408
+ case 8:
409
+ _context5.p = 8;
410
+ _t4 = _context5.v;
400
411
  console.error("Error uploading file ".concat(index + 1, ":"), _t4);
401
412
  // Re-throw to stop the upload process
402
413
  throw _t4;
403
- case 22:
414
+ case 9:
404
415
  index++;
405
- _context4.n = 5;
416
+ _context5.n = 5;
406
417
  break;
407
- case 23:
418
+ case 10:
408
419
  if (!(all_files_uri.length > 0)) {
409
- _context4.n = 24;
420
+ _context5.n = 11;
410
421
  break;
411
422
  }
412
423
  mediaData = all_files_uri.map(function (url, index) {
@@ -419,7 +430,7 @@ var MediaApiService = /*#__PURE__*/function () {
419
430
  mime_type: originalFile.type
420
431
  };
421
432
  }); // Save to media API - POST /v1/media with { media: [...] }
422
- _context4.n = 24;
433
+ _context5.n = 11;
423
434
  return this.apiCall({
424
435
  method: "POST",
425
436
  path: "/v1/media",
@@ -427,27 +438,27 @@ var MediaApiService = /*#__PURE__*/function () {
427
438
  media: mediaData
428
439
  }
429
440
  });
430
- case 24:
431
- _context4.n = 26;
441
+ case 11:
442
+ _context5.n = 13;
432
443
  break;
433
- case 25:
434
- _context4.p = 25;
435
- _t5 = _context4.v;
444
+ case 12:
445
+ _context5.p = 12;
446
+ _t5 = _context5.v;
436
447
  console.error("Upload error:", _t5);
437
448
  if (this.onError) {
438
449
  this.onError(_t5);
439
450
  }
440
451
  throw _t5;
441
- case 26:
452
+ case 13:
442
453
  i++;
443
- _context4.n = 2;
454
+ _context5.n = 2;
444
455
  break;
445
- case 27:
446
- return _context4.a(2, all_files_uri);
456
+ case 14:
457
+ return _context5.a(2, all_files_uri);
447
458
  }
448
- }, _callee4, this, [[7, 15], [6, 21], [3, 25]]);
459
+ }, _callee5, this, [[6, 8], [3, 12]]);
449
460
  }));
450
- function uploadMedia(_x5, _x6) {
461
+ function uploadMedia(_x8, _x9) {
451
462
  return _uploadMedia.apply(this, arguments);
452
463
  }
453
464
  return uploadMedia;
@@ -1,11 +1,18 @@
1
- import React from 'react';
2
- import { View, StyleSheet, Dimensions, ActivityIndicator } from 'react-native';
1
+ import React from "react";
2
+ import { View, StyleSheet, Dimensions, ActivityIndicator } from "react-native";
3
3
  import { jsx as _jsx } from "react/jsx-runtime";
4
- var _Dimensions$get = Dimensions.get('window'),
4
+ var _Dimensions$get = Dimensions.get("window"),
5
5
  SCREEN_WIDTH = _Dimensions$get.width;
6
6
  var NUM_COLUMNS = 3;
7
- var ITEM_MARGIN = 8;
8
- var ITEM_SIZE = (SCREEN_WIDTH - 40 - ITEM_MARGIN * (NUM_COLUMNS - 1) * 2) / NUM_COLUMNS;
7
+ var ITEM_MARGIN = 4; // Match MediaGallery margin
8
+ // Calculate item size accounting for:
9
+ // - Container padding (md = 12px on each side = 24px total)
10
+ // - Grid padding (2px on each side = 4px total)
11
+ // - Item margins between items (4px * 2 gaps = 8px total)
12
+ var CONTAINER_PADDING = 24; // paddingHorizontal md (12 * 2)
13
+ var GRID_PADDING = 4; // padding 2 on each side (2 * 2)
14
+ var TOTAL_MARGINS = ITEM_MARGIN * (NUM_COLUMNS - 1) * 2; // margins between items (4px * 2 gaps = 8px)
15
+ var ITEM_SIZE = (SCREEN_WIDTH - CONTAINER_PADDING - GRID_PADDING - TOTAL_MARGINS) / NUM_COLUMNS;
9
16
  var ImagesSkeleton = function ImagesSkeleton(_ref) {
10
17
  var _ref$per_page = _ref.per_page,
11
18
  per_page = _ref$per_page === void 0 ? 30 : _ref$per_page;
@@ -30,15 +37,15 @@ var ImagesSkeleton = function ImagesSkeleton(_ref) {
30
37
  };
31
38
  var styles = StyleSheet.create({
32
39
  container: {
33
- flexDirection: 'row',
34
- flexWrap: 'wrap',
35
- padding: 4
40
+ flexDirection: "row",
41
+ flexWrap: "wrap",
42
+ padding: 2 // Match MediaGallery grid padding
36
43
  },
37
44
  skeletonItem: {
38
- backgroundColor: '#E5E5E5',
45
+ backgroundColor: "#E5E5E5",
39
46
  borderRadius: 8,
40
- justifyContent: 'center',
41
- alignItems: 'center',
47
+ justifyContent: "center",
48
+ alignItems: "center",
42
49
  opacity: 0.3
43
50
  }
44
51
  });
@@ -8,11 +8,18 @@ var _react = _interopRequireDefault(require("react"));
8
8
  var _reactNative = require("react-native");
9
9
  var _jsxRuntime = require("react/jsx-runtime");
10
10
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
- var _Dimensions$get = _reactNative.Dimensions.get('window'),
11
+ var _Dimensions$get = _reactNative.Dimensions.get("window"),
12
12
  SCREEN_WIDTH = _Dimensions$get.width;
13
13
  var NUM_COLUMNS = 3;
14
- var ITEM_MARGIN = 8;
15
- var ITEM_SIZE = (SCREEN_WIDTH - 40 - ITEM_MARGIN * (NUM_COLUMNS - 1) * 2) / NUM_COLUMNS;
14
+ var ITEM_MARGIN = 4; // Match MediaGallery margin
15
+ // Calculate item size accounting for:
16
+ // - Container padding (md = 12px on each side = 24px total)
17
+ // - Grid padding (2px on each side = 4px total)
18
+ // - Item margins between items (4px * 2 gaps = 8px total)
19
+ var CONTAINER_PADDING = 24; // paddingHorizontal md (12 * 2)
20
+ var GRID_PADDING = 4; // padding 2 on each side (2 * 2)
21
+ var TOTAL_MARGINS = ITEM_MARGIN * (NUM_COLUMNS - 1) * 2; // margins between items (4px * 2 gaps = 8px)
22
+ var ITEM_SIZE = (SCREEN_WIDTH - CONTAINER_PADDING - GRID_PADDING - TOTAL_MARGINS) / NUM_COLUMNS;
16
23
  var ImagesSkeleton = function ImagesSkeleton(_ref) {
17
24
  var _ref$per_page = _ref.per_page,
18
25
  per_page = _ref$per_page === void 0 ? 30 : _ref$per_page;
@@ -37,15 +44,15 @@ var ImagesSkeleton = function ImagesSkeleton(_ref) {
37
44
  };
38
45
  var styles = _reactNative.StyleSheet.create({
39
46
  container: {
40
- flexDirection: 'row',
41
- flexWrap: 'wrap',
42
- padding: 4
47
+ flexDirection: "row",
48
+ flexWrap: "wrap",
49
+ padding: 2 // Match MediaGallery grid padding
43
50
  },
44
51
  skeletonItem: {
45
- backgroundColor: '#E5E5E5',
52
+ backgroundColor: "#E5E5E5",
46
53
  borderRadius: 8,
47
- justifyContent: 'center',
48
- alignItems: 'center',
54
+ justifyContent: "center",
55
+ alignItems: "center",
49
56
  opacity: 0.3
50
57
  }
51
58
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tradly/asset",
3
- "version": "1.0.20",
3
+ "version": "1.0.21",
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",