contentoh-components-library 21.6.55 → 21.6.57
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/.claude/launch.json +14 -0
- package/.env.test +1 -0
- package/dist/ai/prompts/attribute.prompt.js +28 -0
- package/dist/ai/prompts/description.prompt.js +33 -0
- package/dist/ai/schemas/attribute.schema.js +35 -0
- package/dist/ai/schemas/description.schema.js +27 -0
- package/dist/components/atoms/AsignationOption/index.js +1 -0
- package/dist/components/atoms/AsignationOption/styles.js +1 -1
- package/dist/components/atoms/AssetPreview/AssetPreview.stories.js +118 -0
- package/dist/components/atoms/AssetPreview/index.js +150 -0
- package/dist/components/atoms/AssetPreview/styles.js +28 -0
- package/dist/components/atoms/IconFile/index.js +85 -2
- package/dist/components/atoms/IconFile/styles.js +1 -1
- package/dist/components/atoms/ProductImage/ProductImage.stories.js +70 -2
- package/dist/components/atoms/ProductImage/index.js +100 -27
- package/dist/components/atoms/ProductImage/styles.js +3 -1
- package/dist/components/molecules/EditionActiveImage/index.js +4 -2
- package/dist/components/molecules/GalleryAssetElement/GalleryAssetElement.stories.js +147 -0
- package/dist/components/molecules/GalleryAssetElement/index.js +178 -0
- package/dist/components/molecules/GalleryAssetElement/styles.js +26 -0
- package/dist/components/molecules/GalleryElement/index.js +13 -4
- package/dist/components/molecules/GalleryHeader/index.js +96 -24
- package/dist/components/molecules/GalleryHeader/styles.js +4 -1
- package/dist/components/molecules/GalleryTrayTabs/GalleryTrayTabs.stories.js +56 -0
- package/dist/components/molecules/GalleryTrayTabs/index.js +60 -0
- package/dist/components/molecules/GalleryTrayTabs/styles.js +20 -0
- package/dist/components/molecules/ImageSelector/index.js +1 -0
- package/dist/components/molecules/RetailerSelector/RetailerSelector.stories.js +23 -2
- package/dist/components/molecules/RetailerSelector/index.js +7 -2
- package/dist/components/molecules/RetailerSelectorv2/index.js +6 -2
- package/dist/components/organisms/DigitalAssetsTray/DigitalAssetsTray.stories.js +235 -0
- package/dist/components/organisms/DigitalAssetsTray/index.js +219 -0
- package/dist/components/organisms/DigitalAssetsTray/styles.js +22 -0
- package/dist/components/organisms/ImagePreviewer/index.js +1 -0
- package/dist/components/organisms/ProductImageModal/index.js +3 -2
- package/dist/components/pages/CreatorsProductEdition/CreatorsProductEditionView.js +905 -0
- package/dist/components/pages/CreatorsProductEdition/constants.js +19 -0
- package/dist/components/pages/CreatorsProductEdition/hooks/useCreatorsProductEdition.js +2967 -0
- package/dist/components/pages/CreatorsProductEdition/index.js +33 -0
- package/dist/components/pages/CreatorsProductEdition/mocks/api.fixtures.js +537 -0
- package/dist/components/pages/CreatorsProductEdition/mocks/mockApi.js +251 -0
- package/dist/components/pages/CreatorsProductEdition/sections/CommentBox.js +311 -0
- package/dist/components/pages/CreatorsProductEdition/sections/ImagePanel.js +421 -0
- package/dist/components/pages/CreatorsProductEdition/sections/ImagesSection.js +473 -0
- package/dist/components/pages/CreatorsProductEdition/sections/ProductHeader.js +379 -0
- package/dist/components/pages/CreatorsProductEdition/sections/ProductMedia.js +138 -0
- package/dist/components/pages/CreatorsProductEdition/sections/RetailerMenu.js +162 -0
- package/dist/components/pages/CreatorsProductEdition/sections/ServiceActions.js +542 -0
- package/dist/components/pages/CreatorsProductEdition/sections/StatusChip.js +50 -0
- package/dist/components/pages/CreatorsProductEdition/sections/TabsBar.js +247 -0
- package/dist/components/pages/CreatorsProductEdition/sections/VariantsPanel.js +389 -0
- package/dist/components/pages/CreatorsProductEdition/sections/tokens.js +90 -0
- package/dist/components/pages/CreatorsProductEdition/stories/CreatorsProductEdition.stories.js +168 -0
- package/dist/components/pages/CreatorsProductEdition/stories/CreatorsProductEditionAPI.stories.js +74 -0
- package/dist/components/pages/CreatorsProductEdition/styles.js +46 -0
- package/dist/components/pages/RetailerProductEdition/context/provider-product-edition.context.js +330 -15
- package/dist/components/pages/RetailerProductEdition/context/provider-product-edition.reducer.js +12 -2
- package/dist/components/pages/RetailerProductEdition/index.js +606 -425
- package/dist/components/pages/RetailerProductEdition/stories/ImageEditor.stories.js +1 -0
- package/dist/global-files/data.js +16 -3
- package/dist/global-files/digital-assets/assetTypes.js +517 -0
- package/dist/global-files/digital-assets/assets.actions.js +64 -0
- package/dist/global-files/digital-assets/assets.adapter.js +304 -0
- package/dist/global-files/digital-assets/assets.mock.js +136 -0
- package/dist/global-files/digital-assets/assets.reducer.js +220 -0
- package/dist/global-files/digital-assets/uploadAssets.js +202 -0
- package/dist/global-files/digital-assets/useDigitalAssets.js +535 -0
- package/dist/index.js +142 -90
- package/docs/activos-digitales.md +273 -0
- package/package.json +1 -1
- package/src/components/atoms/AsignationOption/index.js +1 -1
- package/src/components/atoms/AsignationOption/styles.js +9 -0
- package/src/components/atoms/AssetPreview/AssetPreview.stories.js +78 -0
- package/src/components/atoms/AssetPreview/index.js +119 -0
- package/src/components/atoms/AssetPreview/styles.js +190 -0
- package/src/components/atoms/IconFile/index.js +28 -1
- package/src/components/atoms/IconFile/styles.js +8 -0
- package/src/components/atoms/ProductImage/ProductImage.stories.js +38 -0
- package/src/components/atoms/ProductImage/index.js +95 -20
- package/src/components/atoms/ProductImage/styles.js +92 -7
- package/src/components/molecules/EditionActiveImage/index.js +2 -2
- package/src/components/molecules/GalleryAssetElement/GalleryAssetElement.stories.js +102 -0
- package/src/components/molecules/GalleryAssetElement/index.js +162 -0
- package/src/components/molecules/GalleryAssetElement/styles.js +163 -0
- package/src/components/molecules/GalleryElement/index.js +9 -0
- package/src/components/molecules/GalleryHeader/index.js +65 -13
- package/src/components/molecules/GalleryHeader/styles.js +2 -1
- package/src/components/molecules/GalleryTrayTabs/GalleryTrayTabs.stories.js +32 -0
- package/src/components/molecules/GalleryTrayTabs/index.js +41 -0
- package/src/components/molecules/GalleryTrayTabs/styles.js +52 -0
- package/src/components/molecules/ImageSelector/index.js +1 -0
- package/src/components/molecules/RetailerSelector/RetailerSelector.stories.js +15 -1
- package/src/components/molecules/RetailerSelector/index.js +8 -1
- package/src/components/molecules/RetailerSelectorv2/index.js +7 -1
- package/src/components/organisms/DigitalAssetsTray/DigitalAssetsTray.stories.js +164 -0
- package/src/components/organisms/DigitalAssetsTray/index.js +193 -0
- package/src/components/organisms/DigitalAssetsTray/styles.js +183 -0
- package/src/components/organisms/ImagePreviewer/index.js +1 -0
- package/src/components/organisms/ProductImageModal/index.js +1 -0
- package/src/components/pages/RetailerProductEdition/context/provider-product-edition.context.jsx +201 -0
- package/src/components/pages/RetailerProductEdition/context/provider-product-edition.reducer.js +12 -0
- package/src/components/pages/RetailerProductEdition/index.js +356 -139
- package/src/components/pages/RetailerProductEdition/stories/ImageEditor.stories.js +1 -0
- package/src/global-files/data.js +17 -2
- package/src/global-files/digital-assets/assetTypes.js +451 -0
- package/src/global-files/digital-assets/assets.actions.js +50 -0
- package/src/global-files/digital-assets/assets.adapter.js +229 -0
- package/src/global-files/digital-assets/assets.mock.js +122 -0
- package/src/global-files/digital-assets/assets.reducer.js +197 -0
- package/src/global-files/digital-assets/uploadAssets.js +124 -0
- package/src/global-files/digital-assets/useDigitalAssets.js +340 -0
- package/src/index.js +4 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.uploadToS3 = exports.requestPresign = void 0;
|
|
9
|
+
|
|
10
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
11
|
+
|
|
12
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
13
|
+
|
|
14
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
|
|
15
|
+
|
|
16
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/asyncToGenerator"));
|
|
17
|
+
|
|
18
|
+
var _axios = _interopRequireDefault(require("axios"));
|
|
19
|
+
|
|
20
|
+
var _assets = require("./assets.adapter");
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Subida de activos digitales a S3.
|
|
24
|
+
*
|
|
25
|
+
* El archivo NO pasa por ningún Lambda ni se convierte a base64. El backend
|
|
26
|
+
* firma la subida y el navegador manda el archivo directo al bucket. Es lo que
|
|
27
|
+
* permite subir un .psd de 300 MB: el camino que usan hoy las imágenes
|
|
28
|
+
* —`FileReader.readAsDataURL` y `putObject` con las llaves de AWS en el
|
|
29
|
+
* bundle— carga el archivo entero en memoria y lo infla un tercio.
|
|
30
|
+
*
|
|
31
|
+
* Es un POST multipart y no un PUT porque el backend firma con
|
|
32
|
+
* `createPresignedPost`, la única forma de que S3 aplique de verdad el tope de
|
|
33
|
+
* tamaño y el Content-Type. Con un PUT firmado, quien tenga la URL sube lo que
|
|
34
|
+
* quiera del tamaño que quiera.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Pide al backend que firme la subida de varios archivos a la vez.
|
|
39
|
+
*
|
|
40
|
+
* En una sola llamada y no una por archivo: soltar diez archivos son diez
|
|
41
|
+
* viajes de ida y vuelta que no hacen falta.
|
|
42
|
+
*
|
|
43
|
+
* Devuelve `uploads` (los que se firmaron) y `rejected` (los que el servidor no
|
|
44
|
+
* aceptó, con su motivo). El servidor valida por su cuenta aunque el front ya
|
|
45
|
+
* lo haya hecho: el front se puede saltar, y quien firma decide qué entra al
|
|
46
|
+
* bucket.
|
|
47
|
+
*/
|
|
48
|
+
var requestPresign = /*#__PURE__*/function () {
|
|
49
|
+
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
|
|
50
|
+
var _data, _data$body, _data2, _data3, _body$uploads, _body$rejected;
|
|
51
|
+
|
|
52
|
+
var articleId, assets, token, data, _yield$axios$post, body;
|
|
53
|
+
|
|
54
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
55
|
+
while (1) {
|
|
56
|
+
switch (_context.prev = _context.next) {
|
|
57
|
+
case 0:
|
|
58
|
+
articleId = _ref.articleId, assets = _ref.assets, token = _ref.token;
|
|
59
|
+
_context.prev = 1;
|
|
60
|
+
_context.next = 4;
|
|
61
|
+
return _axios.default.post(process.env.REACT_APP_ASSETS_PRESIGN_ENDPOINT, {
|
|
62
|
+
articleId: articleId,
|
|
63
|
+
files: assets.map(function (asset) {
|
|
64
|
+
return (0, _objectSpread2.default)({
|
|
65
|
+
// El `ref` vuelve tal cual en la respuesta. Emparejar por nombre sería
|
|
66
|
+
// frágil: dos archivos que se llamen igual acabarían con la clave del
|
|
67
|
+
// otro.
|
|
68
|
+
ref: asset.tempId
|
|
69
|
+
}, (0, _assets.toPayload)(asset));
|
|
70
|
+
})
|
|
71
|
+
}, {
|
|
72
|
+
headers: {
|
|
73
|
+
Authorization: token
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
case 4:
|
|
78
|
+
_yield$axios$post = _context.sent;
|
|
79
|
+
data = _yield$axios$post.data;
|
|
80
|
+
_context.next = 12;
|
|
81
|
+
break;
|
|
82
|
+
|
|
83
|
+
case 8:
|
|
84
|
+
_context.prev = 8;
|
|
85
|
+
_context.t0 = _context["catch"](1);
|
|
86
|
+
// "Network Error" o "Request failed with status code 502" no le dicen nada
|
|
87
|
+
// al usuario. El detalle queda en la consola para quien lo diagnostique.
|
|
88
|
+
console.error("Activos digitales: falló la firma de la subida", _context.t0);
|
|
89
|
+
throw new Error("No se pudo preparar la subida. Revisa tu conexión e inténtalo de nuevo.");
|
|
90
|
+
|
|
91
|
+
case 12:
|
|
92
|
+
// `integration: lambda` de API Gateway devuelve el objeto del handler tal
|
|
93
|
+
// cual, con el cuerpo como cadena, en vez de traducirlo a una respuesta HTTP.
|
|
94
|
+
body = typeof ((_data = data) === null || _data === void 0 ? void 0 : _data.body) === "string" ? JSON.parse(data.body) : (_data$body = (_data2 = data) === null || _data2 === void 0 ? void 0 : _data2.body) !== null && _data$body !== void 0 ? _data$body : data;
|
|
95
|
+
|
|
96
|
+
if (!((_data3 = data) !== null && _data3 !== void 0 && _data3.statusCode && data.statusCode >= 400)) {
|
|
97
|
+
_context.next = 15;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
throw new Error((body === null || body === void 0 ? void 0 : body.message) || "No se pudo preparar la subida");
|
|
102
|
+
|
|
103
|
+
case 15:
|
|
104
|
+
return _context.abrupt("return", {
|
|
105
|
+
uploads: (_body$uploads = body === null || body === void 0 ? void 0 : body.uploads) !== null && _body$uploads !== void 0 ? _body$uploads : [],
|
|
106
|
+
rejected: (_body$rejected = body === null || body === void 0 ? void 0 : body.rejected) !== null && _body$rejected !== void 0 ? _body$rejected : []
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
case 16:
|
|
110
|
+
case "end":
|
|
111
|
+
return _context.stop();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}, _callee, null, [[1, 8]]);
|
|
115
|
+
}));
|
|
116
|
+
|
|
117
|
+
return function requestPresign(_x) {
|
|
118
|
+
return _ref2.apply(this, arguments);
|
|
119
|
+
};
|
|
120
|
+
}();
|
|
121
|
+
/**
|
|
122
|
+
* Sube un archivo con los campos que firmó el backend.
|
|
123
|
+
*
|
|
124
|
+
* Se usa XMLHttpRequest y no fetch porque fetch todavía no sabe informar del
|
|
125
|
+
* progreso de subida. En un .psd de 300 MB la barra no es un adorno: sin ella
|
|
126
|
+
* la pantalla parece colgada durante minutos.
|
|
127
|
+
*
|
|
128
|
+
* El orden del FormData importa: S3 exige que el archivo vaya AL FINAL, después
|
|
129
|
+
* de todos los campos de la política. Si va antes, rechaza la petición.
|
|
130
|
+
*/
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
exports.requestPresign = requestPresign;
|
|
134
|
+
|
|
135
|
+
var uploadToS3 = function uploadToS3(_ref3) {
|
|
136
|
+
var upload = _ref3.upload,
|
|
137
|
+
file = _ref3.file,
|
|
138
|
+
onProgress = _ref3.onProgress;
|
|
139
|
+
return new Promise(function (resolve, reject) {
|
|
140
|
+
var form = new FormData();
|
|
141
|
+
Object.entries(upload.fields).forEach(function (_ref4) {
|
|
142
|
+
var _ref5 = (0, _slicedToArray2.default)(_ref4, 2),
|
|
143
|
+
name = _ref5[0],
|
|
144
|
+
value = _ref5[1];
|
|
145
|
+
|
|
146
|
+
return form.append(name, value);
|
|
147
|
+
});
|
|
148
|
+
form.append("file", file);
|
|
149
|
+
var xhr = new XMLHttpRequest();
|
|
150
|
+
xhr.open("POST", upload.url, true);
|
|
151
|
+
|
|
152
|
+
xhr.upload.onprogress = function (event) {
|
|
153
|
+
if (!event.lengthComputable) return;
|
|
154
|
+
onProgress === null || onProgress === void 0 ? void 0 : onProgress(Math.round(event.loaded / event.total * 100));
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
xhr.onload = function () {
|
|
158
|
+
var _$exec;
|
|
159
|
+
|
|
160
|
+
// S3 responde 204 sin cuerpo cuando acepta el archivo.
|
|
161
|
+
if (xhr.status >= 200 && xhr.status < 300) {
|
|
162
|
+
resolve(upload.key);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
/*
|
|
166
|
+
Los errores de S3 vienen en XML, no en JSON. Los dos que importan:
|
|
167
|
+
EntityTooLarge = el archivo se pasó del tope que firmamos, y AccessDenied
|
|
168
|
+
= al rol del Lambda le falta s3:PutObject sobre el prefijo, o sea que se
|
|
169
|
+
desplegó solo la función y no el servicio completo.
|
|
170
|
+
*/
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
var code = (_$exec = /<Code>(.*?)<\/Code>/.exec(xhr.responseText)) === null || _$exec === void 0 ? void 0 : _$exec[1]; // El código técnico va a la consola; al usuario, algo que pueda hacer.
|
|
174
|
+
|
|
175
|
+
console.error("Activos digitales: S3 rechazó la subida", code || xhr.status, xhr.responseText);
|
|
176
|
+
|
|
177
|
+
if (code === "EntityTooLarge") {
|
|
178
|
+
reject(new Error("El archivo supera el tamaño permitido."));
|
|
179
|
+
} else if (code === "AccessDenied") {
|
|
180
|
+
reject(new Error("No se pudo subir el archivo. Avisa a soporte (permiso de almacenamiento)."));
|
|
181
|
+
} else {
|
|
182
|
+
reject(new Error("No se pudo subir el archivo (".concat(code || xhr.status, "). Int\xE9ntalo de nuevo; si sigue fallando, avisa a soporte.")));
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
xhr.onerror = function () {
|
|
187
|
+
// Un fallo de red sin estatus casi siempre es CORS (el bucket tiene que
|
|
188
|
+
// permitir POST desde el origen de la aplicación) o una conexión caída. El
|
|
189
|
+
// navegador corta la petición y no deja rastro en ningún log del servidor.
|
|
190
|
+
console.error("Activos digitales: no hubo respuesta de S3 (red o CORS del bucket)");
|
|
191
|
+
reject(new Error("No se pudo conectar para subir el archivo. Revisa tu conexión e inténtalo de nuevo."));
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
xhr.onabort = function () {
|
|
195
|
+
return reject(new Error("Subida cancelada."));
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
xhr.send(form);
|
|
199
|
+
});
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
exports.uploadToS3 = uploadToS3;
|