@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.
Files changed (128) hide show
  1. package/dist/cjs/Blerp/BlerpImageRow.js +176 -57
  2. package/dist/cjs/Blerp/BlerpSavePopup.js +44 -40
  3. package/dist/cjs/Blerp/BlerpTitleRow.js +36 -19
  4. package/dist/cjs/Blerp/BlerpTopRow.js +110 -44
  5. package/dist/cjs/Blerp.js +9 -16
  6. package/dist/cjs/BlerpAudioContextProvider.js +2 -2
  7. package/dist/cjs/BlerpListView.js +318 -168
  8. package/dist/cjs/BlerpListViewPremium.js +155 -130
  9. package/dist/cjs/BlerpListViewSkeleton.js +60 -13
  10. package/dist/cjs/BlerpSkeleton.js +32 -9
  11. package/dist/cjs/CollectionCard.js +139 -60
  12. package/dist/cjs/CollectionListViewPremium.js +368 -297
  13. package/dist/cjs/CollectionSkeleton.js +74 -13
  14. package/dist/cjs/Dropdown.js +272 -172
  15. package/dist/cjs/EllipsisLoader.js +66 -21
  16. package/dist/cjs/GroupCard.js +64 -57
  17. package/dist/cjs/Icons/Icons.js +288 -426
  18. package/dist/cjs/ImageEditor.js +247 -0
  19. package/dist/cjs/ImageUpload.js +226 -0
  20. package/dist/cjs/NewBlerp.js +354 -160
  21. package/dist/cjs/NewBlerpTest.js +10 -792
  22. package/dist/cjs/NewCollectionModal.js +294 -310
  23. package/dist/cjs/PremiumCollectionCard.js +191 -454
  24. package/dist/cjs/PurchaseModals/CheckoutModal.js +1 -1
  25. package/dist/cjs/PurchaseModals/PremiumBlerpCheckoutModal.js +1 -1
  26. package/dist/cjs/PurchaseModals/PremiumCollectionCheckoutModal.js +1 -1
  27. package/dist/cjs/PurchaseModals/PremiumSubscriptionCheckoutModal.js +1 -1
  28. package/dist/cjs/ReactionButtons.js +26 -13
  29. package/dist/cjs/SnackbarContextProvider.js +200 -116
  30. package/dist/cjs/Theme.js +217 -90
  31. package/dist/cjs/Toggle.js +86 -32
  32. package/dist/cjs/UserCard.js +13 -32
  33. package/dist/cjs/UserPage/LibraryControls.js +180 -93
  34. package/dist/cjs/UserPage/UserLibraryHeader.js +23 -14
  35. package/dist/cjs/UserPage/UserProfileHeader.js +120 -105
  36. package/dist/cjs/UsernameWithPopout.js +12 -8
  37. package/dist/cjs/colors.js +15 -8
  38. package/dist/cjs/helpers.js +131 -0
  39. package/dist/cjs/index.js +92 -58
  40. package/dist/cjs/neo-components/Autocomplete.js +280 -0
  41. package/dist/cjs/neo-components/BottomNavigation.js +120 -0
  42. package/dist/cjs/neo-components/Box.js +48 -0
  43. package/dist/cjs/neo-components/Button.js +206 -0
  44. package/dist/cjs/neo-components/CircularProgress.js +92 -0
  45. package/dist/cjs/neo-components/Container.js +75 -0
  46. package/dist/cjs/neo-components/Dialog.js +441 -0
  47. package/dist/cjs/neo-components/Fab.js +237 -0
  48. package/dist/cjs/neo-components/FormControls.js +1057 -0
  49. package/dist/cjs/neo-components/Grid.js +256 -0
  50. package/dist/cjs/neo-components/IconButton.js +111 -0
  51. package/dist/cjs/neo-components/Input.js +493 -0
  52. package/dist/cjs/neo-components/Layout.js +1213 -0
  53. package/dist/cjs/neo-components/Misc.js +858 -0
  54. package/dist/cjs/neo-components/Navigation.js +1578 -0
  55. package/dist/cjs/neo-components/Paper.js +256 -0
  56. package/dist/cjs/neo-components/Stack.js +194 -0
  57. package/dist/cjs/neo-components/Stepper.js +291 -0
  58. package/dist/cjs/neo-components/Text.js +290 -0
  59. package/dist/cjs/neo-components/ThemeProvider.js +731 -0
  60. package/dist/cjs/neo-components/ToggleButton.js +223 -0
  61. package/dist/cjs/neo-components/createTheme.js +306 -0
  62. package/dist/cjs/neo-components/withSx.js +164 -0
  63. package/dist/cjs/neo-utils/sxToStyle.js +508 -0
  64. package/dist/esm/Blerp/BlerpImageRow.js +166 -46
  65. package/dist/esm/Blerp/BlerpSavePopup.js +35 -27
  66. package/dist/esm/Blerp/BlerpTitleRow.js +32 -13
  67. package/dist/esm/Blerp/BlerpTopRow.js +85 -16
  68. package/dist/esm/Blerp.js +4 -12
  69. package/dist/esm/BlerpAudioContextProvider.js +1 -2
  70. package/dist/esm/BlerpListView.js +313 -160
  71. package/dist/esm/BlerpListViewPremium.js +135 -109
  72. package/dist/esm/BlerpListViewSkeleton.js +60 -11
  73. package/dist/esm/BlerpSkeleton.js +32 -7
  74. package/dist/esm/CollectionCard.js +118 -38
  75. package/dist/esm/CollectionListViewPremium.js +367 -294
  76. package/dist/esm/CollectionSkeleton.js +73 -11
  77. package/dist/esm/Dropdown.js +260 -161
  78. package/dist/esm/EllipsisLoader.js +63 -18
  79. package/dist/esm/GroupCard.js +54 -46
  80. package/dist/esm/Icons/Icons.js +226 -367
  81. package/dist/esm/ImageEditor.js +240 -0
  82. package/dist/esm/ImageUpload.js +217 -0
  83. package/dist/esm/NewBlerp.js +282 -79
  84. package/dist/esm/NewBlerpTest.js +11 -781
  85. package/dist/esm/NewCollectionModal.js +289 -304
  86. package/dist/esm/PremiumCollectionCard.js +192 -451
  87. package/dist/esm/PurchaseModals/CheckoutModal.js +1 -1
  88. package/dist/esm/PurchaseModals/PremiumBlerpCheckoutModal.js +1 -1
  89. package/dist/esm/PurchaseModals/PremiumCollectionCheckoutModal.js +1 -1
  90. package/dist/esm/PurchaseModals/PremiumSubscriptionCheckoutModal.js +1 -1
  91. package/dist/esm/ReactionButtons.js +23 -8
  92. package/dist/esm/SnackbarContextProvider.js +196 -110
  93. package/dist/esm/Theme.js +187 -66
  94. package/dist/esm/Toggle.js +84 -29
  95. package/dist/esm/UserCard.js +1 -20
  96. package/dist/esm/UserPage/LibraryControls.js +159 -65
  97. package/dist/esm/UserPage/UserLibraryHeader.js +18 -10
  98. package/dist/esm/UserPage/UserProfileHeader.js +100 -79
  99. package/dist/esm/UsernameWithPopout.js +7 -4
  100. package/dist/esm/colors.js +11 -9
  101. package/dist/esm/helpers.js +122 -0
  102. package/dist/esm/icons.js +1 -1
  103. package/dist/esm/index.js +32 -2
  104. package/dist/esm/neo-components/Autocomplete.js +269 -0
  105. package/dist/esm/neo-components/BottomNavigation.js +109 -0
  106. package/dist/esm/neo-components/Box.js +36 -0
  107. package/dist/esm/neo-components/Button.js +194 -0
  108. package/dist/esm/neo-components/CircularProgress.js +81 -0
  109. package/dist/esm/neo-components/Container.js +63 -0
  110. package/dist/esm/neo-components/Dialog.js +423 -0
  111. package/dist/esm/neo-components/Fab.js +225 -0
  112. package/dist/esm/neo-components/FormControls.js +1041 -0
  113. package/dist/esm/neo-components/Grid.js +244 -0
  114. package/dist/esm/neo-components/IconButton.js +99 -0
  115. package/dist/esm/neo-components/Input.js +478 -0
  116. package/dist/esm/neo-components/Layout.js +1179 -0
  117. package/dist/esm/neo-components/Misc.js +840 -0
  118. package/dist/esm/neo-components/Navigation.js +1556 -0
  119. package/dist/esm/neo-components/Paper.js +243 -0
  120. package/dist/esm/neo-components/Stack.js +182 -0
  121. package/dist/esm/neo-components/Stepper.js +278 -0
  122. package/dist/esm/neo-components/Text.js +277 -0
  123. package/dist/esm/neo-components/ThemeProvider.js +718 -0
  124. package/dist/esm/neo-components/ToggleButton.js +214 -0
  125. package/dist/esm/neo-components/createTheme.js +297 -0
  126. package/dist/esm/neo-components/withSx.js +153 -0
  127. package/dist/esm/neo-utils/sxToStyle.js +502 -0
  128. 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;