@atlaskit/media-card 77.12.4 → 78.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.
Files changed (151) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cjs/card/card.js +20 -1039
  3. package/dist/cjs/card/cardLoader.js +2 -2
  4. package/dist/cjs/card/cardView.js +255 -417
  5. package/dist/cjs/card/cardWithMediaClient.js +5 -9
  6. package/dist/cjs/card/{v2/cardviews → cardviews}/cardViewWrapper.js +8 -8
  7. package/dist/cjs/card/{v2/cardviews → cardviews}/errorCardView.js +6 -6
  8. package/dist/cjs/card/{v2/cardviews → cardviews}/iconCardView.js +5 -5
  9. package/dist/cjs/card/{v2/cardviews → cardviews}/imageCardView.js +5 -5
  10. package/dist/cjs/card/{v2/cardviews → cardviews}/index.js +2 -2
  11. package/dist/cjs/card/{v2/cardviews → cardviews}/loadingCardView.js +3 -3
  12. package/dist/cjs/card/{v2/cardviews → cardviews}/processingCardView.js +4 -4
  13. package/dist/cjs/card/{v2/cardviews → cardviews}/videoCardView.js +7 -7
  14. package/dist/cjs/card/{v2/externalImageCard.js → externalImageCard.js} +11 -11
  15. package/dist/cjs/card/{v2/fileCard.js → fileCard.js} +18 -18
  16. package/dist/cjs/card/index.js +2 -2
  17. package/dist/cjs/card/inlinePlayer.js +184 -267
  18. package/dist/cjs/card/media-card-analytics-error-boundary.js +1 -1
  19. package/dist/cjs/card/{v2/svgView → svgView}/svgView.js +9 -9
  20. package/dist/cjs/inline/loader.js +1 -1
  21. package/dist/cjs/utils/ufoExperiences.js +1 -1
  22. package/dist/es2019/card/card.js +20 -1023
  23. package/dist/es2019/card/cardLoader.js +2 -2
  24. package/dist/es2019/card/cardView.js +252 -403
  25. package/dist/es2019/card/cardWithMediaClient.js +6 -10
  26. package/dist/es2019/card/{v2/cardviews → cardviews}/cardViewWrapper.js +8 -8
  27. package/dist/es2019/card/{v2/cardviews → cardviews}/errorCardView.js +6 -6
  28. package/dist/es2019/card/{v2/cardviews → cardviews}/iconCardView.js +5 -5
  29. package/dist/es2019/card/{v2/cardviews → cardviews}/imageCardView.js +5 -5
  30. package/dist/es2019/card/{v2/cardviews → cardviews}/index.js +2 -2
  31. package/dist/es2019/card/{v2/cardviews → cardviews}/loadingCardView.js +3 -3
  32. package/dist/es2019/card/{v2/cardviews → cardviews}/processingCardView.js +4 -4
  33. package/dist/es2019/card/{v2/cardviews → cardviews}/videoCardView.js +7 -7
  34. package/dist/es2019/card/{v2/externalImageCard.js → externalImageCard.js} +11 -11
  35. package/dist/es2019/card/{v2/fileCard.js → fileCard.js} +18 -18
  36. package/dist/es2019/card/index.js +1 -1
  37. package/dist/es2019/card/inlinePlayer.js +127 -208
  38. package/dist/es2019/card/media-card-analytics-error-boundary.js +1 -1
  39. package/dist/es2019/card/{v2/svgView → svgView}/svgView.js +9 -9
  40. package/dist/es2019/inline/loader.js +1 -1
  41. package/dist/es2019/utils/ufoExperiences.js +1 -1
  42. package/dist/esm/card/card.js +21 -1040
  43. package/dist/esm/card/cardLoader.js +2 -2
  44. package/dist/esm/card/cardView.js +251 -416
  45. package/dist/esm/card/cardWithMediaClient.js +6 -10
  46. package/dist/esm/card/{v2/cardviews → cardviews}/cardViewWrapper.js +8 -8
  47. package/dist/esm/card/{v2/cardviews → cardviews}/errorCardView.js +6 -6
  48. package/dist/esm/card/{v2/cardviews → cardviews}/iconCardView.js +5 -5
  49. package/dist/esm/card/{v2/cardviews → cardviews}/imageCardView.js +5 -5
  50. package/dist/esm/card/{v2/cardviews → cardviews}/index.js +2 -2
  51. package/dist/esm/card/{v2/cardviews → cardviews}/loadingCardView.js +3 -3
  52. package/dist/esm/card/{v2/cardviews → cardviews}/processingCardView.js +4 -4
  53. package/dist/esm/card/{v2/cardviews → cardviews}/videoCardView.js +7 -7
  54. package/dist/esm/card/{v2/externalImageCard.js → externalImageCard.js} +11 -11
  55. package/dist/esm/card/{v2/fileCard.js → fileCard.js} +18 -18
  56. package/dist/esm/card/index.js +1 -1
  57. package/dist/esm/card/inlinePlayer.js +185 -269
  58. package/dist/esm/card/media-card-analytics-error-boundary.js +1 -1
  59. package/dist/esm/card/{v2/svgView → svgView}/svgView.js +9 -9
  60. package/dist/esm/inline/loader.js +1 -1
  61. package/dist/esm/utils/ufoExperiences.js +1 -1
  62. package/dist/types/card/card.d.ts +5 -66
  63. package/dist/types/card/cardLoader.d.ts +1 -1
  64. package/dist/types/card/cardView.d.ts +23 -45
  65. package/dist/types/card/cardWithMediaClient.d.ts +1 -1
  66. package/dist/types/card/{v2/cardviews → cardviews}/cardViewWrapper.d.ts +3 -3
  67. package/dist/types/card/{v2/cardviews → cardviews}/errorCardView.d.ts +1 -1
  68. package/dist/{types-ts4.5/card/v2 → types/card}/cardviews/iconCardView.d.ts +1 -1
  69. package/dist/{types-ts4.5/card/v2 → types/card}/cardviews/imageCardView.d.ts +1 -1
  70. package/dist/{types-ts4.5/card/v2 → types/card}/cardviews/index.d.ts +5 -5
  71. package/dist/types/card/{v2/cardviews → cardviews}/videoCardView.d.ts +1 -1
  72. package/dist/types/card/{v2/externalImageCard.d.ts → externalImageCard.d.ts} +1 -1
  73. package/dist/types/card/{v2/fileCard.d.ts → fileCard.d.ts} +2 -2
  74. package/dist/types/card/index.d.ts +1 -1
  75. package/dist/types/card/inlinePlayer.d.ts +2 -31
  76. package/dist/types/card/{v2/svgView → svgView}/errors.d.ts +1 -1
  77. package/dist/{types-ts4.5/card/v2 → types/card}/svgView/svgView.d.ts +2 -2
  78. package/dist/types-ts4.5/card/card.d.ts +5 -66
  79. package/dist/types-ts4.5/card/cardLoader.d.ts +1 -1
  80. package/dist/types-ts4.5/card/cardView.d.ts +23 -45
  81. package/dist/types-ts4.5/card/cardWithMediaClient.d.ts +1 -1
  82. package/dist/types-ts4.5/card/{v2/cardviews → cardviews}/cardViewWrapper.d.ts +3 -3
  83. package/dist/types-ts4.5/card/{v2/cardviews → cardviews}/errorCardView.d.ts +1 -1
  84. package/dist/{types/card/v2 → types-ts4.5/card}/cardviews/iconCardView.d.ts +1 -1
  85. package/dist/{types/card/v2 → types-ts4.5/card}/cardviews/imageCardView.d.ts +1 -1
  86. package/dist/{types/card/v2 → types-ts4.5/card}/cardviews/index.d.ts +5 -5
  87. package/dist/types-ts4.5/card/{v2/cardviews → cardviews}/videoCardView.d.ts +1 -1
  88. package/dist/types-ts4.5/card/{v2/externalImageCard.d.ts → externalImageCard.d.ts} +1 -1
  89. package/dist/types-ts4.5/card/{v2/fileCard.d.ts → fileCard.d.ts} +2 -2
  90. package/dist/types-ts4.5/card/index.d.ts +1 -1
  91. package/dist/types-ts4.5/card/inlinePlayer.d.ts +2 -31
  92. package/dist/types-ts4.5/card/{v2/svgView → svgView}/errors.d.ts +1 -1
  93. package/dist/{types/card/v2 → types-ts4.5/card}/svgView/svgView.d.ts +2 -2
  94. package/package.json +1 -4
  95. package/dist/cjs/card/cardSwitcher.js +0 -15
  96. package/dist/cjs/card/v2/cardV2.js +0 -41
  97. package/dist/cjs/card/v2/cardV2Loader.js +0 -36
  98. package/dist/cjs/card/v2/cardViewV2.js +0 -298
  99. package/dist/cjs/card/v2/cardWithMediaClientV2.js +0 -34
  100. package/dist/cjs/card/v2/inlinePlayerLazyV2.js +0 -35
  101. package/dist/cjs/card/v2/inlinePlayerV2.js +0 -224
  102. package/dist/es2019/card/cardSwitcher.js +0 -8
  103. package/dist/es2019/card/v2/cardV2.js +0 -33
  104. package/dist/es2019/card/v2/cardV2Loader.js +0 -18
  105. package/dist/es2019/card/v2/cardViewV2.js +0 -294
  106. package/dist/es2019/card/v2/cardWithMediaClientV2.js +0 -25
  107. package/dist/es2019/card/v2/inlinePlayerLazyV2.js +0 -10
  108. package/dist/es2019/card/v2/inlinePlayerV2.js +0 -166
  109. package/dist/esm/card/cardSwitcher.js +0 -8
  110. package/dist/esm/card/v2/cardV2.js +0 -34
  111. package/dist/esm/card/v2/cardV2Loader.js +0 -24
  112. package/dist/esm/card/v2/cardViewV2.js +0 -290
  113. package/dist/esm/card/v2/cardWithMediaClientV2.js +0 -27
  114. package/dist/esm/card/v2/inlinePlayerLazyV2.js +0 -23
  115. package/dist/esm/card/v2/inlinePlayerV2.js +0 -214
  116. package/dist/types/card/cardSwitcher.d.ts +0 -4
  117. package/dist/types/card/v2/cardV2.d.ts +0 -7
  118. package/dist/types/card/v2/cardV2Loader.d.ts +0 -4
  119. package/dist/types/card/v2/cardViewV2.d.ts +0 -59
  120. package/dist/types/card/v2/cardWithMediaClientV2.d.ts +0 -3
  121. package/dist/types/card/v2/inlinePlayerLazyV2.d.ts +0 -2
  122. package/dist/types/card/v2/inlinePlayerV2.d.ts +0 -24
  123. package/dist/types-ts4.5/card/cardSwitcher.d.ts +0 -4
  124. package/dist/types-ts4.5/card/v2/cardV2.d.ts +0 -7
  125. package/dist/types-ts4.5/card/v2/cardV2Loader.d.ts +0 -4
  126. package/dist/types-ts4.5/card/v2/cardViewV2.d.ts +0 -59
  127. package/dist/types-ts4.5/card/v2/cardWithMediaClientV2.d.ts +0 -3
  128. package/dist/types-ts4.5/card/v2/inlinePlayerLazyV2.d.ts +0 -2
  129. package/dist/types-ts4.5/card/v2/inlinePlayerV2.d.ts +0 -24
  130. /package/dist/cjs/card/{v2/performance.js → performance.js} +0 -0
  131. /package/dist/cjs/card/{v2/svgView → svgView}/errors.js +0 -0
  132. /package/dist/cjs/card/{v2/svgView → svgView}/helpers.js +0 -0
  133. /package/dist/cjs/card/{v2/svgView → svgView}/index.js +0 -0
  134. /package/dist/es2019/card/{v2/performance.js → performance.js} +0 -0
  135. /package/dist/es2019/card/{v2/svgView → svgView}/errors.js +0 -0
  136. /package/dist/es2019/card/{v2/svgView → svgView}/helpers.js +0 -0
  137. /package/dist/es2019/card/{v2/svgView → svgView}/index.js +0 -0
  138. /package/dist/esm/card/{v2/performance.js → performance.js} +0 -0
  139. /package/dist/esm/card/{v2/svgView → svgView}/errors.js +0 -0
  140. /package/dist/esm/card/{v2/svgView → svgView}/helpers.js +0 -0
  141. /package/dist/esm/card/{v2/svgView → svgView}/index.js +0 -0
  142. /package/dist/types/card/{v2/cardviews → cardviews}/loadingCardView.d.ts +0 -0
  143. /package/dist/types/card/{v2/cardviews → cardviews}/processingCardView.d.ts +0 -0
  144. /package/dist/types/card/{v2/performance.d.ts → performance.d.ts} +0 -0
  145. /package/dist/types/card/{v2/svgView → svgView}/helpers.d.ts +0 -0
  146. /package/dist/types/card/{v2/svgView → svgView}/index.d.ts +0 -0
  147. /package/dist/types-ts4.5/card/{v2/cardviews → cardviews}/loadingCardView.d.ts +0 -0
  148. /package/dist/types-ts4.5/card/{v2/cardviews → cardviews}/processingCardView.d.ts +0 -0
  149. /package/dist/types-ts4.5/card/{v2/performance.d.ts → performance.d.ts} +0 -0
  150. /package/dist/types-ts4.5/card/{v2/svgView → svgView}/helpers.d.ts +0 -0
  151. /package/dist/types-ts4.5/card/{v2/svgView → svgView}/index.d.ts +0 -0
@@ -1,19 +1,14 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
1
  /** @jsx jsx */
3
2
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
4
3
  import { jsx } from '@emotion/react';
5
- import React from 'react';
4
+ import React, { useEffect, useState, useRef } from 'react';
6
5
  import { withAnalyticsEvents } from '@atlaskit/analytics-next';
7
6
  import { MimeTypeIcon } from '@atlaskit/media-ui/mime-type-icon';
8
7
  import SpinnerIcon from '@atlaskit/spinner';
9
8
  import Tooltip from '@atlaskit/tooltip';
10
9
  import { messages } from '@atlaskit/media-ui';
11
- import { defaultImageCardDimensions } from '../utils/cardDimensions';
12
- import { isValidPercentageUnit } from '../utils/isValidPercentageUnit';
13
- import { getElementDimension } from '../utils/getElementDimension';
14
10
  import { createAndFireMediaCardEvent } from '../utils/analytics';
15
11
  import { attachDetailsToActions } from './actions';
16
- import { calcBreakpointSize } from './ui/styles';
17
12
  import { ImageRenderer } from './ui/imageRenderer/imageRenderer';
18
13
  import { TitleBox } from './ui/titleBox/titleBox';
19
14
  import { FailedTitleBox } from './ui/titleBox/failedTitleBox';
@@ -25,234 +20,76 @@ import { ActionsBar } from './ui/actionsBar/actionsBar';
25
20
  import { IconWrapper } from './ui/iconWrapper/iconWrapper';
26
21
  import { PreviewUnavailable, CreatingPreview, FailedToUpload, PreviewCurrentlyUnavailable, FailedToLoad } from './ui/iconMessage';
27
22
  import { isUploadError, isRateLimitedError, isPollingError } from '../errors';
28
- import { ImageContainer, Wrapper } from './ui/wrapper';
23
+ import { Wrapper, ImageContainer } from './ui/wrapper';
29
24
  import { fileCardImageViewSelector } from './classnames';
25
+ import { useBreakpoint } from './useBreakpoint';
30
26
  import OpenMediaViewerButton from './ui/openMediaViewerButton/openMediaViewerButton';
31
- /**
32
- * This is classic vanilla CardView class. To create an instance of class one would need to supply
33
- * `createAnalyticsEvent` prop to satisfy it's Analytics Events needs.
34
- */
35
- export class CardViewBase extends React.Component {
36
- constructor(...args) {
37
- super(...args);
38
- _defineProperty(this, "state", {
39
- didImageRender: false
40
- });
41
- _defineProperty(this, "divRef", /*#__PURE__*/React.createRef());
42
- _defineProperty(this, "onImageLoad", prevCardPreview => {
43
- const {
44
- onImageLoad,
45
- cardPreview
46
- } = this.props;
47
- if (prevCardPreview.dataURI !== (cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI)) {
48
- return;
49
- }
50
- // We render the icon & icon message always, even if there is cardPreview available.
51
- // If the image fails to load/render, the icon will remain, i.e. the user won't see a change until
52
- // the root card decides to chage status to error.
53
- // If the image renders successfully, we switch this variable to hide the icon & icon message
54
- // behind the thumbnail in case the image has transparency.
55
- // It is less likely that root component replaces a suceeded cardPreview for a failed one
56
- // than the opposite case. Therefore we prefer to hide the icon instead show when the image fails,
57
- // for a smoother transition
58
- this.setState({
59
- didImageRender: true
60
- });
61
- onImageLoad && onImageLoad(cardPreview);
62
- });
63
- _defineProperty(this, "onImageError", cardPreview => {
64
- const {
65
- onImageError
66
- } = this.props;
67
- this.setState({
68
- didImageRender: false
69
- });
70
- onImageError && onImageError(cardPreview);
71
- });
72
- // If the dimensions.width is a percentage, we need to transform it
73
- // into a pixel value in order to get the right breakpoints applied.
74
- _defineProperty(this, "saveElementWidth", () => {
75
- const {
76
- dimensions
77
- } = this.props;
78
- if (!dimensions) {
79
- return;
80
- }
81
- const {
82
- width
83
- } = dimensions;
84
- if (width && isValidPercentageUnit(width) && !!this.divRef.current) {
85
- const elementWidth = getElementDimension(this.divRef.current, 'width');
86
- this.setState({
87
- elementWidth
88
- });
89
- }
90
- });
91
- _defineProperty(this, "getRenderConfigByStatus", () => {
92
- const {
93
- cardPreview,
94
- status,
95
- metadata,
96
- disableOverlay,
97
- error,
98
- selectable,
99
- disableAnimation
100
- } = this.props;
101
- const {
102
- name,
103
- mediaType
104
- } = metadata || {};
105
- const {
106
- didImageRender
107
- } = this.state;
108
- const isZeroSize = !!(metadata && metadata.size === 0);
109
- const defaultConfig = {
110
- renderTypeIcon: !didImageRender,
111
- renderImageRenderer: !!cardPreview,
112
- renderPlayButton: !!cardPreview && mediaType === 'video',
113
- renderBlanket: !disableOverlay,
114
- renderTitleBox: !disableOverlay && !!name,
115
- renderTickBox: !disableOverlay && !!selectable
116
- };
117
- switch (status) {
118
- case 'uploading':
119
- return {
120
- ...defaultConfig,
121
- renderBlanket: !disableOverlay || mediaType !== 'video',
122
- isFixedBlanket: true,
123
- renderProgressBar: true
124
- };
125
- case 'processing':
126
- return {
127
- ...defaultConfig,
128
- iconMessage: !didImageRender && !isZeroSize ? jsx(CreatingPreview, {
129
- disableAnimation: disableAnimation
130
- }) : undefined
131
- };
132
- case 'complete':
133
- return defaultConfig;
134
- case 'error':
135
- case 'failed-processing':
136
- const baseErrorConfig = {
137
- ...defaultConfig,
138
- renderTypeIcon: true,
139
- renderImageRenderer: false,
140
- renderTitleBox: false,
141
- renderPlayButton: false
142
- };
143
- let iconMessage;
144
- let customTitleMessage;
145
- const {
146
- secondaryError
147
- } = error || {};
148
- if (isRateLimitedError(secondaryError) || isPollingError(secondaryError)) {
149
- iconMessage = jsx(PreviewCurrentlyUnavailable, null);
150
- } else if (isUploadError(error)) {
151
- iconMessage = jsx(FailedToUpload, null);
152
- customTitleMessage = messages.failed_to_upload;
153
- } else if (!metadata) {
154
- iconMessage = jsx(FailedToLoad, null);
155
- } else {
156
- iconMessage = jsx(PreviewUnavailable, null);
157
- }
158
- if (!disableOverlay) {
159
- const renderFailedTitleBox = !name || !!customTitleMessage;
160
- return {
161
- ...baseErrorConfig,
162
- renderTitleBox: !!name && !customTitleMessage,
163
- renderFailedTitleBox,
164
- iconMessage: !renderFailedTitleBox ? iconMessage : undefined,
165
- customTitleMessage
166
- };
167
- }
168
- return {
169
- ...baseErrorConfig,
170
- iconMessage
171
- };
172
- case 'loading-preview':
173
- case 'loading':
174
- default:
175
- return {
176
- ...defaultConfig,
177
- renderPlayButton: false,
178
- renderTypeIcon: false,
179
- renderSpinner: !didImageRender
180
- };
181
- }
182
- });
183
- _defineProperty(this, "renderContents", () => {
184
- const {
185
- renderTypeIcon,
186
- iconMessage,
187
- renderImageRenderer,
188
- renderSpinner,
189
- renderPlayButton,
190
- renderBlanket,
191
- renderProgressBar,
192
- renderTitleBox,
193
- renderFailedTitleBox,
194
- renderTickBox,
195
- isFixedBlanket,
196
- customTitleMessage
197
- } = this.getRenderConfigByStatus();
198
- const {
199
- progress,
200
- selected,
201
- status,
202
- metadata
203
- } = this.props;
204
- const {
205
- name
206
- } = metadata || {};
207
- const hasTitleBox = !!renderTitleBox || !!renderFailedTitleBox;
208
- return jsx(React.Fragment, null, jsx(ImageContainer, {
209
- testId: fileCardImageViewSelector,
210
- mediaName: name,
211
- status: status,
212
- progress: progress,
213
- selected: selected ? true : undefined
214
- }, renderTypeIcon && this.renderMediaTypeIcon(hasTitleBox, iconMessage), renderSpinner && this.renderSpinner(hasTitleBox), renderImageRenderer && this.renderImageRenderer(), renderPlayButton && this.renderPlayButton(hasTitleBox), renderBlanket && this.renderBlanket(!!isFixedBlanket), renderTitleBox && this.renderTitleBox(), renderFailedTitleBox && this.renderFailedTitleBox(customTitleMessage), renderProgressBar && this.renderProgressBar(!hasTitleBox), renderTickBox && this.renderTickBox()), this.renderActionsBar());
215
- });
216
- }
217
- componentDidMount() {
218
- this.saveElementWidth();
219
- const {
220
- innerRef
221
- } = this.props;
222
- !!innerRef && !!this.divRef.current && innerRef(this.divRef.current);
223
- }
224
- componentDidUpdate({
225
- cardPreview: prevCardPreview
226
- }) {
227
- const {
228
- cardPreview
229
- } = this.props;
230
- // We should only switch didImageRender to false
231
- // when cardPreview goes undefined, not when it is updated.
232
- // as this method could be triggered after onImageLoad callback,
233
- // falling on a race condition
234
- !!prevCardPreview && !cardPreview && this.setState({
235
- didImageRender: false
236
- });
237
- }
238
- get breakpoint() {
239
- const width = this.state.elementWidth || (this.props.dimensions ? this.props.dimensions.width : '') || defaultImageCardDimensions.width;
240
- return calcBreakpointSize(parseInt(`${width}`, 10));
241
- }
242
- renderSpinner(hasTitleBox) {
243
- return jsx(IconWrapper, {
244
- breakpoint: this.breakpoint,
245
- hasTitleBox: hasTitleBox
246
- }, jsx(SpinnerIcon, {
247
- testId: 'media-card-loading',
248
- interactionName: 'media-card-loading'
249
- }));
250
- }
251
- shouldRenderPlayButton() {
252
- const {
253
- metadata,
254
- cardPreview
255
- } = this.props;
27
+ export const CardViewBase = ({
28
+ innerRef,
29
+ onImageLoad,
30
+ onImageError,
31
+ dimensions,
32
+ onClick,
33
+ onMouseEnter,
34
+ testId,
35
+ metadata,
36
+ status,
37
+ selected,
38
+ selectable,
39
+ cardPreview,
40
+ mediaCardCursor,
41
+ shouldHideTooltip,
42
+ progress,
43
+ alt,
44
+ resizeMode,
45
+ onDisplayImage,
46
+ nativeLazyLoad,
47
+ forceSyncDisplay,
48
+ actions,
49
+ disableOverlay,
50
+ titleBoxBgColor,
51
+ titleBoxIcon,
52
+ error,
53
+ disableAnimation,
54
+ openMediaViewerButtonRef = null,
55
+ shouldOpenMediaViewer,
56
+ overriddenCreationDate
57
+ }) => {
58
+ const [didImageRender, setDidImageRender] = useState(false);
59
+ const divRef = useRef(null);
60
+ const prevCardPreviewRef = useRef();
61
+ const breakpoint = useBreakpoint(dimensions === null || dimensions === void 0 ? void 0 : dimensions.width, divRef);
62
+ useEffect(() => {
63
+ innerRef && !!divRef.current && innerRef(divRef.current);
64
+ }, [innerRef]);
65
+ useEffect(() => {
66
+ // We should only switch didImageRender to false when cardPreview goes undefined, not when it is changed. as this method could be triggered after onImageLoad callback, falling on a race condition
67
+ if (prevCardPreviewRef.current && !cardPreview) {
68
+ setDidImageRender(false);
69
+ }
70
+ prevCardPreviewRef.current = cardPreview;
71
+ }, [cardPreview]);
72
+ const handleOnImageLoad = prevCardPreview => {
73
+ if (prevCardPreview.dataURI !== (cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI)) {
74
+ return;
75
+ }
76
+ /*
77
+ We render the icon & icon message always, even if there is cardPreview available.
78
+ If the image fails to load/render, the icon will remain, i.e. the user won't see a change until the root card decides to chage status to error.
79
+ If the image renders successfully, we switch this variable to hide the icon & icon message behind the thumbnail in case the image has transparency.
80
+ It is less likely that root component replaces a suceeded cardPreview for a failed one than the opposite case. Therefore we prefer to hide the icon instead show when the image fails, for a smoother transition
81
+ */
82
+ setDidImageRender(true);
83
+ onImageLoad === null || onImageLoad === void 0 ? void 0 : onImageLoad(cardPreview);
84
+ };
85
+ const handleOnImageError = prevCardPreview => {
86
+ if (prevCardPreview.dataURI !== (cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI)) {
87
+ return;
88
+ }
89
+ setDidImageRender(false);
90
+ onImageError === null || onImageError === void 0 ? void 0 : onImageError(cardPreview);
91
+ };
92
+ const shouldRenderPlayButton = () => {
256
93
  const {
257
94
  mediaType
258
95
  } = metadata || {};
@@ -260,181 +97,193 @@ export class CardViewBase extends React.Component {
260
97
  return false;
261
98
  }
262
99
  return true;
263
- }
264
- renderPlayButton(hasTitleBox) {
265
- return jsx(IconWrapper, {
266
- breakpoint: this.breakpoint,
267
- hasTitleBox: hasTitleBox
268
- }, jsx(PlayButton, null));
269
- }
270
-
271
- //This Blanket will provide a shadow backround for uploading status by
272
- //setting isFixed.
273
- renderBlanket(isFixed) {
274
- return jsx(Blanket, {
275
- isFixed: isFixed
276
- });
277
- }
278
- renderTitleBox() {
279
- const {
280
- metadata,
281
- titleBoxBgColor,
282
- titleBoxIcon,
283
- overriddenCreationDate
284
- } = this.props;
100
+ };
101
+ const getRenderConfigByStatus = () => {
285
102
  const {
286
103
  name,
287
- createdAt
288
- } = metadata || {};
289
- return !!name && jsx(TitleBox, {
290
- name: name,
291
- createdAt: overriddenCreationDate !== null && overriddenCreationDate !== void 0 ? overriddenCreationDate : createdAt,
292
- breakpoint: this.breakpoint,
293
- titleBoxIcon: titleBoxIcon,
294
- titleBoxBgColor: titleBoxBgColor
295
- });
296
- }
297
- renderFailedTitleBox(customMessage) {
298
- return jsx(FailedTitleBox, {
299
- breakpoint: this.breakpoint,
300
- customMessage: customMessage
301
- });
302
- }
303
- renderProgressBar(positionBottom) {
304
- const {
305
- progress
306
- } = this.props;
307
- return jsx(ProgressBar, {
308
- progress: progress,
309
- breakpoint: this.breakpoint,
310
- positionBottom: positionBottom
311
- });
312
- }
313
- renderImageRenderer() {
314
- const {
315
- cardPreview,
316
- metadata: {
317
- mediaType = 'unknown'
318
- } = {},
319
- alt,
320
- resizeMode,
321
- onDisplayImage,
322
- nativeLazyLoad,
323
- forceSyncDisplay
324
- } = this.props;
325
- const {
326
- name
327
- } = this.props.metadata || {};
328
- const altText = alt || name;
329
- return !!cardPreview && jsx(ImageRenderer, {
330
- cardPreview: cardPreview,
331
- mediaType: mediaType,
332
- alt: altText,
333
- resizeMode: resizeMode,
334
- onDisplayImage: onDisplayImage,
335
- onImageLoad: this.onImageLoad,
336
- onImageError: this.onImageError,
337
- nativeLazyLoad: nativeLazyLoad,
338
- forceSyncDisplay: forceSyncDisplay
339
- });
340
- }
341
- renderTickBox() {
342
- const {
343
- selected
344
- } = this.props;
345
- return jsx(TickBox, {
346
- selected: selected
347
- });
348
- }
349
- renderMediaTypeIcon(hasTitleBox, iconMessage) {
350
- const {
351
- metadata
352
- } = this.props;
353
- const {
354
- mediaType,
355
- mimeType,
356
- name
104
+ mediaType
357
105
  } = metadata || {};
358
- return jsx(IconWrapper, {
359
- breakpoint: this.breakpoint,
360
- hasTitleBox: hasTitleBox
361
- }, jsx(MimeTypeIcon, {
362
- testId: 'media-card-file-type-icon',
363
- mediaType: mediaType,
364
- mimeType: mimeType,
365
- name: name
366
- }), iconMessage);
367
- }
368
- renderActionsBar() {
369
- const {
370
- disableOverlay,
371
- actions,
372
- metadata
373
- } = this.props;
374
- const actionsWithDetails = metadata && actions ? attachDetailsToActions(actions, metadata) : [];
375
- if (disableOverlay || !actions || actions.length === 0) {
376
- return null;
106
+ const isZeroSize = metadata && metadata.size === 0;
107
+ const defaultConfig = {
108
+ renderTypeIcon: !didImageRender,
109
+ renderImageRenderer: !!cardPreview,
110
+ renderPlayButton: !!cardPreview && mediaType === 'video',
111
+ renderBlanket: !disableOverlay,
112
+ renderTitleBox: !disableOverlay && !!name,
113
+ renderTickBox: !disableOverlay && !!selectable
114
+ };
115
+ switch (status) {
116
+ case 'uploading':
117
+ return {
118
+ ...defaultConfig,
119
+ renderBlanket: !disableOverlay || mediaType !== 'video',
120
+ isFixedBlanket: true,
121
+ renderProgressBar: true
122
+ };
123
+ case 'processing':
124
+ return {
125
+ ...defaultConfig,
126
+ iconMessage: !didImageRender && !isZeroSize ? jsx(CreatingPreview, {
127
+ disableAnimation: disableAnimation
128
+ }) : undefined
129
+ };
130
+ case 'complete':
131
+ return defaultConfig;
132
+ case 'error':
133
+ case 'failed-processing':
134
+ const baseErrorConfig = {
135
+ ...defaultConfig,
136
+ renderTypeIcon: true,
137
+ renderImageRenderer: false,
138
+ renderTitleBox: false,
139
+ renderPlayButton: false
140
+ };
141
+ let iconMessage;
142
+ let customTitleMessage;
143
+ const {
144
+ secondaryError
145
+ } = error || {};
146
+ if (isRateLimitedError(secondaryError) || isPollingError(secondaryError)) {
147
+ iconMessage = jsx(PreviewCurrentlyUnavailable, null);
148
+ } else if (isUploadError(error)) {
149
+ iconMessage = jsx(FailedToUpload, null);
150
+ customTitleMessage = messages.failed_to_upload;
151
+ } else if (!metadata) {
152
+ iconMessage = jsx(FailedToLoad, null);
153
+ } else {
154
+ iconMessage = jsx(PreviewUnavailable, null);
155
+ }
156
+ if (!disableOverlay) {
157
+ const renderFailedTitleBox = !name || !!customTitleMessage;
158
+ return {
159
+ ...baseErrorConfig,
160
+ renderTitleBox: !!name && !customTitleMessage,
161
+ renderFailedTitleBox,
162
+ iconMessage: !renderFailedTitleBox ? iconMessage : undefined,
163
+ customTitleMessage
164
+ };
165
+ }
166
+ return {
167
+ ...baseErrorConfig,
168
+ iconMessage
169
+ };
170
+ case 'loading-preview':
171
+ case 'loading':
172
+ default:
173
+ return {
174
+ ...defaultConfig,
175
+ renderPlayButton: false,
176
+ renderTypeIcon: false,
177
+ renderSpinner: !didImageRender
178
+ };
377
179
  }
378
- return jsx(ActionsBar, {
379
- filename: metadata === null || metadata === void 0 ? void 0 : metadata.name,
380
- actions: actionsWithDetails
381
- });
382
- }
383
- render() {
384
- const {
385
- dimensions,
386
- appearance,
387
- onClick,
388
- onMouseEnter,
389
- testId,
390
- metadata,
391
- status,
392
- selected,
393
- selectable,
394
- disableOverlay,
395
- cardPreview,
396
- mediaCardCursor,
397
- shouldHideTooltip,
398
- openMediaViewerButtonRef = null,
399
- shouldOpenMediaViewer
400
- } = this.props;
401
- const {
402
- name
403
- } = metadata || {};
404
- const shouldDisplayBackground = !cardPreview || !disableOverlay || status === 'error' || status === 'failed-processing';
405
- const isPlayButtonClickable = !!(this.shouldRenderPlayButton() && disableOverlay);
406
- const isTickBoxSelectable = !disableOverlay && !!selectable && !selected;
407
- // Disable tooltip for Media Single
408
- const shouldDisplayTooltip = !disableOverlay && !shouldHideTooltip;
409
- return jsx(React.Fragment, null, shouldOpenMediaViewer && jsx(OpenMediaViewerButton, {
410
- fileName: name !== null && name !== void 0 ? name : '',
411
- innerRef: openMediaViewerButtonRef,
412
- onClick: onClick
413
- }), jsx(Wrapper, {
414
- testId: testId || 'media-card-view',
415
- dimensions: dimensions,
416
- appearance: appearance,
417
- onClick: onClick,
418
- onMouseEnter: onMouseEnter,
419
- innerRef: this.divRef,
420
- breakpoint: this.breakpoint,
421
- mediaCardCursor: mediaCardCursor,
422
- disableOverlay: !!disableOverlay,
423
- selected: !!selected,
424
- displayBackground: shouldDisplayBackground,
425
- isPlayButtonClickable: isPlayButtonClickable,
426
- isTickBoxSelectable: isTickBoxSelectable,
427
- shouldDisplayTooltip: shouldDisplayTooltip
428
- }, shouldDisplayTooltip ? jsx(Tooltip, {
429
- content: name,
430
- position: "bottom",
431
- tag: 'div'
432
- }, this.renderContents()) : this.renderContents()));
433
- }
434
- }
435
- _defineProperty(CardViewBase, "defaultProps", {
436
- appearance: 'auto'
437
- });
180
+ };
181
+ const {
182
+ renderTypeIcon,
183
+ iconMessage,
184
+ renderImageRenderer,
185
+ renderSpinner,
186
+ renderPlayButton,
187
+ renderBlanket,
188
+ renderProgressBar,
189
+ renderTitleBox,
190
+ renderFailedTitleBox,
191
+ renderTickBox,
192
+ isFixedBlanket,
193
+ customTitleMessage
194
+ } = getRenderConfigByStatus();
195
+ const shouldDisplayBackground = !cardPreview || !disableOverlay || status === 'error' || status === 'failed-processing';
196
+ const isPlayButtonClickable = shouldRenderPlayButton() && !!disableOverlay;
197
+ const isTickBoxSelectable = !disableOverlay && !!selectable && !selected;
198
+ // Disable tooltip for Media Single
199
+ const shouldDisplayTooltip = !disableOverlay && !shouldHideTooltip;
200
+ const hasTitleBox = !!(renderTitleBox || renderFailedTitleBox);
201
+ const {
202
+ mediaType,
203
+ mimeType,
204
+ name,
205
+ createdAt
206
+ } = metadata || {};
207
+ const actionsWithDetails = metadata && actions ? attachDetailsToActions(actions, metadata) : [];
208
+ const contents = jsx(React.Fragment, null, jsx(ImageContainer, {
209
+ testId: fileCardImageViewSelector,
210
+ mediaName: name,
211
+ status: status,
212
+ progress: progress,
213
+ selected: selected,
214
+ source: cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.source
215
+ }, renderTypeIcon && jsx(IconWrapper, {
216
+ breakpoint: breakpoint,
217
+ hasTitleBox: hasTitleBox
218
+ }, jsx(MimeTypeIcon, {
219
+ testId: "media-card-file-type-icon",
220
+ mediaType: mediaType,
221
+ mimeType: mimeType,
222
+ name: name
223
+ }), iconMessage), renderSpinner && jsx(IconWrapper, {
224
+ breakpoint: breakpoint,
225
+ hasTitleBox: hasTitleBox
226
+ }, jsx(SpinnerIcon, {
227
+ testId: "media-card-loading",
228
+ interactionName: "media-card-loading"
229
+ })), renderImageRenderer && !!cardPreview && jsx(ImageRenderer, {
230
+ cardPreview: cardPreview,
231
+ mediaType: (metadata === null || metadata === void 0 ? void 0 : metadata.mediaType) || 'unknown',
232
+ alt: alt || name,
233
+ resizeMode: resizeMode,
234
+ onDisplayImage: onDisplayImage,
235
+ onImageLoad: handleOnImageLoad,
236
+ onImageError: handleOnImageError,
237
+ nativeLazyLoad: nativeLazyLoad,
238
+ forceSyncDisplay: forceSyncDisplay
239
+ }), renderPlayButton && jsx(IconWrapper, {
240
+ breakpoint: breakpoint,
241
+ hasTitleBox: hasTitleBox
242
+ }, jsx(PlayButton, null)), renderBlanket && jsx(Blanket, {
243
+ isFixed: isFixedBlanket
244
+ }), renderTitleBox && name && jsx(TitleBox, {
245
+ name: name,
246
+ createdAt: overriddenCreationDate !== null && overriddenCreationDate !== void 0 ? overriddenCreationDate : createdAt,
247
+ breakpoint: breakpoint,
248
+ titleBoxIcon: titleBoxIcon,
249
+ titleBoxBgColor: titleBoxBgColor
250
+ }), renderFailedTitleBox && jsx(FailedTitleBox, {
251
+ breakpoint: breakpoint,
252
+ customMessage: customTitleMessage
253
+ }), renderProgressBar && jsx(ProgressBar, {
254
+ progress: progress,
255
+ breakpoint: breakpoint,
256
+ positionBottom: !hasTitleBox
257
+ }), renderTickBox && jsx(TickBox, {
258
+ selected: selected
259
+ })), disableOverlay || !actions || actions.length === 0 ? null : jsx(ActionsBar, {
260
+ filename: name,
261
+ actions: actionsWithDetails
262
+ }));
263
+ return jsx(React.Fragment, null, shouldOpenMediaViewer && jsx(OpenMediaViewerButton, {
264
+ fileName: name !== null && name !== void 0 ? name : '',
265
+ innerRef: openMediaViewerButtonRef,
266
+ onClick: onClick
267
+ }), jsx(Wrapper, {
268
+ testId: testId || 'media-card-view',
269
+ dimensions: dimensions,
270
+ onClick: onClick,
271
+ onMouseEnter: onMouseEnter,
272
+ innerRef: divRef,
273
+ breakpoint: breakpoint,
274
+ mediaCardCursor: mediaCardCursor,
275
+ disableOverlay: !!disableOverlay,
276
+ selected: !!selected,
277
+ displayBackground: shouldDisplayBackground,
278
+ isPlayButtonClickable: isPlayButtonClickable,
279
+ isTickBoxSelectable: isTickBoxSelectable,
280
+ shouldDisplayTooltip: shouldDisplayTooltip
281
+ }, shouldDisplayTooltip ? jsx(Tooltip, {
282
+ content: name,
283
+ position: "bottom",
284
+ tag: "div"
285
+ }, contents) : contents));
286
+ };
438
287
  export const CardView = withAnalyticsEvents({
439
288
  onClick: createAndFireMediaCardEvent({
440
289
  eventType: 'ui',