@orangelogic/orange-dam-content-browser-sdk 2.1.52 → 2.1.54

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 (281) hide show
  1. package/.env +1 -0
  2. package/.eslintignore +2 -0
  3. package/.eslintrc.json +82 -0
  4. package/.releaserc +17 -0
  5. package/.travis.yml +20 -0
  6. package/CBSDKdemo.html +315 -0
  7. package/GitVersion.yml +18 -0
  8. package/azure-pipeline.yaml +93 -0
  9. package/clientlib.config.js +36 -0
  10. package/config/env.js +105 -0
  11. package/config/getHttpsConfig.js +67 -0
  12. package/config/jest/babelTransform.js +30 -0
  13. package/config/jest/cssTransform.js +14 -0
  14. package/config/jest/fileTransform.js +41 -0
  15. package/config/modules.js +135 -0
  16. package/config/paths.js +79 -0
  17. package/config/webpack/persistentCache/createEnvironmentHash.js +10 -0
  18. package/config/webpack.config.js +762 -0
  19. package/config/webpackDevServer.config.js +128 -0
  20. package/config-overrides.js +8 -0
  21. package/gab_extension/GAB.html +85 -0
  22. package/gab_extension/GoogleChrome/manifest.json +28 -0
  23. package/gab_extension/GoogleChrome/src/assets/icon48.png +0 -0
  24. package/gab_extension/GoogleChrome/src/background/index.js +6 -0
  25. package/gab_extension/GoogleChrome/src/scripts/index.js +347 -0
  26. package/gab_extension/MozillaFirefox/manifest.json +20 -0
  27. package/gab_extension/MozillaFirefox/src/assets/icon.png +0 -0
  28. package/gab_extension/MozillaFirefox/src/background/index.js +5 -0
  29. package/gab_extension/MozillaFirefox/src/scripts/index.js +347 -0
  30. package/gab_extension/README.md +11 -0
  31. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Orange DAM Asset Browser Extension.xcodeproj/project.pbxproj +927 -0
  32. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Orange DAM Asset Browser Extension.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  33. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Orange DAM Asset Browser Extension.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  34. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Orange DAM Asset Browser Extension.xcodeproj/project.xcworkspace/xcuserdata/oldevmac01.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  35. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Orange DAM Asset Browser Extension.xcodeproj/xcuserdata/oldevmac01.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  36. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  37. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json +63 -0
  38. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Shared (App)/Assets.xcassets/Contents.json +6 -0
  39. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json +20 -0
  40. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Shared (App)/Base.lproj/Main.html +23 -0
  41. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Shared (App)/Resources/Icon.png +0 -0
  42. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Shared (App)/Resources/Script.js +24 -0
  43. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Shared (App)/Resources/Style.css +61 -0
  44. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Shared (App)/ViewController.swift +81 -0
  45. package/gab_extension/Safari/Orange DAM Asset Browser Extension/Shared (Extension)/SafariWebExtensionHandler.swift +26 -0
  46. package/gab_extension/Safari/Orange DAM Asset Browser Extension/iOS (App)/AppDelegate.swift +24 -0
  47. package/gab_extension/Safari/Orange DAM Asset Browser Extension/iOS (App)/Base.lproj/LaunchScreen.storyboard +36 -0
  48. package/gab_extension/Safari/Orange DAM Asset Browser Extension/iOS (App)/Base.lproj/Main.storyboard +38 -0
  49. package/gab_extension/Safari/Orange DAM Asset Browser Extension/iOS (App)/Info.plist +27 -0
  50. package/gab_extension/Safari/Orange DAM Asset Browser Extension/iOS (App)/SceneDelegate.swift +18 -0
  51. package/gab_extension/Safari/Orange DAM Asset Browser Extension/iOS (Extension)/Info.plist +13 -0
  52. package/gab_extension/Safari/Orange DAM Asset Browser Extension/macOS (App)/AppDelegate.swift +21 -0
  53. package/gab_extension/Safari/Orange DAM Asset Browser Extension/macOS (App)/Base.lproj/Main.storyboard +125 -0
  54. package/gab_extension/Safari/Orange DAM Asset Browser Extension/macOS (App)/Info.plist +8 -0
  55. package/gab_extension/Safari/Orange DAM Asset Browser Extension/macOS (App)/Orange DAM Asset Browser Extension.entitlements +12 -0
  56. package/gab_extension/Safari/Orange DAM Asset Browser Extension/macOS (Extension)/Info.plist +13 -0
  57. package/gab_extension/Safari/Orange DAM Asset Browser Extension/macOS (Extension)/Orange DAM Asset Browser Extension.entitlements +10 -0
  58. package/package.json +8 -49
  59. package/public/index.html +92 -0
  60. package/scripts/build.js +218 -0
  61. package/scripts/start.js +154 -0
  62. package/scripts/test.js +53 -0
  63. package/src/App.tsx +98 -0
  64. package/src/AppContext.ts +18 -0
  65. package/src/GlobalConfigContext.ts +46 -0
  66. package/src/components/ArrayClamp/ArrayClamp.styled.ts +42 -0
  67. package/src/components/ArrayClamp/ArrayClamp.tsx +167 -0
  68. package/src/components/ArrayClamp/index.ts +1 -0
  69. package/src/components/Browser/Browser.styled.ts +82 -0
  70. package/src/components/Browser/Browser.tsx +284 -0
  71. package/src/components/Browser/BrowserItem.tsx +98 -0
  72. package/src/components/ControlBar/ControlBar.constants.tsx +66 -0
  73. package/src/components/ControlBar/ControlBar.styled.ts +82 -0
  74. package/src/components/ControlBar/ControlBar.tsx +528 -0
  75. package/src/components/ControlBar/Facet/Facet.tsx +113 -0
  76. package/src/components/ControlBar/Facet/index.ts +1 -0
  77. package/src/components/FormatDialog/CropPreviewer/CropPreviewer.tsx +224 -0
  78. package/{build/components/FormatDialog/CropPreviewer/index.d.ts → src/components/FormatDialog/CropPreviewer/index.ts} +1 -1
  79. package/src/components/FormatDialog/CustomRendition/CustomRendition.constants.ts +24 -0
  80. package/src/components/FormatDialog/CustomRendition/CustomRendition.styled.ts +57 -0
  81. package/src/components/FormatDialog/CustomRendition/CustomRendition.tsx +178 -0
  82. package/src/components/FormatDialog/CustomRendition/index.ts +1 -0
  83. package/src/components/FormatDialog/CustomRendition/transformations/Crop.tsx +249 -0
  84. package/src/components/FormatDialog/CustomRendition/transformations/Extension.tsx +54 -0
  85. package/src/components/FormatDialog/CustomRendition/transformations/Format.tsx +86 -0
  86. package/src/components/FormatDialog/CustomRendition/transformations/Resize.tsx +176 -0
  87. package/src/components/FormatDialog/CustomRendition/transformations/Rotate.tsx +101 -0
  88. package/{build/components/FormatDialog/CustomRendition/transformations/index.d.ts → src/components/FormatDialog/CustomRendition/transformations/index.ts} +1 -3
  89. package/src/components/FormatDialog/FormatDialog.styled.ts +137 -0
  90. package/src/components/FormatDialog/FormatDialog.tsx +1533 -0
  91. package/src/components/FormatDialog/Previewer/Previewer.styled.ts +31 -0
  92. package/src/components/FormatDialog/Previewer/Previewer.tsx +143 -0
  93. package/src/components/FormatDialog/Previewer/index.ts +1 -0
  94. package/src/components/FormatDialog/ProxyMenu/ProxyMenu.styled.ts +88 -0
  95. package/src/components/FormatDialog/ProxyMenu/ProxyMenu.tsx +74 -0
  96. package/src/components/FormatDialog/ProxyMenu/index.ts +1 -0
  97. package/src/components/FormatDialog/TrackingParameters/TrackingParameters.tsx +59 -0
  98. package/src/components/FormatDialog/TrackingParameters/index.ts +1 -0
  99. package/src/components/FormatDialog/index.ts +1 -0
  100. package/src/components/Header/Header.styled.ts +51 -0
  101. package/src/components/Header/Header.tsx +118 -0
  102. package/src/components/Loader/Loader.tsx +37 -0
  103. package/src/components/Loader/index.ts +1 -0
  104. package/src/components/NoResult/NoResult.tsx +37 -0
  105. package/src/components/NoResult/index.tsx +1 -0
  106. package/src/components/Result/AssetCard/AssetCard.styled.ts +120 -0
  107. package/src/components/Result/AssetCard/AssetCard.tsx +192 -0
  108. package/src/components/Result/AssetCard/AssetCardWrapper.styled.ts +35 -0
  109. package/src/components/Result/AssetCard/AssetCardWrapper.tsx +165 -0
  110. package/src/components/Result/AssetCard/index.ts +1 -0
  111. package/src/components/Result/AssetPreview/AssetPreview.styled.ts +108 -0
  112. package/src/components/Result/AssetPreview/AssetPreview.tsx +78 -0
  113. package/src/components/Result/AssetPreview/ImagePreview/ImagePreview.tsx +42 -0
  114. package/src/components/Result/AssetPreview/ImagePreview/index.ts +1 -0
  115. package/src/components/Result/AssetPreview/OtherPreview/OtherPreview.styled.ts +23 -0
  116. package/src/components/Result/AssetPreview/OtherPreview/OtherPreview.tsx +28 -0
  117. package/src/components/Result/AssetPreview/OtherPreview/index.ts +1 -0
  118. package/src/components/Result/AssetPreview/VideoPreview/VideoPreview.tsx +132 -0
  119. package/src/components/Result/AssetPreview/VideoPreview/index.ts +1 -0
  120. package/src/components/Result/AssetPreview/index.ts +1 -0
  121. package/src/consts/asset.ts +16 -0
  122. package/src/consts/data.ts +17 -0
  123. package/src/index.tsx +305 -0
  124. package/src/page/Authenticate/Authenticate.tsx +232 -0
  125. package/src/page/Authenticate/ConnectingBackground.tsx +44 -0
  126. package/src/page/Authenticate/index.tsx +94 -0
  127. package/src/page/Home/Home.styled.ts +46 -0
  128. package/src/page/Home/Home.tsx +941 -0
  129. package/src/react-web-component.d.ts +4617 -0
  130. package/src/store/assets/assets.api.ts +167 -0
  131. package/src/store/assets/assets.service.ts +223 -0
  132. package/src/store/assets/assets.slice.ts +104 -0
  133. package/src/store/auth/auth.service.ts +71 -0
  134. package/src/store/auth/auth.slice.ts +295 -0
  135. package/src/store/index.ts +27 -0
  136. package/src/store/search/search.api.ts +319 -0
  137. package/src/store/search/search.slice.ts +28 -0
  138. package/src/store/user/user.api.ts +29 -0
  139. package/src/styles.css +42 -0
  140. package/src/types/assets.ts +71 -0
  141. package/src/types/auth.ts +42 -0
  142. package/src/types/common.ts +11 -0
  143. package/src/types/download.ts +8 -0
  144. package/src/types/navigation.ts +3 -0
  145. package/src/types/search.ts +116 -0
  146. package/{build/types/storage.d.ts → src/types/storage.ts} +1 -1
  147. package/src/types/user.ts +6 -0
  148. package/src/utils/api.ts +186 -0
  149. package/src/utils/array.ts +25 -0
  150. package/src/utils/constants.ts +12 -0
  151. package/src/utils/fetch.ts +116 -0
  152. package/src/utils/getRequestUrl.ts +15 -0
  153. package/src/utils/hooks.ts +36 -0
  154. package/src/utils/icon.ts +22 -0
  155. package/src/utils/image.ts +157 -0
  156. package/src/utils/number.ts +11 -0
  157. package/src/utils/rotate.ts +23 -0
  158. package/src/utils/storage.ts +184 -0
  159. package/src/utils/string.ts +24 -0
  160. package/src/view/AssetsPicker.tsx +24 -0
  161. package/src/web-component.d.ts +8151 -0
  162. package/tsconfig.eslint.json +10 -0
  163. package/tsconfig.json +37 -0
  164. package/build/ApiService.d.ts +0 -15
  165. package/build/App.d.ts +0 -62
  166. package/build/AppContext.d.ts +0 -18
  167. package/build/GlobalConfigContext.d.ts +0 -32
  168. package/build/OrangeDAMContentBrowserSDK.min.css +0 -2
  169. package/build/OrangeDAMContentBrowserSDK.min.css.map +0 -1
  170. package/build/OrangeDAMContentBrowserSDK.min.js +0 -11468
  171. package/build/OrangeDAMContentBrowserSDK.min.js.map +0 -1
  172. package/build/asset-manifest.json +0 -13
  173. package/build/components/ArrayClamp/ArrayClamp.d.ts +0 -10
  174. package/build/components/ArrayClamp/ArrayClamp.styled.d.ts +0 -1
  175. package/build/components/ArrayClamp/index.d.ts +0 -1
  176. package/build/components/Browser/Browser.constants.d.ts +0 -3
  177. package/build/components/Browser/Browser.d.ts +0 -21
  178. package/build/components/Browser/Browser.styled.d.ts +0 -2
  179. package/build/components/Browser/BrowserItem.d.ts +0 -13
  180. package/build/components/Browser/LoadMoreButton.d.ts +0 -9
  181. package/build/components/ControlBar/ControlBar.constants.d.ts +0 -10
  182. package/build/components/ControlBar/ControlBar.d.ts +0 -23
  183. package/build/components/ControlBar/ControlBar.styled.d.ts +0 -1
  184. package/build/components/ControlBar/Facet/Facet.d.ts +0 -14
  185. package/build/components/ControlBar/Facet/index.d.ts +0 -1
  186. package/build/components/FormatDialog/CropPreviewer/CropPreviewer.d.ts +0 -41
  187. package/build/components/FormatDialog/CustomRendition/CustomRendition.constants.d.ts +0 -5
  188. package/build/components/FormatDialog/CustomRendition/CustomRendition.d.ts +0 -56
  189. package/build/components/FormatDialog/CustomRendition/CustomRendition.styled.d.ts +0 -1
  190. package/build/components/FormatDialog/CustomRendition/index.d.ts +0 -1
  191. package/build/components/FormatDialog/CustomRendition/transformations/Crop.d.ts +0 -26
  192. package/build/components/FormatDialog/CustomRendition/transformations/Extension.d.ts +0 -11
  193. package/build/components/FormatDialog/CustomRendition/transformations/Format.d.ts +0 -10
  194. package/build/components/FormatDialog/CustomRendition/transformations/Metadata.d.ts +0 -7
  195. package/build/components/FormatDialog/CustomRendition/transformations/Quality.d.ts +0 -7
  196. package/build/components/FormatDialog/CustomRendition/transformations/Resize.d.ts +0 -18
  197. package/build/components/FormatDialog/CustomRendition/transformations/Rotate.d.ts +0 -8
  198. package/build/components/FormatDialog/FormatDialog.d.ts +0 -49
  199. package/build/components/FormatDialog/FormatDialog.styled.d.ts +0 -3
  200. package/build/components/FormatDialog/Previewer/Previewer.d.ts +0 -17
  201. package/build/components/FormatDialog/Previewer/Previewer.styled.d.ts +0 -1
  202. package/build/components/FormatDialog/Previewer/index.d.ts +0 -1
  203. package/build/components/FormatDialog/ProxyMenu/ProxyMenu.d.ts +0 -20
  204. package/build/components/FormatDialog/ProxyMenu/ProxyMenu.styled.d.ts +0 -2
  205. package/build/components/FormatDialog/ProxyMenu/index.d.ts +0 -1
  206. package/build/components/FormatDialog/TrackingParameters/TrackingParameters.d.ts +0 -13
  207. package/build/components/FormatDialog/TrackingParameters/index.d.ts +0 -1
  208. package/build/components/FormatDialog/VersionHistory/VersionHistory.d.ts +0 -6
  209. package/build/components/FormatDialog/VersionHistory/VersionHistory.styled.d.ts +0 -1
  210. package/build/components/FormatDialog/VersionHistory/index.d.ts +0 -1
  211. package/build/components/FormatDialog/index.d.ts +0 -1
  212. package/build/components/Header/Header.d.ts +0 -15
  213. package/build/components/Header/Header.styled.d.ts +0 -5
  214. package/build/components/Loader/Loader.d.ts +0 -7
  215. package/build/components/Loader/index.d.ts +0 -1
  216. package/build/components/NoResult/NoResult.d.ts +0 -7
  217. package/build/components/NoResult/index.d.ts +0 -1
  218. package/build/components/Result/AssetCard/AssetCard.d.ts +0 -15
  219. package/build/components/Result/AssetCard/AssetCard.styled.d.ts +0 -2
  220. package/build/components/Result/AssetCard/AssetCardWrapper.d.ts +0 -18
  221. package/build/components/Result/AssetCard/AssetCardWrapper.styled.d.ts +0 -1
  222. package/build/components/Result/AssetCard/index.d.ts +0 -1
  223. package/build/components/Result/AssetPreview/AssetPreview.d.ts +0 -11
  224. package/build/components/Result/AssetPreview/AssetPreview.styled.d.ts +0 -1
  225. package/build/components/Result/AssetPreview/ImagePreview/ImagePreview.d.ts +0 -11
  226. package/build/components/Result/AssetPreview/ImagePreview/index.d.ts +0 -1
  227. package/build/components/Result/AssetPreview/OtherPreview/OtherPreview.d.ts +0 -9
  228. package/build/components/Result/AssetPreview/OtherPreview/OtherPreview.styled.d.ts +0 -1
  229. package/build/components/Result/AssetPreview/OtherPreview/index.d.ts +0 -1
  230. package/build/components/Result/AssetPreview/VideoPreview/VideoPreview.d.ts +0 -11
  231. package/build/components/Result/AssetPreview/VideoPreview/index.d.ts +0 -1
  232. package/build/components/Result/AssetPreview/index.d.ts +0 -1
  233. package/build/consts/asset.d.ts +0 -14
  234. package/build/consts/auth.d.ts +0 -4
  235. package/build/consts/data.d.ts +0 -21
  236. package/build/index.d.ts +0 -225
  237. package/build/index.html +0 -1
  238. package/build/page/Authenticate/Authenticate.d.ts +0 -2
  239. package/build/page/Authenticate/ConnectingBackground.d.ts +0 -8
  240. package/build/page/Authenticate/index.d.ts +0 -2
  241. package/build/page/Home/Home.d.ts +0 -6
  242. package/build/page/Home/Home.styled.d.ts +0 -2
  243. package/build/setupTests.d.ts +0 -1
  244. package/build/store/assets/assets.api.d.ts +0 -66
  245. package/build/store/assets/assets.service.d.ts +0 -23
  246. package/build/store/assets/assets.slice.d.ts +0 -65
  247. package/build/store/auth/auth.service.d.ts +0 -10
  248. package/build/store/auth/auth.slice.d.ts +0 -76
  249. package/build/store/index.d.ts +0 -368
  250. package/build/store/search/search.api.d.ts +0 -39
  251. package/build/store/search/search.slice.d.ts +0 -12
  252. package/build/store/user/user.api.d.ts +0 -5
  253. package/build/types/assets.d.ts +0 -68
  254. package/build/types/auth.d.ts +0 -35
  255. package/build/types/common.d.ts +0 -11
  256. package/build/types/download.d.ts +0 -8
  257. package/build/types/navigation.d.ts +0 -3
  258. package/build/types/search.d.ts +0 -148
  259. package/build/types/user.d.ts +0 -7
  260. package/build/utils/api.d.ts +0 -27
  261. package/build/utils/array.d.ts +0 -13
  262. package/build/utils/constants.d.ts +0 -11
  263. package/build/utils/function.d.ts +0 -1
  264. package/build/utils/getRequestUrl.d.ts +0 -1
  265. package/build/utils/hooks.d.ts +0 -1
  266. package/build/utils/icon.d.ts +0 -3
  267. package/build/utils/image.d.ts +0 -24
  268. package/build/utils/number.d.ts +0 -4
  269. package/build/utils/rotate.d.ts +0 -4
  270. package/build/utils/storage.d.ts +0 -23
  271. package/build/utils/string.d.ts +0 -12
  272. package/build/view/AssetsPicker.d.ts +0 -6
  273. /package/{build → public}/favicon.ico +0 -0
  274. /package/{build → public}/logo192.png +0 -0
  275. /package/{build → public}/logo512.png +0 -0
  276. /package/{build → public}/manifest.json +0 -0
  277. /package/{build → public}/robots.txt +0 -0
  278. /package/{build/components/Browser/index.d.ts → src/components/Browser/index.ts} +0 -0
  279. /package/{build/components/ControlBar/index.d.ts → src/components/ControlBar/index.ts} +0 -0
  280. /package/{build/components/Header/index.d.ts → src/components/Header/index.ts} +0 -0
  281. /package/{build/page/Home/index.d.ts → src/page/Home/index.ts} +0 -0
@@ -0,0 +1,224 @@
1
+ import _debounce from 'lodash-es/debounce';
2
+ import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
3
+ import Cropper, { Area, Point } from 'react-easy-crop';
4
+
5
+ import { Unit } from '@/types/assets';
6
+ import { FORMAT_DIALOG_PREVIEW_SIZE } from '@/utils/constants';
7
+ import { calculateAspectRatioFit, cropImage, resizeImage, rotateImage } from '@/utils/image';
8
+
9
+ import { Container } from '../Previewer/Previewer.styled';
10
+
11
+ type Props = {
12
+ disabled: boolean;
13
+ loadable: boolean;
14
+ image: {
15
+ url: string;
16
+ originalUrl: string;
17
+ extension: string;
18
+ width: number;
19
+ height: number;
20
+ x: number;
21
+ y: number;
22
+ rotation: number;
23
+ };
24
+ selectedProxy: string;
25
+ resizer: {
26
+ width: number;
27
+ height: number;
28
+ };
29
+ cropper: {
30
+ width: number;
31
+ height: number;
32
+ percentageWidth: number;
33
+ percentageHeight: number;
34
+ x: number;
35
+ y: number;
36
+ unit: Unit;
37
+ };
38
+ rotation: number;
39
+ onCropComplete: (croppedArea: Area, croppedAreaPixels: Area) => void;
40
+ onLoadingChange: (loading: boolean) => void;
41
+ };
42
+
43
+ export type CropPreviewerHandle = {
44
+ applyResize: () => Promise<string>;
45
+ applyCrop: () => Promise<string>;
46
+ applyRotation: () => Promise<string>;
47
+ setZoom: (zoom: number) => void;
48
+ };
49
+
50
+ const CropPreviewer = forwardRef<CropPreviewerHandle, Props>(({
51
+ disabled,
52
+ loadable,
53
+ image,
54
+ resizer,
55
+ cropper,
56
+ rotation,
57
+ selectedProxy,
58
+ onCropComplete,
59
+ onLoadingChange,
60
+ }, ref) => {
61
+ const [isLoading, setIsLoading] = useState(true);
62
+ const [crop, setCrop] = useState({ x: 0, y: 0 });
63
+ const [zoom, setZoom] = useState(1);
64
+ const [resizedImage, setResizedImage] = useState<string>(image?.url ?? '');
65
+ const containerRef = useRef<HTMLDivElement>(null);
66
+ useEffect(() => {
67
+ const { url, originalUrl, extension } = image;
68
+ const { width, height } = resizer;
69
+ const resize = async () => {
70
+ if (loadable) {
71
+ onLoadingChange(true);
72
+ const { width: newWidth, height: newHeight } = calculateAspectRatioFit(image.width, image.height, width, height);
73
+ const { url: imageUrl } = await resizeImage(url,
74
+ newWidth,
75
+ newHeight,
76
+ containerRef.current?.clientWidth ?? window.innerWidth, FORMAT_DIALOG_PREVIEW_SIZE,
77
+ );
78
+ setResizedImage(extension === 'gif' ? originalUrl : imageUrl);
79
+ onLoadingChange(false);
80
+ } else {
81
+ setResizedImage(url);
82
+ }
83
+ };
84
+ const debounceResize = _debounce(resize, 300, { leading: true });
85
+ debounceResize();
86
+ }, [image, loadable, onLoadingChange, resizer, selectedProxy]);
87
+
88
+ const applyResize = useCallback(async () => {
89
+ return resizedImage;
90
+ }, [resizedImage]);
91
+
92
+ const applyCrop = useCallback(async () => {
93
+ const { width, height, x, y, unit } = cropper;
94
+ const options = { x, y, width, height };
95
+ options.x = (x / 100) * image.width;
96
+ options.y = (y / 100) * image.height;
97
+ if (loadable) {
98
+ onLoadingChange(true);
99
+ if (unit === Unit.AspectRatio) {
100
+ const { width: newWidth, height: newHeight } = calculateAspectRatioFit(image.width, image.height, width, height);
101
+ options.width = newWidth / zoom;
102
+ options.height = newHeight / zoom;
103
+ }
104
+ const result = await cropImage(
105
+ {
106
+ url: image.url,
107
+ width: image.width,
108
+ height: image.height,
109
+ },
110
+ options,
111
+ );
112
+ onLoadingChange(false);
113
+ return result;
114
+ } else {
115
+ return Promise.resolve(image.url);
116
+ }
117
+ }, [cropper, image.width, image.height, image.url, loadable, onLoadingChange, zoom]);
118
+
119
+ const applyRotation = useCallback(async () => {
120
+ if (loadable) {
121
+ onLoadingChange(true);
122
+ const result = await rotateImage(
123
+ {
124
+ url: image.url,
125
+ width: image.width,
126
+ height: image.height,
127
+ },
128
+ rotation,
129
+ );
130
+ onLoadingChange(false);
131
+ return result;
132
+ } else {
133
+ return Promise.resolve(image.url);
134
+ }
135
+ }, [image.height, image.url, image.width, loadable, onLoadingChange, rotation]);
136
+
137
+ useImperativeHandle(ref, () => ({
138
+ applyResize,
139
+ applyCrop,
140
+ applyRotation,
141
+ setZoom,
142
+ }));
143
+
144
+ const resetCropper = useCallback(() => {
145
+ setCrop({ x: 0, y: 0 });
146
+ setZoom(1);
147
+ }, []);
148
+
149
+ const onCropChange = useCallback(
150
+ (location: Point) => {
151
+ if (disabled) {
152
+ return;
153
+ }
154
+ setCrop(location);
155
+ },
156
+ [disabled],
157
+ );
158
+
159
+ const onMediaLoaded = useCallback(() => {
160
+ setIsLoading(false);
161
+ }, []);
162
+
163
+ useEffect(() => {
164
+ resetCropper();
165
+ }, [disabled, resetCropper]);
166
+
167
+
168
+ const objectFit = useMemo(() => {
169
+ const container = containerRef.current;
170
+ if (!container || isLoading) {
171
+ return 'contain';
172
+ }
173
+ const imgAspect = resizer.width / resizer.height;
174
+
175
+ const containerAspect = container.clientHeight ? (container.clientWidth) / (container.clientHeight) : 0;
176
+
177
+ return imgAspect > containerAspect ? 'horizontal-cover' : 'vertical-cover';
178
+ }, [isLoading, resizer]);
179
+
180
+ return (
181
+ <Container
182
+ ref={containerRef}
183
+ style={{
184
+ height: `${FORMAT_DIALOG_PREVIEW_SIZE}px`,
185
+ }}
186
+ >
187
+ {loadable && (
188
+ <Cropper
189
+ image={resizedImage}
190
+ crop={crop}
191
+ zoom={zoom}
192
+ aspect={cropper.width / cropper.height}
193
+ rotation={rotation}
194
+ objectFit={objectFit}
195
+ onCropChange={onCropChange}
196
+ onCropComplete={onCropComplete}
197
+ onMediaLoaded={onMediaLoaded}
198
+ onZoomChange={setZoom}
199
+ zoomWithScroll={cropper.unit === Unit.AspectRatio}
200
+ style={{
201
+ containerStyle: {
202
+ cursor: disabled ? 'default' : 'move',
203
+ pointerEvents: disabled ? 'none' : 'auto',
204
+ },
205
+ cropAreaStyle: {
206
+ display: disabled ? 'none' : 'block',
207
+ },
208
+ mediaStyle: {
209
+ opacity: isLoading ? 0 : 1,
210
+ },
211
+ }}
212
+ />
213
+ )}
214
+ {isLoading && (
215
+ <div className="loading">
216
+ <cx-skeleton className="loading__skeleton"></cx-skeleton>
217
+ <cx-spinner className="loading__spinner"></cx-spinner>
218
+ </div>
219
+ )}
220
+ </Container>
221
+ );
222
+ });
223
+
224
+ export default CropPreviewer;
@@ -1,3 +1,3 @@
1
1
  import { CropPreviewerHandle } from './CropPreviewer';
2
2
  export { default } from './CropPreviewer';
3
- export type { CropPreviewerHandle };
3
+ export type { CropPreviewerHandle };
@@ -0,0 +1,24 @@
1
+ export const cropModes = [{
2
+ value: 'free',
3
+ label: 'Freeform',
4
+ }, {
5
+ value: '16:9',
6
+ label: 'Widescreen (16:9)',
7
+ }, {
8
+ value: '9:16',
9
+ label: 'Phone (9:16)',
10
+ }, {
11
+ value: '4:3',
12
+ label: 'Presentation (4:3)',
13
+ }, {
14
+ value: '1:1',
15
+ label: 'Square (1:1)',
16
+ }, {
17
+ value: '3:2',
18
+ label: 'Landscape (3:2)',
19
+ }, {
20
+ value: '2:3',
21
+ label: 'Portrait (2:3)',
22
+ }];
23
+
24
+ export const INPUT_DEBOUNCE_DELAY = 1000;
@@ -0,0 +1,57 @@
1
+ import styled from 'styled-components';
2
+
3
+ export const Container = styled.div`
4
+ .details__summary__icon {
5
+ width: var(--cx-font-size-3x-large);
6
+ height: var(--cx-font-size-3x-large);
7
+ display: flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ background-color: var(--cx-color-neutral-100);
11
+ border-radius: var(--cx-border-radius-large);
12
+ color: var(--cx-color-neutral-600);
13
+ font-size: var(--cx-font-size-large);
14
+ }
15
+
16
+ .details__summary__input-label {
17
+ color: var(--cx-color-neutral-400);
18
+ margin-inline-start: var(--cx-spacing-small);
19
+ }
20
+
21
+ cx-input::part(input) {
22
+ padding-left: var(--cx-spacing-small);
23
+ padding-right: var(--cx-spacing-small);
24
+ }
25
+
26
+ cx-space {
27
+ width: 100%;
28
+
29
+ cx-input {
30
+ flex: 1;
31
+ }
32
+ }
33
+
34
+ .resize__unit-select {
35
+ width: 120px;
36
+ }
37
+
38
+ .resize__input-group {
39
+ display: flex;
40
+ flex: 1;
41
+ }
42
+
43
+ .extension {
44
+ padding: var(--cx-spacing-small) var(--cx-spacing-medium);
45
+ border: solid 1px var(--cx-color-neutral-200);
46
+ background-color: var(--cx-color-neutral-0);
47
+
48
+ cx-select{
49
+ flex: 1;
50
+ width: 100%;
51
+ }
52
+ }
53
+
54
+ cx-details:not(:last-child)::part(base) {
55
+ border-bottom-width: 0;
56
+ }
57
+ `;
@@ -0,0 +1,178 @@
1
+ import _isEqualWith from 'lodash-es/isEqualWith';
2
+ import { FC, useEffect, useMemo, useRef } from 'react';
3
+
4
+ import { Unit } from '@/types/assets';
5
+ import { CxHideEvent, CxShowEvent } from '@/web-component';
6
+
7
+ import { Container } from './CustomRendition.styled';
8
+ import { Crop, Extension, Format, Resize, Rotate } from './transformations';
9
+ import { Proxy } from '@/types/search';
10
+
11
+ type Props = {
12
+ activeSetting: string;
13
+ extensions: { displayName: string; value: string }[];
14
+ availableProxies: Proxy[];
15
+ imageSize: {
16
+ width: number;
17
+ height: number;
18
+ }
19
+ resize: {
20
+ width: number;
21
+ height: number;
22
+ unit: Unit;
23
+ };
24
+ crop: {
25
+ width: number;
26
+ height: number;
27
+ unit: Unit;
28
+ percentageWidth: number;
29
+ percentageHeight: number;
30
+ };
31
+ extension: string;
32
+ lastAppliedResize: Record<Unit, {
33
+ width: number;
34
+ height: number;
35
+ unit: Unit;
36
+ }>;
37
+ lastAppliedCrop: Record<Unit, {
38
+ width: number;
39
+ height: number;
40
+ percentageWidth: number;
41
+ percentageHeight: number;
42
+ x: number;
43
+ y: number;
44
+ unit: Unit;
45
+ }>;
46
+ proxy: string;
47
+ rotation: number;
48
+ onCropChange: (
49
+ width: number,
50
+ height: number,
51
+ unit: Unit,
52
+ shouldApply: boolean
53
+ ) => void;
54
+ onExtensionChange: (extension: string) => void;
55
+ onFormatChange: (format: Proxy) => void;
56
+ onResizeChange: (
57
+ width: number,
58
+ height: number,
59
+ unit: Unit,
60
+ shouldApply: boolean
61
+ ) => void;
62
+ onRotateChange: (rotation: number, shouldApply: boolean) => void;
63
+ onViewChange: (view: string) => void;
64
+ };
65
+
66
+ const CustomRendition: FC<Props> = ({
67
+ activeSetting,
68
+ extensions,
69
+ availableProxies,
70
+ imageSize,
71
+ resize,
72
+ crop,
73
+ extension,
74
+ lastAppliedCrop,
75
+ lastAppliedResize,
76
+ proxy,
77
+ rotation,
78
+ onCropChange,
79
+ onExtensionChange,
80
+ onFormatChange,
81
+ onResizeChange,
82
+ onRotateChange,
83
+ onViewChange,
84
+ }: Props) => {
85
+ const containerRef = useRef<HTMLDivElement>(null);
86
+
87
+ useEffect(() => {
88
+ const container = containerRef.current;
89
+ if (!container) { return; }
90
+
91
+ const onDetailsShow = (e: CxShowEvent) => {
92
+ if ((e.target as HTMLElement).localName === 'cx-details') {
93
+ onViewChange((e.target as HTMLElement).dataset.value ?? '');
94
+ }
95
+ };
96
+ const onDetailsHide = (e: CxHideEvent) => {
97
+ const allDetails = container?.querySelectorAll('cx-details');
98
+
99
+ if ((e.target as HTMLElement).localName === 'cx-details') {
100
+ const allDetailsClosed = Array.from(allDetails).every((details) => {
101
+ if (details.open) {
102
+ return false;
103
+ }
104
+ return true;
105
+ });
106
+
107
+ if (allDetailsClosed) {
108
+ onViewChange('');
109
+ }
110
+ }
111
+ };
112
+ container.addEventListener('cx-show', onDetailsShow);
113
+ container.addEventListener('cx-hide', onDetailsHide);
114
+
115
+ return () => {
116
+ container.removeEventListener('cx-show', onDetailsShow);
117
+ container.removeEventListener('cx-hide', onDetailsHide);
118
+ };
119
+ }, [onViewChange]);
120
+
121
+ const disabledCropApply = useMemo(() => {
122
+ return _isEqualWith(crop, lastAppliedCrop[crop.unit], (a, b) => {
123
+ if (!isNaN(a) && !isNaN(b)) {
124
+ return Math.round(a) === Math.round(b);
125
+ }
126
+ return undefined;
127
+ });
128
+ }, [crop, lastAppliedCrop]);
129
+
130
+ const formats = useMemo(() => {
131
+ return availableProxies.filter(item => !item.cdnName);
132
+ }, [availableProxies]);
133
+
134
+ return (
135
+ <Container ref={containerRef}>
136
+ <Format
137
+ open={activeSetting === 'format'}
138
+ format={proxy}
139
+ formats={formats}
140
+ onApply={onFormatChange}
141
+ />
142
+ <Crop
143
+ open={activeSetting === 'crop'}
144
+ width={crop.width}
145
+ height={crop.height}
146
+ percentageWidth={crop.percentageWidth}
147
+ percentageHeight={crop.percentageHeight}
148
+ disabledCropApply={disabledCropApply}
149
+ lastAppliedSetting={lastAppliedCrop}
150
+ maxWidth={resize.width}
151
+ maxHeight={resize.height}
152
+ unit={crop.unit}
153
+ onChange={(width, height, unit) => onCropChange(width, height, unit, false)}
154
+ onApply={() => onCropChange(crop.width, crop.height, crop.unit, true)}
155
+ />
156
+ <Resize
157
+ open={activeSetting === 'resize'}
158
+ width={resize.width}
159
+ height={resize.height}
160
+ lastAppliedSetting={lastAppliedResize}
161
+ maxWidth={imageSize.width}
162
+ maxHeight={imageSize.height}
163
+ unit={resize.unit}
164
+ onChange={(width, height, unit) => onResizeChange(width, height, unit, false)}
165
+ onApply={() => onResizeChange(resize.width, resize.height, resize.unit, true)}
166
+ />
167
+ <Rotate
168
+ open={activeSetting === 'rotate'}
169
+ rotation={rotation}
170
+ onChange={(newRotation) => onRotateChange(newRotation, false)}
171
+ onApply={() => onRotateChange(rotation, true)}
172
+ />
173
+ <Extension extension={extension} extensions={extensions} onChange={onExtensionChange} />
174
+ </Container>
175
+ );
176
+ };
177
+
178
+ export default CustomRendition;
@@ -0,0 +1 @@
1
+ export { default } from './CustomRendition';