@chayns-components/gallery 5.2.4 → 5.2.5

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 (124) hide show
  1. package/AGENTS.md +132 -13
  2. package/lib/cjs/components/Gallery.js +4 -1
  3. package/lib/cjs/components/Gallery.js.map +1 -1
  4. package/lib/cjs/components/Gallery.types.js.map +1 -1
  5. package/lib/cjs/components/gallery-editor/GalleryEditor.constants.js +12 -0
  6. package/lib/cjs/components/gallery-editor/GalleryEditor.constants.js.map +1 -0
  7. package/lib/cjs/components/gallery-editor/GalleryEditor.js +40 -178
  8. package/lib/cjs/components/gallery-editor/GalleryEditor.js.map +1 -1
  9. package/lib/cjs/components/gallery-editor/GalleryEditor.styles.js +3 -1
  10. package/lib/cjs/components/gallery-editor/GalleryEditor.styles.js.map +1 -1
  11. package/lib/cjs/components/gallery-editor/GalleryEditor.types.js.map +1 -1
  12. package/lib/cjs/components/gallery-editor/GalleryEditor.utils.js +27 -0
  13. package/lib/cjs/components/gallery-editor/GalleryEditor.utils.js.map +1 -0
  14. package/lib/cjs/components/gallery-editor/add-file/AddFile.js +1 -1
  15. package/lib/cjs/components/gallery-editor/add-file/AddFile.js.map +1 -1
  16. package/lib/cjs/components/gallery-editor/gallery-editor-item/GalleryEditorItem.js +48 -19
  17. package/lib/cjs/components/gallery-editor/gallery-editor-item/GalleryEditorItem.js.map +1 -1
  18. package/lib/cjs/components/gallery-editor/gallery-editor-item/GalleryEditorItem.styles.js +10 -3
  19. package/lib/cjs/components/gallery-editor/gallery-editor-item/GalleryEditorItem.styles.js.map +1 -1
  20. package/lib/cjs/components/gallery-editor/gallery-editor-item/GalleryEditorItem.types.js.map +1 -1
  21. package/lib/cjs/components/gallery-editor/gallery-editor-item/gallery-editor-media-item/GalleryEditorMediaItem.js +10 -4
  22. package/lib/cjs/components/gallery-editor/gallery-editor-item/gallery-editor-media-item/GalleryEditorMediaItem.js.map +1 -1
  23. package/lib/cjs/components/gallery-editor/gallery-editor-item/gallery-editor-media-item/GalleryEditorMediaItem.types.js.map +1 -1
  24. package/lib/cjs/components/gallery-editor/gallery-editor-item/gallery-editor-preview-item/GalleryEditorPreviewItem.js +7 -10
  25. package/lib/cjs/components/gallery-editor/gallery-editor-item/gallery-editor-preview-item/GalleryEditorPreviewItem.js.map +1 -1
  26. package/lib/cjs/components/gallery-editor/useGalleryEditorState.js +161 -0
  27. package/lib/cjs/components/gallery-editor/useGalleryEditorState.js.map +1 -0
  28. package/lib/cjs/components/gallery-viewer/GalleryViewer.constants.js +8 -0
  29. package/lib/cjs/components/gallery-viewer/GalleryViewer.constants.js.map +1 -0
  30. package/lib/cjs/components/gallery-viewer/GalleryViewer.js +8 -4
  31. package/lib/cjs/components/gallery-viewer/GalleryViewer.js.map +1 -1
  32. package/lib/cjs/components/gallery-viewer/GalleryViewer.types.js.map +1 -1
  33. package/lib/cjs/components/gallery-viewer/gallery-viewer-item/GalleryViewerItem.js +6 -3
  34. package/lib/cjs/components/gallery-viewer/gallery-viewer-item/GalleryViewerItem.js.map +1 -1
  35. package/lib/cjs/components/gallery-viewer/gallery-viewer-item/GalleryViewerItem.types.js.map +1 -1
  36. package/lib/cjs/components/media-content/MediaContent.constants.js +12 -0
  37. package/lib/cjs/components/media-content/MediaContent.constants.js.map +1 -0
  38. package/lib/cjs/components/media-content/MediaContent.js +95 -20
  39. package/lib/cjs/components/media-content/MediaContent.js.map +1 -1
  40. package/lib/cjs/components/media-content/MediaContent.styles.js +35 -5
  41. package/lib/cjs/components/media-content/MediaContent.styles.js.map +1 -1
  42. package/lib/cjs/components/media-content/MediaContent.types.js.map +1 -1
  43. package/lib/cjs/components/media-content/MediaContent.utils.js +84 -0
  44. package/lib/cjs/components/media-content/MediaContent.utils.js.map +1 -0
  45. package/lib/cjs/components/media-content/useMediaContentSize.js +68 -0
  46. package/lib/cjs/components/media-content/useMediaContentSize.js.map +1 -0
  47. package/lib/cjs/utils/gallery.js +2 -2
  48. package/lib/cjs/utils/gallery.js.map +1 -1
  49. package/lib/esm/components/Gallery.js +4 -1
  50. package/lib/esm/components/Gallery.js.map +1 -1
  51. package/lib/esm/components/Gallery.types.js.map +1 -1
  52. package/lib/esm/components/gallery-editor/GalleryEditor.constants.js +6 -0
  53. package/lib/esm/components/gallery-editor/GalleryEditor.constants.js.map +1 -0
  54. package/lib/esm/components/gallery-editor/GalleryEditor.js +37 -174
  55. package/lib/esm/components/gallery-editor/GalleryEditor.js.map +1 -1
  56. package/lib/esm/components/gallery-editor/GalleryEditor.styles.js +3 -1
  57. package/lib/esm/components/gallery-editor/GalleryEditor.styles.js.map +1 -1
  58. package/lib/esm/components/gallery-editor/GalleryEditor.types.js.map +1 -1
  59. package/lib/esm/components/gallery-editor/GalleryEditor.utils.js +17 -0
  60. package/lib/esm/components/gallery-editor/GalleryEditor.utils.js.map +1 -0
  61. package/lib/esm/components/gallery-editor/add-file/AddFile.js +2 -2
  62. package/lib/esm/components/gallery-editor/add-file/AddFile.js.map +1 -1
  63. package/lib/esm/components/gallery-editor/gallery-editor-item/GalleryEditorItem.js +47 -19
  64. package/lib/esm/components/gallery-editor/gallery-editor-item/GalleryEditorItem.js.map +1 -1
  65. package/lib/esm/components/gallery-editor/gallery-editor-item/GalleryEditorItem.styles.js +9 -2
  66. package/lib/esm/components/gallery-editor/gallery-editor-item/GalleryEditorItem.styles.js.map +1 -1
  67. package/lib/esm/components/gallery-editor/gallery-editor-item/GalleryEditorItem.types.js.map +1 -1
  68. package/lib/esm/components/gallery-editor/gallery-editor-item/gallery-editor-media-item/GalleryEditorMediaItem.js +9 -4
  69. package/lib/esm/components/gallery-editor/gallery-editor-item/gallery-editor-media-item/GalleryEditorMediaItem.js.map +1 -1
  70. package/lib/esm/components/gallery-editor/gallery-editor-item/gallery-editor-media-item/GalleryEditorMediaItem.types.js.map +1 -1
  71. package/lib/esm/components/gallery-editor/gallery-editor-item/gallery-editor-preview-item/GalleryEditorPreviewItem.js +6 -9
  72. package/lib/esm/components/gallery-editor/gallery-editor-item/gallery-editor-preview-item/GalleryEditorPreviewItem.js.map +1 -1
  73. package/lib/esm/components/gallery-editor/useGalleryEditorState.js +150 -0
  74. package/lib/esm/components/gallery-editor/useGalleryEditorState.js.map +1 -0
  75. package/lib/esm/components/gallery-viewer/GalleryViewer.constants.js +2 -0
  76. package/lib/esm/components/gallery-viewer/GalleryViewer.constants.js.map +1 -0
  77. package/lib/esm/components/gallery-viewer/GalleryViewer.js +9 -5
  78. package/lib/esm/components/gallery-viewer/GalleryViewer.js.map +1 -1
  79. package/lib/esm/components/gallery-viewer/GalleryViewer.types.js.map +1 -1
  80. package/lib/esm/components/gallery-viewer/gallery-viewer-item/GalleryViewerItem.js +5 -3
  81. package/lib/esm/components/gallery-viewer/gallery-viewer-item/GalleryViewerItem.js.map +1 -1
  82. package/lib/esm/components/gallery-viewer/gallery-viewer-item/GalleryViewerItem.types.js.map +1 -1
  83. package/lib/esm/components/media-content/MediaContent.constants.js +6 -0
  84. package/lib/esm/components/media-content/MediaContent.constants.js.map +1 -0
  85. package/lib/esm/components/media-content/MediaContent.js +94 -21
  86. package/lib/esm/components/media-content/MediaContent.js.map +1 -1
  87. package/lib/esm/components/media-content/MediaContent.styles.js +34 -4
  88. package/lib/esm/components/media-content/MediaContent.styles.js.map +1 -1
  89. package/lib/esm/components/media-content/MediaContent.types.js.map +1 -1
  90. package/lib/esm/components/media-content/MediaContent.utils.js +71 -0
  91. package/lib/esm/components/media-content/MediaContent.utils.js.map +1 -0
  92. package/lib/esm/components/media-content/useMediaContentSize.js +62 -0
  93. package/lib/esm/components/media-content/useMediaContentSize.js.map +1 -0
  94. package/lib/esm/utils/gallery.js +2 -2
  95. package/lib/esm/utils/gallery.js.map +1 -1
  96. package/lib/types/components/Gallery.types.d.ts +12 -0
  97. package/lib/types/components/gallery-editor/GalleryEditor.constants.d.ts +5 -0
  98. package/lib/types/components/gallery-editor/GalleryEditor.styles.d.ts +7 -3
  99. package/lib/types/components/gallery-editor/GalleryEditor.types.d.ts +11 -0
  100. package/lib/types/components/gallery-editor/GalleryEditor.utils.d.ts +5 -0
  101. package/lib/types/components/gallery-editor/add-file/AddFile.d.ts +3 -3
  102. package/lib/types/components/gallery-editor/add-file/AddFile.styles.d.ts +5 -3
  103. package/lib/types/components/gallery-editor/gallery-editor-item/GalleryEditorItem.d.ts +3 -3
  104. package/lib/types/components/gallery-editor/gallery-editor-item/GalleryEditorItem.styles.d.ts +13 -3
  105. package/lib/types/components/gallery-editor/gallery-editor-item/GalleryEditorItem.types.d.ts +8 -0
  106. package/lib/types/components/gallery-editor/gallery-editor-item/gallery-editor-media-item/GalleryEditorMediaItem.d.ts +3 -3
  107. package/lib/types/components/gallery-editor/gallery-editor-item/gallery-editor-media-item/GalleryEditorMediaItem.styles.d.ts +3 -1
  108. package/lib/types/components/gallery-editor/gallery-editor-item/gallery-editor-media-item/GalleryEditorMediaItem.types.d.ts +15 -0
  109. package/lib/types/components/gallery-editor/gallery-editor-item/gallery-editor-preview-item/GalleryEditorPreviewItem.d.ts +3 -3
  110. package/lib/types/components/gallery-editor/gallery-editor-item/gallery-editor-preview-item/GalleryEditorPreviewItem.styles.d.ts +12 -6
  111. package/lib/types/components/gallery-editor/useGalleryEditorState.d.ts +21 -0
  112. package/lib/types/components/gallery-viewer/GalleryViewer.constants.d.ts +1 -0
  113. package/lib/types/components/gallery-viewer/GalleryViewer.styles.d.ts +7 -3
  114. package/lib/types/components/gallery-viewer/GalleryViewer.types.d.ts +11 -0
  115. package/lib/types/components/gallery-viewer/gallery-viewer-item/GalleryViewerItem.d.ts +3 -3
  116. package/lib/types/components/gallery-viewer/gallery-viewer-item/GalleryViewerItem.styles.d.ts +2 -2
  117. package/lib/types/components/gallery-viewer/gallery-viewer-item/GalleryViewerItem.types.d.ts +8 -0
  118. package/lib/types/components/media-content/MediaContent.constants.d.ts +5 -0
  119. package/lib/types/components/media-content/MediaContent.d.ts +3 -3
  120. package/lib/types/components/media-content/MediaContent.styles.d.ts +50 -9
  121. package/lib/types/components/media-content/MediaContent.types.d.ts +16 -0
  122. package/lib/types/components/media-content/MediaContent.utils.d.ts +12 -0
  123. package/lib/types/components/media-content/useMediaContentSize.d.ts +3 -0
  124. package/package.json +4 -4
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _core = require("@chayns-components/core");
8
+ var _chaynsApi = require("chayns-api");
9
+ var _react = require("react");
10
+ var _uuid = require("uuid");
11
+ var _file = require("../../utils/file");
12
+ var _gallery = require("../../utils/gallery");
13
+ var _GalleryEditor = require("./GalleryEditor.utils");
14
+ const useGalleryEditorState = ({
15
+ allowDragAndDrop,
16
+ doubleFileDialogMessage,
17
+ files,
18
+ maxFiles,
19
+ onAdd,
20
+ onFileCountChange,
21
+ onRemove
22
+ }) => {
23
+ const [fileItems, setFileItems] = (0, _react.useState)(() => (0, _GalleryEditor.mapExternalFilesIntoInternalItems)(files));
24
+ const callDuplicateFileDialog = (0, _react.useCallback)(() => {
25
+ (0, _chaynsApi.createDialog)({
26
+ type: _chaynsApi.DialogType.ALERT,
27
+ text: doubleFileDialogMessage
28
+ });
29
+ }, [doubleFileDialogMessage]);
30
+ const handlePreviewUrlCallback = (0, _react.useCallback)((previewUrl, file) => {
31
+ setFileItems(prevState => prevState.map(prevFile => prevFile.id === file.id ? {
32
+ ...prevFile,
33
+ previewUrl
34
+ } : prevFile));
35
+ }, []);
36
+ const handleUploadFileCallback = (0, _react.useCallback)((file, uploadedFile) => {
37
+ setFileItems(prevState => {
38
+ const duplicateItem = prevState.find(prevFile => {
39
+ var _prevFile$uploadedFil;
40
+ return ((_prevFile$uploadedFil = prevFile.uploadedFile) === null || _prevFile$uploadedFil === void 0 ? void 0 : _prevFile$uploadedFil.url) === uploadedFile.url;
41
+ });
42
+ const updatedState = prevState.map(prevFile => {
43
+ var _prevFile$uploadedFil2;
44
+ if (((_prevFile$uploadedFil2 = prevFile.uploadedFile) === null || _prevFile$uploadedFil2 === void 0 ? void 0 : _prevFile$uploadedFil2.url) === uploadedFile.url) {
45
+ callDuplicateFileDialog();
46
+ return undefined;
47
+ }
48
+ if (prevFile.id === file.id) {
49
+ if (typeof onAdd === 'function' && !duplicateItem) {
50
+ onAdd({
51
+ file: uploadedFile,
52
+ id: file.id
53
+ });
54
+ }
55
+ return {
56
+ ...prevFile,
57
+ uploadedFile,
58
+ state: 'uploaded'
59
+ };
60
+ }
61
+ return prevFile;
62
+ });
63
+ return updatedState.filter(Boolean);
64
+ });
65
+ }, [callDuplicateFileDialog, onAdd]);
66
+ const filesToGeneratePreview = (0, _react.useMemo)(() => (0, _GalleryEditor.getPendingPreviewFileItems)(fileItems), [fileItems]);
67
+ const filesToUpload = (0, _react.useMemo)(() => (0, _GalleryEditor.getPendingUploadFileItems)(fileItems), [fileItems]);
68
+ const handleAddFiles = (0, _react.useCallback)(filesToAdd => {
69
+ setFileItems(prevState => {
70
+ const newFileItems = [];
71
+ filesToAdd.forEach(file => {
72
+ if (file && !(0, _file.filterDuplicateFile)({
73
+ files: prevState,
74
+ newFile: file
75
+ })) {
76
+ newFileItems.push({
77
+ id: (0, _uuid.v4)(),
78
+ file,
79
+ state: 'none'
80
+ });
81
+ }
82
+ });
83
+ const limitedFileItems = maxFiles ? newFileItems.slice(0, Math.max(maxFiles - prevState.length, 0)) : newFileItems;
84
+ return [...prevState, ...limitedFileItems];
85
+ });
86
+ }, [maxFiles]);
87
+ const handleDeleteFile = (0, _react.useCallback)(id => {
88
+ let uploadedFile;
89
+ setFileItems(prevState => {
90
+ var _prevState$find;
91
+ uploadedFile = (_prevState$find = prevState.find(file => file.id === id)) === null || _prevState$find === void 0 ? void 0 : _prevState$find.uploadedFile;
92
+ return prevState.filter(file => file.id !== id);
93
+ });
94
+ if (uploadedFile && typeof onRemove === 'function') {
95
+ onRemove({
96
+ file: uploadedFile,
97
+ id
98
+ });
99
+ }
100
+ }, [onRemove]);
101
+ const handleDrop = (0, _react.useCallback)(event => {
102
+ if (!allowDragAndDrop) {
103
+ return;
104
+ }
105
+ event.preventDefault();
106
+ handleAddFiles(Array.from(event.dataTransfer.files));
107
+ }, [allowDragAndDrop, handleAddFiles]);
108
+ const handleOpenFiles = (0, _react.useCallback)(file => {
109
+ (0, _gallery.openFiles)(fileItems, file);
110
+ }, [fileItems]);
111
+ const handleClear = (0, _react.useCallback)(() => {
112
+ setFileItems([]);
113
+ }, []);
114
+ (0, _react.useEffect)(() => {
115
+ if (typeof onFileCountChange === 'function') {
116
+ onFileCountChange(fileItems.length);
117
+ }
118
+ }, [fileItems.length, onFileCountChange]);
119
+ (0, _react.useEffect)(() => {
120
+ filesToGeneratePreview.forEach(file => {
121
+ if (!file.file) {
122
+ return;
123
+ }
124
+ if (file.file.type.includes('video/')) {
125
+ (0, _file.generateVideoThumbnail)({
126
+ file: file.file,
127
+ callback: previewUrl => handlePreviewUrlCallback(previewUrl, file)
128
+ });
129
+ return;
130
+ }
131
+ (0, _file.generatePreviewUrl)({
132
+ file: file.file,
133
+ callback: previewUrl => handlePreviewUrlCallback(previewUrl, file)
134
+ });
135
+ });
136
+ filesToUpload.forEach(file => {
137
+ setFileItems(prevState => prevState.map(prevFile => prevFile.id === file.id ? {
138
+ ...prevFile,
139
+ state: 'uploading'
140
+ } : prevFile));
141
+ void (0, _core.uploadFile)({
142
+ fileToUpload: file,
143
+ callback: uploadedFile => handleUploadFileCallback(file, uploadedFile)
144
+ });
145
+ });
146
+ }, [filesToGeneratePreview, filesToUpload, handlePreviewUrlCallback, handleUploadFileCallback]);
147
+ (0, _react.useEffect)(() => {
148
+ const externalFileItems = (0, _GalleryEditor.mapExternalFilesIntoInternalItems)(files);
149
+ setFileItems(prevState => (0, _GalleryEditor.mergeExternalFilesWithInternalState)(prevState, externalFileItems));
150
+ }, [files]);
151
+ return {
152
+ fileItems,
153
+ handleAddFiles,
154
+ handleClear,
155
+ handleDeleteFile,
156
+ handleDrop,
157
+ handleOpenFiles
158
+ };
159
+ };
160
+ var _default = exports.default = useGalleryEditorState;
161
+ //# sourceMappingURL=useGalleryEditorState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGalleryEditorState.js","names":["_core","require","_chaynsApi","_react","_uuid","_file","_gallery","_GalleryEditor","useGalleryEditorState","allowDragAndDrop","doubleFileDialogMessage","files","maxFiles","onAdd","onFileCountChange","onRemove","fileItems","setFileItems","useState","mapExternalFilesIntoInternalItems","callDuplicateFileDialog","useCallback","createDialog","type","DialogType","ALERT","text","handlePreviewUrlCallback","previewUrl","file","prevState","map","prevFile","id","handleUploadFileCallback","uploadedFile","duplicateItem","find","_prevFile$uploadedFil","url","updatedState","_prevFile$uploadedFil2","undefined","state","filter","Boolean","filesToGeneratePreview","useMemo","getPendingPreviewFileItems","filesToUpload","getPendingUploadFileItems","handleAddFiles","filesToAdd","newFileItems","forEach","filterDuplicateFile","newFile","push","uuidv4","limitedFileItems","slice","Math","max","length","handleDeleteFile","_prevState$find","handleDrop","event","preventDefault","Array","from","dataTransfer","handleOpenFiles","openFiles","handleClear","useEffect","includes","generateVideoThumbnail","callback","generatePreviewUrl","uploadFile","fileToUpload","externalFileItems","mergeExternalFilesWithInternalState","_default","exports","default"],"sources":["../../../../src/components/gallery-editor/useGalleryEditorState.ts"],"sourcesContent":["import {\n Image,\n uploadFile,\n Video,\n type FileItem,\n type InternalFileItem,\n} from '@chayns-components/core';\nimport { createDialog, DialogType } from 'chayns-api';\nimport { type DragEvent, useCallback, useEffect, useMemo, useState } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport { filterDuplicateFile, generatePreviewUrl, generateVideoThumbnail } from '../../utils/file';\nimport { openFiles } from '../../utils/gallery';\nimport {\n getPendingPreviewFileItems,\n getPendingUploadFileItems,\n mapExternalFilesIntoInternalItems,\n mergeExternalFilesWithInternalState,\n} from './GalleryEditor.utils';\n\ntype UseGalleryEditorStateOptions = {\n allowDragAndDrop: boolean;\n doubleFileDialogMessage: string;\n files?: FileItem[];\n maxFiles?: number;\n onAdd?: (file: FileItem) => void;\n onFileCountChange?: (fileCount: number) => void;\n onRemove?: (file: FileItem) => void;\n};\n\ntype GalleryEditorStateResult = {\n fileItems: InternalFileItem[];\n handleAddFiles: (filesToAdd: File[]) => void;\n handleClear: () => void;\n handleDeleteFile: (id?: string) => void;\n handleDrop: (event: DragEvent<HTMLDivElement>) => void;\n handleOpenFiles: (file: InternalFileItem) => void;\n};\n\nconst useGalleryEditorState = ({\n allowDragAndDrop,\n doubleFileDialogMessage,\n files,\n maxFiles,\n onAdd,\n onFileCountChange,\n onRemove,\n}: UseGalleryEditorStateOptions): GalleryEditorStateResult => {\n const [fileItems, setFileItems] = useState<InternalFileItem[]>(() =>\n mapExternalFilesIntoInternalItems(files),\n );\n\n const callDuplicateFileDialog = useCallback(() => {\n createDialog({ type: DialogType.ALERT, text: doubleFileDialogMessage });\n }, [doubleFileDialogMessage]);\n\n const handlePreviewUrlCallback = useCallback((previewUrl: string, file: InternalFileItem) => {\n setFileItems((prevState) =>\n prevState.map((prevFile) =>\n prevFile.id === file.id ? { ...prevFile, previewUrl } : prevFile,\n ),\n );\n }, []);\n\n const handleUploadFileCallback = useCallback(\n (file: InternalFileItem, uploadedFile: Video | Image) => {\n setFileItems((prevState) => {\n const duplicateItem = prevState.find(\n (prevFile) => prevFile.uploadedFile?.url === uploadedFile.url,\n );\n\n const updatedState = prevState.map((prevFile) => {\n if (prevFile.uploadedFile?.url === uploadedFile.url) {\n callDuplicateFileDialog();\n\n return undefined;\n }\n\n if (prevFile.id === file.id) {\n if (typeof onAdd === 'function' && !duplicateItem) {\n onAdd({ file: uploadedFile, id: file.id });\n }\n\n return {\n ...prevFile,\n uploadedFile,\n state: 'uploaded',\n };\n }\n\n return prevFile;\n });\n\n return updatedState.filter(Boolean) as InternalFileItem[];\n });\n },\n [callDuplicateFileDialog, onAdd],\n );\n\n const filesToGeneratePreview = useMemo(\n () => getPendingPreviewFileItems(fileItems),\n [fileItems],\n );\n const filesToUpload = useMemo(() => getPendingUploadFileItems(fileItems), [fileItems]);\n\n const handleAddFiles = useCallback(\n (filesToAdd: File[]) => {\n setFileItems((prevState) => {\n const newFileItems: InternalFileItem[] = [];\n\n filesToAdd.forEach((file) => {\n if (file && !filterDuplicateFile({ files: prevState, newFile: file })) {\n newFileItems.push({\n id: uuidv4(),\n file,\n state: 'none',\n });\n }\n });\n\n const limitedFileItems = maxFiles\n ? newFileItems.slice(0, Math.max(maxFiles - prevState.length, 0))\n : newFileItems;\n\n return [...prevState, ...limitedFileItems];\n });\n },\n [maxFiles],\n );\n\n const handleDeleteFile = useCallback(\n (id?: string) => {\n let uploadedFile: Image | Video | undefined;\n\n setFileItems((prevState) => {\n uploadedFile = prevState.find((file) => file.id === id)?.uploadedFile;\n\n return prevState.filter((file) => file.id !== id);\n });\n\n if (uploadedFile && typeof onRemove === 'function') {\n onRemove({ file: uploadedFile, id });\n }\n },\n [onRemove],\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n if (!allowDragAndDrop) {\n return;\n }\n\n event.preventDefault();\n\n handleAddFiles(Array.from(event.dataTransfer.files));\n },\n [allowDragAndDrop, handleAddFiles],\n );\n\n const handleOpenFiles = useCallback(\n (file: InternalFileItem) => {\n openFiles(fileItems, file);\n },\n [fileItems],\n );\n\n const handleClear = useCallback(() => {\n setFileItems([]);\n }, []);\n\n useEffect(() => {\n if (typeof onFileCountChange === 'function') {\n onFileCountChange(fileItems.length);\n }\n }, [fileItems.length, onFileCountChange]);\n\n useEffect(() => {\n filesToGeneratePreview.forEach((file) => {\n if (!file.file) {\n return;\n }\n\n if (file.file.type.includes('video/')) {\n generateVideoThumbnail({\n file: file.file,\n callback: (previewUrl) => handlePreviewUrlCallback(previewUrl, file),\n });\n\n return;\n }\n\n generatePreviewUrl({\n file: file.file,\n callback: (previewUrl) => handlePreviewUrlCallback(previewUrl, file),\n });\n });\n\n filesToUpload.forEach((file) => {\n setFileItems((prevState) =>\n prevState.map((prevFile) =>\n prevFile.id === file.id ? { ...prevFile, state: 'uploading' } : prevFile,\n ),\n );\n\n void uploadFile({\n fileToUpload: file,\n callback: (uploadedFile) => handleUploadFileCallback(file, uploadedFile),\n });\n });\n }, [filesToGeneratePreview, filesToUpload, handlePreviewUrlCallback, handleUploadFileCallback]);\n\n useEffect(() => {\n const externalFileItems = mapExternalFilesIntoInternalItems(files);\n\n setFileItems((prevState) =>\n mergeExternalFilesWithInternalState(prevState, externalFileItems),\n );\n }, [files]);\n\n return {\n fileItems,\n handleAddFiles,\n handleClear,\n handleDeleteFile,\n handleDrop,\n handleOpenFiles,\n };\n};\n\nexport default useGalleryEditorState;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.GALLERY_VIEWER_MAX_VISIBLE_ITEMS = void 0;
7
+ const GALLERY_VIEWER_MAX_VISIBLE_ITEMS = exports.GALLERY_VIEWER_MAX_VISIBLE_ITEMS = 4;
8
+ //# sourceMappingURL=GalleryViewer.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GalleryViewer.constants.js","names":["GALLERY_VIEWER_MAX_VISIBLE_ITEMS","exports"],"sources":["../../../../src/components/gallery-viewer/GalleryViewer.constants.ts"],"sourcesContent":["export const GALLERY_VIEWER_MAX_VISIBLE_ITEMS = 4;\n"],"mappings":";;;;;;AAAO,MAAMA,gCAAgC,GAAAC,OAAA,CAAAD,gCAAA,GAAG,CAAC","ignoreList":[]}
@@ -9,18 +9,21 @@ var _GalleryViewerItem = _interopRequireDefault(require("./gallery-viewer-item/G
9
9
  var _GalleryViewer = require("./GalleryViewer.styles");
10
10
  var _gallery = require("../../utils/gallery");
11
11
  var _gallery2 = require("../../types/gallery");
12
+ var _GalleryViewer2 = require("./GalleryViewer.constants");
12
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
14
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
15
+ const EMPTY_FILE_ITEMS = [];
14
16
  const GalleryViewer = ({
15
17
  files,
18
+ shouldLoadImages = true,
16
19
  viewMode = _gallery2.GalleryViewMode.GRID
17
20
  }) => {
18
- const fileItems = files ?? [];
19
- const ratio = (0, _react.useMemo)(() => (0, _gallery.getGalleryRatio)(fileItems), [fileItems]);
21
+ const fileItems = files ?? EMPTY_FILE_ITEMS;
22
+ const ratio = (0, _gallery.getGalleryRatio)(fileItems);
20
23
  const handleOpenFiles = (0, _react.useCallback)(file => {
21
24
  (0, _gallery.openKnownFiles)(fileItems, file);
22
25
  }, [fileItems]);
23
- const visibleItems = fileItems.slice(0, 4);
26
+ const visibleItems = fileItems.slice(0, _GalleryViewer2.GALLERY_VIEWER_MAX_VISIBLE_ITEMS);
24
27
  return /*#__PURE__*/_react.default.createElement(_GalleryViewer.StyledGalleryViewer, null, /*#__PURE__*/_react.default.createElement(_GalleryViewer.StyledGalleryViewerItemWrapper, {
25
28
  $ratio: ratio,
26
29
  $itemCount: fileItems.length,
@@ -34,7 +37,8 @@ const GalleryViewer = ({
34
37
  index,
35
38
  viewMode
36
39
  }),
37
- remainingItemsLength: fileItems.length > 4 && index === 3 ? fileItems.length : undefined
40
+ shouldLoadImages: shouldLoadImages,
41
+ remainingItemsLength: fileItems.length > _GalleryViewer2.GALLERY_VIEWER_MAX_VISIBLE_ITEMS && index === 3 ? fileItems.length : undefined
38
42
  }))));
39
43
  };
40
44
  GalleryViewer.displayName = 'GalleryViewer';
@@ -1 +1 @@
1
- {"version":3,"file":"GalleryViewer.js","names":["_react","_interopRequireWildcard","require","_GalleryViewerItem","_interopRequireDefault","_GalleryViewer","_gallery","_gallery2","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","GalleryViewer","files","viewMode","GalleryViewMode","GRID","fileItems","ratio","useMemo","getGalleryRatio","handleOpenFiles","useCallback","file","openKnownFiles","visibleItems","slice","createElement","StyledGalleryViewer","StyledGalleryViewerItemWrapper","$ratio","$itemCount","length","$viewMode","map","index","key","getGalleryViewerKey","fileItem","onClick","getReadOnlyItemRatio","remainingItemsLength","undefined","displayName","_default","exports"],"sources":["../../../../src/components/gallery-viewer/GalleryViewer.tsx"],"sourcesContent":["import type { FileItem } from '@chayns-components/core';\nimport React, { FC, useCallback, useMemo } from 'react';\nimport GalleryViewerItem from './gallery-viewer-item/GalleryViewerItem';\nimport { StyledGalleryViewer, StyledGalleryViewerItemWrapper } from './GalleryViewer.styles';\nimport type { GalleryViewerProps } from './GalleryViewer.types';\nimport {\n getGalleryRatio,\n getGalleryViewerKey,\n getReadOnlyItemRatio,\n openKnownFiles,\n} from '../../utils/gallery';\nimport { GalleryViewMode } from '../../types/gallery';\n\nconst GalleryViewer: FC<GalleryViewerProps> = ({ files, viewMode = GalleryViewMode.GRID }) => {\n const fileItems = files ?? [];\n\n const ratio = useMemo(() => getGalleryRatio(fileItems), [fileItems]);\n\n const handleOpenFiles = useCallback(\n (file: FileItem) => {\n openKnownFiles(fileItems, file);\n },\n [fileItems],\n );\n\n const visibleItems = fileItems.slice(0, 4);\n\n return (\n <StyledGalleryViewer>\n <StyledGalleryViewerItemWrapper\n $ratio={ratio}\n $itemCount={fileItems.length}\n $viewMode={viewMode}\n >\n {visibleItems.map((file, index) => (\n <GalleryViewerItem\n key={getGalleryViewerKey(file, index)}\n fileItem={file}\n onClick={handleOpenFiles}\n ratio={getReadOnlyItemRatio({ fileItems, index, viewMode })}\n remainingItemsLength={\n fileItems.length > 4 && index === 3 ? fileItems.length : undefined\n }\n />\n ))}\n </StyledGalleryViewerItemWrapper>\n </StyledGalleryViewer>\n );\n};\n\nGalleryViewer.displayName = 'GalleryViewer';\n\nexport default GalleryViewer;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"GalleryViewer.js","names":["_react","_interopRequireWildcard","require","_GalleryViewerItem","_interopRequireDefault","_GalleryViewer","_gallery","_gallery2","_GalleryViewer2","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","EMPTY_FILE_ITEMS","GalleryViewer","files","shouldLoadImages","viewMode","GalleryViewMode","GRID","fileItems","ratio","getGalleryRatio","handleOpenFiles","useCallback","file","openKnownFiles","visibleItems","slice","GALLERY_VIEWER_MAX_VISIBLE_ITEMS","createElement","StyledGalleryViewer","StyledGalleryViewerItemWrapper","$ratio","$itemCount","length","$viewMode","map","index","key","getGalleryViewerKey","fileItem","onClick","getReadOnlyItemRatio","remainingItemsLength","undefined","displayName","_default","exports"],"sources":["../../../../src/components/gallery-viewer/GalleryViewer.tsx"],"sourcesContent":["import type { FileItem } from '@chayns-components/core';\nimport React, { FC, useCallback } from 'react';\nimport GalleryViewerItem from './gallery-viewer-item/GalleryViewerItem';\nimport { StyledGalleryViewer, StyledGalleryViewerItemWrapper } from './GalleryViewer.styles';\nimport type { GalleryViewerProps } from './GalleryViewer.types';\nimport {\n getGalleryRatio,\n getGalleryViewerKey,\n getReadOnlyItemRatio,\n openKnownFiles,\n} from '../../utils/gallery';\nimport { GalleryViewMode } from '../../types/gallery';\nimport { GALLERY_VIEWER_MAX_VISIBLE_ITEMS } from './GalleryViewer.constants';\n\nconst EMPTY_FILE_ITEMS: FileItem[] = [];\n\nconst GalleryViewer: FC<GalleryViewerProps> = ({\n files,\n shouldLoadImages = true,\n viewMode = GalleryViewMode.GRID,\n}) => {\n const fileItems = files ?? EMPTY_FILE_ITEMS;\n const ratio = getGalleryRatio(fileItems);\n\n const handleOpenFiles = useCallback(\n (file: FileItem) => {\n openKnownFiles(fileItems, file);\n },\n [fileItems],\n );\n\n const visibleItems = fileItems.slice(0, GALLERY_VIEWER_MAX_VISIBLE_ITEMS);\n\n return (\n <StyledGalleryViewer>\n <StyledGalleryViewerItemWrapper\n $ratio={ratio}\n $itemCount={fileItems.length}\n $viewMode={viewMode}\n >\n {visibleItems.map((file, index) => (\n <GalleryViewerItem\n key={getGalleryViewerKey(file, index)}\n fileItem={file}\n onClick={handleOpenFiles}\n ratio={getReadOnlyItemRatio({ fileItems, index, viewMode })}\n shouldLoadImages={shouldLoadImages}\n remainingItemsLength={\n fileItems.length > GALLERY_VIEWER_MAX_VISIBLE_ITEMS && index === 3\n ? fileItems.length\n : undefined\n }\n />\n ))}\n </StyledGalleryViewerItemWrapper>\n </StyledGalleryViewer>\n );\n};\n\nGalleryViewer.displayName = 'GalleryViewer';\n\nexport default GalleryViewer;\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"GalleryViewer.types.js","names":[],"sources":["../../../../src/components/gallery-viewer/GalleryViewer.types.ts"],"sourcesContent":["import type { FileItem } from '@chayns-components/core';\nimport type { GalleryViewMode } from '../../types/gallery';\n\n/**\n * Props for the prop-driven read-only gallery viewer.\n */\nexport interface GalleryViewerProps {\n /**\n * Provides the already known media items that should be rendered without local upload state.\n * @description\n * The viewer renders these files directly from props and does not mirror them into local component state.\n * @example\n * <GalleryViewer files={files} />\n * @optional\n */\n files?: FileItem[];\n /**\n * Defines how the media tiles are arranged in read-only mode.\n * @description\n * Use this prop to switch between the supported viewer layouts for known media.\n * @default GalleryViewMode.GRID\n * @example\n * <GalleryViewer files={files} viewMode={GalleryViewMode.SQUARE} />\n * @optional\n */\n viewMode?: GalleryViewMode;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"GalleryViewer.types.js","names":[],"sources":["../../../../src/components/gallery-viewer/GalleryViewer.types.ts"],"sourcesContent":["import type { FileItem } from '@chayns-components/core';\nimport type { GalleryViewMode } from '../../types/gallery';\n\n/**\n * Props for the prop-driven read-only gallery viewer.\n */\nexport interface GalleryViewerProps {\n /**\n * Provides the already known media items that should be rendered without local upload state.\n * @description\n * The viewer renders these files directly from props and does not mirror them into local component state.\n * @example\n * <GalleryViewer files={files} />\n * @optional\n */\n files?: FileItem[];\n /**\n * Controls whether the viewer may load the final media assets immediately.\n * @description\n * When set to `true`, the viewer renders and loads the actual images right away.\n * When set to `false`, the viewer keeps showing previews first and defers the final image load until this flag becomes `true`.\n * @default true\n * @example\n * <GalleryViewer files={files} shouldLoadImages={false} />\n * @optional\n */\n shouldLoadImages?: boolean;\n /**\n * Defines how the media tiles are arranged in read-only mode.\n * @description\n * Use this prop to switch between the supported viewer layouts for known media.\n * @default GalleryViewMode.GRID\n * @example\n * <GalleryViewer files={files} viewMode={GalleryViewMode.SQUARE} />\n * @optional\n */\n viewMode?: GalleryViewMode;\n}\n"],"mappings":"","ignoreList":[]}
@@ -4,22 +4,25 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _react = _interopRequireDefault(require("react"));
7
+ var _react = _interopRequireWildcard(require("react"));
8
8
  var _MediaContent = _interopRequireDefault(require("../../media-content/MediaContent"));
9
9
  var _GalleryViewerItem = require("./GalleryViewerItem.styles");
10
10
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
11
12
  const GalleryViewerItem = ({
12
13
  fileItem,
14
+ shouldLoadImages = true,
13
15
  ratio = 1,
14
16
  remainingItemsLength,
15
17
  onClick
16
18
  }) => /*#__PURE__*/_react.default.createElement(_GalleryViewerItem.StyledGalleryViewerItem, null, /*#__PURE__*/_react.default.createElement(_MediaContent.default, {
17
19
  file: fileItem.file,
18
20
  onClick: () => onClick(fileItem),
19
- ratio: ratio
21
+ ratio: ratio,
22
+ shouldLoadImages: shouldLoadImages
20
23
  }), remainingItemsLength && /*#__PURE__*/_react.default.createElement(_GalleryViewerItem.StyledGalleryViewerMoreItemsIndicator, {
21
24
  onClick: () => onClick(fileItem)
22
25
  }, /*#__PURE__*/_react.default.createElement("p", null, `+ ${remainingItemsLength - 3}`)));
23
26
  GalleryViewerItem.displayName = 'GalleryViewerItem';
24
- var _default = exports.default = GalleryViewerItem;
27
+ var _default = exports.default = /*#__PURE__*/(0, _react.memo)(GalleryViewerItem);
25
28
  //# sourceMappingURL=GalleryViewerItem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GalleryViewerItem.js","names":["_react","_interopRequireDefault","require","_MediaContent","_GalleryViewerItem","e","__esModule","default","GalleryViewerItem","fileItem","ratio","remainingItemsLength","onClick","createElement","StyledGalleryViewerItem","file","StyledGalleryViewerMoreItemsIndicator","displayName","_default","exports"],"sources":["../../../../../src/components/gallery-viewer/gallery-viewer-item/GalleryViewerItem.tsx"],"sourcesContent":["import React, { FC } from 'react';\nimport MediaContent from '../../media-content/MediaContent';\nimport {\n StyledGalleryViewerItem,\n StyledGalleryViewerMoreItemsIndicator,\n} from './GalleryViewerItem.styles';\nimport type { GalleryViewerItemProps } from './GalleryViewerItem.types';\n\nconst GalleryViewerItem: FC<GalleryViewerItemProps> = ({\n fileItem,\n ratio = 1,\n remainingItemsLength,\n onClick,\n}) => (\n <StyledGalleryViewerItem>\n <MediaContent file={fileItem.file} onClick={() => onClick(fileItem)} ratio={ratio} />\n {remainingItemsLength && (\n <StyledGalleryViewerMoreItemsIndicator onClick={() => onClick(fileItem)}>\n <p>{`+ ${remainingItemsLength - 3}`}</p>\n </StyledGalleryViewerMoreItemsIndicator>\n )}\n </StyledGalleryViewerItem>\n);\n\nGalleryViewerItem.displayName = 'GalleryViewerItem';\n\nexport default GalleryViewerItem;\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,kBAAA,GAAAF,OAAA;AAGoC,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGpC,MAAMG,iBAA6C,GAAGA,CAAC;EACnDC,QAAQ;EACRC,KAAK,GAAG,CAAC;EACTC,oBAAoB;EACpBC;AACJ,CAAC,kBACGZ,MAAA,CAAAO,OAAA,CAAAM,aAAA,CAACT,kBAAA,CAAAU,uBAAuB,qBACpBd,MAAA,CAAAO,OAAA,CAAAM,aAAA,CAACV,aAAA,CAAAI,OAAY;EAACQ,IAAI,EAAEN,QAAQ,CAACM,IAAK;EAACH,OAAO,EAAEA,CAAA,KAAMA,OAAO,CAACH,QAAQ,CAAE;EAACC,KAAK,EAAEA;AAAM,CAAE,CAAC,EACpFC,oBAAoB,iBACjBX,MAAA,CAAAO,OAAA,CAAAM,aAAA,CAACT,kBAAA,CAAAY,qCAAqC;EAACJ,OAAO,EAAEA,CAAA,KAAMA,OAAO,CAACH,QAAQ;AAAE,gBACpET,MAAA,CAAAO,OAAA,CAAAM,aAAA,YAAI,KAAKF,oBAAoB,GAAG,CAAC,EAAM,CACJ,CAEtB,CAC5B;AAEDH,iBAAiB,CAACS,WAAW,GAAG,mBAAmB;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAZ,OAAA,GAErCC,iBAAiB","ignoreList":[]}
1
+ {"version":3,"file":"GalleryViewerItem.js","names":["_react","_interopRequireWildcard","require","_MediaContent","_interopRequireDefault","_GalleryViewerItem","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","GalleryViewerItem","fileItem","shouldLoadImages","ratio","remainingItemsLength","onClick","createElement","StyledGalleryViewerItem","file","StyledGalleryViewerMoreItemsIndicator","displayName","_default","exports","memo"],"sources":["../../../../../src/components/gallery-viewer/gallery-viewer-item/GalleryViewerItem.tsx"],"sourcesContent":["import React, { FC, memo } from 'react';\nimport MediaContent from '../../media-content/MediaContent';\nimport {\n StyledGalleryViewerItem,\n StyledGalleryViewerMoreItemsIndicator,\n} from './GalleryViewerItem.styles';\nimport type { GalleryViewerItemProps } from './GalleryViewerItem.types';\n\nconst GalleryViewerItem: FC<GalleryViewerItemProps> = ({\n fileItem,\n shouldLoadImages = true,\n ratio = 1,\n remainingItemsLength,\n onClick,\n}) => (\n <StyledGalleryViewerItem>\n <MediaContent\n file={fileItem.file}\n onClick={() => onClick(fileItem)}\n ratio={ratio}\n shouldLoadImages={shouldLoadImages}\n />\n {remainingItemsLength && (\n <StyledGalleryViewerMoreItemsIndicator onClick={() => onClick(fileItem)}>\n <p>{`+ ${remainingItemsLength - 3}`}</p>\n </StyledGalleryViewerMoreItemsIndicator>\n )}\n </StyledGalleryViewerItem>\n);\n\nGalleryViewerItem.displayName = 'GalleryViewerItem';\n\nexport default memo(GalleryViewerItem);\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,kBAAA,GAAAH,OAAA;AAGoC,SAAAE,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAL,wBAAAK,CAAA,EAAAG,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAT,uBAAA,YAAAA,CAAAK,CAAA,EAAAG,CAAA,SAAAA,CAAA,IAAAH,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAO,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAR,OAAA,EAAAF,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAS,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAI,GAAA,CAAAX,CAAA,UAAAO,CAAA,CAAAK,GAAA,CAAAZ,CAAA,GAAAO,CAAA,CAAAM,GAAA,CAAAb,CAAA,EAAAS,CAAA,gBAAAN,CAAA,IAAAH,CAAA,gBAAAG,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAG,CAAA,OAAAK,CAAA,IAAAD,CAAA,GAAAS,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAG,CAAA,OAAAK,CAAA,CAAAI,GAAA,IAAAJ,CAAA,CAAAK,GAAA,IAAAN,CAAA,CAAAE,CAAA,EAAAN,CAAA,EAAAK,CAAA,IAAAC,CAAA,CAAAN,CAAA,IAAAH,CAAA,CAAAG,CAAA,WAAAM,CAAA,KAAAT,CAAA,EAAAG,CAAA;AAGpC,MAAMgB,iBAA6C,GAAGA,CAAC;EACnDC,QAAQ;EACRC,gBAAgB,GAAG,IAAI;EACvBC,KAAK,GAAG,CAAC;EACTC,oBAAoB;EACpBC;AACJ,CAAC,kBACG9B,MAAA,CAAAQ,OAAA,CAAAuB,aAAA,CAAC1B,kBAAA,CAAA2B,uBAAuB,qBACpBhC,MAAA,CAAAQ,OAAA,CAAAuB,aAAA,CAAC5B,aAAA,CAAAK,OAAY;EACTyB,IAAI,EAAEP,QAAQ,CAACO,IAAK;EACpBH,OAAO,EAAEA,CAAA,KAAMA,OAAO,CAACJ,QAAQ,CAAE;EACjCE,KAAK,EAAEA,KAAM;EACbD,gBAAgB,EAAEA;AAAiB,CACtC,CAAC,EACDE,oBAAoB,iBACjB7B,MAAA,CAAAQ,OAAA,CAAAuB,aAAA,CAAC1B,kBAAA,CAAA6B,qCAAqC;EAACJ,OAAO,EAAEA,CAAA,KAAMA,OAAO,CAACJ,QAAQ;AAAE,gBACpE1B,MAAA,CAAAQ,OAAA,CAAAuB,aAAA,YAAI,KAAKF,oBAAoB,GAAG,CAAC,EAAM,CACJ,CAEtB,CAC5B;AAEDJ,iBAAiB,CAACU,WAAW,GAAG,mBAAmB;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAA7B,OAAA,gBAErC,IAAA8B,WAAI,EAACb,iBAAiB,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"GalleryViewerItem.types.js","names":[],"sources":["../../../../../src/components/gallery-viewer/gallery-viewer-item/GalleryViewerItem.types.ts"],"sourcesContent":["import type { FileItem } from '@chayns-components/core';\n\n/**\n * Props for a dedicated read-only gallery tile.\n */\nexport interface GalleryViewerItemProps {\n /**\n * Provides the uploaded media that should be rendered.\n * @description\n * The viewer item renders only already known media and never deals with upload-specific transient state.\n * @example\n * <GalleryViewerItem fileItem={file} onClick={handleOpen} />\n */\n fileItem: FileItem;\n /**\n * Defines the aspect ratio that should be reserved for the tile.\n * @description\n * Use this prop to reserve a deterministic tile height for stable read-only rendering.\n * @default 1\n * @example\n * <GalleryViewerItem fileItem={file} onClick={handleOpen} ratio={1.5} />\n * @optional\n */\n ratio?: number;\n /**\n * Provides the total item count when the last visible tile should show a remaining-items overlay.\n * @description\n * When this prop is set on the last visible viewer tile, the tile displays the `+n` overlay for hidden items.\n * @example\n * <GalleryViewerItem fileItem={file} onClick={handleOpen} remainingItemsLength={5} />\n * @optional\n */\n remainingItemsLength?: number;\n /**\n * Is called when the tile is selected.\n * @description\n * The viewer uses this callback to open the selected file inside the slideshow flow.\n * @example\n * <GalleryViewerItem fileItem={file} onClick={handleOpen} />\n */\n onClick: (file: FileItem) => void;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"GalleryViewerItem.types.js","names":[],"sources":["../../../../../src/components/gallery-viewer/gallery-viewer-item/GalleryViewerItem.types.ts"],"sourcesContent":["import type { FileItem } from '@chayns-components/core';\n\n/**\n * Props for a dedicated read-only gallery tile.\n */\nexport interface GalleryViewerItemProps {\n /**\n * Provides the uploaded media that should be rendered.\n * @description\n * The viewer item renders only already known media and never deals with upload-specific transient state.\n * @example\n * <GalleryViewerItem fileItem={file} onClick={handleOpen} />\n */\n fileItem: FileItem;\n /**\n * Controls whether the item may load the final media source immediately.\n * @description\n * The item forwards this flag to the shared media renderer so preview-first rendering can be controlled by the parent gallery.\n * @default true\n * @optional\n */\n shouldLoadImages?: boolean;\n /**\n * Defines the aspect ratio that should be reserved for the tile.\n * @description\n * Use this prop to reserve a deterministic tile height for stable read-only rendering.\n * @default 1\n * @example\n * <GalleryViewerItem fileItem={file} onClick={handleOpen} ratio={1.5} />\n * @optional\n */\n ratio?: number;\n /**\n * Provides the total item count when the last visible tile should show a remaining-items overlay.\n * @description\n * When this prop is set on the last visible viewer tile, the tile displays the `+n` overlay for hidden items.\n * @example\n * <GalleryViewerItem fileItem={file} onClick={handleOpen} remainingItemsLength={5} />\n * @optional\n */\n remainingItemsLength?: number;\n /**\n * Is called when the tile is selected.\n * @description\n * The viewer uses this callback to open the selected file inside the slideshow flow.\n * @example\n * <GalleryViewerItem fileItem={file} onClick={handleOpen} />\n */\n onClick: (file: FileItem) => void;\n}\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.MEDIA_CONTENT_PREVIEW_SCALE = exports.MEDIA_CONTENT_PREVIEW_BLUR = exports.MEDIA_CONTENT_IMAGE_FADE_DURATION_MS = exports.MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS = exports.MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS = void 0;
7
+ const MEDIA_CONTENT_IMAGE_FADE_DURATION_MS = exports.MEDIA_CONTENT_IMAGE_FADE_DURATION_MS = 200;
8
+ const MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS = exports.MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS = 100;
9
+ const MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS = exports.MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS = 200;
10
+ const MEDIA_CONTENT_PREVIEW_BLUR = exports.MEDIA_CONTENT_PREVIEW_BLUR = 'blur(16px)';
11
+ const MEDIA_CONTENT_PREVIEW_SCALE = exports.MEDIA_CONTENT_PREVIEW_SCALE = 1.05;
12
+ //# sourceMappingURL=MediaContent.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaContent.constants.js","names":["MEDIA_CONTENT_IMAGE_FADE_DURATION_MS","exports","MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS","MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS","MEDIA_CONTENT_PREVIEW_BLUR","MEDIA_CONTENT_PREVIEW_SCALE"],"sources":["../../../../src/components/media-content/MediaContent.constants.ts"],"sourcesContent":["export const MEDIA_CONTENT_IMAGE_FADE_DURATION_MS = 200;\nexport const MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS = 100;\nexport const MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS = 200;\nexport const MEDIA_CONTENT_PREVIEW_BLUR = 'blur(16px)';\nexport const MEDIA_CONTENT_PREVIEW_SCALE = 1.05;\n"],"mappings":";;;;;;AAAO,MAAMA,oCAAoC,GAAAC,OAAA,CAAAD,oCAAA,GAAG,GAAG;AAChD,MAAME,wCAAwC,GAAAD,OAAA,CAAAC,wCAAA,GAAG,GAAG;AACpD,MAAMC,2CAA2C,GAAAF,OAAA,CAAAE,2CAAA,GAAG,GAAG;AACvD,MAAMC,0BAA0B,GAAAH,OAAA,CAAAG,0BAAA,GAAG,YAAY;AAC/C,MAAMC,2BAA2B,GAAAJ,OAAA,CAAAI,2BAAA,GAAG,IAAI","ignoreList":[]}
@@ -5,32 +5,107 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _core = require("@chayns-components/core");
8
- var _react = _interopRequireDefault(require("react"));
8
+ var _react = _interopRequireWildcard(require("react"));
9
9
  var _MediaContent = require("./MediaContent.styles");
10
+ var _MediaContent2 = require("./MediaContent.utils");
11
+ var _MediaContent3 = require("./MediaContent.constants");
12
+ var _useMediaContentSize = _interopRequireDefault(require("./useMediaContentSize"));
10
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
11
15
  const MediaContent = ({
12
16
  file,
17
+ previewUrl,
13
18
  ratio,
14
19
  onClick,
20
+ shouldLoadImages = true,
15
21
  playIconSize = 50
16
- }) => 'thumbnailUrl' in file ? /*#__PURE__*/_react.default.createElement(_MediaContent.StyledMediaContentVideoWrapper, {
17
- onClick: onClick,
18
- $ratio: ratio
19
- }, /*#__PURE__*/_react.default.createElement(_MediaContent.StyledMediaContentPlayIcon, null, /*#__PURE__*/_react.default.createElement(_core.Icon, {
20
- size: playIconSize,
21
- icons: ['fa fa-play']
22
- })), /*#__PURE__*/_react.default.createElement(_MediaContent.StyledMediaContentVideo, {
23
- poster: file.thumbnailUrl
24
- }, /*#__PURE__*/_react.default.createElement("source", {
25
- src: file.url,
26
- type: "video/mp4"
27
- }))) : /*#__PURE__*/_react.default.createElement(_MediaContent.StyledMediaContentImageWrapper, {
28
- onClick: onClick,
29
- $ratio: ratio
30
- }, /*#__PURE__*/_react.default.createElement(_MediaContent.StyledMediaContentImage, {
31
- draggable: false,
32
- src: file.url
33
- }));
22
+ }) => {
23
+ const isVideo = (0, _MediaContent2.isVideoFile)(file);
24
+ const sourceKey = (0, _MediaContent2.getMediaSourceUrl)(file);
25
+ const previewSourceUrl = (0, _MediaContent2.getMediaPreviewUrl)(file, previewUrl);
26
+ const [hasLoadedFinalMedia, setHasLoadedFinalMedia] = (0, _react.useState)(false);
27
+ const imageRef = (0, _react.useRef)(null);
28
+ const videoRef = (0, _react.useRef)(null);
29
+ const [containerElement, setContainerElement] = (0, _react.useState)(null);
30
+ const renderSize = (0, _useMediaContentSize.default)(containerElement);
31
+ const devicePixelRatio = typeof window !== 'undefined' && Number.isFinite(window.devicePixelRatio) && window.devicePixelRatio > 0 ? window.devicePixelRatio : 1;
32
+ const finalSourceUrl = (0, _react.useMemo)(() => isVideo ? sourceKey : (0, _MediaContent2.getResponsiveImageServiceUrl)(sourceKey, renderSize, devicePixelRatio), [devicePixelRatio, isVideo, renderSize, sourceKey]);
33
+ const displayPreviewUrl = (0, _react.useMemo)(() => previewSourceUrl ? (0, _MediaContent2.getResponsiveImageServiceUrl)(previewSourceUrl, renderSize, devicePixelRatio) : undefined, [devicePixelRatio, previewSourceUrl, renderSize]);
34
+ (0, _react.useLayoutEffect)(() => {
35
+ setHasLoadedFinalMedia(false);
36
+ }, [sourceKey]);
37
+ (0, _react.useLayoutEffect)(() => {
38
+ var _imageRef$current, _videoRef$current;
39
+ if (!shouldLoadImages) {
40
+ return;
41
+ }
42
+ if (!isVideo && (_imageRef$current = imageRef.current) !== null && _imageRef$current !== void 0 && _imageRef$current.complete && imageRef.current.naturalWidth > 0) {
43
+ setHasLoadedFinalMedia(true);
44
+ }
45
+ if (isVideo && (_videoRef$current = videoRef.current) !== null && _videoRef$current !== void 0 && _videoRef$current.readyState && videoRef.current.readyState >= 2) {
46
+ setHasLoadedFinalMedia(true);
47
+ }
48
+ }, [finalSourceUrl, isVideo, shouldLoadImages]);
49
+ const shouldRenderFinalImage = shouldLoadImages && Boolean(finalSourceUrl);
50
+ const shouldShowPreview = Boolean(displayPreviewUrl);
51
+ if (isVideo) {
52
+ return /*#__PURE__*/_react.default.createElement(_MediaContent.StyledMediaContentVideoWrapper, {
53
+ ref: setContainerElement,
54
+ onClick: onClick,
55
+ $ratio: ratio
56
+ }, displayPreviewUrl && /*#__PURE__*/_react.default.createElement(_MediaContent.StyledMediaContentPreviewImage, {
57
+ draggable: false,
58
+ src: displayPreviewUrl,
59
+ alt: "",
60
+ "aria-hidden": "true",
61
+ style: {
62
+ opacity: shouldLoadImages && hasLoadedFinalMedia ? 0 : 1
63
+ }
64
+ }), /*#__PURE__*/_react.default.createElement(_MediaContent.StyledMediaContentPlayIcon, null, /*#__PURE__*/_react.default.createElement(_core.Icon, {
65
+ size: playIconSize,
66
+ icons: ['fa fa-play']
67
+ })), shouldRenderFinalImage && /*#__PURE__*/_react.default.createElement(_MediaContent.StyledMediaContentVideo, {
68
+ ref: videoRef,
69
+ poster: displayPreviewUrl,
70
+ preload: "metadata",
71
+ onLoadedData: () => setHasLoadedFinalMedia(true),
72
+ style: {
73
+ filter: displayPreviewUrl && !hasLoadedFinalMedia ? _MediaContent3.MEDIA_CONTENT_PREVIEW_BLUR : 'none',
74
+ transform: displayPreviewUrl && !hasLoadedFinalMedia ? `scale(${_MediaContent3.MEDIA_CONTENT_PREVIEW_SCALE})` : 'none',
75
+ opacity: hasLoadedFinalMedia || !displayPreviewUrl ? 1 : 0,
76
+ transition: `opacity ${_MediaContent3.MEDIA_CONTENT_IMAGE_FADE_DURATION_MS}ms ease, filter ${_MediaContent3.MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS}ms ease ${_MediaContent3.MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS}ms, transform ${_MediaContent3.MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS}ms ease ${_MediaContent3.MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS}ms`
77
+ }
78
+ }, /*#__PURE__*/_react.default.createElement("source", {
79
+ src: finalSourceUrl,
80
+ type: "video/mp4"
81
+ })));
82
+ }
83
+ return /*#__PURE__*/_react.default.createElement(_MediaContent.StyledMediaContentImageWrapper, {
84
+ ref: setContainerElement,
85
+ onClick: onClick,
86
+ $ratio: ratio
87
+ }, shouldShowPreview && /*#__PURE__*/_react.default.createElement(_MediaContent.StyledMediaContentPreviewImage, {
88
+ draggable: false,
89
+ src: displayPreviewUrl,
90
+ alt: "",
91
+ "aria-hidden": "true",
92
+ style: {
93
+ opacity: shouldLoadImages && hasLoadedFinalMedia ? 0 : 1
94
+ }
95
+ }), shouldRenderFinalImage && /*#__PURE__*/_react.default.createElement(_MediaContent.StyledMediaContentImage, {
96
+ ref: imageRef,
97
+ draggable: false,
98
+ src: finalSourceUrl,
99
+ alt: "",
100
+ onLoad: () => setHasLoadedFinalMedia(true),
101
+ style: {
102
+ filter: displayPreviewUrl && !hasLoadedFinalMedia ? _MediaContent3.MEDIA_CONTENT_PREVIEW_BLUR : 'none',
103
+ transform: displayPreviewUrl && !hasLoadedFinalMedia ? `scale(${_MediaContent3.MEDIA_CONTENT_PREVIEW_SCALE})` : 'none',
104
+ opacity: hasLoadedFinalMedia || !displayPreviewUrl ? 1 : 0,
105
+ transition: `opacity ${_MediaContent3.MEDIA_CONTENT_IMAGE_FADE_DURATION_MS}ms ease, filter ${_MediaContent3.MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS}ms ease ${_MediaContent3.MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS}ms, transform ${_MediaContent3.MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS}ms ease ${_MediaContent3.MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS}ms`
106
+ }
107
+ }));
108
+ };
34
109
  MediaContent.displayName = 'MediaContent';
35
- var _default = exports.default = MediaContent;
110
+ var _default = exports.default = /*#__PURE__*/(0, _react.memo)(MediaContent);
36
111
  //# sourceMappingURL=MediaContent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MediaContent.js","names":["_core","require","_react","_interopRequireDefault","_MediaContent","e","__esModule","default","MediaContent","file","ratio","onClick","playIconSize","createElement","StyledMediaContentVideoWrapper","$ratio","StyledMediaContentPlayIcon","Icon","size","icons","StyledMediaContentVideo","poster","thumbnailUrl","src","url","type","StyledMediaContentImageWrapper","StyledMediaContentImage","draggable","displayName","_default","exports"],"sources":["../../../../src/components/media-content/MediaContent.tsx"],"sourcesContent":["import { Icon } from '@chayns-components/core';\nimport React, { FC } from 'react';\nimport {\n StyledMediaContentImage,\n StyledMediaContentImageWrapper,\n StyledMediaContentPlayIcon,\n StyledMediaContentVideo,\n StyledMediaContentVideoWrapper,\n} from './MediaContent.styles';\nimport type { MediaContentProps } from './MediaContent.types';\n\nconst MediaContent: FC<MediaContentProps> = ({ file, ratio, onClick, playIconSize = 50 }) =>\n 'thumbnailUrl' in file ? (\n <StyledMediaContentVideoWrapper onClick={onClick} $ratio={ratio}>\n <StyledMediaContentPlayIcon>\n <Icon size={playIconSize} icons={['fa fa-play']} />\n </StyledMediaContentPlayIcon>\n <StyledMediaContentVideo poster={file.thumbnailUrl}>\n <source src={file.url} type=\"video/mp4\" />\n </StyledMediaContentVideo>\n </StyledMediaContentVideoWrapper>\n ) : (\n <StyledMediaContentImageWrapper onClick={onClick} $ratio={ratio}>\n <StyledMediaContentImage draggable={false} src={file.url} />\n </StyledMediaContentImageWrapper>\n );\n\nMediaContent.displayName = 'MediaContent';\n\nexport default MediaContent;\n"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,aAAA,GAAAH,OAAA;AAM+B,SAAAE,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAG/B,MAAMG,YAAmC,GAAGA,CAAC;EAAEC,IAAI;EAAEC,KAAK;EAAEC,OAAO;EAAEC,YAAY,GAAG;AAAG,CAAC,KACpF,cAAc,IAAIH,IAAI,gBAClBP,MAAA,CAAAK,OAAA,CAAAM,aAAA,CAACT,aAAA,CAAAU,8BAA8B;EAACH,OAAO,EAAEA,OAAQ;EAACI,MAAM,EAAEL;AAAM,gBAC5DR,MAAA,CAAAK,OAAA,CAAAM,aAAA,CAACT,aAAA,CAAAY,0BAA0B,qBACvBd,MAAA,CAAAK,OAAA,CAAAM,aAAA,CAACb,KAAA,CAAAiB,IAAI;EAACC,IAAI,EAAEN,YAAa;EAACO,KAAK,EAAE,CAAC,YAAY;AAAE,CAAE,CAC1B,CAAC,eAC7BjB,MAAA,CAAAK,OAAA,CAAAM,aAAA,CAACT,aAAA,CAAAgB,uBAAuB;EAACC,MAAM,EAAEZ,IAAI,CAACa;AAAa,gBAC/CpB,MAAA,CAAAK,OAAA,CAAAM,aAAA;EAAQU,GAAG,EAAEd,IAAI,CAACe,GAAI;EAACC,IAAI,EAAC;AAAW,CAAE,CACpB,CACG,CAAC,gBAEjCvB,MAAA,CAAAK,OAAA,CAAAM,aAAA,CAACT,aAAA,CAAAsB,8BAA8B;EAACf,OAAO,EAAEA,OAAQ;EAACI,MAAM,EAAEL;AAAM,gBAC5DR,MAAA,CAAAK,OAAA,CAAAM,aAAA,CAACT,aAAA,CAAAuB,uBAAuB;EAACC,SAAS,EAAE,KAAM;EAACL,GAAG,EAAEd,IAAI,CAACe;AAAI,CAAE,CAC/B,CACnC;AAELhB,YAAY,CAACqB,WAAW,GAAG,cAAc;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAxB,OAAA,GAE3BC,YAAY","ignoreList":[]}
1
+ {"version":3,"file":"MediaContent.js","names":["_core","require","_react","_interopRequireWildcard","_MediaContent","_MediaContent2","_MediaContent3","_useMediaContentSize","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","MediaContent","file","previewUrl","ratio","onClick","shouldLoadImages","playIconSize","isVideo","isVideoFile","sourceKey","getMediaSourceUrl","previewSourceUrl","getMediaPreviewUrl","hasLoadedFinalMedia","setHasLoadedFinalMedia","useState","imageRef","useRef","videoRef","containerElement","setContainerElement","renderSize","useMediaContentSize","devicePixelRatio","window","Number","isFinite","finalSourceUrl","useMemo","getResponsiveImageServiceUrl","displayPreviewUrl","undefined","useLayoutEffect","_imageRef$current","_videoRef$current","current","complete","naturalWidth","readyState","shouldRenderFinalImage","Boolean","shouldShowPreview","createElement","StyledMediaContentVideoWrapper","ref","$ratio","StyledMediaContentPreviewImage","draggable","src","alt","style","opacity","StyledMediaContentPlayIcon","Icon","size","icons","StyledMediaContentVideo","poster","preload","onLoadedData","filter","MEDIA_CONTENT_PREVIEW_BLUR","transform","MEDIA_CONTENT_PREVIEW_SCALE","transition","MEDIA_CONTENT_IMAGE_FADE_DURATION_MS","MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS","MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS","type","StyledMediaContentImageWrapper","StyledMediaContentImage","onLoad","displayName","_default","exports","memo"],"sources":["../../../../src/components/media-content/MediaContent.tsx"],"sourcesContent":["import { Icon } from '@chayns-components/core';\nimport React, { FC, memo, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport {\n StyledMediaContentImage,\n StyledMediaContentImageWrapper,\n StyledMediaContentPlayIcon,\n StyledMediaContentPreviewImage,\n StyledMediaContentVideo,\n StyledMediaContentVideoWrapper,\n} from './MediaContent.styles';\nimport type { MediaContentProps } from './MediaContent.types';\nimport {\n getMediaPreviewUrl,\n getMediaSourceUrl,\n getResponsiveImageServiceUrl,\n isVideoFile,\n} from './MediaContent.utils';\nimport {\n MEDIA_CONTENT_IMAGE_FADE_DURATION_MS,\n MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS,\n MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS,\n MEDIA_CONTENT_PREVIEW_BLUR,\n MEDIA_CONTENT_PREVIEW_SCALE,\n} from './MediaContent.constants';\nimport useMediaContentSize from './useMediaContentSize';\n\nconst MediaContent: FC<MediaContentProps> = ({\n file,\n previewUrl,\n ratio,\n onClick,\n shouldLoadImages = true,\n playIconSize = 50,\n}) => {\n const isVideo = isVideoFile(file);\n const sourceKey = getMediaSourceUrl(file);\n const previewSourceUrl = getMediaPreviewUrl(file, previewUrl);\n const [hasLoadedFinalMedia, setHasLoadedFinalMedia] = useState(false);\n const imageRef = useRef<HTMLImageElement>(null);\n const videoRef = useRef<HTMLVideoElement>(null);\n const [containerElement, setContainerElement] = useState<HTMLDivElement | null>(null);\n const renderSize = useMediaContentSize(containerElement);\n const devicePixelRatio =\n typeof window !== 'undefined' &&\n Number.isFinite(window.devicePixelRatio) &&\n window.devicePixelRatio > 0\n ? window.devicePixelRatio\n : 1;\n\n const finalSourceUrl = useMemo(\n () =>\n isVideo\n ? sourceKey\n : getResponsiveImageServiceUrl(sourceKey, renderSize, devicePixelRatio),\n [devicePixelRatio, isVideo, renderSize, sourceKey],\n );\n const displayPreviewUrl = useMemo(\n () =>\n previewSourceUrl\n ? getResponsiveImageServiceUrl(previewSourceUrl, renderSize, devicePixelRatio)\n : undefined,\n [devicePixelRatio, previewSourceUrl, renderSize],\n );\n\n useLayoutEffect(() => {\n setHasLoadedFinalMedia(false);\n }, [sourceKey]);\n\n useLayoutEffect(() => {\n if (!shouldLoadImages) {\n return;\n }\n\n if (!isVideo && imageRef.current?.complete && imageRef.current.naturalWidth > 0) {\n setHasLoadedFinalMedia(true);\n }\n\n if (isVideo && videoRef.current?.readyState && videoRef.current.readyState >= 2) {\n setHasLoadedFinalMedia(true);\n }\n }, [finalSourceUrl, isVideo, shouldLoadImages]);\n\n const shouldRenderFinalImage = shouldLoadImages && Boolean(finalSourceUrl);\n const shouldShowPreview = Boolean(displayPreviewUrl);\n\n if (isVideo) {\n return (\n <StyledMediaContentVideoWrapper\n ref={setContainerElement}\n onClick={onClick}\n $ratio={ratio}\n >\n {displayPreviewUrl && (\n <StyledMediaContentPreviewImage\n draggable={false}\n src={displayPreviewUrl}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n opacity: shouldLoadImages && hasLoadedFinalMedia ? 0 : 1,\n }}\n />\n )}\n <StyledMediaContentPlayIcon>\n <Icon size={playIconSize} icons={['fa fa-play']} />\n </StyledMediaContentPlayIcon>\n {shouldRenderFinalImage && (\n <StyledMediaContentVideo\n ref={videoRef}\n poster={displayPreviewUrl}\n preload=\"metadata\"\n onLoadedData={() => setHasLoadedFinalMedia(true)}\n style={{\n filter:\n displayPreviewUrl && !hasLoadedFinalMedia\n ? MEDIA_CONTENT_PREVIEW_BLUR\n : 'none',\n transform:\n displayPreviewUrl && !hasLoadedFinalMedia\n ? `scale(${MEDIA_CONTENT_PREVIEW_SCALE})`\n : 'none',\n opacity: hasLoadedFinalMedia || !displayPreviewUrl ? 1 : 0,\n transition: `opacity ${MEDIA_CONTENT_IMAGE_FADE_DURATION_MS}ms ease, filter ${MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS}ms ease ${MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS}ms, transform ${MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS}ms ease ${MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS}ms`,\n }}\n >\n <source src={finalSourceUrl} type=\"video/mp4\" />\n </StyledMediaContentVideo>\n )}\n </StyledMediaContentVideoWrapper>\n );\n }\n\n return (\n <StyledMediaContentImageWrapper ref={setContainerElement} onClick={onClick} $ratio={ratio}>\n {shouldShowPreview && (\n <StyledMediaContentPreviewImage\n draggable={false}\n src={displayPreviewUrl}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n opacity: shouldLoadImages && hasLoadedFinalMedia ? 0 : 1,\n }}\n />\n )}\n {shouldRenderFinalImage && (\n <StyledMediaContentImage\n ref={imageRef}\n draggable={false}\n src={finalSourceUrl}\n alt=\"\"\n onLoad={() => setHasLoadedFinalMedia(true)}\n style={{\n filter:\n displayPreviewUrl && !hasLoadedFinalMedia\n ? MEDIA_CONTENT_PREVIEW_BLUR\n : 'none',\n transform:\n displayPreviewUrl && !hasLoadedFinalMedia\n ? `scale(${MEDIA_CONTENT_PREVIEW_SCALE})`\n : 'none',\n opacity: hasLoadedFinalMedia || !displayPreviewUrl ? 1 : 0,\n transition: `opacity ${MEDIA_CONTENT_IMAGE_FADE_DURATION_MS}ms ease, filter ${MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS}ms ease ${MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS}ms, transform ${MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DURATION_MS}ms ease ${MEDIA_CONTENT_IMAGE_BLUR_REMOVE_DELAY_MS}ms`,\n }}\n />\n )}\n </StyledMediaContentImageWrapper>\n );\n};\n\nMediaContent.displayName = 'MediaContent';\n\nexport default memo(MediaContent);\n"],"mappings":"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","ignoreList":[]}
@@ -3,11 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.StyledMediaContentVideoWrapper = exports.StyledMediaContentVideo = exports.StyledMediaContentPlayIcon = exports.StyledMediaContentImageWrapper = exports.StyledMediaContentImage = void 0;
6
+ exports.StyledMediaContentVideoWrapper = exports.StyledMediaContentVideo = exports.StyledMediaContentPreviewImage = exports.StyledMediaContentPlayIcon = exports.StyledMediaContentImageWrapper = exports.StyledMediaContentImage = void 0;
7
7
  var _styledComponents = _interopRequireDefault(require("styled-components"));
8
+ var _MediaContent = require("./MediaContent.constants");
8
9
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
10
  const StyledMediaContentVideoWrapper = exports.StyledMediaContentVideoWrapper = _styledComponents.default.div`
10
11
  display: flex;
12
+ position: relative;
13
+ overflow: hidden;
11
14
  width: 100%;
12
15
  height: 100%;
13
16
  aspect-ratio: ${({
@@ -16,13 +19,23 @@ const StyledMediaContentVideoWrapper = exports.StyledMediaContentVideoWrapper =
16
19
  `;
17
20
  const StyledMediaContentImageWrapper = exports.StyledMediaContentImageWrapper = _styledComponents.default.div`
18
21
  display: flex;
22
+ position: relative;
23
+ overflow: hidden;
19
24
  width: 100%;
20
25
  height: 100%;
21
26
  aspect-ratio: ${({
22
27
  $ratio
23
28
  }) => $ratio};
24
29
  `;
25
- const StyledMediaContentImage = exports.StyledMediaContentImage = _styledComponents.default.img`
30
+ const StyledMediaContentLayer = _styledComponents.default.img`
31
+ position: absolute;
32
+ inset: 0;
33
+ width: 100%;
34
+ height: 100%;
35
+ object-fit: cover;
36
+ pointer-events: none;
37
+ `;
38
+ const StyledMediaContentPreviewImage = exports.StyledMediaContentPreviewImage = (0, _styledComponents.default)(StyledMediaContentLayer)`
26
39
  background-color: ${({
27
40
  theme
28
41
  }) => theme['101']};
@@ -31,9 +44,22 @@ const StyledMediaContentImage = exports.StyledMediaContentImage = _styledCompone
31
44
  theme
32
45
  }) => theme['009-rgb']}, 0.08) inset;
33
46
  z-index: 1;
34
- width: 100%;
35
- height: 100%;
36
- object-fit: cover;
47
+ filter: ${_MediaContent.MEDIA_CONTENT_PREVIEW_BLUR};
48
+ transform: scale(${_MediaContent.MEDIA_CONTENT_PREVIEW_SCALE});
49
+ transition:
50
+ opacity ${_MediaContent.MEDIA_CONTENT_IMAGE_FADE_DURATION_MS}ms ease,
51
+ filter ${_MediaContent.MEDIA_CONTENT_IMAGE_FADE_DURATION_MS}ms ease;
52
+ `;
53
+ const StyledMediaContentImage = exports.StyledMediaContentImage = (0, _styledComponents.default)(StyledMediaContentLayer)`
54
+ background-color: ${({
55
+ theme
56
+ }) => theme['101']};
57
+ box-shadow: 0 0 0 1px
58
+ rgba(${({
59
+ theme
60
+ }) => theme['009-rgb']}, 0.08) inset;
61
+ z-index: 2;
62
+ transition: opacity ${_MediaContent.MEDIA_CONTENT_IMAGE_FADE_DURATION_MS}ms ease;
37
63
  `;
38
64
  const StyledMediaContentVideo = exports.StyledMediaContentVideo = _styledComponents.default.video`
39
65
  background-color: ${({
@@ -43,8 +69,12 @@ const StyledMediaContentVideo = exports.StyledMediaContentVideo = _styledCompone
43
69
  rgba(${({
44
70
  theme
45
71
  }) => theme['009-rgb']}, 0.08) inset;
72
+ position: absolute;
73
+ inset: 0;
46
74
  width: 100%;
75
+ height: 100%;
47
76
  object-fit: cover;
77
+ pointer-events: none;
48
78
  `;
49
79
  const StyledMediaContentPlayIcon = exports.StyledMediaContentPlayIcon = _styledComponents.default.div`
50
80
  position: absolute;