@pingux/astro 1.8.0-alpha.0 → 1.8.0-alpha.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/lib/cjs/components/CodeView/CodeView.js +11 -4
- package/lib/cjs/components/CodeView/CodeView.stories.js +33 -2
- package/lib/cjs/components/Image/Image.js +132 -11
- package/lib/cjs/components/Image/Image.stories.js +52 -6
- package/lib/cjs/components/Image/Image.test.js +138 -2
- package/lib/cjs/components/Image/imageConstants.js +13 -0
- package/lib/cjs/components/ImageUploadField/ImageUploadField.test.js +27 -8
- package/lib/cjs/hooks/index.js +10 -1
- package/lib/cjs/hooks/useFallbackImage/index.js +18 -0
- package/lib/cjs/hooks/useFallbackImage/useFallbackImage.js +46 -0
- package/lib/cjs/hooks/useFallbackImage/useFallbackImage.test.js +65 -0
- package/lib/components/CodeView/CodeView.js +12 -5
- package/lib/components/CodeView/CodeView.stories.js +26 -0
- package/lib/components/Image/Image.js +123 -9
- package/lib/components/Image/Image.stories.js +39 -4
- package/lib/components/Image/Image.test.js +118 -1
- package/lib/components/Image/imageConstants.js +2 -0
- package/lib/components/ImageUploadField/ImageUploadField.test.js +27 -7
- package/lib/hooks/index.js +2 -1
- package/lib/hooks/useFallbackImage/index.js +1 -0
- package/lib/hooks/useFallbackImage/useFallbackImage.js +32 -0
- package/lib/hooks/useFallbackImage/useFallbackImage.test.js +51 -0
- package/package.json +2 -1
@@ -20,17 +20,22 @@ var _testWrapper = require("../../utils/testUtils/testWrapper");
|
|
20
20
|
|
21
21
|
var _ImageUploadField = _interopRequireDefault(require("./ImageUploadField"));
|
22
22
|
|
23
|
-
var _index = require("../../index");
|
24
|
-
|
25
23
|
var _react3 = require("@emotion/react");
|
26
24
|
|
25
|
+
var imageUploadNoImagePreview = 'image-upload-no-image-preview';
|
26
|
+
jest.mock('../Image', function () {
|
27
|
+
return function (props) {
|
28
|
+
return (0, _react3.jsx)("img", (0, _extends2["default"])({
|
29
|
+
alt: "mock"
|
30
|
+
}, props));
|
31
|
+
};
|
32
|
+
});
|
27
33
|
var testLabel = 'test-label';
|
28
34
|
var testButtonId = 'image-preview-button';
|
29
35
|
var testHelperText = 'test-helper-text';
|
30
36
|
var testImageURL = 'test-image-url';
|
31
37
|
var testImageURL2 = 'test-image-url2';
|
32
38
|
var imageUploadImagePreview = 'image-upload-image-preview';
|
33
|
-
var imageUploadNoImagePreview = 'image-upload-no-image-preview';
|
34
39
|
var file = new File(['(⌐□_□)'], 'chucknorris.png', {
|
35
40
|
type: 'image/png'
|
36
41
|
});
|
@@ -224,10 +229,16 @@ test('should change image if the corresponding menu option clicked', /*#__PURE__
|
|
224
229
|
}
|
225
230
|
});
|
226
231
|
|
227
|
-
expect
|
232
|
+
_context4.t0 = expect;
|
233
|
+
_context4.next = 14;
|
234
|
+
return _testWrapper.screen.findByTestId(imageUploadImagePreview);
|
235
|
+
|
236
|
+
case 14:
|
237
|
+
_context4.t1 = _context4.sent;
|
238
|
+
(0, _context4.t0)(_context4.t1).toBeInTheDocument();
|
228
239
|
expect(imagePreview).toHaveAttribute('src');
|
229
240
|
|
230
|
-
case
|
241
|
+
case 17:
|
231
242
|
case "end":
|
232
243
|
return _context4.stop();
|
233
244
|
}
|
@@ -273,14 +284,20 @@ test('should call onRemove cb (when provided) when a file is uploaded', /*#__PUR
|
|
273
284
|
|
274
285
|
_userEvent["default"].click(_testWrapper.screen.getByTestId(testButtonId));
|
275
286
|
|
276
|
-
expect
|
287
|
+
_context5.t0 = expect;
|
288
|
+
_context5.next = 10;
|
289
|
+
return _testWrapper.screen.findByTestId(imageUploadImagePreview);
|
290
|
+
|
291
|
+
case 10:
|
292
|
+
_context5.t1 = _context5.sent;
|
293
|
+
(0, _context5.t0)(_context5.t1).toBeInTheDocument();
|
277
294
|
|
278
295
|
_userEvent["default"].click(_testWrapper.screen.getByText('Remove Image'));
|
279
296
|
|
280
297
|
expect(imagePreview).not.toBeInTheDocument();
|
281
298
|
expect(testOnRemove).toHaveBeenCalledTimes(1);
|
282
299
|
|
283
|
-
case
|
300
|
+
case 15:
|
284
301
|
case "end":
|
285
302
|
return _context5.stop();
|
286
303
|
}
|
@@ -429,7 +446,9 @@ test('should show the menu if label clicked when preview image exists', /*#__PUR
|
|
429
446
|
})));
|
430
447
|
test('should render node element if passed as default image', function () {
|
431
448
|
getComponent({
|
432
|
-
defaultPreviewImage: (0, _react3.jsx)(
|
449
|
+
defaultPreviewImage: (0, _react3.jsx)("img", {
|
450
|
+
alt: "mock"
|
451
|
+
})
|
433
452
|
});
|
434
453
|
|
435
454
|
var img = _testWrapper.screen.getByRole('img');
|
package/lib/cjs/hooks/index.js
CHANGED
@@ -36,6 +36,13 @@ _Object$defineProperty(exports, "useDeprecationWarning", {
|
|
36
36
|
}
|
37
37
|
});
|
38
38
|
|
39
|
+
_Object$defineProperty(exports, "useFallbackImage", {
|
40
|
+
enumerable: true,
|
41
|
+
get: function get() {
|
42
|
+
return _useFallbackImage["default"];
|
43
|
+
}
|
44
|
+
});
|
45
|
+
|
39
46
|
_Object$defineProperty(exports, "useField", {
|
40
47
|
enumerable: true,
|
41
48
|
get: function get() {
|
@@ -123,4 +130,6 @@ var _useSelectField = _interopRequireDefault(require("./useSelectField"));
|
|
123
130
|
|
124
131
|
var _useStatusClasses = _interopRequireDefault(require("./useStatusClasses"));
|
125
132
|
|
126
|
-
var _useDebounce = _interopRequireDefault(require("./useDebounce"));
|
133
|
+
var _useDebounce = _interopRequireDefault(require("./useDebounce"));
|
134
|
+
|
135
|
+
var _useFallbackImage = _interopRequireDefault(require("./useFallbackImage"));
|
@@ -0,0 +1,18 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
|
5
|
+
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
6
|
+
|
7
|
+
_Object$defineProperty(exports, "__esModule", {
|
8
|
+
value: true
|
9
|
+
});
|
10
|
+
|
11
|
+
_Object$defineProperty(exports, "default", {
|
12
|
+
enumerable: true,
|
13
|
+
get: function get() {
|
14
|
+
return _useFallbackImage["default"];
|
15
|
+
}
|
16
|
+
});
|
17
|
+
|
18
|
+
var _useFallbackImage = _interopRequireDefault(require("./useFallbackImage"));
|
@@ -0,0 +1,46 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
|
5
|
+
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
6
|
+
|
7
|
+
_Object$defineProperty(exports, "__esModule", {
|
8
|
+
value: true
|
9
|
+
});
|
10
|
+
|
11
|
+
exports["default"] = void 0;
|
12
|
+
|
13
|
+
var _setTimeout2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-timeout"));
|
14
|
+
|
15
|
+
var _react = require("react");
|
16
|
+
|
17
|
+
var useFallbackImage = function useFallbackImage(_ref) {
|
18
|
+
var imageSrc = _ref.src,
|
19
|
+
onImageLoad = _ref.onImageLoad,
|
20
|
+
onImageError = _ref.onImageError,
|
21
|
+
fallbackTimeout = _ref.fallbackTimeout,
|
22
|
+
onFallbackTimeout = _ref.onFallbackTimeout;
|
23
|
+
var displayImage = (0, _react.useMemo)(function () {
|
24
|
+
return document.createElement('img');
|
25
|
+
}, []);
|
26
|
+
(0, _react.useEffect)(function () {
|
27
|
+
displayImage.src = imageSrc;
|
28
|
+
displayImage.onload = onImageLoad;
|
29
|
+
displayImage.onerror = onImageError;
|
30
|
+
return function () {
|
31
|
+
displayImage.onload = null;
|
32
|
+
displayImage.onerror = null;
|
33
|
+
};
|
34
|
+
}, []);
|
35
|
+
(0, _react.useEffect)(function () {
|
36
|
+
var timeoutId = 0;
|
37
|
+
timeoutId = (0, _setTimeout2["default"])(onFallbackTimeout, fallbackTimeout);
|
38
|
+
return function () {
|
39
|
+
return clearTimeout(timeoutId);
|
40
|
+
};
|
41
|
+
}, []);
|
42
|
+
return displayImage;
|
43
|
+
};
|
44
|
+
|
45
|
+
var _default = useFallbackImage;
|
46
|
+
exports["default"] = _default;
|
@@ -0,0 +1,65 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
|
5
|
+
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
6
|
+
|
7
|
+
var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");
|
8
|
+
|
9
|
+
var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");
|
10
|
+
|
11
|
+
var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");
|
12
|
+
|
13
|
+
var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
|
14
|
+
|
15
|
+
var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");
|
16
|
+
|
17
|
+
var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");
|
18
|
+
|
19
|
+
var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");
|
20
|
+
|
21
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
|
22
|
+
|
23
|
+
var _reactHooks = require("@testing-library/react-hooks");
|
24
|
+
|
25
|
+
var _useFallbackImage = _interopRequireDefault(require("./useFallbackImage"));
|
26
|
+
|
27
|
+
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
28
|
+
|
29
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
|
30
|
+
|
31
|
+
var defaultProps = {
|
32
|
+
src: 'test-src',
|
33
|
+
fallbackImage: 'test-fallback-src',
|
34
|
+
onImageLoad: jest.fn(),
|
35
|
+
onImageError: jest.fn(),
|
36
|
+
fallbackTimeout: 5,
|
37
|
+
onFallbackTimeout: jest.fn()
|
38
|
+
};
|
39
|
+
test('should return node if all props are correct ', function () {
|
40
|
+
var _renderHook = (0, _reactHooks.renderHook)(function () {
|
41
|
+
return (0, _useFallbackImage["default"])(defaultProps);
|
42
|
+
}),
|
43
|
+
current = _renderHook.result.current;
|
44
|
+
|
45
|
+
expect(current).toBeInstanceOf(HTMLImageElement);
|
46
|
+
});
|
47
|
+
test('should not trigger onImageLoad if no fallback passed', function () {
|
48
|
+
(0, _reactHooks.renderHook)(function () {
|
49
|
+
return (0, _useFallbackImage["default"])(_objectSpread(_objectSpread({}, defaultProps), {}, {
|
50
|
+
fallbackImage: null
|
51
|
+
}));
|
52
|
+
});
|
53
|
+
expect(defaultProps.onImageLoad).not.toHaveBeenCalled();
|
54
|
+
});
|
55
|
+
test('should not trigger onImageLoad if component unmounted', function () {
|
56
|
+
var _renderHook2 = (0, _reactHooks.renderHook)(function () {
|
57
|
+
return (0, _useFallbackImage["default"])(_objectSpread(_objectSpread({}, defaultProps), {}, {
|
58
|
+
fallbackImage: null
|
59
|
+
}));
|
60
|
+
}),
|
61
|
+
unmount = _renderHook2.unmount;
|
62
|
+
|
63
|
+
unmount();
|
64
|
+
expect(defaultProps.onImageLoad).not.toHaveBeenCalled();
|
65
|
+
});
|
@@ -11,7 +11,7 @@ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
|
|
11
11
|
import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
|
12
12
|
import _trimInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/trim";
|
13
13
|
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
|
14
|
-
var _excluded = ["children", "className", "hasLineNumbers", "hasNoCopyButton", "language"];
|
14
|
+
var _excluded = ["children", "className", "hasLineNumbers", "hasNoCopyButton", "language", "Prism"];
|
15
15
|
|
16
16
|
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
17
17
|
|
@@ -22,7 +22,7 @@ import PropTypes from 'prop-types';
|
|
22
22
|
import { useFocusRing } from '@react-aria/focus';
|
23
23
|
import { useHover } from '@react-aria/interactions';
|
24
24
|
import { mergeProps } from '@react-aria/utils';
|
25
|
-
import Highlight, { defaultProps } from 'prism-react-renderer';
|
25
|
+
import Highlight, { defaultProps, Prism } from 'prism-react-renderer';
|
26
26
|
import { useStatusClasses } from '../../hooks';
|
27
27
|
import { Box, CopyText } from '../..';
|
28
28
|
import codeView from '../../styles/variants/codeView';
|
@@ -38,6 +38,7 @@ var CodeView = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
38
38
|
hasLineNumbers = props.hasLineNumbers,
|
39
39
|
hasNoCopyButton = props.hasNoCopyButton,
|
40
40
|
language = props.language,
|
41
|
+
customPrism = props.Prism,
|
41
42
|
others = _objectWithoutProperties(props, _excluded);
|
42
43
|
|
43
44
|
var _useFocusRing = useFocusRing(),
|
@@ -64,7 +65,8 @@ var CodeView = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
64
65
|
var content = ___EmotionJSX(Highlight, _extends({}, defaultProps, {
|
65
66
|
theme: codeView.theme,
|
66
67
|
code: (children === null || children === void 0 ? void 0 : _trimInstanceProperty(children).call(children)) || '',
|
67
|
-
language: language
|
68
|
+
language: language,
|
69
|
+
Prism: customPrism || Prism
|
68
70
|
}), function (_ref) {
|
69
71
|
var className = _ref.className,
|
70
72
|
style = _ref.style,
|
@@ -128,9 +130,14 @@ CodeView.propTypes = {
|
|
128
130
|
* Which programming language the CodeView should use for highlighting. A list of default languages is listed [here](https://github.com/FormidableLabs/prism-react-renderer/blob/master/src/vendor/prism/includeLangs.js).
|
129
131
|
*
|
130
132
|
*
|
131
|
-
* Additional languages may be added, see
|
133
|
+
* Additional languages may be added, see
|
134
|
+
* [CodeView with additional language](./?path=/docs/codeview--with-additional-language)
|
135
|
+
* for more information.
|
132
136
|
*/
|
133
|
-
language: PropTypes.string
|
137
|
+
language: PropTypes.string,
|
138
|
+
|
139
|
+
/* Prism object for using instead of Prism from "react-prism-renderer" */
|
140
|
+
Prism: PropTypes.shape({})
|
134
141
|
};
|
135
142
|
CodeView.defaultProps = {
|
136
143
|
language: 'json',
|
@@ -1,4 +1,7 @@
|
|
1
|
+
import _trimInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/trim";
|
1
2
|
import React from 'react';
|
3
|
+
import Prism from 'prismjs';
|
4
|
+
import 'prismjs/components/prism-powershell';
|
2
5
|
import CodeView from './CodeView';
|
3
6
|
import { Text } from '../..';
|
4
7
|
import { jsx as ___EmotionJSX } from "@emotion/react";
|
@@ -15,6 +18,9 @@ export default {
|
|
15
18
|
control: {
|
16
19
|
type: 'text'
|
17
20
|
}
|
21
|
+
},
|
22
|
+
Prism: {
|
23
|
+
control: 'none'
|
18
24
|
}
|
19
25
|
},
|
20
26
|
parameters: {
|
@@ -62,4 +68,24 @@ export var WithCustomSize = function WithCustomSize() {
|
|
62
68
|
},
|
63
69
|
hasNoCopyButton: true
|
64
70
|
}, "\nexport const ChipWithIcon = () => (\n <>\n <Chip label=\"Chip with Icon Button\" bg=\"navy\">\n <IconButton aria-label=\"Clear Chip with Icon Button\" variant=\"inverted\">\n <Icon icon={Clear} ml=\"xs\" size=\"14px\" />\n </IconButton>\n </Chip>\n\n <div style={{ padding: '5px' }} />\n\n <Chip label=\"Chip with Icon Button\">\n <IconButton aria-label=\"Clear Chip with Icon Button\" variant=\"inverted\">\n <Icon icon={Earth} ml=\"xs\" size=\"14px\" />\n </IconButton>\n </Chip>\n\n <div style={{ padding: '5px' }} />\n\n <Chip label=\"Chip with Icon\" bg=\"green\">\n <Icon icon={ContentCopy} ml=\"xs\" size=\"14px\" color=\"white\" />\n </Chip>\n </>\n);\n "));
|
71
|
+
};
|
72
|
+
export var WithAdditionalLanguage = function WithAdditionalLanguage() {
|
73
|
+
var _context;
|
74
|
+
|
75
|
+
/**
|
76
|
+
* import { CodeView } from "@pingux/astro";
|
77
|
+
* import Prism from 'prismjs';
|
78
|
+
* import 'prismjs/components/prism-powershell';
|
79
|
+
*/
|
80
|
+
var powershellCode = _trimInstanceProperty(_context = "\n Get-WinEvent -FilterHashtable @{\n LogName='Application'\n ProviderName='*defrag'\n }\n ").call(_context);
|
81
|
+
|
82
|
+
return ___EmotionJSX(CodeView, {
|
83
|
+
language: "powershell",
|
84
|
+
Prism: Prism
|
85
|
+
}, powershellCode);
|
86
|
+
};
|
87
|
+
WithAdditionalLanguage.parameters = {
|
88
|
+
docs: {
|
89
|
+
storyDescription: 'All available languages are listed [here](https://github.com/PrismJS/prism/tree/master/components).'
|
90
|
+
}
|
65
91
|
};
|
@@ -1,11 +1,33 @@
|
|
1
|
+
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
|
2
|
+
import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
|
3
|
+
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
|
4
|
+
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
|
5
|
+
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
|
6
|
+
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
|
7
|
+
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
|
8
|
+
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
|
1
9
|
import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
|
10
|
+
import _taggedTemplateLiteral from "@babel/runtime-corejs3/helpers/esm/taggedTemplateLiteral";
|
11
|
+
import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
|
12
|
+
import _slicedToArray from "@babel/runtime-corejs3/helpers/esm/slicedToArray";
|
2
13
|
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
|
3
|
-
|
4
|
-
|
14
|
+
|
15
|
+
var _templateObject;
|
16
|
+
|
17
|
+
var _excluded = ["className", "fallbackImage", "fallbackTimeout", "isDisabled", "src", "sx"];
|
18
|
+
|
19
|
+
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
20
|
+
|
21
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { _defineProperty(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
|
22
|
+
|
23
|
+
import React, { forwardRef, useRef, useImperativeHandle, useState } from 'react';
|
5
24
|
import PropTypes from 'prop-types';
|
6
25
|
import { Image as ThemeUIImage } from 'theme-ui';
|
7
26
|
import { useHover } from '@react-aria/interactions';
|
8
|
-
import {
|
27
|
+
import { keyframes } from '@emotion/react';
|
28
|
+
import { usePropWarning, useStatusClasses, useFallbackImage } from '../../hooks';
|
29
|
+
import { Box } from '../../index';
|
30
|
+
import { neutral } from '../../styles/colors';
|
9
31
|
/**
|
10
32
|
* Basic image component.
|
11
33
|
* Built on top of [Image from Theme-UI](https://theme-ui.com/components/image/).
|
@@ -15,9 +37,37 @@ import { usePropWarning, useStatusClasses } from '../../hooks';
|
|
15
37
|
import { jsx as ___EmotionJSX } from "@emotion/react";
|
16
38
|
var Image = /*#__PURE__*/forwardRef(function (props, ref) {
|
17
39
|
var className = props.className,
|
40
|
+
fallbackImage = props.fallbackImage,
|
41
|
+
fallbackTimeout = props.fallbackTimeout,
|
18
42
|
isDisabled = props.isDisabled,
|
43
|
+
src = props.src,
|
44
|
+
sx = props.sx,
|
19
45
|
others = _objectWithoutProperties(props, _excluded);
|
20
46
|
|
47
|
+
var _useState = useState(true),
|
48
|
+
_useState2 = _slicedToArray(_useState, 2),
|
49
|
+
isLoading = _useState2[0],
|
50
|
+
setIsLoading = _useState2[1];
|
51
|
+
|
52
|
+
var _useState3 = useState(false),
|
53
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
54
|
+
loadedSuccessfully = _useState4[0],
|
55
|
+
setLoadedSuccessfully = _useState4[1]; // we need to use useRef here with useState so it will be updated in setTimeout and onload
|
56
|
+
// https://github.com/facebook/react/issues/14010#issuecomment-433788147
|
57
|
+
|
58
|
+
|
59
|
+
var isLoadingRef = useRef(isLoading);
|
60
|
+
|
61
|
+
var setIsLoadingWithRef = function setIsLoadingWithRef(newState) {
|
62
|
+
setIsLoading(newState);
|
63
|
+
isLoadingRef.current = newState;
|
64
|
+
};
|
65
|
+
|
66
|
+
var _useState5 = useState(fallbackImage || src),
|
67
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
68
|
+
imgSrc = _useState6[0],
|
69
|
+
setImgSrc = _useState6[1];
|
70
|
+
|
21
71
|
var imgRef = useRef();
|
22
72
|
/* istanbul ignore next */
|
23
73
|
|
@@ -32,16 +82,68 @@ var Image = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
32
82
|
|
33
83
|
var _useStatusClasses = useStatusClasses(className, {
|
34
84
|
isDisabled: isDisabled,
|
35
|
-
isHovered: isHovered
|
85
|
+
isHovered: isHovered,
|
86
|
+
isLoading: isLoading
|
36
87
|
}),
|
37
88
|
classNames = _useStatusClasses.classNames;
|
38
89
|
|
39
|
-
|
90
|
+
var onImageLoad = function onImageLoad() {
|
91
|
+
if (isLoadingRef !== null && isLoadingRef !== void 0 && isLoadingRef.current) {
|
92
|
+
setIsLoadingWithRef(false);
|
93
|
+
setImgSrc(src);
|
94
|
+
setLoadedSuccessfully(true);
|
95
|
+
}
|
96
|
+
};
|
97
|
+
|
98
|
+
var onImageError = function onImageError() {
|
99
|
+
setIsLoadingWithRef(false);
|
100
|
+
setImgSrc(fallbackImage || null);
|
101
|
+
};
|
102
|
+
|
103
|
+
var onFallbackTimeout = function onFallbackTimeout() {
|
104
|
+
if (isLoadingRef !== null && isLoadingRef !== void 0 && isLoadingRef.current) {
|
105
|
+
setIsLoadingWithRef(false);
|
106
|
+
setImgSrc(fallbackImage || null);
|
107
|
+
}
|
108
|
+
};
|
109
|
+
|
110
|
+
useFallbackImage(_objectSpread({
|
111
|
+
onImageLoad: onImageLoad,
|
112
|
+
onImageError: onImageError,
|
113
|
+
onFallbackTimeout: onFallbackTimeout
|
114
|
+
}, props));
|
115
|
+
var skeletonFrames = keyframes(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n 0% {\n background-color: ", ";\n }\n 100% {\n background-color: ", ";\n }\n"])), neutral[90], neutral[70]);
|
116
|
+
var skeletonSx = {
|
117
|
+
backgroundColor: neutral[90],
|
118
|
+
// eslint-disable-next-line react/prop-types
|
119
|
+
width: (sx === null || sx === void 0 ? void 0 : sx.width) || '100%',
|
120
|
+
// eslint-disable-next-line react/prop-types
|
121
|
+
height: (sx === null || sx === void 0 ? void 0 : sx.height) || '100%',
|
122
|
+
animation: isLoading && "".concat(skeletonFrames, " 1.5s ease-in-out 0.5s infinite alternate")
|
123
|
+
};
|
124
|
+
|
125
|
+
var Skeleton = function Skeleton(_ref) {
|
126
|
+
var children = _ref.children;
|
127
|
+
return ___EmotionJSX(Box, {
|
128
|
+
sx: skeletonSx,
|
129
|
+
"data-testid": "skeleton-image"
|
130
|
+
}, children);
|
131
|
+
};
|
132
|
+
|
133
|
+
var themeUiImage = ___EmotionJSX(ThemeUIImage, _extends({
|
40
134
|
className: classNames,
|
41
135
|
ref: imgRef,
|
42
136
|
alt: "Image",
|
43
|
-
role: "img"
|
137
|
+
role: "img",
|
138
|
+
src: imgSrc,
|
139
|
+
sx: sx
|
44
140
|
}, others, hoverProps));
|
141
|
+
|
142
|
+
if (isLoading || !loadedSuccessfully && !fallbackImage) {
|
143
|
+
return ___EmotionJSX(Skeleton, null);
|
144
|
+
}
|
145
|
+
|
146
|
+
return themeUiImage;
|
45
147
|
});
|
46
148
|
Image.propTypes = {
|
47
149
|
/** The styling variation of the image. */
|
@@ -53,12 +155,24 @@ Image.propTypes = {
|
|
53
155
|
/** The HTML element used to render the image. */
|
54
156
|
as: PropTypes.string,
|
55
157
|
|
56
|
-
/** Source of image. */
|
57
|
-
src: PropTypes.oneOfType([PropTypes.string, PropTypes.object])
|
158
|
+
/** Source of image(Image path). */
|
159
|
+
src: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
|
160
|
+
|
161
|
+
/** Load failure fault-tolerant src
|
162
|
+
* We do recommend using JS File or Blob object as an src for the "fallbackImage".
|
163
|
+
* Here is some documentation on how to create a blob image [https://developer.mozilla.org/en-US/docs/Web/API/Blob].
|
164
|
+
* Also please note that URLs are accepted, but if the URL cannot be loaded,
|
165
|
+
* the fallback image will not be rendered so it's not recommended.
|
166
|
+
* */
|
167
|
+
fallbackImage: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
|
168
|
+
|
169
|
+
/** Time in milliseconds that component should wait for a response from src address. */
|
170
|
+
fallbackTimeout: PropTypes.number
|
58
171
|
};
|
59
172
|
Image.defaultProps = {
|
60
173
|
isDisabled: false,
|
61
|
-
as: 'img'
|
174
|
+
as: 'img',
|
175
|
+
fallbackTimeout: 5000
|
62
176
|
};
|
63
177
|
Image.displayName = 'Image';
|
64
178
|
export default Image;
|
@@ -1,6 +1,8 @@
|
|
1
1
|
import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
|
2
2
|
import React from 'react';
|
3
|
+
import isChromatic from 'chromatic/isChromatic';
|
3
4
|
import Image from '.';
|
5
|
+
import { chiefIdentityChampions, pingImg } from './imageConstants';
|
4
6
|
import { htmlElements } from '../../utils/devUtils/constants/htmlElements';
|
5
7
|
import { jsx as ___EmotionJSX } from "@emotion/react";
|
6
8
|
export default {
|
@@ -24,7 +26,7 @@ export default {
|
|
24
26
|
control: {
|
25
27
|
type: 'none'
|
26
28
|
},
|
27
|
-
defaultValue:
|
29
|
+
defaultValue: pingImg
|
28
30
|
}
|
29
31
|
}
|
30
32
|
};
|
@@ -35,13 +37,13 @@ export var Default = function Default(_ref) {
|
|
35
37
|
};
|
36
38
|
export var Avatar = function Avatar() {
|
37
39
|
return ___EmotionJSX(Image, {
|
38
|
-
src:
|
40
|
+
src: pingImg,
|
39
41
|
variant: "images.avatar"
|
40
42
|
});
|
41
43
|
};
|
42
44
|
export var CustomSizeAndRadius = function CustomSizeAndRadius() {
|
43
45
|
return ___EmotionJSX(Image, {
|
44
|
-
src:
|
46
|
+
src: chiefIdentityChampions,
|
45
47
|
sx: {
|
46
48
|
width: '70px',
|
47
49
|
height: '70px',
|
@@ -52,7 +54,40 @@ export var CustomSizeAndRadius = function CustomSizeAndRadius() {
|
|
52
54
|
};
|
53
55
|
export var Disabled = function Disabled() {
|
54
56
|
return ___EmotionJSX(Image, {
|
55
|
-
src:
|
57
|
+
src: pingImg,
|
56
58
|
isDisabled: true
|
57
59
|
});
|
60
|
+
};
|
61
|
+
export var FallbackImage = function FallbackImage() {
|
62
|
+
return ___EmotionJSX(Image, {
|
63
|
+
fallbackImage: pingImg,
|
64
|
+
src: "https://deelay.me/7000/https://picsum.photos/150/150",
|
65
|
+
sx: {
|
66
|
+
width: '150px',
|
67
|
+
height: '150px'
|
68
|
+
}
|
69
|
+
});
|
70
|
+
};
|
71
|
+
export var WithSkeletonLoadSuccess = function WithSkeletonLoadSuccess(_ref2) {
|
72
|
+
var useLocalSrc = _ref2.useLocalSrc;
|
73
|
+
var imageSrc = useLocalSrc ? pingImg : 'https://deelay.me/3000/https://picsum.photos/150/150';
|
74
|
+
return ___EmotionJSX(Image, {
|
75
|
+
src: imageSrc,
|
76
|
+
sx: {
|
77
|
+
width: '150px',
|
78
|
+
height: '150px'
|
79
|
+
}
|
80
|
+
});
|
81
|
+
};
|
82
|
+
WithSkeletonLoadSuccess.args = {
|
83
|
+
useLocalSrc: isChromatic()
|
84
|
+
};
|
85
|
+
export var WithSkeletonLoadTimeout = function WithSkeletonLoadTimeout() {
|
86
|
+
return ___EmotionJSX(Image, {
|
87
|
+
src: "https://deelay.me/7000/https://picsum.photos/150/150",
|
88
|
+
sx: {
|
89
|
+
width: '150px',
|
90
|
+
height: '150px'
|
91
|
+
}
|
92
|
+
});
|
58
93
|
};
|