@blerp/design 1.3.17 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Blerp/BlerpImageRow.js +176 -57
- package/dist/cjs/Blerp/BlerpSavePopup.js +44 -40
- package/dist/cjs/Blerp/BlerpTitleRow.js +36 -19
- package/dist/cjs/Blerp/BlerpTopRow.js +110 -44
- package/dist/cjs/Blerp.js +9 -16
- package/dist/cjs/BlerpAudioContextProvider.js +2 -2
- package/dist/cjs/BlerpListView.js +318 -168
- package/dist/cjs/BlerpListViewPremium.js +155 -130
- package/dist/cjs/BlerpListViewSkeleton.js +60 -13
- package/dist/cjs/BlerpSkeleton.js +32 -9
- package/dist/cjs/CollectionCard.js +139 -60
- package/dist/cjs/CollectionListViewPremium.js +368 -297
- package/dist/cjs/CollectionSkeleton.js +74 -13
- package/dist/cjs/Dropdown.js +272 -172
- package/dist/cjs/EllipsisLoader.js +66 -21
- package/dist/cjs/GroupCard.js +64 -57
- package/dist/cjs/Icons/Icons.js +288 -426
- package/dist/cjs/ImageEditor.js +247 -0
- package/dist/cjs/ImageUpload.js +226 -0
- package/dist/cjs/NewBlerp.js +354 -160
- package/dist/cjs/NewBlerpTest.js +10 -792
- package/dist/cjs/NewCollectionModal.js +294 -310
- package/dist/cjs/PremiumCollectionCard.js +191 -454
- package/dist/cjs/PurchaseModals/CheckoutModal.js +1 -1
- package/dist/cjs/PurchaseModals/PremiumBlerpCheckoutModal.js +1 -1
- package/dist/cjs/PurchaseModals/PremiumCollectionCheckoutModal.js +1 -1
- package/dist/cjs/PurchaseModals/PremiumSubscriptionCheckoutModal.js +1 -1
- package/dist/cjs/ReactionButtons.js +26 -13
- package/dist/cjs/SnackbarContextProvider.js +200 -116
- package/dist/cjs/Theme.js +217 -90
- package/dist/cjs/Toggle.js +86 -32
- package/dist/cjs/UserCard.js +13 -32
- package/dist/cjs/UserPage/LibraryControls.js +180 -93
- package/dist/cjs/UserPage/UserLibraryHeader.js +23 -14
- package/dist/cjs/UserPage/UserProfileHeader.js +120 -105
- package/dist/cjs/UsernameWithPopout.js +12 -8
- package/dist/cjs/colors.js +15 -8
- package/dist/cjs/helpers.js +131 -0
- package/dist/cjs/index.js +92 -58
- package/dist/cjs/neo-components/Autocomplete.js +280 -0
- package/dist/cjs/neo-components/BottomNavigation.js +120 -0
- package/dist/cjs/neo-components/Box.js +48 -0
- package/dist/cjs/neo-components/Button.js +206 -0
- package/dist/cjs/neo-components/CircularProgress.js +92 -0
- package/dist/cjs/neo-components/Container.js +75 -0
- package/dist/cjs/neo-components/Dialog.js +441 -0
- package/dist/cjs/neo-components/Fab.js +237 -0
- package/dist/cjs/neo-components/FormControls.js +1057 -0
- package/dist/cjs/neo-components/Grid.js +256 -0
- package/dist/cjs/neo-components/IconButton.js +111 -0
- package/dist/cjs/neo-components/Input.js +493 -0
- package/dist/cjs/neo-components/Layout.js +1213 -0
- package/dist/cjs/neo-components/Misc.js +858 -0
- package/dist/cjs/neo-components/Navigation.js +1578 -0
- package/dist/cjs/neo-components/Paper.js +256 -0
- package/dist/cjs/neo-components/Stack.js +194 -0
- package/dist/cjs/neo-components/Stepper.js +291 -0
- package/dist/cjs/neo-components/Text.js +290 -0
- package/dist/cjs/neo-components/ThemeProvider.js +731 -0
- package/dist/cjs/neo-components/ToggleButton.js +223 -0
- package/dist/cjs/neo-components/createTheme.js +306 -0
- package/dist/cjs/neo-components/withSx.js +164 -0
- package/dist/cjs/neo-utils/sxToStyle.js +508 -0
- package/dist/esm/Blerp/BlerpImageRow.js +166 -46
- package/dist/esm/Blerp/BlerpSavePopup.js +35 -27
- package/dist/esm/Blerp/BlerpTitleRow.js +32 -13
- package/dist/esm/Blerp/BlerpTopRow.js +85 -16
- package/dist/esm/Blerp.js +4 -12
- package/dist/esm/BlerpAudioContextProvider.js +1 -2
- package/dist/esm/BlerpListView.js +313 -160
- package/dist/esm/BlerpListViewPremium.js +135 -109
- package/dist/esm/BlerpListViewSkeleton.js +60 -11
- package/dist/esm/BlerpSkeleton.js +32 -7
- package/dist/esm/CollectionCard.js +118 -38
- package/dist/esm/CollectionListViewPremium.js +367 -294
- package/dist/esm/CollectionSkeleton.js +73 -11
- package/dist/esm/Dropdown.js +260 -161
- package/dist/esm/EllipsisLoader.js +63 -18
- package/dist/esm/GroupCard.js +54 -46
- package/dist/esm/Icons/Icons.js +226 -367
- package/dist/esm/ImageEditor.js +240 -0
- package/dist/esm/ImageUpload.js +217 -0
- package/dist/esm/NewBlerp.js +282 -79
- package/dist/esm/NewBlerpTest.js +11 -781
- package/dist/esm/NewCollectionModal.js +289 -304
- package/dist/esm/PremiumCollectionCard.js +192 -451
- package/dist/esm/PurchaseModals/CheckoutModal.js +1 -1
- package/dist/esm/PurchaseModals/PremiumBlerpCheckoutModal.js +1 -1
- package/dist/esm/PurchaseModals/PremiumCollectionCheckoutModal.js +1 -1
- package/dist/esm/PurchaseModals/PremiumSubscriptionCheckoutModal.js +1 -1
- package/dist/esm/ReactionButtons.js +23 -8
- package/dist/esm/SnackbarContextProvider.js +196 -110
- package/dist/esm/Theme.js +187 -66
- package/dist/esm/Toggle.js +84 -29
- package/dist/esm/UserCard.js +1 -20
- package/dist/esm/UserPage/LibraryControls.js +159 -65
- package/dist/esm/UserPage/UserLibraryHeader.js +18 -10
- package/dist/esm/UserPage/UserProfileHeader.js +100 -79
- package/dist/esm/UsernameWithPopout.js +7 -4
- package/dist/esm/colors.js +11 -9
- package/dist/esm/helpers.js +122 -0
- package/dist/esm/icons.js +1 -1
- package/dist/esm/index.js +32 -2
- package/dist/esm/neo-components/Autocomplete.js +269 -0
- package/dist/esm/neo-components/BottomNavigation.js +109 -0
- package/dist/esm/neo-components/Box.js +36 -0
- package/dist/esm/neo-components/Button.js +194 -0
- package/dist/esm/neo-components/CircularProgress.js +81 -0
- package/dist/esm/neo-components/Container.js +63 -0
- package/dist/esm/neo-components/Dialog.js +423 -0
- package/dist/esm/neo-components/Fab.js +225 -0
- package/dist/esm/neo-components/FormControls.js +1041 -0
- package/dist/esm/neo-components/Grid.js +244 -0
- package/dist/esm/neo-components/IconButton.js +99 -0
- package/dist/esm/neo-components/Input.js +478 -0
- package/dist/esm/neo-components/Layout.js +1179 -0
- package/dist/esm/neo-components/Misc.js +840 -0
- package/dist/esm/neo-components/Navigation.js +1556 -0
- package/dist/esm/neo-components/Paper.js +243 -0
- package/dist/esm/neo-components/Stack.js +182 -0
- package/dist/esm/neo-components/Stepper.js +278 -0
- package/dist/esm/neo-components/Text.js +277 -0
- package/dist/esm/neo-components/ThemeProvider.js +718 -0
- package/dist/esm/neo-components/ToggleButton.js +214 -0
- package/dist/esm/neo-components/createTheme.js +297 -0
- package/dist/esm/neo-components/withSx.js +153 -0
- package/dist/esm/neo-utils/sxToStyle.js +502 -0
- package/package.json +19 -15
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
|
|
6
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
7
|
+
|
|
8
|
+
var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
|
|
9
|
+
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
10
|
+
|
|
11
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
12
|
+
|
|
13
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
14
|
+
const ImageEditor = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
15
|
+
let {
|
|
16
|
+
image,
|
|
17
|
+
width = 250,
|
|
18
|
+
height = 250,
|
|
19
|
+
borderRadius = 0,
|
|
20
|
+
scale = 1,
|
|
21
|
+
position = {
|
|
22
|
+
x: 0.5,
|
|
23
|
+
y: 0.5
|
|
24
|
+
},
|
|
25
|
+
onPositionChange,
|
|
26
|
+
rotate = 0,
|
|
27
|
+
crossOrigin = 'anonymous',
|
|
28
|
+
style = {},
|
|
29
|
+
className = ''
|
|
30
|
+
} = _ref;
|
|
31
|
+
const canvasRef = React.useRef(null);
|
|
32
|
+
const containerRef = React.useRef(null);
|
|
33
|
+
const imageRef = React.useRef(null);
|
|
34
|
+
const [internalPosition, setInternalPosition] = React.useState(position);
|
|
35
|
+
const [isDragging, setIsDragging] = React.useState(false);
|
|
36
|
+
const dragStart = React.useRef({
|
|
37
|
+
x: 0,
|
|
38
|
+
y: 0
|
|
39
|
+
});
|
|
40
|
+
const [imageLoaded, setImageLoaded] = React.useState(false);
|
|
41
|
+
const [imageError, setImageError] = React.useState(false); // Expose the same API as react-avatar-editor
|
|
42
|
+
|
|
43
|
+
React.useImperativeHandle(ref, () => ({
|
|
44
|
+
getImage: () => {
|
|
45
|
+
return canvasRef.current;
|
|
46
|
+
},
|
|
47
|
+
getImageScaledToCanvas: () => {
|
|
48
|
+
return canvasRef.current;
|
|
49
|
+
}
|
|
50
|
+
})); // Sync position prop with internal state
|
|
51
|
+
|
|
52
|
+
React.useEffect(() => {
|
|
53
|
+
setInternalPosition(position);
|
|
54
|
+
}, [position]); // Draw the image on canvas
|
|
55
|
+
|
|
56
|
+
const drawImage = React.useCallback(() => {
|
|
57
|
+
if (!imageRef.current || !imageLoaded) return;
|
|
58
|
+
const canvas = canvasRef.current;
|
|
59
|
+
if (!canvas) return;
|
|
60
|
+
const ctx = canvas.getContext('2d'); // Clear canvas
|
|
61
|
+
|
|
62
|
+
ctx.clearRect(0, 0, width, height); // Save context for clipping
|
|
63
|
+
|
|
64
|
+
ctx.save(); // Apply circular clipping if borderRadius equals half of width (circular)
|
|
65
|
+
|
|
66
|
+
if (borderRadius > 0) {
|
|
67
|
+
ctx.beginPath();
|
|
68
|
+
|
|
69
|
+
if (borderRadius >= width / 2) {
|
|
70
|
+
// Circular clip
|
|
71
|
+
ctx.arc(width / 2, height / 2, width / 2, 0, Math.PI * 2);
|
|
72
|
+
} else {
|
|
73
|
+
// Rounded rectangle clip
|
|
74
|
+
const x = 0,
|
|
75
|
+
y = 0,
|
|
76
|
+
w = width,
|
|
77
|
+
h = height,
|
|
78
|
+
r = borderRadius;
|
|
79
|
+
ctx.moveTo(x + r, y);
|
|
80
|
+
ctx.lineTo(x + w - r, y);
|
|
81
|
+
ctx.quadraticCurveTo(x + w, y, x + w, y + r);
|
|
82
|
+
ctx.lineTo(x + w, y + h - r);
|
|
83
|
+
ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h);
|
|
84
|
+
ctx.lineTo(x + r, y + h);
|
|
85
|
+
ctx.quadraticCurveTo(x, y + h, x, y + h - r);
|
|
86
|
+
ctx.lineTo(x, y + r);
|
|
87
|
+
ctx.quadraticCurveTo(x, y, x + r, y);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
ctx.clip();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const img = imageRef.current; // Calculate scaled dimensions
|
|
94
|
+
|
|
95
|
+
const scaledWidth = img.naturalWidth * scale;
|
|
96
|
+
const scaledHeight = img.naturalHeight * scale; // Calculate position - convert from 0-1 range to pixel offset
|
|
97
|
+
|
|
98
|
+
const maxOffsetX = Math.max(0, (scaledWidth - width) / 2);
|
|
99
|
+
const maxOffsetY = Math.max(0, (scaledHeight - height) / 2);
|
|
100
|
+
const offsetX = (internalPosition.x - 0.5) * maxOffsetX * 2;
|
|
101
|
+
const offsetY = (internalPosition.y - 0.5) * maxOffsetY * 2; // Center the image with position offset
|
|
102
|
+
|
|
103
|
+
const x = (width - scaledWidth) / 2 - offsetX;
|
|
104
|
+
const y = (height - scaledHeight) / 2 - offsetY; // Apply rotation if needed
|
|
105
|
+
|
|
106
|
+
if (rotate !== 0) {
|
|
107
|
+
ctx.translate(width / 2, height / 2);
|
|
108
|
+
ctx.rotate(rotate * Math.PI / 180);
|
|
109
|
+
ctx.translate(-width / 2, -height / 2);
|
|
110
|
+
} // Draw image
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
ctx.drawImage(img, x, y, scaledWidth, scaledHeight); // Restore context
|
|
114
|
+
|
|
115
|
+
ctx.restore();
|
|
116
|
+
}, [imageLoaded, width, height, scale, internalPosition, borderRadius, rotate]); // Load image
|
|
117
|
+
|
|
118
|
+
React.useEffect(() => {
|
|
119
|
+
if (!image) {
|
|
120
|
+
setImageLoaded(false);
|
|
121
|
+
setImageError(false);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const img = new Image();
|
|
126
|
+
|
|
127
|
+
if (crossOrigin) {
|
|
128
|
+
img.crossOrigin = crossOrigin;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
img.onload = () => {
|
|
132
|
+
imageRef.current = img;
|
|
133
|
+
setImageLoaded(true);
|
|
134
|
+
setImageError(false);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
img.onerror = () => {
|
|
138
|
+
console.error('Failed to load image');
|
|
139
|
+
setImageError(true);
|
|
140
|
+
setImageLoaded(false);
|
|
141
|
+
}; // Handle both File objects and URLs
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
let objectURL = null;
|
|
145
|
+
|
|
146
|
+
if (typeof image === 'string') {
|
|
147
|
+
img.src = image;
|
|
148
|
+
} else if (image instanceof File || image instanceof Blob) {
|
|
149
|
+
objectURL = URL.createObjectURL(image);
|
|
150
|
+
img.src = objectURL;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return () => {
|
|
154
|
+
if (objectURL) {
|
|
155
|
+
URL.revokeObjectURL(objectURL);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
}, [image, crossOrigin]); // Redraw when dependencies change
|
|
159
|
+
|
|
160
|
+
React.useEffect(() => {
|
|
161
|
+
drawImage();
|
|
162
|
+
}, [drawImage]); // Mouse drag handlers for panning
|
|
163
|
+
|
|
164
|
+
const handleMouseDown = e => {
|
|
165
|
+
e.preventDefault();
|
|
166
|
+
setIsDragging(true);
|
|
167
|
+
dragStart.current = {
|
|
168
|
+
x: e.clientX,
|
|
169
|
+
y: e.clientY,
|
|
170
|
+
startPosX: internalPosition.x,
|
|
171
|
+
startPosY: internalPosition.y
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const handleMouseMove = React.useCallback(e => {
|
|
176
|
+
if (!isDragging || !imageRef.current) return;
|
|
177
|
+
const img = imageRef.current;
|
|
178
|
+
const scaledWidth = img.naturalWidth * scale;
|
|
179
|
+
const scaledHeight = img.naturalHeight * scale; // Calculate how much the image is larger than the canvas
|
|
180
|
+
|
|
181
|
+
const maxOffsetX = Math.max(0, (scaledWidth - width) / 2);
|
|
182
|
+
const maxOffsetY = Math.max(0, (scaledHeight - height) / 2); // Convert pixel movement to position (0-1 range)
|
|
183
|
+
|
|
184
|
+
const deltaX = e.clientX - dragStart.current.x;
|
|
185
|
+
const deltaY = e.clientY - dragStart.current.y;
|
|
186
|
+
const positionDeltaX = maxOffsetX > 0 ? deltaX / maxOffsetX / 2 : 0;
|
|
187
|
+
const positionDeltaY = maxOffsetY > 0 ? deltaY / maxOffsetY / 2 : 0;
|
|
188
|
+
const newPosition = {
|
|
189
|
+
x: Math.max(0, Math.min(1, dragStart.current.startPosX + positionDeltaX)),
|
|
190
|
+
y: Math.max(0, Math.min(1, dragStart.current.startPosY + positionDeltaY))
|
|
191
|
+
};
|
|
192
|
+
setInternalPosition(newPosition);
|
|
193
|
+
|
|
194
|
+
if (onPositionChange) {
|
|
195
|
+
onPositionChange(newPosition);
|
|
196
|
+
}
|
|
197
|
+
}, [isDragging, scale, width, height, onPositionChange]);
|
|
198
|
+
const handleMouseUp = React.useCallback(() => {
|
|
199
|
+
setIsDragging(false);
|
|
200
|
+
}, []); // Add/remove global mouse event listeners
|
|
201
|
+
|
|
202
|
+
React.useEffect(() => {
|
|
203
|
+
if (isDragging) {
|
|
204
|
+
document.addEventListener('mousemove', handleMouseMove);
|
|
205
|
+
document.addEventListener('mouseup', handleMouseUp);
|
|
206
|
+
return () => {
|
|
207
|
+
document.removeEventListener('mousemove', handleMouseMove);
|
|
208
|
+
document.removeEventListener('mouseup', handleMouseUp);
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}, [isDragging, handleMouseMove, handleMouseUp]);
|
|
212
|
+
return /*#__PURE__*/React__default["default"].createElement("div", {
|
|
213
|
+
ref: containerRef,
|
|
214
|
+
className: className,
|
|
215
|
+
style: _objectSpread({
|
|
216
|
+
width: "".concat(width, "px"),
|
|
217
|
+
height: "".concat(height, "px"),
|
|
218
|
+
borderRadius: "".concat(borderRadius, "px"),
|
|
219
|
+
overflow: 'hidden',
|
|
220
|
+
cursor: isDragging ? 'grabbing' : 'grab',
|
|
221
|
+
backgroundColor: '#f0f0f0'
|
|
222
|
+
}, style),
|
|
223
|
+
onMouseDown: handleMouseDown
|
|
224
|
+
}, /*#__PURE__*/React__default["default"].createElement("canvas", {
|
|
225
|
+
ref: canvasRef,
|
|
226
|
+
width: width,
|
|
227
|
+
height: height,
|
|
228
|
+
style: {
|
|
229
|
+
display: 'block',
|
|
230
|
+
width: '100%',
|
|
231
|
+
height: '100%'
|
|
232
|
+
}
|
|
233
|
+
}), imageError && /*#__PURE__*/React__default["default"].createElement("div", {
|
|
234
|
+
style: {
|
|
235
|
+
position: 'absolute',
|
|
236
|
+
top: '50%',
|
|
237
|
+
left: '50%',
|
|
238
|
+
transform: 'translate(-50%, -50%)',
|
|
239
|
+
color: '#999',
|
|
240
|
+
fontSize: '12px',
|
|
241
|
+
textAlign: 'center'
|
|
242
|
+
}
|
|
243
|
+
}, "Failed to load image"));
|
|
244
|
+
});
|
|
245
|
+
ImageEditor.displayName = 'ImageEditor';
|
|
246
|
+
|
|
247
|
+
module.exports = ImageEditor;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _extends = require('@babel/runtime/helpers/extends');
|
|
4
|
+
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
|
|
5
|
+
var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
|
|
6
|
+
var index = require('./index.js');
|
|
7
|
+
var React = require('react');
|
|
8
|
+
var ImageEditor = require('./ImageEditor.js');
|
|
9
|
+
var ScreenSizeHook = require('./ScreenSizeHook.js');
|
|
10
|
+
var Theme = require('./Theme.js');
|
|
11
|
+
|
|
12
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
13
|
+
|
|
14
|
+
var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends);
|
|
15
|
+
var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
|
|
16
|
+
var _objectWithoutProperties__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutProperties);
|
|
17
|
+
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
18
|
+
|
|
19
|
+
const _excluded = ["path", "sx", "size"];
|
|
20
|
+
|
|
21
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
22
|
+
|
|
23
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
24
|
+
|
|
25
|
+
const Icon = _ref => {
|
|
26
|
+
let {
|
|
27
|
+
path,
|
|
28
|
+
sx,
|
|
29
|
+
size = "24px"
|
|
30
|
+
} = _ref,
|
|
31
|
+
props = _objectWithoutProperties__default["default"](_ref, _excluded);
|
|
32
|
+
|
|
33
|
+
return /*#__PURE__*/React__default["default"].createElement(index.Box, _extends__default["default"]({
|
|
34
|
+
component: "svg",
|
|
35
|
+
viewBox: "0 0 24 24",
|
|
36
|
+
width: size,
|
|
37
|
+
height: size,
|
|
38
|
+
fill: "currentColor",
|
|
39
|
+
sx: _objectSpread({
|
|
40
|
+
display: "inline-block",
|
|
41
|
+
flexShrink: 0
|
|
42
|
+
}, sx)
|
|
43
|
+
}, props), /*#__PURE__*/React__default["default"].createElement("path", {
|
|
44
|
+
d: path
|
|
45
|
+
}));
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const paths = {
|
|
49
|
+
photo: "M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z",
|
|
50
|
+
close: "M18.3 5.71a.9959.9959 0 00-1.41 0L12 10.59 7.11 5.7a.9959.9959 0 00-1.41 0c-.39.39-.39 1.02 0 1.41L10.59 12 5.7 16.89c-.39.39-.39 1.02 0 1.41.39.39 1.02.39 1.41 0L12 13.41l4.89 4.89c.39.39 1.02.39 1.41 0 .39-.39.39-1.02 0-1.41L13.41 12l4.89-4.89c.38-.38.38-1.02 0-1.4z"
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const ImageUploadModal = _ref2 => {
|
|
54
|
+
let {
|
|
55
|
+
prevImage,
|
|
56
|
+
updateImage,
|
|
57
|
+
onClose,
|
|
58
|
+
title,
|
|
59
|
+
isCircularImage,
|
|
60
|
+
isSquareImage,
|
|
61
|
+
sizeInfo
|
|
62
|
+
} = _ref2;
|
|
63
|
+
const [image, setImage] = React.useState(prevImage);
|
|
64
|
+
const [zoom, setZoom] = React.useState(50);
|
|
65
|
+
const [loading, setLoading] = React.useState(false);
|
|
66
|
+
const [dropzoneHovered, setDropzoneHovered] = React.useState(false);
|
|
67
|
+
const size = ScreenSizeHook.useWindowSize();
|
|
68
|
+
const theme = Theme.useBlerpTheme();
|
|
69
|
+
const inputRef = React.useRef(null);
|
|
70
|
+
const imageEditorRef = /*#__PURE__*/React.createRef();
|
|
71
|
+
|
|
72
|
+
const urlToObject = async img => {
|
|
73
|
+
const response = await fetch(img);
|
|
74
|
+
const blob = await response.blob();
|
|
75
|
+
const file = new File([blob], img, {
|
|
76
|
+
type: blob.type
|
|
77
|
+
});
|
|
78
|
+
setImage(file);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
React.useEffect(() => {
|
|
82
|
+
if (prevImage) urlToObject(prevImage);
|
|
83
|
+
}, [prevImage]);
|
|
84
|
+
|
|
85
|
+
const handleImageDrop = files => {
|
|
86
|
+
setImage(files[0]);
|
|
87
|
+
setDropzoneHovered(false);
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const handleUploadClick = async () => {
|
|
91
|
+
if (!image) {
|
|
92
|
+
alert("You must upload a valid image");
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (image.size > 8842038) {
|
|
97
|
+
alert("You must update with a valid image less then 7mb");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
setLoading(true);
|
|
102
|
+
const canvas = imageEditorRef.current.getImage().toDataURL();
|
|
103
|
+
const blob = await (await fetch(canvas)).blob();
|
|
104
|
+
const file = new File([blob], image.name, {
|
|
105
|
+
type: image.type,
|
|
106
|
+
size: image.size
|
|
107
|
+
});
|
|
108
|
+
await updateImage(file);
|
|
109
|
+
setLoading(false);
|
|
110
|
+
onClose();
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
return /*#__PURE__*/React__default["default"].createElement(index.Stack, {
|
|
114
|
+
sx: {
|
|
115
|
+
minHeight: "580px"
|
|
116
|
+
},
|
|
117
|
+
alignItems: "center",
|
|
118
|
+
justifyContent: "space-between"
|
|
119
|
+
}, /*#__PURE__*/React__default["default"].createElement(Icon, {
|
|
120
|
+
path: paths.close,
|
|
121
|
+
onClick: onClose,
|
|
122
|
+
sx: {
|
|
123
|
+
position: "absolute",
|
|
124
|
+
top: 20,
|
|
125
|
+
right: 20,
|
|
126
|
+
cursor: "pointer"
|
|
127
|
+
}
|
|
128
|
+
}), /*#__PURE__*/React__default["default"].createElement(index.Stack, {
|
|
129
|
+
alignItems: "center"
|
|
130
|
+
}, /*#__PURE__*/React__default["default"].createElement(index.Text, {
|
|
131
|
+
sx: {
|
|
132
|
+
fontSize: "32px"
|
|
133
|
+
}
|
|
134
|
+
}, title), /*#__PURE__*/React__default["default"].createElement(index.Text, {
|
|
135
|
+
color: "grey4"
|
|
136
|
+
}, "Adjust your image below."), /*#__PURE__*/React__default["default"].createElement(index.Text, {
|
|
137
|
+
color: "grey4"
|
|
138
|
+
}, sizeInfo)), /*#__PURE__*/React__default["default"].createElement(index.Stack, {
|
|
139
|
+
sx: {
|
|
140
|
+
minWidth: "300px",
|
|
141
|
+
backgroundColor: "waxwing.main",
|
|
142
|
+
maxHeight: "250px",
|
|
143
|
+
justifyContent: "center",
|
|
144
|
+
alignItems: "center"
|
|
145
|
+
}
|
|
146
|
+
}, !image ? /*#__PURE__*/React__default["default"].createElement("div", {
|
|
147
|
+
style: {
|
|
148
|
+
width: "100%",
|
|
149
|
+
height: size.width > 600 ? "300px" : "200px",
|
|
150
|
+
cursor: "pointer",
|
|
151
|
+
display: "flex",
|
|
152
|
+
justifyContent: "center",
|
|
153
|
+
alignItems: "center"
|
|
154
|
+
},
|
|
155
|
+
onClick: () => {
|
|
156
|
+
var _inputRef$current;
|
|
157
|
+
|
|
158
|
+
return (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.click();
|
|
159
|
+
},
|
|
160
|
+
onDragOver: e => {
|
|
161
|
+
e.preventDefault();
|
|
162
|
+
setDropzoneHovered(true);
|
|
163
|
+
},
|
|
164
|
+
onDragLeave: () => setDropzoneHovered(false),
|
|
165
|
+
onDrop: e => {
|
|
166
|
+
e.preventDefault();
|
|
167
|
+
handleImageDrop(Array.from(e.dataTransfer.files));
|
|
168
|
+
}
|
|
169
|
+
}, /*#__PURE__*/React__default["default"].createElement("input", {
|
|
170
|
+
ref: inputRef,
|
|
171
|
+
type: "file",
|
|
172
|
+
hidden: true,
|
|
173
|
+
accept: "image/*",
|
|
174
|
+
onChange: e => handleImageDrop(Array.from(e.target.files))
|
|
175
|
+
}), dropzoneHovered ? /*#__PURE__*/React__default["default"].createElement(Icon, {
|
|
176
|
+
path: paths.photo,
|
|
177
|
+
size: "100%",
|
|
178
|
+
sx: {
|
|
179
|
+
color: "white"
|
|
180
|
+
}
|
|
181
|
+
}) : /*#__PURE__*/React__default["default"].createElement(index.Text, {
|
|
182
|
+
sx: {
|
|
183
|
+
textAlign: "center",
|
|
184
|
+
width: "80%"
|
|
185
|
+
}
|
|
186
|
+
}, "Click or drop image here to upload.")) : image.type !== "image/gif" ? /*#__PURE__*/React__default["default"].createElement(ImageEditor, {
|
|
187
|
+
ref: imageEditorRef,
|
|
188
|
+
width: !isCircularImage && !isSquareImage ? 650 : 250,
|
|
189
|
+
height: !isCircularImage && !isSquareImage ? 225 : 250,
|
|
190
|
+
borderRadius: isCircularImage ? 125 : 0,
|
|
191
|
+
image: image,
|
|
192
|
+
scale: zoom / 50,
|
|
193
|
+
crossOrigin: "anonymous"
|
|
194
|
+
}) : /*#__PURE__*/React__default["default"].createElement("img", {
|
|
195
|
+
src: URL.createObjectURL(image),
|
|
196
|
+
width: "250px",
|
|
197
|
+
alt: "gif preview"
|
|
198
|
+
})), image && image.type !== "image/gif" && /*#__PURE__*/React__default["default"].createElement(index.Stack, {
|
|
199
|
+
direction: "row",
|
|
200
|
+
width: "250px",
|
|
201
|
+
alignItems: "center"
|
|
202
|
+
}, /*#__PURE__*/React__default["default"].createElement(index.Box, {
|
|
203
|
+
component: "input",
|
|
204
|
+
type: "range",
|
|
205
|
+
min: "35",
|
|
206
|
+
max: "100",
|
|
207
|
+
value: zoom,
|
|
208
|
+
onChange: e => setZoom(e.target.value),
|
|
209
|
+
sx: {
|
|
210
|
+
width: "100%",
|
|
211
|
+
"&::-webkit-slider-thumb": {
|
|
212
|
+
background: theme.colors.ibisRed
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
})), /*#__PURE__*/React__default["default"].createElement(index.Stack, {
|
|
216
|
+
alignItems: "center"
|
|
217
|
+
}, /*#__PURE__*/React__default["default"].createElement(index.Button, {
|
|
218
|
+
variant: "text",
|
|
219
|
+
onClick: () => setImage(null)
|
|
220
|
+
}, image ? "Change Image" : "Cancel"), /*#__PURE__*/React__default["default"].createElement(index.Button, {
|
|
221
|
+
variant: "contained",
|
|
222
|
+
onClick: handleUploadClick
|
|
223
|
+
}, "Save Image")));
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
module.exports = ImageUploadModal;
|