@ntbjs/react-components 0.0.1-beta.8 → 1.0.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.
@@ -1,970 +0,0 @@
1
- import { P as PropTypes, d as _objectSpread2, s as styleInject, a as applyDefaultTheme, _ as _taggedTemplateLiteral, b as _objectWithoutProperties, e as _slicedToArray, c as _extends$5, f as _toConsumableArray } from './defaultTheme-f1063879.js';
2
- import * as React from 'react';
3
- import React__default, { useMemo, useRef, useState, useLayoutEffect, useEffect, useCallback } from 'react';
4
- import { isFunction, omit, get, throttle } from 'lodash';
5
- import { LazyLoadComponent, LazyLoadImage } from 'react-lazy-load-image-component';
6
- import { A as ActionButton } from './ActionButton-dfa33fb3.js';
7
- import './Popover-ca8883c5.js';
8
- import { T as Tooltip } from './Tooltip-be5c2611.js';
9
- import styled, { css } from 'styled-components';
10
-
11
- var toFnRef = function toFnRef(ref) {
12
- return !ref || typeof ref === 'function' ? ref : function (value) {
13
- ref.current = value;
14
- };
15
- };
16
-
17
- function mergeRefs(refA, refB) {
18
- var a = toFnRef(refA);
19
- var b = toFnRef(refB);
20
- return function (value) {
21
- if (a) a(value);
22
- if (b) b(value);
23
- };
24
- }
25
- /**
26
- * Create and returns a single callback ref composed from two other Refs.
27
- *
28
- * ```tsx
29
- * const Button = React.forwardRef((props, ref) => {
30
- * const [element, attachRef] = useCallbackRef<HTMLButtonElement>();
31
- * const mergedRef = useMergedRefs(ref, attachRef);
32
- *
33
- * return <button ref={mergedRef} {...props}/>
34
- * })
35
- * ```
36
- *
37
- * @param refA A Callback or mutable Ref
38
- * @param refB A Callback or mutable Ref
39
- * @category refs
40
- */
41
-
42
- function useMergedRefs(refA, refB) {
43
- return useMemo(function () {
44
- return mergeRefs(refA, refB);
45
- }, [refA, refB]);
46
- }
47
-
48
- var assetShape = {
49
- key: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
50
- previewUrl: PropTypes.string,
51
- title: PropTypes.string,
52
- note: PropTypes.shape({
53
- icon: PropTypes.element,
54
- message: PropTypes.string
55
- }),
56
- width: PropTypes.number,
57
- height: PropTypes.number,
58
- fileType: PropTypes.oneOf(['image', 'video', 'pdf', 'file']).isRequired,
59
- group: PropTypes.string,
60
- actions: PropTypes.arrayOf(PropTypes.shape({
61
- title: PropTypes.string.isRequired,
62
- icon: PropTypes.element.isRequired,
63
- onClick: PropTypes.func.isRequired,
64
- component: PropTypes.func
65
- })),
66
- overlay: PropTypes.element,
67
- disabled: PropTypes.bool,
68
- onClick: PropTypes.func,
69
- onMouseEnter: PropTypes.func
70
- };
71
- var assetShapeWithLayout = _objectSpread2(_objectSpread2({}, assetShape), {}, {
72
- layout: PropTypes.shape({
73
- width: PropTypes.number.isRequired,
74
- height: PropTypes.number.isRequired,
75
- translateX: PropTypes.number.isRequired,
76
- translateY: PropTypes.number.isRequired,
77
- type: PropTypes.oneOf(['groupLabel', 'asset']).isRequired,
78
- hasHeightAndWidth: PropTypes.bool
79
- }).isRequired
80
- });
81
-
82
- var css_248z = ".lazy-load-image-background.opacity {\n opacity: 0;\n}\n\n.lazy-load-image-background.opacity.lazy-load-image-loaded {\n opacity: 1;\n transition: opacity .3s;\n}\n";
83
- styleInject(css_248z);
84
-
85
- var _templateObject$2, _templateObject2$2, _templateObject3$2, _templateObject4$1, _templateObject5$1, _templateObject6$1, _templateObject7$1, _templateObject8$1, _templateObject9$1, _templateObject10$1, _templateObject11$1, _templateObject12$1, _templateObject13$1, _templateObject14$1, _templateObject15$1, _templateObject16$1, _templateObject17, _templateObject18, _templateObject19, _templateObject20, _templateObject21, _templateObject22;
86
- var AssetGalleryCompactCard$2 = styled.div.attrs(applyDefaultTheme)(_templateObject$2 || (_templateObject$2 = _taggedTemplateLiteral(["\n display: block;\n height: 100%;\n ", ";\n ", ";\n\n ", "\n\n video {\n width: 100%;\n height: 100%;\n }\n"])), function (props) {
87
- return props.theme.themeProp('background', props.theme.getColor('gray-700'), props.theme.getColor('gray-300'));
88
- }, function (props) {
89
- return props.disabled && css(_templateObject2$2 || (_templateObject2$2 = _taggedTemplateLiteral(["\n pointer-events: none;\n opacity: 0.4;\n "])));
90
- }, function (props) {
91
- return props.extendedSelectMode && css(_templateObject3$2 || (_templateObject3$2 = _taggedTemplateLiteral(["\n cursor: pointer;\n "])));
92
- });
93
- var Figure = styled.figure(_templateObject4$1 || (_templateObject4$1 = _taggedTemplateLiteral(["\n margin: 0;\n width: 100%;\n height: 100%;\n\n .lazy-load-image-background {\n display: block !important;\n }\n\n img {\n display: block;\n height: 100%;\n width: 100%;\n ", "\n }\n"])), function (props) {
94
- return props.hasHeightAndWidth ? css(_templateObject5$1 || (_templateObject5$1 = _taggedTemplateLiteral(["\n object-fit: cover;\n "]))) : css(_templateObject6$1 || (_templateObject6$1 = _taggedTemplateLiteral(["\n object-fit: contain;\n "])));
95
- });
96
- var Overlay = styled.div.attrs(applyDefaultTheme)(_templateObject7$1 || (_templateObject7$1 = _taggedTemplateLiteral(["\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n"])));
97
- var OverlayBackdrop = styled.div.attrs(applyDefaultTheme)(_templateObject8$1 || (_templateObject8$1 = _taggedTemplateLiteral(["\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n opacity: 0;\n background: linear-gradient(rgba(0, 0, 0, 0.6), transparent 70%, rgba(0, 0, 0, 0.6));\n transition: opacity 220ms;\n\n ", ":hover & {\n opacity: 1;\n }\n"])), Overlay);
98
- var OverlayInfo = styled.div.attrs(applyDefaultTheme)(_templateObject9$1 || (_templateObject9$1 = _taggedTemplateLiteral(["\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n padding: 15px 12px 10px;\n color: ", ";\n"])), function (props) {
99
- return props.theme.getColor('gray-100');
100
- });
101
- var OverlayInfoTopTitleAndFileType = styled.div.attrs(applyDefaultTheme)(_templateObject10$1 || (_templateObject10$1 = _taggedTemplateLiteral(["\n display: flex;\n"])));
102
- var OverlayInfoTopTitle = styled.div.attrs(applyDefaultTheme)(_templateObject11$1 || (_templateObject11$1 = _taggedTemplateLiteral(["\n flex-grow: 1;\n font-family: ", ";\n font-weight: 400;\n line-height: 1.4;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n opacity: 0;\n transition: opacity 220ms;\n\n ", ":hover & {\n opacity: 1;\n }\n"])), function (props) {
103
- return props.theme.primaryFontFamily;
104
- }, Overlay);
105
- var OverlayInfoTopFileType = styled.div.attrs(applyDefaultTheme)(_templateObject12$1 || (_templateObject12$1 = _taggedTemplateLiteral(["\n flex-shrink: 0;\n width: auto;\n max-width: 19px;\n max-height: 19px;\n"])));
106
- var OverlayInfoTopNote = styled.div.attrs(applyDefaultTheme)(_templateObject13$1 || (_templateObject13$1 = _taggedTemplateLiteral(["\n display: flex;\n padding-top: 5px;\n transform: translate3d(0, -100%, 0);\n transition: transform 250ms;\n\n svg {\n max-width: 20px;\n max-height: 20px;\n width: auto;\n flex-shrink: 0;\n }\n\n ", ":hover && {\n ", "\n }\n"])), Overlay, function (props) {
107
- var _props$assetTitle;
108
-
109
- return ((_props$assetTitle = props.assetTitle) === null || _props$assetTitle === void 0 ? void 0 : _props$assetTitle.trim().length) > 0 ? css(_templateObject14$1 || (_templateObject14$1 = _taggedTemplateLiteral(["\n transform: translate3d(0, 0, 0);\n "]))) : css(_templateObject15$1 || (_templateObject15$1 = _taggedTemplateLiteral(["\n transform: translate3d(0, -100%, 0);\n "])));
110
- });
111
- var OverlayInfoTopNoteTitle = styled.div.attrs(applyDefaultTheme)(_templateObject16$1 || (_templateObject16$1 = _taggedTemplateLiteral(["\n font-family: ", ";\n font-weight: 400;\n line-height: 1.4;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n margin-left: 5px;\n opacity: 0;\n transition: opacity 250ms;\n\n ", ":hover & {\n opacity: 1;\n }\n"])), function (props) {
112
- return props.theme.primaryFontFamily;
113
- }, Overlay);
114
- var OverlaySelected$1 = styled.div.attrs(applyDefaultTheme)(_templateObject17 || (_templateObject17 = _taggedTemplateLiteral(["\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n pointer-events: none;\n transition: border-color 120ms;\n border: 4px solid\n ", ";\n"])), function (props) {
115
- return props.selected ? props.theme.getColor('orange-500') : 'transparent';
116
- });
117
- var OverlayInfoBottom = styled.div.attrs(applyDefaultTheme)(_templateObject18 || (_templateObject18 = _taggedTemplateLiteral(["\n display: flex;\n"])));
118
- var OverlayInfoBottomSelectButton = styled.div.attrs(applyDefaultTheme)(_templateObject19 || (_templateObject19 = _taggedTemplateLiteral(["\n opacity: ", ";\n flex-shrink: 0;\n cursor: pointer;\n transition: opacity 220ms;\n\n > svg {\n width: 23px;\n height: 100%;\n transition: color 120ms;\n color: ", ";\n }\n\n ", ":hover & {\n opacity: 1;\n }\n"])), function (props) {
119
- return props.selected ? 1 : 0;
120
- }, function (props) {
121
- return props.selected ? props.theme.getColor('orange-500') : 'inherit';
122
- }, Overlay);
123
- var OverlayInfoBottomActions = styled.div.attrs(applyDefaultTheme)(_templateObject20 || (_templateObject20 = _taggedTemplateLiteral(["\n display: flex;\n justify-content: space-between;\n margin-left: auto;\n opacity: 0;\n transition: opacity 220ms;\n\n ", ":hover & {\n opacity: 1;\n }\n"])), Overlay);
124
- var ConsumerDefinedOverlay$1 = styled.div.attrs(applyDefaultTheme)(_templateObject21 || (_templateObject21 = _taggedTemplateLiteral(["\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n pointer-events: none;\n"])));
125
- var Fragment$1 = styled.div(_templateObject22 || (_templateObject22 = _taggedTemplateLiteral([""])));
126
-
127
- function _extends$4() { _extends$4 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$4.apply(this, arguments); }
128
-
129
- var _ref$4 = /*#__PURE__*/React.createElement("path", {
130
- fill: "currentColor",
131
- d: "M12 0a12 12 0 1012 12A12 12 0 0012 0zM9.6 18l-6-6 1.69-1.69L9.6 14.6l9.11-9.1 1.69 1.7z",
132
- fillOpacity: 0.9
133
- });
134
-
135
- function SvgCheckCircleFilled(props) {
136
- return /*#__PURE__*/React.createElement("svg", _extends$4({
137
- xmlns: "http://www.w3.org/2000/svg",
138
- viewBox: "0 0 24 24"
139
- }, props), _ref$4);
140
- }
141
-
142
- function _extends$3() { _extends$3 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$3.apply(this, arguments); }
143
-
144
- var _ref$3 = /*#__PURE__*/React.createElement("path", {
145
- fill: "currentColor",
146
- d: "M10.8 15.6h2.4V18h-2.4zm0-9.6h2.4v7.2h-2.4zm1.188-6A12 12 0 1024 12 11.994 11.994 0 0011.988 0zM12 21.6a9.6 9.6 0 119.6-9.6 9.597 9.597 0 01-9.6 9.6z"
147
- });
148
-
149
- function SvgWarningCircle(props) {
150
- return /*#__PURE__*/React.createElement("svg", _extends$3({
151
- xmlns: "http://www.w3.org/2000/svg",
152
- viewBox: "0 0 24 24"
153
- }, props), _ref$3);
154
- }
155
-
156
- function _extends$2() { _extends$2 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$2.apply(this, arguments); }
157
-
158
- var _ref$2 = /*#__PURE__*/React.createElement("path", {
159
- fill: "currentColor",
160
- d: "M3.43 6.24l9 5.76-9 5.76V6.24M0 0v24l18.86-12z"
161
- });
162
-
163
- function SvgPlay(props) {
164
- return /*#__PURE__*/React.createElement("svg", _extends$2({
165
- xmlns: "http://www.w3.org/2000/svg",
166
- viewBox: "0 0 18.86 24"
167
- }, props), _ref$2);
168
- }
169
-
170
- function _extends$1() { _extends$1 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$1.apply(this, arguments); }
171
-
172
- var _ref$1 = /*#__PURE__*/React.createElement("path", {
173
- fill: "currentColor",
174
- d: "M21 0H3A3 3 0 00.05 2.9V21A3 3 0 003 24h18.1a3 3 0 002.95-3V3A3.11 3.11 0 0021 0zm0 21H3V3h18.1v18zm-6-6v-4.52a1.56 1.56 0 00-1.55-1.55h-3.01v7.58h2.94A1.47 1.47 0 0014.93 15zm-3-4.52h1.54V15H12zm6 3.08h1.55V12H18v-1.52h1.55V9.07h-2.94v7.58h1.55v-3.09zm-12.07 0h1.56A1.55 1.55 0 009 12v-1.52a1.56 1.56 0 00-1.51-1.55H4.4v7.58h1.54zm0-3.08h1.56V12H5.94z"
175
- });
176
-
177
- function SvgPdf(props) {
178
- return /*#__PURE__*/React.createElement("svg", _extends$1({
179
- xmlns: "http://www.w3.org/2000/svg",
180
- viewBox: "0 0 24 24"
181
- }, props), _ref$1);
182
- }
183
-
184
- function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
185
-
186
- var _ref = /*#__PURE__*/React.createElement("path", {
187
- fill: "currentColor",
188
- d: "M12 0H2.4A2.4 2.4 0 000 2.4v19.2A2.4 2.4 0 002.39 24H16.8a2.41 2.41 0 002.4-2.4V7.2zM2.4 21.6V2.4h8.4v6h6v13.2z"
189
- });
190
-
191
- function SvgFile(props) {
192
- return /*#__PURE__*/React.createElement("svg", _extends({
193
- xmlns: "http://www.w3.org/2000/svg",
194
- viewBox: "0 0 19.2 24"
195
- }, props), _ref);
196
- }
197
-
198
- var ComputedRootComponent$1 = function ComputedRootComponent(_ref) {
199
- var component = _ref.component,
200
- asset = _ref.asset,
201
- props = _objectWithoutProperties(_ref, ["component", "asset"]);
202
-
203
- var newProps = omit(props, ['theme', 'extendedSelectMode']);
204
-
205
- if (component) {
206
- if (!isFunction(component)) throw Error('Expected a function in component-prop');
207
-
208
- if (React__default.isValidElement(component(asset, newProps.children))) {
209
- return React__default.cloneElement(component(asset, newProps.children), omit(newProps, ['children']));
210
- }
211
- }
212
-
213
- return React__default.createElement(AssetGalleryCompactCard$2, newProps);
214
- };
215
-
216
- var ComputedActionButton$1 = React__default.forwardRef(function ComputedActionButton(_ref2, forwardedRef) {
217
- var component = _ref2.component,
218
- props = _objectWithoutProperties(_ref2, ["component"]);
219
-
220
- var newProps = props;
221
- newProps.children = React__default.createElement(ActionButton, {
222
- ref: forwardedRef,
223
- icon: newProps.icon,
224
- onClick: newProps.onClick
225
- });
226
-
227
- if (component) {
228
- if (!isFunction(component)) throw Error('Expected a function in component-prop');
229
-
230
- if (React__default.isValidElement(component())) {
231
- return React__default.cloneElement(component(), _objectSpread2({}, omit(newProps, 'icon')));
232
- }
233
- }
234
-
235
- return React__default.createElement(React__default.Fragment, null, newProps.children);
236
- });
237
-
238
- var AssetGalleryCompactCard = function AssetGalleryCompactCard(props) {
239
- var _asset$note;
240
-
241
- var asset = props.asset,
242
- selectable = props.selectable,
243
- hasHeightAndWidth = props.hasHeightAndWidth,
244
- selected = props.selected,
245
- extendedSelectMode = props.extendedSelectMode,
246
- onAssetSelected = props.onAssetSelected,
247
- onAssetUnselected = props.onAssetUnselected,
248
- component = props.component;
249
-
250
- function onClick(event) {
251
- if (extendedSelectMode) {
252
- return onSelectClick(event);
253
- }
254
-
255
- if (isFunction(asset.onClick)) {
256
- asset.onClick(event, asset);
257
- }
258
- }
259
-
260
- function onSelectClick(event) {
261
- event.preventDefault();
262
- event.stopPropagation();
263
-
264
- if (selected) {
265
- return onAssetUnselected(asset.key);
266
- }
267
-
268
- return onAssetSelected(asset.key);
269
- }
270
-
271
- function onActionClick(event, action) {
272
- event.preventDefault();
273
- event.stopPropagation();
274
- action.onClick(asset);
275
- }
276
-
277
- var videoPlayerRef = useRef();
278
-
279
- function onMouseEnter(event) {
280
- event.stopPropagation();
281
-
282
- if (videoPlayerRef.current) {
283
- var playPromise = videoPlayerRef.current.play();
284
-
285
- if (playPromise !== undefined) {
286
- playPromise.then(function () {})["catch"](function () {});
287
- }
288
- }
289
-
290
- if (isFunction(asset.onMouseEnter)) {
291
- asset.onMouseEnter(event, asset);
292
- }
293
- }
294
-
295
- function onMouseLeave(event) {
296
- event.stopPropagation();
297
-
298
- if (videoPlayerRef.current) {
299
- videoPlayerRef.current.pause();
300
- }
301
- }
302
-
303
- return React__default.createElement(AssetGalleryCompactCard$2, {
304
- as: ComputedRootComponent$1,
305
- component: component,
306
- disabled: asset.disabled,
307
- asset: asset,
308
- onClick: onClick,
309
- extendedSelectMode: extendedSelectMode,
310
- onMouseEnter: onMouseEnter,
311
- onMouseLeave: onMouseLeave
312
- }, asset.previewUrl && (['video'].includes(asset.fileType) ? React__default.createElement(LazyLoadComponent, null, React__default.createElement("video", {
313
- ref: videoPlayerRef,
314
- loop: true,
315
- muted: true
316
- }, React__default.createElement("source", {
317
- src: asset.previewUrl,
318
- type: "video/mp4"
319
- }))) : React__default.createElement(Figure, {
320
- hasHeightAndWidth: hasHeightAndWidth
321
- }, React__default.createElement(LazyLoadImage, {
322
- alt: asset.title,
323
- src: asset.previewUrl,
324
- height: "100%",
325
- width: "100%",
326
- effect: "opacity",
327
- threshold: 700
328
- }))), React__default.createElement(Overlay, null, React__default.createElement(OverlayBackdrop, null), React__default.createElement(OverlayInfo, null, React__default.createElement("div", null, React__default.createElement(OverlayInfoTopTitleAndFileType, null, React__default.createElement(OverlayInfoTopTitle, {
329
- title: asset.title
330
- }, asset.title || "\xA0"), asset.fileType === 'video' && React__default.createElement(OverlayInfoTopFileType, {
331
- as: SvgPlay
332
- }), asset.fileType === 'pdf' && React__default.createElement(OverlayInfoTopFileType, {
333
- as: SvgPdf
334
- }), asset.fileType === 'file' && React__default.createElement(OverlayInfoTopFileType, {
335
- as: SvgFile
336
- })), ((_asset$note = asset.note) === null || _asset$note === void 0 ? void 0 : _asset$note.title) && React__default.createElement(OverlayInfoTopNote, {
337
- title: asset.note.title,
338
- assetTitle: asset.title
339
- }, asset.note.icon ? asset.note.icon : React__default.createElement(SvgWarningCircle, null), React__default.createElement(OverlayInfoTopNoteTitle, null, asset.note.title))), React__default.createElement(OverlayInfoBottom, null, selectable && React__default.createElement(OverlayInfoBottomSelectButton, {
340
- selected: selected
341
- }, React__default.createElement(SvgCheckCircleFilled, {
342
- onClick: onSelectClick
343
- })), React__default.createElement(OverlayInfoBottomActions, null, asset.actions && asset.actions.map(function (action) {
344
- return React__default.createElement(Tooltip, {
345
- key: "".concat(asset.key, "-").concat(action.title),
346
- content: action.title
347
- }, React__default.createElement(Fragment$1, {
348
- as: ComputedActionButton$1,
349
- component: action.component,
350
- icon: action.icon,
351
- onClick: function onClick(event) {
352
- return onActionClick(event, action);
353
- }
354
- }));
355
- })))), selectable && React__default.createElement(OverlaySelected$1, {
356
- selected: selected
357
- })), asset.overlay && React__default.createElement(ConsumerDefinedOverlay$1, null, asset.overlay));
358
- };
359
-
360
- AssetGalleryCompactCard.propTypes = process.env.NODE_ENV !== "production" ? {
361
- asset: PropTypes.shape(assetShapeWithLayout).isRequired,
362
- hasHeightAndWidth: PropTypes.bool.isRequired,
363
- selectable: PropTypes.bool,
364
- selected: PropTypes.bool,
365
- extendedSelectMode: PropTypes.bool,
366
- onAssetSelected: PropTypes.func.isRequired,
367
- onAssetUnselected: PropTypes.func.isRequired,
368
- component: PropTypes.func
369
- } : {};
370
- AssetGalleryCompactCard.defaultProps = {};
371
- var AssetGalleryCompactCard$1 = React__default.memo(AssetGalleryCompactCard, function (prevProps, nextProps) {
372
- var reactiveProps = ['selectable', 'selected', 'extendedSelectMode', 'asset.previewUrl', 'asset.overlay', 'hasHeightAndWidth'];
373
- return reactiveProps.every(function (propKey) {
374
- return get(prevProps, propKey) === get(nextProps, propKey);
375
- });
376
- });
377
-
378
- var _templateObject$1, _templateObject2$1, _templateObject3$1, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16;
379
- var AssetGalleryGridCard$2 = styled.div.attrs(applyDefaultTheme)(_templateObject$1 || (_templateObject$1 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n height: 100%;\n margin: 0;\n ", "\n border: 1px solid;\n ", ";\n ", "\n box-sizing: border-box;\n text-decoration: none;\n"])), function (props) {
380
- return props.theme.themeProp('color', props.theme.getColor('gray-300'), props.theme.getColor('gray-700'));
381
- }, function (props) {
382
- return props.theme.themeProp('border-color', props.theme.getColor('gray-700'), props.theme.getColor('gray-300'));
383
- }, function (props) {
384
- return props.extendedSelectMode && css(_templateObject2$1 || (_templateObject2$1 = _taggedTemplateLiteral(["\n cursor: pointer;\n "])));
385
- });
386
- var Note = styled.div.attrs(applyDefaultTheme)(_templateObject3$1 || (_templateObject3$1 = _taggedTemplateLiteral(["\n display: flex;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n padding: 9px 15px 7px;\n\n svg {\n max-width: 18px;\n max-height: 18px;\n width: auto;\n flex-shrink: 0;\n }\n"])));
387
- var NoteTitle = styled.div.attrs(applyDefaultTheme)(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n font-family: ", ";\n text-transform: uppercase;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 1.4;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n margin-left: 5px;\n"])), function (props) {
388
- return props.theme.secondaryFontFamily;
389
- });
390
- var Asset = styled.div(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n padding-top: 35px;\n padding-left: 8px;\n padding-right: 8px;\n\n video {\n display: block;\n width: 100%;\n height: 200px;\n }\n"])));
391
- var AssetFigure = styled.figure(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n margin: 0;\n width: 100%;\n height: 200px;\n\n img {\n object-fit: contain;\n height: 100%;\n width: 100%;\n }\n"])));
392
- var Info = styled.div.attrs(applyDefaultTheme)(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n font-family: ", ";\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 1.7;\n padding: 15px 15px 5px;\n"])), function (props) {
393
- return props.theme.primaryFontFamily;
394
- });
395
- var InfoTitle = styled.div.attrs(applyDefaultTheme)(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n flex-grow: 1;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n margin-bottom: 4px;\n"])));
396
- var InfoFileType = styled.div.attrs(applyDefaultTheme)(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n flex-shrink: 0;\n width: auto;\n max-width: 18px;\n max-height: 18px;\n"])));
397
- var InfoDescription = styled.div.attrs(applyDefaultTheme)(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n"])));
398
- var Bottom = styled.div.attrs(applyDefaultTheme)(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n display: flex;\n margin-top: auto;\n padding: 0 10px 10px;\n"])));
399
- var BottomSelectButton = styled.div.attrs(applyDefaultTheme)(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n opacity: ", ";\n flex-shrink: 0;\n cursor: pointer;\n transition: opacity 220ms;\n\n > svg {\n width: 23px;\n height: 100%;\n transition: color 120ms;\n color: ", ";\n }\n\n ", ":hover & {\n opacity: 1;\n }\n"])), function (props) {
400
- return props.selected ? 1 : 0;
401
- }, function (props) {
402
- return props.selected ? props.theme.getColor('orange-500') : 'inherit';
403
- }, AssetGalleryGridCard$2);
404
- var BottomActions = styled.div.attrs(applyDefaultTheme)(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n display: flex;\n margin-left: auto;\n opacity: 0;\n transition: opacity 220ms;\n\n ", ":hover & {\n opacity: 1;\n }\n"])), AssetGalleryGridCard$2);
405
- var OverlaySelected = styled.div.attrs(applyDefaultTheme)(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n position: absolute;\n top: -1px;\n bottom: -1px;\n left: -1px;\n right: -1px;\n pointer-events: none;\n transition: border-color 120ms;\n border: 4px solid\n ", ";\n"])), function (props) {
406
- return props.selected ? props.theme.getColor('orange-500') : 'transparent';
407
- });
408
- var ConsumerDefinedOverlay = styled.div.attrs(applyDefaultTheme)(_templateObject15 || (_templateObject15 = _taggedTemplateLiteral(["\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n pointer-events: none;\n"])));
409
- var Fragment = styled.div(_templateObject16 || (_templateObject16 = _taggedTemplateLiteral([""])));
410
-
411
- var ComputedRootComponent = function ComputedRootComponent(_ref) {
412
- var component = _ref.component,
413
- asset = _ref.asset,
414
- props = _objectWithoutProperties(_ref, ["component", "asset"]);
415
-
416
- var newProps = omit(props, ['theme', 'extendedSelectMode']);
417
-
418
- if (component) {
419
- if (!isFunction(component)) throw Error('Expected a function in component-prop');
420
-
421
- if (React__default.isValidElement(component(asset, newProps.children))) {
422
- return React__default.cloneElement(component(asset, newProps.children), omit(newProps, ['children']));
423
- }
424
- }
425
-
426
- return React__default.createElement(AssetGalleryGridCard$2, newProps);
427
- };
428
-
429
- ComputedRootComponent.propTypes = process.env.NODE_ENV !== "production" ? {} : {};
430
- var ComputedActionButton = React__default.forwardRef(function ComputedActionButton(_ref2, forwardedRef) {
431
- var component = _ref2.component,
432
- props = _objectWithoutProperties(_ref2, ["component"]);
433
-
434
- var newProps = props;
435
- newProps.children = React__default.createElement(ActionButton, {
436
- ref: forwardedRef,
437
- icon: newProps.icon,
438
- onClick: newProps.onClick
439
- });
440
-
441
- if (component) {
442
- if (!isFunction(component)) throw Error('Expected a function in component-prop');
443
-
444
- if (React__default.isValidElement(component())) {
445
- return React__default.cloneElement(component(), _objectSpread2({}, omit(newProps, 'icon')));
446
- }
447
- }
448
-
449
- return React__default.createElement(React__default.Fragment, null, newProps.children);
450
- });
451
-
452
- var AssetGalleryGridCard = function AssetGalleryGridCard(props) {
453
- var _asset$note;
454
-
455
- var asset = props.asset,
456
- selectable = props.selectable,
457
- selected = props.selected,
458
- extendedSelectMode = props.extendedSelectMode,
459
- onAssetSelected = props.onAssetSelected,
460
- onAssetUnselected = props.onAssetUnselected,
461
- component = props.component;
462
- var videoPlayerRef = useRef();
463
-
464
- function onMouseEnter(event) {
465
- event.stopPropagation();
466
-
467
- if (videoPlayerRef.current) {
468
- var playPromise = videoPlayerRef.current.play();
469
-
470
- if (playPromise !== undefined) {
471
- playPromise.then(function () {})["catch"](function () {});
472
- }
473
- }
474
-
475
- if (isFunction(asset.onMouseEnter)) {
476
- asset.onMouseEnter(event, asset);
477
- }
478
- }
479
-
480
- function onMouseLeave(event) {
481
- event.stopPropagation();
482
-
483
- if (videoPlayerRef.current) {
484
- videoPlayerRef.current.pause();
485
- }
486
- }
487
-
488
- function onClick(event) {
489
- if (extendedSelectMode) {
490
- return onSelectClick(event);
491
- }
492
-
493
- if (isFunction(asset.onClick)) {
494
- asset.onClick(event, asset);
495
- }
496
- }
497
-
498
- function onSelectClick(event) {
499
- event.preventDefault();
500
- event.stopPropagation();
501
-
502
- if (selected) {
503
- return onAssetUnselected(asset.key);
504
- }
505
-
506
- return onAssetSelected(asset.key);
507
- }
508
-
509
- function onActionClick(event, action) {
510
- event.preventDefault();
511
- event.stopPropagation();
512
- action.onClick(asset);
513
- }
514
-
515
- return React__default.createElement(AssetGalleryGridCard$2, {
516
- as: ComputedRootComponent,
517
- component: component,
518
- asset: asset,
519
- disabled: asset.disabled,
520
- hasHeightAndWidth: asset.layout.hasHeightAndWidth,
521
- onClick: onClick,
522
- extendedSelectMode: extendedSelectMode,
523
- onMouseEnter: onMouseEnter,
524
- onMouseLeave: onMouseLeave
525
- }, ((_asset$note = asset.note) === null || _asset$note === void 0 ? void 0 : _asset$note.title) && React__default.createElement(Note, {
526
- title: asset.note.title
527
- }, asset.note.icon ? asset.note.icon : React__default.createElement(SvgWarningCircle, null), React__default.createElement(NoteTitle, null, asset.note.title)), React__default.createElement(Asset, {
528
- "data-id": "ss"
529
- }, asset.previewUrl && (['video'].includes(asset.fileType) ? React__default.createElement(LazyLoadComponent, null, React__default.createElement("video", {
530
- ref: videoPlayerRef,
531
- loop: true,
532
- muted: true
533
- }, React__default.createElement("source", {
534
- src: asset.previewUrl,
535
- type: "video/mp4"
536
- }))) : React__default.createElement(AssetFigure, null, React__default.createElement(LazyLoadImage, {
537
- alt: asset.title,
538
- src: asset.previewUrl,
539
- height: "100%",
540
- width: "100%",
541
- effect: "opacity",
542
- threshold: 700
543
- })))), React__default.createElement(Info, null, React__default.createElement("div", {
544
- style: {
545
- display: 'flex'
546
- }
547
- }, React__default.createElement(InfoTitle, {
548
- title: asset.title
549
- }, asset.title || '—'), asset.fileType === 'video' && React__default.createElement(InfoFileType, {
550
- as: SvgPlay
551
- }), asset.fileType === 'pdf' && React__default.createElement(InfoFileType, {
552
- as: SvgPdf
553
- }), asset.fileType === 'file' && React__default.createElement(InfoFileType, {
554
- as: SvgFile
555
- })), React__default.createElement(InfoDescription, null, asset.description)), React__default.createElement(Bottom, null, selectable && React__default.createElement(BottomSelectButton, {
556
- selected: selected
557
- }, React__default.createElement(SvgCheckCircleFilled, {
558
- onClick: onSelectClick
559
- })), React__default.createElement(BottomActions, null, asset.actions && asset.actions.map(function (action) {
560
- return React__default.createElement(Tooltip, {
561
- key: "".concat(asset.key, "-").concat(action.title),
562
- content: action.title
563
- }, React__default.createElement(Fragment, {
564
- as: ComputedActionButton,
565
- component: action.component,
566
- icon: action.icon,
567
- onClick: function onClick(event) {
568
- return onActionClick(event, action);
569
- }
570
- }));
571
- }))), selectable && React__default.createElement(OverlaySelected, {
572
- selected: selected
573
- }), asset.overlay && React__default.createElement(ConsumerDefinedOverlay, null, asset.overlay));
574
- };
575
-
576
- AssetGalleryGridCard.propTypes = process.env.NODE_ENV !== "production" ? {
577
- asset: PropTypes.shape(assetShapeWithLayout).isRequired,
578
- selectable: PropTypes.bool,
579
- selected: PropTypes.bool,
580
- extendedSelectMode: PropTypes.bool,
581
- onAssetSelected: PropTypes.func.isRequired,
582
- onAssetUnselected: PropTypes.func.isRequired,
583
- component: PropTypes.func
584
- } : {};
585
- AssetGalleryGridCard.defaultProps = {};
586
- var AssetGalleryGridCard$1 = React__default.memo(AssetGalleryGridCard, function (prevProps, nextProps) {
587
- var reactiveProps = ['selectable', 'selected', 'extendedSelectMode', 'asset.previewUrl', 'asset.overlay'];
588
- return reactiveProps.every(function (propKey) {
589
- return get(prevProps, propKey) === get(nextProps, propKey);
590
- });
591
- });
592
-
593
- var _templateObject, _templateObject2, _templateObject3;
594
- var AssetGalleryBase$1 = styled.div.attrs(applyDefaultTheme)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n position: relative;\n"])));
595
- var GroupLabel = styled.div.attrs(applyDefaultTheme)(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n font-family: ", ";\n ", "\n display: flex;\n align-items: flex-end;\n position: absolute;\n padding-bottom: 4px;\n box-sizing: border-box;\n"])), function (props) {
596
- return props.theme.primaryFontFamily;
597
- }, function (props) {
598
- return props.theme.themeProp('color', props.theme.getColor('gray-100'), props.theme.getColor('gray-700'));
599
- });
600
- var AssetGalleryCardBase = styled.div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n position: absolute;\n top: 0;\n left: 0;\n margin: 0;\n overflow: hidden;\n will-change: transform, width, height;\n"])));
601
-
602
- var AssetGalleryBase = React__default.forwardRef(function AssetGalleryBase(_ref, forwardedRef) {
603
- var assetsProp = _ref.assets,
604
- viewMode = _ref.viewMode,
605
- thumbnailMaxHeight = _ref.thumbnailMaxHeight,
606
- selectable = _ref.selectable,
607
- selectedAssetKeys = _ref.selectedAssetKeys,
608
- onAssetSelected = _ref.onAssetSelected,
609
- onAssetUnselected = _ref.onAssetUnselected,
610
- component = _ref.component,
611
- props = _objectWithoutProperties(_ref, ["assets", "viewMode", "thumbnailMaxHeight", "selectable", "selectedAssetKeys", "onAssetSelected", "onAssetUnselected", "component"]);
612
-
613
- var assetGalleryDOMNode = useRef();
614
- var assetGalleryCompactRef = useMergedRefs(forwardedRef, assetGalleryDOMNode);
615
- var assetGalleryWidth = useRef(0);
616
- var minimumRowAspectRatio = useRef(0);
617
- var calculatedAssets = useRef([]);
618
-
619
- var _useState = useState([]),
620
- _useState2 = _slicedToArray(_useState, 2),
621
- assets = _useState2[0],
622
- setAssets = _useState2[1];
623
-
624
- var MAXIMUM_ROW_HEIGHT = useMemo(function () {
625
- return viewMode === 'grid' ? 450 : thumbnailMaxHeight;
626
- }, [viewMode, thumbnailMaxHeight]);
627
- var SPACE_BETWEEN_ASSETS = 8;
628
- var SPACE_UNDER_ASSETS = 8;
629
- var PRIMARY_SCROLL_BUFFER_HEIGHT = 700;
630
- var SECONDARY_SCROLL_BUFFER_HEIGHT = 300;
631
- var GRID_VIEW_MODE_ASSET_MIN_WIDTH = 300;
632
- var GRID_VIEW_MODE_ASSET_HEIGHT = 403;
633
- var MISSING_WIDTH_PLACEHOLDER = 1920;
634
- var MISSING_HEIGHT_PLACEHOLDER = 1080;
635
- var previousYOffset = useRef(window.pageYOffset);
636
- var latestYOffset = useRef(window.pageYOffset);
637
- var scrollDirection = useRef('down');
638
- useLayoutEffect(function () {
639
- if (!assetGalleryDOMNode.current) return;
640
- var throttledOnResize = throttle(onResize, 1);
641
- var resizeObserver = new ResizeObserver(throttledOnResize);
642
- resizeObserver.observe(assetGalleryDOMNode.current);
643
-
644
- function onResize(entries) {
645
- entries.forEach(function (entry) {
646
- if (assetGalleryWidth.current === entry.contentRect.width) return;
647
- window.requestAnimationFrame(function () {
648
- assetGalleryWidth.current = entry.contentRect.width;
649
- main();
650
- });
651
- });
652
- }
653
-
654
- return function () {
655
- return resizeObserver.unobserve(assetGalleryDOMNode.current);
656
- };
657
- }, [assetsProp, assetGalleryDOMNode, MAXIMUM_ROW_HEIGHT]);
658
- useEffect(function () {
659
- main();
660
- }, [MAXIMUM_ROW_HEIGHT, assetsProp]);
661
-
662
- var main = function main() {
663
- calculateAssetGalleryAspectRatio();
664
- calculateLayout();
665
- calculateVisibility();
666
- };
667
-
668
- var calculateAssetGalleryAspectRatio = function calculateAssetGalleryAspectRatio() {
669
- if (assetGalleryWidth.current > 0) {
670
- minimumRowAspectRatio.current = calculateAspectRatio(assetGalleryWidth.current, MAXIMUM_ROW_HEIGHT);
671
- }
672
- };
673
-
674
- var calculateLayout = function calculateLayout() {
675
- if (viewMode === 'grid' && assetGalleryWidth.current > 0) {
676
- var row = [];
677
- var translateX = 0;
678
- var translateY = 0;
679
- var computedAssets = [];
680
- var lastGroup = null;
681
- var desiredAssetCountInRow = Math.floor(assetGalleryWidth.current / GRID_VIEW_MODE_ASSET_MIN_WIDTH) || 1;
682
- var desiredAssetWidth = assetGalleryWidth.current / desiredAssetCountInRow - SPACE_BETWEEN_ASSETS + SPACE_BETWEEN_ASSETS / desiredAssetCountInRow;
683
- assetsProp.forEach(function (asset, index) {
684
- var _assetsProp;
685
-
686
- if (asset.group && asset.group !== lastGroup) {
687
- computedAssets.push({
688
- title: asset.group,
689
- key: asset.key,
690
- layout: {
691
- type: 'groupLabel',
692
- height: 50,
693
- translateX: Math.round(translateX),
694
- translateY: Math.round(translateY)
695
- }
696
- });
697
- lastGroup = asset.group;
698
- translateY += 50 + SPACE_UNDER_ASSETS;
699
- }
700
-
701
- row.push(asset);
702
-
703
- if (row.length === desiredAssetCountInRow || index + 1 === assetsProp.length || (_assetsProp = assetsProp[index + 1]) !== null && _assetsProp !== void 0 && _assetsProp.group && assetsProp[index + 1].group !== asset.group) {
704
- row.forEach(function (rowAsset) {
705
- computedAssets.push(_objectSpread2(_objectSpread2({}, rowAsset), {}, {
706
- layout: {
707
- type: 'asset',
708
- width: Math.round(desiredAssetWidth),
709
- height: Math.round(GRID_VIEW_MODE_ASSET_HEIGHT),
710
- translateX: Math.round(translateX),
711
- translateY: Math.round(translateY)
712
- }
713
- }));
714
- translateX += desiredAssetWidth + SPACE_BETWEEN_ASSETS;
715
- });
716
- row = [];
717
- translateX = 0;
718
- translateY += GRID_VIEW_MODE_ASSET_HEIGHT + SPACE_UNDER_ASSETS;
719
- }
720
- });
721
- calculatedAssets.current = computedAssets;
722
- } else {
723
- if (minimumRowAspectRatio.current > 0) {
724
- var _row = [];
725
- var _translateX = 0;
726
- var _translateY = 0;
727
- var rowAspectRatio = 0;
728
- var _lastGroup = null;
729
- var _computedAssets = [];
730
- assetsProp.forEach(function (asset, index) {
731
- var _assetsProp2;
732
-
733
- if (asset.group && asset.group !== _lastGroup) {
734
- _computedAssets.push({
735
- title: asset.group,
736
- key: asset.key,
737
- layout: {
738
- type: 'groupLabel',
739
- height: 50,
740
- translateX: Math.round(_translateX),
741
- translateY: Math.round(_translateY)
742
- }
743
- });
744
-
745
- _lastGroup = asset.group;
746
- _translateY += 50 + SPACE_UNDER_ASSETS;
747
- }
748
-
749
- rowAspectRatio += calculateAspectRatio(asset.width || MISSING_WIDTH_PLACEHOLDER, asset.height || MISSING_HEIGHT_PLACEHOLDER);
750
-
751
- _row.push(asset);
752
-
753
- if (rowAspectRatio >= minimumRowAspectRatio.current || index + 1 === assetsProp.length || (_assetsProp2 = assetsProp[index + 1]) !== null && _assetsProp2 !== void 0 && _assetsProp2.group && assetsProp[index + 1].group !== asset.group) {
754
- rowAspectRatio = Math.max(rowAspectRatio, minimumRowAspectRatio.current);
755
- var totalDesiredWidthOfImages = assetGalleryWidth.current - SPACE_BETWEEN_ASSETS * (_row.length - 1);
756
- var rowHeight = totalDesiredWidthOfImages / rowAspectRatio;
757
-
758
- _row.forEach(function (rowAsset) {
759
- var assetWidth = rowHeight * calculateAspectRatio(rowAsset.width || MISSING_WIDTH_PLACEHOLDER, rowAsset.height || MISSING_HEIGHT_PLACEHOLDER);
760
-
761
- _computedAssets.push(_objectSpread2(_objectSpread2({}, rowAsset), {}, {
762
- layout: {
763
- type: 'asset',
764
- width: Math.round(assetWidth),
765
- height: Math.round(rowHeight),
766
- translateX: Math.round(_translateX),
767
- translateY: Math.round(_translateY),
768
- hasHeightAndWidth: Boolean(rowAsset.width && rowAsset.height)
769
- }
770
- }));
771
-
772
- _translateX += assetWidth + SPACE_BETWEEN_ASSETS;
773
- });
774
-
775
- _row = [];
776
- rowAspectRatio = 0;
777
- _translateY += rowHeight + SPACE_UNDER_ASSETS;
778
- _translateX = 0;
779
- }
780
- });
781
- calculatedAssets.current = _computedAssets;
782
- }
783
- }
784
- };
785
-
786
- function calculateAspectRatio(width, height) {
787
- return width / height;
788
- }
789
-
790
- var totalGalleryHeight = useMemo(function () {
791
- if (assets.length === 0) {
792
- return 0;
793
- }
794
-
795
- var lastAsset = assets[assets.length - 1];
796
- return lastAsset.layout.translateY + lastAsset.layout.height;
797
- }, [assets]);
798
- useEffect(function () {
799
- var throttledOnScroll = throttle(onScroll, 200);
800
- window.addEventListener('scroll', throttledOnScroll, false);
801
- return function () {
802
- return window.removeEventListener('scroll', throttledOnScroll, false);
803
- };
804
- }, [assetGalleryDOMNode, calculatedAssets]);
805
-
806
- function onScroll() {
807
- setScrollPositionAndDirection();
808
- calculateVisibility();
809
- }
810
-
811
- function setScrollPositionAndDirection() {
812
- var newYOffset = window.pageYOffset;
813
- previousYOffset.current = latestYOffset.current;
814
- latestYOffset.current = newYOffset;
815
- scrollDirection.current = latestYOffset.current > previousYOffset.current ? 'down' : 'up';
816
- }
817
-
818
- var calculateVisibility = function calculateVisibility() {
819
- if (!assetGalleryDOMNode.current) return;
820
- var bufferTop = scrollDirection.current === 'up' ? PRIMARY_SCROLL_BUFFER_HEIGHT : SECONDARY_SCROLL_BUFFER_HEIGHT;
821
- var bufferBottom = scrollDirection.current === 'up' ? SECONDARY_SCROLL_BUFFER_HEIGHT : PRIMARY_SCROLL_BUFFER_HEIGHT;
822
- var containerOffset = getOffsetTop(assetGalleryDOMNode.current);
823
- var scrollerHeight = window.innerHeight;
824
- var yOffset = latestYOffset.current;
825
- var minTranslateYPlusHeight = yOffset - containerOffset - bufferTop;
826
- var maxTranslateY = yOffset - containerOffset + scrollerHeight + bufferBottom;
827
- var finalizedAssets = calculatedAssets.current.map(function (asset) {
828
- if (asset.layout.translateY + asset.layout.height < minTranslateYPlusHeight || asset.layout.translateY > maxTranslateY) {
829
- asset.layout.show = false;
830
- } else {
831
- asset.layout.show = true;
832
- }
833
-
834
- return asset;
835
- });
836
- setAssets(finalizedAssets);
837
- };
838
-
839
- function getOffsetTop(elem) {
840
- var offsetTop = 0;
841
-
842
- do {
843
- if (!isNaN(elem.offsetTop)) {
844
- offsetTop += elem.offsetTop;
845
- }
846
-
847
- elem = elem.offsetParent;
848
- } while (elem);
849
-
850
- return offsetTop;
851
- }
852
-
853
- return React__default.createElement(React__default.Fragment, null, React__default.createElement(AssetGalleryBase$1, _extends$5({
854
- ref: assetGalleryCompactRef,
855
- style: {
856
- height: "".concat(totalGalleryHeight, "px")
857
- },
858
- className: props.className
859
- }, props), assets.map(function (asset) {
860
- return asset.layout.show && React__default.createElement(React__default.Fragment, {
861
- key: "asset-gallery-".concat(asset.layout.type, "-").concat(asset.key)
862
- }, asset.layout.type === 'groupLabel' && React__default.createElement(GroupLabel, {
863
- style: {
864
- transform: "translate3d(".concat(asset.layout.translateX, "px,").concat(asset.layout.translateY, "px, 0)"),
865
- height: "".concat(asset.layout.height, "px")
866
- }
867
- }, asset.title), asset.layout.type === 'asset' && React__default.createElement(AssetGalleryCardBase, {
868
- style: {
869
- transform: "translate3d(".concat(asset.layout.translateX, "px, ").concat(asset.layout.translateY, "px, 0)"),
870
- width: "".concat(asset.layout.width, "px"),
871
- height: "".concat(asset.layout.height, "px")
872
- }
873
- }, viewMode === 'grid' ? React__default.createElement(AssetGalleryGridCard$1, {
874
- asset: asset,
875
- selectable: selectable,
876
- selected: selectedAssetKeys.includes(asset.key),
877
- extendedSelectMode: Boolean(selectedAssetKeys.length),
878
- onAssetSelected: onAssetSelected,
879
- onAssetUnselected: onAssetUnselected,
880
- component: component
881
- }) : React__default.createElement(AssetGalleryCompactCard$1, {
882
- asset: asset,
883
- hasHeightAndWidth: asset.layout.hasHeightAndWidth,
884
- selectable: selectable,
885
- selected: selectedAssetKeys.includes(asset.key),
886
- extendedSelectMode: Boolean(selectedAssetKeys.length),
887
- onAssetSelected: onAssetSelected,
888
- onAssetUnselected: onAssetUnselected,
889
- component: component
890
- })));
891
- })));
892
- });
893
- AssetGalleryBase.propTypes = process.env.NODE_ENV !== "production" ? {
894
- assets: PropTypes.arrayOf(PropTypes.shape(assetShape)),
895
- viewMode: PropTypes.oneOf(['compact', 'grid']),
896
- thumbnailMaxHeight: PropTypes.number,
897
- selectable: PropTypes.bool,
898
- selectedAssetKeys: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.string), PropTypes.arrayOf(PropTypes.number)]).isRequired,
899
- onAssetSelected: PropTypes.func.isRequired,
900
- onAssetUnselected: PropTypes.func.isRequired,
901
- component: PropTypes.func,
902
- className: PropTypes.string
903
- } : {};
904
-
905
- var AssetGallery = React__default.forwardRef(function AssetGallery(_ref, forwardedRef) {
906
- var assets = _ref.assets,
907
- viewMode = _ref.viewMode,
908
- thumbnailMaxHeight = _ref.thumbnailMaxHeight,
909
- selectable = _ref.selectable,
910
- selectedAssetKeys = _ref.selectedAssetKeys,
911
- onSelectedChanged = _ref.onSelectedChanged,
912
- component = _ref.component,
913
- props = _objectWithoutProperties(_ref, ["assets", "viewMode", "thumbnailMaxHeight", "selectable", "selectedAssetKeys", "onSelectedChanged", "component"]);
914
-
915
- var _useState = useState(selectedAssetKeys || []),
916
- _useState2 = _slicedToArray(_useState, 2),
917
- selectedAssetKeysInternalState = _useState2[0],
918
- setSelectedAssetKeysInternalState = _useState2[1];
919
-
920
- useEffect(function () {
921
- setSelectedAssetKeysInternalState(selectedAssetKeys || []);
922
- }, [selectedAssetKeys]);
923
- useEffect(function () {
924
- if (selectedAssetKeys === selectedAssetKeysInternalState) return;
925
-
926
- if (isFunction(onSelectedChanged)) {
927
- onSelectedChanged(selectedAssetKeysInternalState);
928
- }
929
- }, [selectedAssetKeysInternalState]);
930
- var onSelected = useCallback(function (assetKey) {
931
- setSelectedAssetKeysInternalState(function (currentState) {
932
- return [].concat(_toConsumableArray(currentState), [assetKey]);
933
- });
934
- }, []);
935
- var onUnselected = useCallback(function (assetKey) {
936
- setSelectedAssetKeysInternalState(function (currentState) {
937
- return currentState.filter(function (filteredAssetKey) {
938
- return filteredAssetKey !== assetKey;
939
- });
940
- });
941
- }, []);
942
- return React__default.createElement(AssetGalleryBase, _extends$5({
943
- ref: forwardedRef,
944
- assets: assets,
945
- thumbnailMaxHeight: thumbnailMaxHeight,
946
- selectable: selectable,
947
- selectedAssetKeys: selectedAssetKeysInternalState,
948
- onAssetSelected: onSelected,
949
- onAssetUnselected: onUnselected,
950
- component: component,
951
- viewMode: viewMode
952
- }, props));
953
- });
954
- AssetGallery.propTypes = process.env.NODE_ENV !== "production" ? {
955
- assets: PropTypes.arrayOf(PropTypes.shape(assetShape)),
956
- viewMode: PropTypes.oneOf(['compact', 'grid']),
957
- thumbnailMaxHeight: PropTypes.number,
958
- selectable: PropTypes.bool,
959
- selectedAssetKeys: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.string), PropTypes.arrayOf(PropTypes.number)]),
960
- onSelectedChanged: PropTypes.func,
961
- component: PropTypes.func
962
- } : {};
963
- AssetGallery.defaultProps = {
964
- assets: [],
965
- viewMode: 'compact',
966
- thumbnailMaxHeight: 300,
967
- selectedAssetKeys: []
968
- };
969
-
970
- export { AssetGallery as A };