@cashub/ui 0.3.3 → 0.4.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/cropper/Cropper.js +66 -0
- package/cropper/CropperHandler.js +44 -0
- package/dropzone/FileDropzone.js +535 -0
- package/dropzone/ImageDropzone.js +275 -0
- package/dropzone/Message.js +26 -0
- package/heading/Heading3.js +31 -0
- package/image/ImageFigure.js +31 -0
- package/image/ImageFluid.js +21 -0
- package/image/UploadImage.js +207 -0
- package/package.json +1 -1
- package/partial/modal/CropImageModal.js +111 -0
- package/styles/mixin/rounded.js +22 -0
- package/toast/MessageContainer.js +42 -0
- package/utils/aria/keycode.js +16 -0
- package/utils/dataURLtoFile.js +25 -0
- package/utils/format/formatSize.js +36 -0
- package/utils/getBase64.js +22 -0
- package/utils/image/resize.js +49 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
|
|
10
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
11
|
+
|
|
12
|
+
var _fi = require("react-icons/fi");
|
|
13
|
+
|
|
14
|
+
var _md = require("react-icons/md");
|
|
15
|
+
|
|
16
|
+
var _dataURLtoFile = _interopRequireDefault(require("../utils/dataURLtoFile"));
|
|
17
|
+
|
|
18
|
+
var _HiddenFileInput = _interopRequireDefault(require("../file/HiddenFileInput"));
|
|
19
|
+
|
|
20
|
+
var _Message = _interopRequireDefault(require("./Message"));
|
|
21
|
+
|
|
22
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
23
|
+
|
|
24
|
+
var _templateObject, _templateObject2, _templateObject3, _templateObject4;
|
|
25
|
+
|
|
26
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
27
|
+
|
|
28
|
+
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
29
|
+
|
|
30
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
31
|
+
|
|
32
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
33
|
+
|
|
34
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
35
|
+
|
|
36
|
+
function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); }
|
|
37
|
+
|
|
38
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
39
|
+
|
|
40
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
41
|
+
|
|
42
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
43
|
+
|
|
44
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
45
|
+
|
|
46
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
47
|
+
|
|
48
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
49
|
+
|
|
50
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
51
|
+
|
|
52
|
+
var ImageDropzone = function ImageDropzone(_ref) {
|
|
53
|
+
var maxFiles = _ref.maxFiles,
|
|
54
|
+
message = _ref.message,
|
|
55
|
+
accept = _ref.accept,
|
|
56
|
+
onAddedFile = _ref.onAddedFile,
|
|
57
|
+
onRemovedFile = _ref.onRemovedFile,
|
|
58
|
+
setDropzoneFunc = _ref.setDropzoneFunc,
|
|
59
|
+
cropper = _ref.cropper;
|
|
60
|
+
var inputRef = (0, _react.useRef)(null);
|
|
61
|
+
|
|
62
|
+
var _useState = (0, _react.useState)([]),
|
|
63
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
64
|
+
files = _useState2[0],
|
|
65
|
+
setFiles = _useState2[1];
|
|
66
|
+
|
|
67
|
+
var _useState3 = (0, _react.useState)(false),
|
|
68
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
69
|
+
dragging = _useState4[0],
|
|
70
|
+
setDragging = _useState4[1];
|
|
71
|
+
|
|
72
|
+
var _useState5 = (0, _react.useState)([]),
|
|
73
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
74
|
+
addedFiles = _useState6[0],
|
|
75
|
+
setAddedFiles = _useState6[1];
|
|
76
|
+
|
|
77
|
+
var handleClick = function handleClick() {
|
|
78
|
+
if (files.length >= maxFiles) return;
|
|
79
|
+
inputRef.current.click();
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
var handleDragEnter = function handleDragEnter(e) {
|
|
83
|
+
e.preventDefault();
|
|
84
|
+
e.stopPropagation();
|
|
85
|
+
if (files.length < maxFiles) setDragging(true);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
var handleDragOver = function handleDragOver(e) {
|
|
89
|
+
e.preventDefault();
|
|
90
|
+
e.stopPropagation();
|
|
91
|
+
if (files.length < maxFiles) setDragging(true);
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
var handleDragLeave = function handleDragLeave(e) {
|
|
95
|
+
e.preventDefault();
|
|
96
|
+
e.stopPropagation();
|
|
97
|
+
if (files.length < maxFiles) setDragging(false);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
var handleDrop = function handleDrop(e) {
|
|
101
|
+
e.preventDefault();
|
|
102
|
+
e.stopPropagation();
|
|
103
|
+
|
|
104
|
+
if (files.length < maxFiles) {
|
|
105
|
+
setDragging(false);
|
|
106
|
+
var dataTransfer = e.dataTransfer;
|
|
107
|
+
|
|
108
|
+
var _dataTransfer$files = _toArray(dataTransfer.files),
|
|
109
|
+
newFiles = _dataTransfer$files.slice(0);
|
|
110
|
+
|
|
111
|
+
if (files.length + newFiles.length > maxFiles) {
|
|
112
|
+
newFiles.splice(maxFiles - files.length);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
for (var i = 0; i < newFiles.length; i++) {
|
|
116
|
+
newFiles[i].url = URL.createObjectURL(newFiles[i]);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
setFiles([].concat(_toConsumableArray(files), _toConsumableArray(newFiles)));
|
|
120
|
+
setAddedFiles(newFiles);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
var handleAddFiles = (0, _react.useCallback)(function (newFiles) {
|
|
125
|
+
if (files.length + newFiles.length > maxFiles) {
|
|
126
|
+
newFiles.splice(maxFiles - files.length);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
for (var i = 0; i < newFiles.length; i++) {
|
|
130
|
+
newFiles[i].url = URL.createObjectURL(newFiles[i]);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
setFiles([].concat(_toConsumableArray(files), _toConsumableArray(newFiles)));
|
|
134
|
+
setAddedFiles(newFiles);
|
|
135
|
+
}, [files, maxFiles]);
|
|
136
|
+
var handleRemoveFile = (0, _react.useCallback)(function (e, index) {
|
|
137
|
+
if (e) {
|
|
138
|
+
e.stopPropagation();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
var newFiles = _toConsumableArray(files);
|
|
142
|
+
|
|
143
|
+
newFiles.splice(index, 1);
|
|
144
|
+
setFiles(newFiles);
|
|
145
|
+
if (onRemovedFile) onRemovedFile(index);
|
|
146
|
+
}, [files, onRemovedFile]);
|
|
147
|
+
var handleChangeFile = (0, _react.useCallback)(function (e) {
|
|
148
|
+
var files = e.target.files;
|
|
149
|
+
var newFiles = [];
|
|
150
|
+
|
|
151
|
+
for (var i = 0; i < files.length; i++) {
|
|
152
|
+
newFiles.push(files[i]);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
handleAddFiles(newFiles);
|
|
156
|
+
inputRef.current.value = '';
|
|
157
|
+
}, [handleAddFiles]);
|
|
158
|
+
var handleCrop = (0, _react.useCallback)(function (e, index, file) {
|
|
159
|
+
e.stopPropagation();
|
|
160
|
+
cropper.handler({
|
|
161
|
+
src: file.url,
|
|
162
|
+
file: file,
|
|
163
|
+
width: 180,
|
|
164
|
+
height: 320,
|
|
165
|
+
onCrop: function onCrop(croppedSrc) {
|
|
166
|
+
var croppedImageFile = (0, _dataURLtoFile.default)(croppedSrc, file.name);
|
|
167
|
+
croppedImageFile.url = croppedSrc;
|
|
168
|
+
cropper.onCrop(index, croppedImageFile);
|
|
169
|
+
setFiles(function (previousFiles) {
|
|
170
|
+
var newFiles = _toConsumableArray(previousFiles);
|
|
171
|
+
|
|
172
|
+
newFiles[index] = croppedImageFile;
|
|
173
|
+
return newFiles;
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}, [cropper]);
|
|
178
|
+
|
|
179
|
+
var previewItem = function previewItem() {
|
|
180
|
+
return files.map(function (file, index) {
|
|
181
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Image, {
|
|
182
|
+
onClick: function onClick(e) {
|
|
183
|
+
e.stopPropagation();
|
|
184
|
+
},
|
|
185
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(ButtonGroup, {
|
|
186
|
+
children: [cropper && /*#__PURE__*/(0, _jsxRuntime.jsx)(Button, {
|
|
187
|
+
title: "Crop",
|
|
188
|
+
onClick: function onClick(e) {
|
|
189
|
+
return handleCrop(e, index, file);
|
|
190
|
+
},
|
|
191
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_md.MdCrop, {})
|
|
192
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(Button, {
|
|
193
|
+
danger: true,
|
|
194
|
+
title: "Remove",
|
|
195
|
+
onClick: function onClick(e) {
|
|
196
|
+
return handleRemoveFile(e, index);
|
|
197
|
+
},
|
|
198
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_fi.FiX, {})
|
|
199
|
+
})]
|
|
200
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("img", {
|
|
201
|
+
crossOrigin: "anonymous",
|
|
202
|
+
src: file.url,
|
|
203
|
+
alt: file.name
|
|
204
|
+
})]
|
|
205
|
+
}, index);
|
|
206
|
+
});
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
var addFiles = (0, _react.useCallback)(function (files) {
|
|
210
|
+
handleAddFiles(files);
|
|
211
|
+
}, [handleAddFiles]);
|
|
212
|
+
var remove = (0, _react.useCallback)(function (index) {
|
|
213
|
+
handleRemoveFile(null, index);
|
|
214
|
+
}, [handleRemoveFile]);
|
|
215
|
+
(0, _react.useEffect)(function () {
|
|
216
|
+
if (addedFiles.length > 0 && onAddedFile) {
|
|
217
|
+
var startIndex = files.length - addedFiles.length;
|
|
218
|
+
addedFiles.forEach(function (file, index) {
|
|
219
|
+
onAddedFile(file, startIndex + index);
|
|
220
|
+
});
|
|
221
|
+
setAddedFiles([]);
|
|
222
|
+
}
|
|
223
|
+
}, [addedFiles, onAddedFile, files]);
|
|
224
|
+
(0, _react.useEffect)(function () {
|
|
225
|
+
setDropzoneFunc({
|
|
226
|
+
addFiles: addFiles,
|
|
227
|
+
remove: remove
|
|
228
|
+
});
|
|
229
|
+
}, [setDropzoneFunc, addFiles, remove]);
|
|
230
|
+
var messageItem = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Message.default, {
|
|
231
|
+
dragging: dragging,
|
|
232
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_fi.FiUpload, {
|
|
233
|
+
role: "img",
|
|
234
|
+
"aria-hidden": "true",
|
|
235
|
+
"data-icon": "upload"
|
|
236
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
237
|
+
children: message
|
|
238
|
+
})]
|
|
239
|
+
});
|
|
240
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Wrapper, {
|
|
241
|
+
onClick: handleClick,
|
|
242
|
+
onDragEnter: handleDragEnter,
|
|
243
|
+
onDragLeave: handleDragLeave,
|
|
244
|
+
onDragOver: handleDragOver,
|
|
245
|
+
onDrop: handleDrop,
|
|
246
|
+
reachedLimit: files.length >= maxFiles,
|
|
247
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_HiddenFileInput.default, {
|
|
248
|
+
multiple: true,
|
|
249
|
+
ref: inputRef,
|
|
250
|
+
accept: accept,
|
|
251
|
+
onChange: handleChangeFile
|
|
252
|
+
}), files.length === 0 ? messageItem : previewItem()]
|
|
253
|
+
});
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
var Wrapper = _styledComponents.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n min-height: 200px;\n border: 4px dashed var(--border-color);\n border-radius: var(--border-radius-l);\n color: var(--font-on-primary);\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n padding: var(--spacing-xs);\n cursor: ", ";\n"])), function (_ref2) {
|
|
257
|
+
var reachedLimit = _ref2.reachedLimit;
|
|
258
|
+
return reachedLimit ? 'default' : 'pointer';
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
var Image = _styledComponents.default.figure(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n width: 180px;\n height: 320px;\n position: relative;\n margin: var(--spacing-xs);\n\n > img {\n width: 100%;\n height: 100%;\n border-radius: var(--border-radius);\n }\n"])));
|
|
262
|
+
|
|
263
|
+
var ButtonGroup = _styledComponents.default.div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n position: absolute;\n right: calc(var(--spacing-xs) * -1);\n top: calc(var(--spacing-xs) * -1);\n"])));
|
|
264
|
+
|
|
265
|
+
var Button = _styledComponents.default.div.attrs(function () {
|
|
266
|
+
return {
|
|
267
|
+
role: 'button'
|
|
268
|
+
};
|
|
269
|
+
})(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n display: inline-block;\n width: 32px;\n height: 32px;\n color: var(--color-white);\n background: var(--color-primary);\n border-radius: var(--border-radius-round);\n cursor: pointer;\n\n > svg {\n color: var(--color-white);\n margin: 0 auto;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n margin: 0 auto;\n display: block;\n }\n\n &:not(:first-child) {\n margin-left: var(--spacing-xs);\n }\n\n ", "\n"])), function (_ref3) {
|
|
270
|
+
var danger = _ref3.danger;
|
|
271
|
+
return danger && 'background: var(--color-danger);';
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
var _default = ImageDropzone;
|
|
275
|
+
exports.default = _default;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
9
|
+
|
|
10
|
+
var _templateObject;
|
|
11
|
+
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
|
|
14
|
+
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
15
|
+
|
|
16
|
+
var Message = _styledComponents.default.div.attrs(function () {
|
|
17
|
+
return {
|
|
18
|
+
'data-testid': 'message-container'
|
|
19
|
+
};
|
|
20
|
+
})(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n text-align: center;\n\n > svg {\n margin-bottom: var(--spacing-s);\n font-size: var(--font-h2);\n }\n\n ", ";\n"])), function (_ref) {
|
|
21
|
+
var dragging = _ref.dragging;
|
|
22
|
+
return dragging ? 'opacity: 0.5' : '';
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
var _default = Message;
|
|
26
|
+
exports.default = _default;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
9
|
+
|
|
10
|
+
var _templateObject;
|
|
11
|
+
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
|
|
14
|
+
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
15
|
+
|
|
16
|
+
var Heading3 = _styledComponents.default.h3(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n font-size: var(--font-h3);\n word-break: break-word;\n\n ", "\n\n ", "\n\n ", "\n\n ", "\n"])), function (_ref) {
|
|
17
|
+
var center = _ref.center;
|
|
18
|
+
return center && 'text-align: center;';
|
|
19
|
+
}, function (_ref2) {
|
|
20
|
+
var fontWeightNormal = _ref2.fontWeightNormal;
|
|
21
|
+
return fontWeightNormal && 'font-weight: normal;';
|
|
22
|
+
}, function (_ref3) {
|
|
23
|
+
var marginBottomXS = _ref3.marginBottomXS;
|
|
24
|
+
return marginBottomXS && 'margin-bottom: var(--spacing-xs);';
|
|
25
|
+
}, function (_ref4) {
|
|
26
|
+
var paddingBottomXS = _ref4.paddingBottomXS;
|
|
27
|
+
return paddingBottomXS && 'padding-bottom: var(--spacing-xs);';
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
var _default = Heading3;
|
|
31
|
+
exports.default = _default;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
9
|
+
|
|
10
|
+
var _rounded = _interopRequireDefault(require("../styles/mixin/rounded"));
|
|
11
|
+
|
|
12
|
+
var _templateObject;
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
17
|
+
|
|
18
|
+
var ImageFigure = _styledComponents.default.figure.attrs(function () {
|
|
19
|
+
return {
|
|
20
|
+
rounded: true
|
|
21
|
+
};
|
|
22
|
+
})(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width: 160px;\n height: 160px;\n border: 4px dashed var(--border-color);\n padding: var(--spacing-xs);\n margin-left: var(--spacing);\n\n ", "\n\n ", "\n\n ", "\n"])), function (_ref) {
|
|
23
|
+
var small = _ref.small;
|
|
24
|
+
return small && "\n width: 40px;\n height: 40px;\n ";
|
|
25
|
+
}, _rounded.default, function (_ref2) {
|
|
26
|
+
var noBorder = _ref2.noBorder;
|
|
27
|
+
return noBorder && 'border: none;';
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
var _default = ImageFigure;
|
|
31
|
+
exports.default = _default;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
9
|
+
|
|
10
|
+
var _rounded = _interopRequireDefault(require("../styles/mixin/rounded"));
|
|
11
|
+
|
|
12
|
+
var _templateObject;
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
17
|
+
|
|
18
|
+
var ImageFluid = _styledComponents.default.img(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width: 100%;\n height: 100%;\n object-fit: cover;\n\n ", "\n"])), _rounded.default);
|
|
19
|
+
|
|
20
|
+
var _default = ImageFluid;
|
|
21
|
+
exports.default = _default;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
|
|
10
|
+
var _reactI18next = require("react-i18next");
|
|
11
|
+
|
|
12
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
13
|
+
|
|
14
|
+
var _fa = require("react-icons/fa");
|
|
15
|
+
|
|
16
|
+
var _md = require("react-icons/md");
|
|
17
|
+
|
|
18
|
+
var _reactToastify = require("react-toastify");
|
|
19
|
+
|
|
20
|
+
var _dataURLtoFile = _interopRequireDefault(require("../utils/dataURLtoFile"));
|
|
21
|
+
|
|
22
|
+
var _getBase = _interopRequireDefault(require("../utils/getBase64"));
|
|
23
|
+
|
|
24
|
+
var _MessageContainer = _interopRequireDefault(require("../toast/MessageContainer"));
|
|
25
|
+
|
|
26
|
+
var _HiddenFileInput = _interopRequireDefault(require("../file/HiddenFileInput"));
|
|
27
|
+
|
|
28
|
+
var _ImageFigure = _interopRequireDefault(require("../image/ImageFigure"));
|
|
29
|
+
|
|
30
|
+
var _ImageFluid = _interopRequireDefault(require("../image/ImageFluid"));
|
|
31
|
+
|
|
32
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
33
|
+
|
|
34
|
+
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
|
|
35
|
+
|
|
36
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
37
|
+
|
|
38
|
+
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
39
|
+
|
|
40
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
41
|
+
|
|
42
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
43
|
+
|
|
44
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
45
|
+
|
|
46
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
47
|
+
|
|
48
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
49
|
+
|
|
50
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
51
|
+
|
|
52
|
+
var UploadImage = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
53
|
+
var id = _ref.id,
|
|
54
|
+
src = _ref.src,
|
|
55
|
+
_ref$alt = _ref.alt,
|
|
56
|
+
alt = _ref$alt === void 0 ? 'user avatar' : _ref$alt,
|
|
57
|
+
_ref$roundedCircle = _ref.roundedCircle,
|
|
58
|
+
roundedCircle = _ref$roundedCircle === void 0 ? false : _ref$roundedCircle,
|
|
59
|
+
cropperHandler = _ref.cropperHandler;
|
|
60
|
+
|
|
61
|
+
var _useState = (0, _react.useState)(src),
|
|
62
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
63
|
+
currentSrc = _useState2[0],
|
|
64
|
+
setCurrentSrc = _useState2[1];
|
|
65
|
+
|
|
66
|
+
var _useState3 = (0, _react.useState)(null),
|
|
67
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
68
|
+
currentFile = _useState4[0],
|
|
69
|
+
setCurrentFile = _useState4[1];
|
|
70
|
+
|
|
71
|
+
var _useTranslation = (0, _reactI18next.useTranslation)(),
|
|
72
|
+
t = _useTranslation.t;
|
|
73
|
+
|
|
74
|
+
var handleAvatarRemove = function handleAvatarRemove(e) {
|
|
75
|
+
setCurrentSrc(src);
|
|
76
|
+
ref.current.value = '';
|
|
77
|
+
setCurrentFile(null);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
var restoreFile = (0, _react.useCallback)(function () {
|
|
81
|
+
if (!currentFile) return;
|
|
82
|
+
var dataTransfer = new DataTransfer();
|
|
83
|
+
dataTransfer.items.add(currentFile);
|
|
84
|
+
ref.current.files = dataTransfer.files;
|
|
85
|
+
}, [ref, currentFile]);
|
|
86
|
+
var handleImageFile = (0, _react.useCallback)(function (file, src) {
|
|
87
|
+
var dataTransfer = new DataTransfer();
|
|
88
|
+
var changedImageFile = (0, _dataURLtoFile.default)(src, file.name);
|
|
89
|
+
dataTransfer.items.add(changedImageFile);
|
|
90
|
+
setCurrentSrc(src);
|
|
91
|
+
setCurrentFile(changedImageFile);
|
|
92
|
+
ref.current.files = dataTransfer.files;
|
|
93
|
+
}, [ref]);
|
|
94
|
+
|
|
95
|
+
var handleOnChange = function handleOnChange(files) {
|
|
96
|
+
if (files.length === 0) {
|
|
97
|
+
//沒有傳檔案(叉叉或取消)
|
|
98
|
+
restoreFile();
|
|
99
|
+
} else {
|
|
100
|
+
var fileType = files[0].name.slice(files[0].name.lastIndexOf('.')).toLowerCase();
|
|
101
|
+
|
|
102
|
+
if (['.jpeg', '.bmp', '.jpg', '.png'].includes(fileType)) {
|
|
103
|
+
if (files[0].size < 2097152) {
|
|
104
|
+
var srcUrl = URL.createObjectURL(files[0]);
|
|
105
|
+
handleCrop(srcUrl, files[0]);
|
|
106
|
+
} else {
|
|
107
|
+
ref.current.value = '';
|
|
108
|
+
restoreFile();
|
|
109
|
+
|
|
110
|
+
_reactToastify.toast.error( /*#__PURE__*/(0, _jsxRuntime.jsx)(_MessageContainer.default, {
|
|
111
|
+
title: t('error:Upload'),
|
|
112
|
+
message: t('error:UploadSize', {
|
|
113
|
+
size: '2MB'
|
|
114
|
+
})
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
ref.current.value = '';
|
|
119
|
+
restoreFile();
|
|
120
|
+
|
|
121
|
+
_reactToastify.toast.error( /*#__PURE__*/(0, _jsxRuntime.jsx)(_MessageContainer.default, {
|
|
122
|
+
title: t('error:Upload'),
|
|
123
|
+
message: t('error:LogoMerchantFileType')
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
var handleCrop = (0, _react.useCallback)(function (src, file) {
|
|
130
|
+
cropperHandler({
|
|
131
|
+
src: src,
|
|
132
|
+
file: file,
|
|
133
|
+
width: 160,
|
|
134
|
+
height: 160,
|
|
135
|
+
onCrop: function onCrop(croppedSrc) {
|
|
136
|
+
handleImageFile(file, croppedSrc);
|
|
137
|
+
},
|
|
138
|
+
onClose: function onClose() {
|
|
139
|
+
(0, _getBase.default)(file, function (dataUrl) {
|
|
140
|
+
handleImageFile(file, dataUrl);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}, [cropperHandler, handleImageFile]);
|
|
145
|
+
(0, _react.useEffect)(function () {
|
|
146
|
+
setCurrentSrc(src);
|
|
147
|
+
}, [src, ref]);
|
|
148
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Wrapper, {
|
|
149
|
+
roundedCircle: roundedCircle,
|
|
150
|
+
children: [currentSrc && /*#__PURE__*/(0, _jsxRuntime.jsx)(_ImageFluid.default, {
|
|
151
|
+
crossOrigin: "anonymous",
|
|
152
|
+
src: currentSrc,
|
|
153
|
+
alt: alt,
|
|
154
|
+
rounded: true,
|
|
155
|
+
roundedCircle: roundedCircle
|
|
156
|
+
}), ref && /*#__PURE__*/(0, _jsxRuntime.jsxs)(ButtonGroup, {
|
|
157
|
+
roundedCircle: roundedCircle,
|
|
158
|
+
children: [ref.current && ref.current.files && ref.current.files.length !== 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(CropButton, {
|
|
159
|
+
roundedCircle: roundedCircle,
|
|
160
|
+
onClick: function onClick() {
|
|
161
|
+
handleCrop(currentSrc, ref.current.files[0]);
|
|
162
|
+
},
|
|
163
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_md.MdCrop, {})
|
|
164
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(ModifyButton, {
|
|
165
|
+
roundedCircle: roundedCircle,
|
|
166
|
+
onClick: function onClick() {
|
|
167
|
+
ref.current.click();
|
|
168
|
+
},
|
|
169
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_fa.FaPen, {})
|
|
170
|
+
})]
|
|
171
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_HiddenFileInput.default, {
|
|
172
|
+
ref: ref && ref,
|
|
173
|
+
id: id,
|
|
174
|
+
accept: ".jpeg, .bmp, .jpg, .png",
|
|
175
|
+
onChange: function onChange(e) {
|
|
176
|
+
return handleOnChange(e.target.files);
|
|
177
|
+
}
|
|
178
|
+
}), ref && ref.current && ref.current.files && ref.current.files.length !== 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(RemoveIcon, {
|
|
179
|
+
onClick: handleAvatarRemove,
|
|
180
|
+
roundedCircle: roundedCircle,
|
|
181
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_fa.FaTimes, {})
|
|
182
|
+
})]
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
var Wrapper = (0, _styledComponents.default)(_ImageFigure.default)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n position: relative;\n padding: var(--spacing-xs);\n"])));
|
|
186
|
+
|
|
187
|
+
var ButtonGroup = _styledComponents.default.div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n position: absolute;\n top: -16px;\n right: -12px;\n\n ", "\n"])), function (_ref2) {
|
|
188
|
+
var rounded = _ref2.rounded;
|
|
189
|
+
return rounded && "\n top: 0;\n right: 0;\n ";
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
var ActionButton = _styledComponents.default.button(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n display: inline-flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n width: 32px;\n height: 32px;\n border: none;\n"])));
|
|
193
|
+
|
|
194
|
+
var CropButton = (0, _styledComponents.default)(ActionButton)(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n color: var(--font-on-primary);\n background: var(--color-primary);\n border-radius: var(--border-radius);\n\n ", "\n"])), function (_ref3) {
|
|
195
|
+
var roundedCircle = _ref3.roundedCircle;
|
|
196
|
+
return roundedCircle && "\n position: relative;\n top: -16px;\n ";
|
|
197
|
+
});
|
|
198
|
+
var ModifyButton = (0, _styledComponents.default)(ActionButton)(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n color: var(--font-on-primary);\n background: var(--color-primary);\n border-radius: var(--border-radius);\n margin-left: var(--spacing-xs);\n\n ", "\n"])), function (_ref4) {
|
|
199
|
+
var roundedCircle = _ref4.roundedCircle;
|
|
200
|
+
return roundedCircle && "\n position: relative;\n top: 4px;\n ";
|
|
201
|
+
});
|
|
202
|
+
var RemoveIcon = (0, _styledComponents.default)(ActionButton)(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n position: absolute;\n color: var(--font-on-danger);\n background: var(--color-danger);\n border-radius: var(--border-radius);\n bottom: -12px;\n right: -12px;\n\n ", "\n"])), function (_ref5) {
|
|
203
|
+
var roundedCircle = _ref5.roundedCircle;
|
|
204
|
+
return roundedCircle && "\n bottom: 0;\n right: 4px;\n ";
|
|
205
|
+
});
|
|
206
|
+
var _default = UploadImage;
|
|
207
|
+
exports.default = _default;
|