@solidxai/core-ui 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.js +51 -27
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.tsx +85 -22
- package/dist/components/core/common/SolidImageViewer.d.ts +10 -0
- package/dist/components/core/common/SolidImageViewer.d.ts.map +1 -0
- package/dist/components/core/common/SolidImageViewer.js +59 -0
- package/dist/components/core/common/SolidImageViewer.js.map +1 -0
- package/dist/components/core/common/SolidImageViewer.tsx +84 -0
- package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.d.ts.map +1 -1
- package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.js +80 -79
- package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.js.map +1 -1
- package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.tsx +92 -85
- package/dist/components/core/list/SolidListView.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +6 -4
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +6 -4
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +16 -17
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +46 -44
- package/dist/components/core/list/columns/SolidMediaSingleColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidMediaSingleColumn.js +6 -4
- package/dist/components/core/list/columns/SolidMediaSingleColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidMediaSingleColumn.tsx +7 -5
- package/dist/helpers/fetchS3Url.d.ts +19 -0
- package/dist/helpers/fetchS3Url.d.ts.map +1 -0
- package/dist/helpers/fetchS3Url.js +60 -0
- package/dist/helpers/fetchS3Url.js.map +1 -0
- package/dist/helpers/fetchS3Url.ts +33 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/index.ts +8 -1
- package/dist/routes/pages/admin/core/ListPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/ListPage.js +8 -3
- package/dist/routes/pages/admin/core/ListPage.js.map +1 -1
- package/dist/routes/pages/admin/core/ListPage.tsx +10 -3
- package/package.json +1 -1
|
@@ -703,8 +703,10 @@ export const SolidListView = forwardRef<SolidListViewHandle, SolidListViewParams
|
|
|
703
703
|
setToPopulateMedia(populateMedia);
|
|
704
704
|
setFirst(0);
|
|
705
705
|
}
|
|
706
|
+
//below line was added to handle state stale issue when we converted boilerplate to vite
|
|
707
|
+
//since now we dont need it becuase our component is remounted on every router change
|
|
706
708
|
setFilters(params.customFilter || { $and: [] })
|
|
707
|
-
setFilterPredicates(null);
|
|
709
|
+
//setFilterPredicates(null);
|
|
708
710
|
setSelectedRecords([]);
|
|
709
711
|
setSelectedRecoverRecords([]);
|
|
710
712
|
setQueryDataLoaded(true);
|
|
@@ -787,7 +789,7 @@ export const SolidListView = forwardRef<SolidListViewHandle, SolidListViewParams
|
|
|
787
789
|
|
|
788
790
|
|
|
789
791
|
useEffect(() => {
|
|
790
|
-
console.log(`useEffect: [first- ${first}, rows- ${rows}, sortField- ${sortField}, sortOrder- ${sortOrder}, showArchived- ${showArchived}, toPopulate- ${toPopulate}, toPopulateMedia- ${toPopulateMedia}, queryDataLoaded- ${queryDataLoaded}]`);
|
|
792
|
+
console.log(`useEffect: [first- ${first}, rows- ${rows}, sortField- ${sortField}, sortOrder- ${sortOrder}, showArchived- ${showArchived}, toPopulate- ${toPopulate}, toPopulateMedia- ${toPopulateMedia}, queryDataLoaded- ${queryDataLoaded}, filterPredicates- ${filterPredicates}]`);
|
|
791
793
|
if (queryDataLoaded && filters && (filterPredicates || params.embeded == true)) {
|
|
792
794
|
setQueryString();
|
|
793
795
|
}
|
|
@@ -800,7 +802,8 @@ export const SolidListView = forwardRef<SolidListViewHandle, SolidListViewParams
|
|
|
800
802
|
showArchived,
|
|
801
803
|
toPopulate,
|
|
802
804
|
toPopulateMedia,
|
|
803
|
-
queryDataLoaded
|
|
805
|
+
queryDataLoaded,
|
|
806
|
+
filterPredicates
|
|
804
807
|
]);
|
|
805
808
|
|
|
806
809
|
// Handle pagination event.
|
|
@@ -946,7 +949,6 @@ export const SolidListView = forwardRef<SolidListViewHandle, SolidListViewParams
|
|
|
946
949
|
|
|
947
950
|
// Then update state
|
|
948
951
|
setFilters(updatedFilter);
|
|
949
|
-
setPersistFilter(persistFilter);
|
|
950
952
|
setFilterPredicates(updatedFilterPredicates);
|
|
951
953
|
// Force synchronous state updates
|
|
952
954
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidMediaMultipleColumn.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/list/columns/SolidMediaMultipleColumn.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"SolidMediaMultipleColumn.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/list/columns/SolidMediaMultipleColumn.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAuG9E,QAAA,MAAM,wBAAwB,uFAAwF,yBAAyB,4CAyC9I,CAAC;AAEF,eAAe,wBAAwB,CAAC;AAGxC,eAAO,MAAM,8BAA8B,iEAAkE,8BAA8B,mDAoJ1I,CAAC"}
|
|
@@ -17,10 +17,15 @@ import { getExtensionComponent } from '../../../../helpers/registry';
|
|
|
17
17
|
import { classNames } from 'primereact/utils';
|
|
18
18
|
import { FileReaderExt } from '../../../../components/common/FileReaderExt';
|
|
19
19
|
import { Dialog } from 'primereact/dialog';
|
|
20
|
-
|
|
21
|
-
var isImageFile = function (url) { return /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(url); };
|
|
22
|
-
var isVideoFile = function (url) { return /\.(mp4|webm|ogg)$/i.test(url); };
|
|
23
|
-
var isAudioFile = function (url) { return /\.(mp3|wav|ogg)$/i.test(url); };
|
|
20
|
+
var getCleanUrl = function (url) { return url.split("?")[0]; };
|
|
21
|
+
var isImageFile = function (url) { return /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(getCleanUrl(url)); };
|
|
22
|
+
var isVideoFile = function (url) { return /\.(mp4|webm|ogg)$/i.test(getCleanUrl(url)); };
|
|
23
|
+
var isAudioFile = function (url) { return /\.(mp3|wav|ogg)$/i.test(getCleanUrl(url)); };
|
|
24
|
+
var isDocumentType = function (url) {
|
|
25
|
+
var _a;
|
|
26
|
+
var ext = (_a = getCleanUrl(url).split(".").pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
|
|
27
|
+
return ext ? downloadOnlyExt.includes(ext) : false;
|
|
28
|
+
};
|
|
24
29
|
var downloadOnlyExt = [
|
|
25
30
|
"txt", "zip", "rar",
|
|
26
31
|
"doc", "docx",
|
|
@@ -28,11 +33,6 @@ var downloadOnlyExt = [
|
|
|
28
33
|
"ppt", "pptx",
|
|
29
34
|
"pdf", "csv"
|
|
30
35
|
];
|
|
31
|
-
var isDocumentType = function (url) {
|
|
32
|
-
var _a;
|
|
33
|
-
var ext = (_a = url.split("?")[0].split(".").pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
|
|
34
|
-
return ext ? downloadOnlyExt.includes(ext) : false;
|
|
35
|
-
};
|
|
36
36
|
var downloadFile = function (url, name) {
|
|
37
37
|
if (name === void 0) { name = ""; }
|
|
38
38
|
var link = document.createElement("a");
|
|
@@ -107,11 +107,10 @@ export var DefaultMediaMultipleListWidget = function (_a) {
|
|
|
107
107
|
return size >= 1024 * 1024 ? "".concat((size / (1024 * 1024)).toFixed(1), " MB") : "".concat((size / 1024).toFixed(1), " KB");
|
|
108
108
|
};
|
|
109
109
|
var handleFileView = function (file) {
|
|
110
|
-
var _a;
|
|
111
110
|
var fileUrl = (file === null || file === void 0 ? void 0 : file.fileUrl) || "";
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
if (
|
|
111
|
+
// const cleanUrl = fileUrl.split("?")[0];
|
|
112
|
+
// const ext = cleanUrl.split(".").pop()?.toLowerCase();
|
|
113
|
+
if (isDocumentType(fileUrl)) {
|
|
115
114
|
downloadFile(file === null || file === void 0 ? void 0 : file.fileUrl, "");
|
|
116
115
|
}
|
|
117
116
|
else {
|
|
@@ -122,13 +121,13 @@ export var DefaultMediaMultipleListWidget = function (_a) {
|
|
|
122
121
|
return fullrecord.length > 0 ? (_jsxs("div", { className: 'flex gap-2 align-items-end', children: [_jsx(MediaPreview, { src: (_d = fullrecord[0]) === null || _d === void 0 ? void 0 : _d.fileUrl, onClick: function (event) {
|
|
123
122
|
var _a, _b, _c;
|
|
124
123
|
event.stopPropagation();
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (
|
|
124
|
+
// const cleanUrl = fullrecord[0]?.fileUrl.split("?")[0];
|
|
125
|
+
// const ext = cleanUrl.split(".").pop()?.toLowerCase();
|
|
126
|
+
if (isDocumentType((_a = fullrecord[0]) === null || _a === void 0 ? void 0 : _a.fileUrl) && (fullrecord === null || fullrecord === void 0 ? void 0 : fullrecord.length) > 1) {
|
|
128
127
|
setShowAllFiles(true);
|
|
129
128
|
return;
|
|
130
129
|
}
|
|
131
|
-
else if (
|
|
130
|
+
else if (isDocumentType((_b = fullrecord[0]) === null || _b === void 0 ? void 0 : _b.fileUrl)) {
|
|
132
131
|
downloadFile((_c = fullrecord[0]) === null || _c === void 0 ? void 0 : _c.fileUrl, "");
|
|
133
132
|
return;
|
|
134
133
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidMediaMultipleColumn.js","sourceRoot":"","sources":["../../../../../src/components/core/list/columns/SolidMediaMultipleColumn.tsx"],"names":[],"mappings":"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","sourcesContent":["\nimport React, { useState } from 'react';\nimport { Column } from \"primereact/column\";\nimport { SolidListViewColumnParams } from '../SolidListViewColumn';\nimport { Button } from 'primereact/button';\nimport { SolidMediaListFieldWidgetProps } from '../../../../types/solid-core';\nimport { getExtensionComponent } from '../../../../helpers/registry';\nimport { classNames } from 'primereact/utils';\nimport { FileReaderExt } from '../../../../components/common/FileReaderExt';\nimport { Dialog } from 'primereact/dialog';\n\n// Helpers\nconst isImageFile = (url: string) => /\\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(url);\nconst isVideoFile = (url: string) => /\\.(mp4|webm|ogg)$/i.test(url);\nconst isAudioFile = (url: string) => /\\.(mp3|wav|ogg)$/i.test(url);\n\nconst downloadOnlyExt = [\n \"txt\", \"zip\", \"rar\",\n \"doc\", \"docx\",\n \"xls\", \"xlsx\",\n \"ppt\", \"pptx\",\n \"pdf\", \"csv\"\n];\n\nconst isDocumentType = (url: string) => {\n const ext = url.split(\"?\")[0].split(\".\").pop()?.toLowerCase();\n return ext ? downloadOnlyExt.includes(ext) : false;\n};\n\nconst downloadFile = (url: string, name: string = \"\") => {\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = name;\n link.target = \"_blank\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\n\n\n// Thumbnail preview component\nconst MediaPreview = ({ src, onClick }: { src: string; onClick: (event: React.MouseEvent) => void }) => {\n const [isBroken, setIsBroken] = useState(false);\n\n const handleClick = (event: React.MouseEvent) => {\n onClick(event);\n };\n\n if (!isBroken) {\n if (isImageFile(src)) {\n return (\n <img\n src={src}\n alt=\"media\"\n className=\"shadow-2 border-round\"\n width={40}\n height={40}\n style={{ objectFit: \"cover\" }}\n onError={() => setIsBroken(true)}\n onClick={handleClick}\n />\n );\n }\n\n if (isVideoFile(src)) {\n return (\n <video\n src={src}\n width={40}\n height={40}\n className=\"shadow-2 border-round\"\n style={{ objectFit: \"cover\" }}\n onError={() => setIsBroken(true)}\n onClick={handleClick}\n muted\n />\n );\n }\n\n if (isAudioFile(src)) {\n return (\n <div\n className=\"shadow-2 border-round flex align-items-center justify-content-center bg-gray-100\"\n style={{ width: 40, height: 40 }}\n onClick={handleClick}\n >\n <i className=\"pi pi-volume-up text-xl text-gray-600\"></i>\n </div>\n );\n }\n }\n\n return (\n <div\n style={{ width: 40, height: 40, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}\n onClick={handleClick}\n >\n <i className={classNames(\"pi pi-file\", \"text-3xl text-gray-400\")}></i>\n </div>\n );\n};\n\n\n// Column Component\nconst SolidMediaMultipleColumn = ({ solidListViewMetaData, fieldMetadata, column, setLightboxUrls, setOpenLightbox }: SolidListViewColumnParams) => {\n const filterable = false;\n const showFilterOperator = false;\n const columnDataType = undefined;\n const header = column.attrs.label ?? fieldMetadata.displayName;\n\n return (\n <Column\n key={fieldMetadata.name}\n field={fieldMetadata.name}\n header={header}\n body={(rowData) => {\n let viewWidget = column.attrs.viewWidget;\n if (!viewWidget) {\n viewWidget = 'DefaultMediaMultipleListWidget';\n }\n let DynamicWidget = getExtensionComponent(viewWidget);\n const widgetProps: SolidMediaListFieldWidgetProps = {\n rowData,\n solidListViewMetaData,\n fieldMetadata,\n column,\n setLightboxUrls,\n setOpenLightbox\n }\n return (\n <>\n {\n DynamicWidget && <DynamicWidget {...widgetProps} />\n }\n </>\n )\n }}\n sortable={column.attrs.sortable}\n dataType={columnDataType}\n showFilterOperator={showFilterOperator}\n filterPlaceholder={`Search by ${fieldMetadata.displayName}`}\n style={{ minWidth: \"12rem\" }}\n headerClassName=\"table-header-fs\"\n />\n );\n};\n\nexport default SolidMediaMultipleColumn;\n\n// Default multiple widget\nexport const DefaultMediaMultipleListWidget = ({ rowData, fieldMetadata, setLightboxUrls, setOpenLightbox }: SolidMediaListFieldWidgetProps) => {\n const [isShowAllFiles, setShowAllFiles] = useState(false);\n\n if (!rowData?._media?.[fieldMetadata.name]) return null;\n\n const fullrecord = rowData._media[fieldMetadata.name]?.map((file: any) => ({\n name: file.originalFileName,\n type: file.mimeType,\n size: file.fileSize,\n id: file.id,\n fileUrl: file._full_url\n }));\n\n\n const formatFileSize = (size: number) =>\n size >= 1024 * 1024 ? `${(size / (1024 * 1024)).toFixed(1)} MB` : `${(size / 1024).toFixed(1)} KB`;\n\n\n const handleFileView = (file: any) => {\n const fileUrl = file?.fileUrl || \"\";\n const cleanUrl = fileUrl.split(\"?\")[0];\n const ext = cleanUrl.split(\".\").pop()?.toLowerCase();\n\n if (ext && downloadOnlyExt.includes(ext)) {\n downloadFile(file?.fileUrl, \"\")\n\n } else {\n setLightboxUrls?.([{ src: file.fileUrl, downloadUrl: file.fileUrl }]);\n setOpenLightbox?.(true);\n }\n };\n\n\n\n return fullrecord.length > 0 ? (\n <div className='flex gap-2 align-items-end'>\n\n {/* THUMBNAIL - FIXED BEHAVIOR */}\n <MediaPreview\n src={fullrecord[0]?.fileUrl}\n onClick={(event) => {\n event.stopPropagation();\n\n const cleanUrl = fullrecord[0]?.fileUrl.split(\"?\")[0];\n const ext = cleanUrl.split(\".\").pop()?.toLowerCase();\n\n if (ext && downloadOnlyExt.includes(ext) && fullrecord?.length > 1) {\n setShowAllFiles(true)\n return;\n }\n\n else if (ext && downloadOnlyExt.includes(ext)) {\n downloadFile(fullrecord[0]?.fileUrl, \"\")\n return;\n }\n\n // FIRST FILE IS MEDIA ⇒ OPEN LIGHTBOX\n const urlsWithType = fullrecord.map((file: any) => ({\n src: file.fileUrl,\n downloadUrl: file.fileUrl,\n }));\n setLightboxUrls(urlsWithType);\n setOpenLightbox(true);\n }}\n />\n\n {fullrecord?.length > 1 && <span\n style={{\n color: \"#0895CD\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n marginLeft: \"4px\"\n }}\n onClick={(event) => {\n event.stopPropagation();\n \n if (isDocumentType(fullrecord[0]?.fileUrl)) {\n setShowAllFiles(true);\n } else {\n const urlsWithType = fullrecord.map((file: any) => ({\n src: file.fileUrl,\n downloadUrl: file.fileUrl\n }));\n setLightboxUrls(urlsWithType);\n setOpenLightbox(true);\n }\n }}\n >\n +{fullrecord.length - 1}\n </span>\n }\n\n \n\n {/* VIEW ALL DIALOG */}\n <Dialog\n visible={isShowAllFiles}\n header=\"Items Uploaded\"\n modal\n onHide={() => setShowAllFiles(false)}\n // style={{ minWidth: 450 }}\n style={{ width: '32rem' }}\n onClick={(event) => event.stopPropagation()}\n breakpoints={{ '591px': '94vw'}}\n >\n {fullrecord?.map((file: any) => {\n const fileId = `${file.name}-${file.size}`;\n return (\n <div key={fileId} className=\"solid-file-upload-wrapper mb-3\">\n <div className=\"flex align-items-center gap-2\">\n\n <FileReaderExt fileDetails={file} />\n\n <div className=\"w-full flex flex-column gap-1\">\n <div className=\"flex align-items-center justify-content-between\">\n\n <p\n className=\"font-normal w-11 text-primary m-0\"\n style={{ cursor: \"pointer\" }}\n onClick={() => handleFileView(file)}\n >\n {file?.name}\n </p>\n\n <Button\n type=\"button\"\n text\n icon=\"pi pi-download\"\n size=\"small\"\n onClick={() => {\n downloadFile(file?.fileUrl, \"\")\n }}\n style={{ height: 16, width: 16 }}\n />\n </div>\n\n <div className=\"text-sm\">{formatFileSize(file.size)}</div>\n </div>\n\n </div>\n </div>\n )\n }\n )}\n </Dialog>\n </div>\n ) : (\n <div style={{ height: 40, width: 40 }} />\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"SolidMediaMultipleColumn.js","sourceRoot":"","sources":["../../../../../src/components/core/list/columns/SolidMediaMultipleColumn.tsx"],"names":[],"mappings":"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","sourcesContent":["\nimport React, { useState } from 'react';\nimport { Column } from \"primereact/column\";\nimport { SolidListViewColumnParams } from '../SolidListViewColumn';\nimport { Button } from 'primereact/button';\nimport { SolidMediaListFieldWidgetProps } from '../../../../types/solid-core';\nimport { getExtensionComponent } from '../../../../helpers/registry';\nimport { classNames } from 'primereact/utils';\nimport { FileReaderExt } from '../../../../components/common/FileReaderExt';\nimport { Dialog } from 'primereact/dialog';\n\nconst getCleanUrl = (url: string) => url.split(\"?\")[0];\n\nconst isImageFile = (url: string) => /\\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(getCleanUrl(url));\n\nconst isVideoFile = (url: string) => /\\.(mp4|webm|ogg)$/i.test(getCleanUrl(url));\n\nconst isAudioFile = (url: string) => /\\.(mp3|wav|ogg)$/i.test(getCleanUrl(url));\n\nconst isDocumentType = (url: string) => {\n const ext = getCleanUrl(url).split(\".\").pop()?.toLowerCase();\n return ext ? downloadOnlyExt.includes(ext) : false;\n};\n\nconst downloadOnlyExt = [\n \"txt\", \"zip\", \"rar\",\n \"doc\", \"docx\",\n \"xls\", \"xlsx\",\n \"ppt\", \"pptx\",\n \"pdf\", \"csv\"\n];\n\nconst downloadFile = (url: string, name: string = \"\") => {\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = name;\n link.target = \"_blank\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\n\n\n// Thumbnail preview component\nconst MediaPreview = ({ src, onClick }: { src: string; onClick: (event: React.MouseEvent) => void }) => {\n const [isBroken, setIsBroken] = useState(false);\n\n const handleClick = (event: React.MouseEvent) => {\n onClick(event);\n };\n\n if (!isBroken) {\n if (isImageFile(src)) {\n return (\n <img\n src={src}\n alt=\"media\"\n className=\"shadow-2 border-round\"\n width={40}\n height={40}\n style={{ objectFit: \"cover\" }}\n onError={() => setIsBroken(true)}\n onClick={handleClick}\n />\n );\n }\n\n if (isVideoFile(src)) {\n return (\n <video\n src={src}\n width={40}\n height={40}\n className=\"shadow-2 border-round\"\n style={{ objectFit: \"cover\" }}\n onError={() => setIsBroken(true)}\n onClick={handleClick}\n muted\n />\n );\n }\n\n if (isAudioFile(src)) {\n return (\n <div\n className=\"shadow-2 border-round flex align-items-center justify-content-center bg-gray-100\"\n style={{ width: 40, height: 40 }}\n onClick={handleClick}\n >\n <i className=\"pi pi-volume-up text-xl text-gray-600\"></i>\n </div>\n );\n }\n }\n\n return (\n <div\n style={{ width: 40, height: 40, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}\n onClick={handleClick}\n >\n <i className={classNames(\"pi pi-file\", \"text-3xl text-gray-400\")}></i>\n </div>\n );\n};\n\n\n// Column Component\nconst SolidMediaMultipleColumn = ({ solidListViewMetaData, fieldMetadata, column, setLightboxUrls, setOpenLightbox }: SolidListViewColumnParams) => {\n const filterable = false;\n const showFilterOperator = false;\n const columnDataType = undefined;\n const header = column.attrs.label ?? fieldMetadata.displayName;\n\n return (\n <Column\n key={fieldMetadata.name}\n field={fieldMetadata.name}\n header={header}\n body={(rowData) => {\n let viewWidget = column.attrs.viewWidget;\n if (!viewWidget) {\n viewWidget = 'DefaultMediaMultipleListWidget';\n }\n let DynamicWidget = getExtensionComponent(viewWidget);\n const widgetProps: SolidMediaListFieldWidgetProps = {\n rowData,\n solidListViewMetaData,\n fieldMetadata,\n column,\n setLightboxUrls,\n setOpenLightbox\n }\n return (\n <>\n {\n DynamicWidget && <DynamicWidget {...widgetProps} />\n }\n </>\n )\n }}\n sortable={column.attrs.sortable}\n dataType={columnDataType}\n showFilterOperator={showFilterOperator}\n filterPlaceholder={`Search by ${fieldMetadata.displayName}`}\n style={{ minWidth: \"12rem\" }}\n headerClassName=\"table-header-fs\"\n />\n );\n};\n\nexport default SolidMediaMultipleColumn;\n\n// Default multiple widget\nexport const DefaultMediaMultipleListWidget = ({ rowData, fieldMetadata, setLightboxUrls, setOpenLightbox }: SolidMediaListFieldWidgetProps) => {\n const [isShowAllFiles, setShowAllFiles] = useState(false);\n\n if (!rowData?._media?.[fieldMetadata.name]) return null;\n\n const fullrecord = rowData._media[fieldMetadata.name]?.map((file: any) => ({\n name: file.originalFileName,\n type: file.mimeType,\n size: file.fileSize,\n id: file.id,\n fileUrl: file._full_url\n }));\n\n\n const formatFileSize = (size: number) =>\n size >= 1024 * 1024 ? `${(size / (1024 * 1024)).toFixed(1)} MB` : `${(size / 1024).toFixed(1)} KB`;\n\n\n const handleFileView = (file: any) => {\n const fileUrl = file?.fileUrl || \"\";\n // const cleanUrl = fileUrl.split(\"?\")[0];\n // const ext = cleanUrl.split(\".\").pop()?.toLowerCase();\n\n if (isDocumentType(fileUrl)) {\n downloadFile(file?.fileUrl, \"\")\n\n } else {\n setLightboxUrls?.([{ src: file.fileUrl, downloadUrl: file.fileUrl }]);\n setOpenLightbox?.(true);\n }\n };\n\n\n\n return fullrecord.length > 0 ? (\n <div className='flex gap-2 align-items-end'>\n\n {/* THUMBNAIL - FIXED BEHAVIOR */}\n <MediaPreview\n src={fullrecord[0]?.fileUrl}\n onClick={(event) => {\n event.stopPropagation();\n\n // const cleanUrl = fullrecord[0]?.fileUrl.split(\"?\")[0];\n // const ext = cleanUrl.split(\".\").pop()?.toLowerCase();\n\n if (isDocumentType(fullrecord[0]?.fileUrl) && fullrecord?.length > 1) {\n setShowAllFiles(true)\n return;\n }\n\n else if (isDocumentType(fullrecord[0]?.fileUrl)) {\n downloadFile(fullrecord[0]?.fileUrl, \"\")\n return;\n }\n // FIRST FILE IS MEDIA ⇒ OPEN LIGHTBOX\n const urlsWithType = fullrecord.map((file: any) => ({\n src: file.fileUrl,\n downloadUrl: file.fileUrl,\n }));\n setLightboxUrls(urlsWithType);\n setOpenLightbox(true);\n }}\n />\n\n {fullrecord?.length > 1 && <span\n style={{\n color: \"#0895CD\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n marginLeft: \"4px\"\n }}\n onClick={(event) => {\n event.stopPropagation();\n\n if (isDocumentType(fullrecord[0]?.fileUrl)) {\n setShowAllFiles(true);\n } else {\n const urlsWithType = fullrecord.map((file: any) => ({\n src: file.fileUrl,\n downloadUrl: file.fileUrl\n }));\n setLightboxUrls(urlsWithType);\n setOpenLightbox(true);\n }\n }}\n >\n +{fullrecord.length - 1}\n </span>\n }\n\n\n\n {/* VIEW ALL DIALOG */}\n <Dialog\n visible={isShowAllFiles}\n header=\"Items Uploaded\"\n modal\n onHide={() => setShowAllFiles(false)}\n // style={{ minWidth: 450 }}\n style={{ width: '32rem' }}\n onClick={(event) => event.stopPropagation()}\n breakpoints={{ '591px': '94vw' }}\n >\n {fullrecord?.map((file: any) => {\n const fileId = `${file.name}-${file.size}`;\n return (\n <div key={fileId} className=\"solid-file-upload-wrapper mb-3\">\n <div className=\"flex align-items-center gap-2\">\n\n <FileReaderExt fileDetails={file} />\n\n <div className=\"w-full flex flex-column gap-1\">\n <div className=\"flex align-items-center justify-content-between\">\n\n <p\n className=\"font-normal w-11 text-primary m-0\"\n style={{ cursor: \"pointer\" }}\n onClick={() => handleFileView(file)}\n >\n {file?.name}\n </p>\n\n <Button\n type=\"button\"\n text\n icon=\"pi pi-download\"\n size=\"small\"\n onClick={() => {\n downloadFile(file?.fileUrl, \"\")\n }}\n style={{ height: 16, width: 16 }}\n />\n </div>\n\n <div className=\"text-sm\">{formatFileSize(file.size)}</div>\n </div>\n\n </div>\n </div>\n )\n }\n )}\n </Dialog>\n </div>\n ) : (\n <div style={{ height: 40, width: 40 }} />\n );\n};\n"]}
|
|
@@ -9,10 +9,18 @@ import { classNames } from 'primereact/utils';
|
|
|
9
9
|
import { FileReaderExt } from '../../../../components/common/FileReaderExt';
|
|
10
10
|
import { Dialog } from 'primereact/dialog';
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
|
|
12
|
+
const getCleanUrl = (url: string) => url.split("?")[0];
|
|
13
|
+
|
|
14
|
+
const isImageFile = (url: string) => /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(getCleanUrl(url));
|
|
15
|
+
|
|
16
|
+
const isVideoFile = (url: string) => /\.(mp4|webm|ogg)$/i.test(getCleanUrl(url));
|
|
17
|
+
|
|
18
|
+
const isAudioFile = (url: string) => /\.(mp3|wav|ogg)$/i.test(getCleanUrl(url));
|
|
19
|
+
|
|
20
|
+
const isDocumentType = (url: string) => {
|
|
21
|
+
const ext = getCleanUrl(url).split(".").pop()?.toLowerCase();
|
|
22
|
+
return ext ? downloadOnlyExt.includes(ext) : false;
|
|
23
|
+
};
|
|
16
24
|
|
|
17
25
|
const downloadOnlyExt = [
|
|
18
26
|
"txt", "zip", "rar",
|
|
@@ -22,11 +30,6 @@ const downloadOnlyExt = [
|
|
|
22
30
|
"pdf", "csv"
|
|
23
31
|
];
|
|
24
32
|
|
|
25
|
-
const isDocumentType = (url: string) => {
|
|
26
|
-
const ext = url.split("?")[0].split(".").pop()?.toLowerCase();
|
|
27
|
-
return ext ? downloadOnlyExt.includes(ext) : false;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
33
|
const downloadFile = (url: string, name: string = "") => {
|
|
31
34
|
const link = document.createElement("a");
|
|
32
35
|
link.href = url;
|
|
@@ -169,10 +172,10 @@ export const DefaultMediaMultipleListWidget = ({ rowData, fieldMetadata, setLigh
|
|
|
169
172
|
|
|
170
173
|
const handleFileView = (file: any) => {
|
|
171
174
|
const fileUrl = file?.fileUrl || "";
|
|
172
|
-
const cleanUrl = fileUrl.split("?")[0];
|
|
173
|
-
const ext = cleanUrl.split(".").pop()?.toLowerCase();
|
|
175
|
+
// const cleanUrl = fileUrl.split("?")[0];
|
|
176
|
+
// const ext = cleanUrl.split(".").pop()?.toLowerCase();
|
|
174
177
|
|
|
175
|
-
if (
|
|
178
|
+
if (isDocumentType(fileUrl)) {
|
|
176
179
|
downloadFile(file?.fileUrl, "")
|
|
177
180
|
|
|
178
181
|
} else {
|
|
@@ -192,19 +195,18 @@ export const DefaultMediaMultipleListWidget = ({ rowData, fieldMetadata, setLigh
|
|
|
192
195
|
onClick={(event) => {
|
|
193
196
|
event.stopPropagation();
|
|
194
197
|
|
|
195
|
-
const cleanUrl = fullrecord[0]?.fileUrl.split("?")[0];
|
|
196
|
-
const ext = cleanUrl.split(".").pop()?.toLowerCase();
|
|
198
|
+
// const cleanUrl = fullrecord[0]?.fileUrl.split("?")[0];
|
|
199
|
+
// const ext = cleanUrl.split(".").pop()?.toLowerCase();
|
|
197
200
|
|
|
198
|
-
if (
|
|
201
|
+
if (isDocumentType(fullrecord[0]?.fileUrl) && fullrecord?.length > 1) {
|
|
199
202
|
setShowAllFiles(true)
|
|
200
203
|
return;
|
|
201
204
|
}
|
|
202
205
|
|
|
203
|
-
else if (
|
|
206
|
+
else if (isDocumentType(fullrecord[0]?.fileUrl)) {
|
|
204
207
|
downloadFile(fullrecord[0]?.fileUrl, "")
|
|
205
208
|
return;
|
|
206
209
|
}
|
|
207
|
-
|
|
208
210
|
// FIRST FILE IS MEDIA ⇒ OPEN LIGHTBOX
|
|
209
211
|
const urlsWithType = fullrecord.map((file: any) => ({
|
|
210
212
|
src: file.fileUrl,
|
|
@@ -215,33 +217,33 @@ export const DefaultMediaMultipleListWidget = ({ rowData, fieldMetadata, setLigh
|
|
|
215
217
|
}}
|
|
216
218
|
/>
|
|
217
219
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
220
|
+
{fullrecord?.length > 1 && <span
|
|
221
|
+
style={{
|
|
222
|
+
color: "#0895CD",
|
|
223
|
+
fontWeight: "bold",
|
|
224
|
+
cursor: "pointer",
|
|
225
|
+
marginLeft: "4px"
|
|
226
|
+
}}
|
|
227
|
+
onClick={(event) => {
|
|
228
|
+
event.stopPropagation();
|
|
229
|
+
|
|
230
|
+
if (isDocumentType(fullrecord[0]?.fileUrl)) {
|
|
231
|
+
setShowAllFiles(true);
|
|
232
|
+
} else {
|
|
233
|
+
const urlsWithType = fullrecord.map((file: any) => ({
|
|
234
|
+
src: file.fileUrl,
|
|
235
|
+
downloadUrl: file.fileUrl
|
|
236
|
+
}));
|
|
237
|
+
setLightboxUrls(urlsWithType);
|
|
238
|
+
setOpenLightbox(true);
|
|
239
|
+
}
|
|
240
|
+
}}
|
|
241
|
+
>
|
|
242
|
+
+{fullrecord.length - 1}
|
|
243
|
+
</span>
|
|
244
|
+
}
|
|
245
|
+
|
|
243
246
|
|
|
244
|
-
|
|
245
247
|
|
|
246
248
|
{/* VIEW ALL DIALOG */}
|
|
247
249
|
<Dialog
|
|
@@ -252,7 +254,7 @@ export const DefaultMediaMultipleListWidget = ({ rowData, fieldMetadata, setLigh
|
|
|
252
254
|
// style={{ minWidth: 450 }}
|
|
253
255
|
style={{ width: '32rem' }}
|
|
254
256
|
onClick={(event) => event.stopPropagation()}
|
|
255
|
-
breakpoints={{ '591px': '94vw'}}
|
|
257
|
+
breakpoints={{ '591px': '94vw' }}
|
|
256
258
|
>
|
|
257
259
|
{fullrecord?.map((file: any) => {
|
|
258
260
|
const fileId = `${file.name}-${file.size}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidMediaSingleColumn.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/list/columns/SolidMediaSingleColumn.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"SolidMediaSingleColumn.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/list/columns/SolidMediaSingleColumn.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAkG9E,QAAA,MAAM,sBAAsB,uFAAwF,yBAAyB,4CAmC5I,CAAC;AAEF,eAAe,sBAAsB,CAAC;AAGtC,eAAO,MAAM,4BAA4B,gGAOtC,8BAA8B,mDAqBhC,CAAC"}
|
|
@@ -14,10 +14,11 @@ import { useState } from 'react';
|
|
|
14
14
|
import { Column } from "primereact/column";
|
|
15
15
|
import { classNames } from 'primereact/utils';
|
|
16
16
|
import { getExtensionComponent } from '../../../../helpers/registry';
|
|
17
|
+
var getCleanUrl = function (url) { return url.split("?")[0]; };
|
|
17
18
|
// Helpers for file type detection
|
|
18
|
-
var isImageFile = function (url) { return /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(url); };
|
|
19
|
-
var isVideoFile = function (url) { return /\.(mp4|webm|ogg)$/i.test(url); };
|
|
20
|
-
var isAudioFile = function (url) { return /\.(mp3|wav|ogg)$/i.test(url); };
|
|
19
|
+
var isImageFile = function (url) { return /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(getCleanUrl(url)); };
|
|
20
|
+
var isVideoFile = function (url) { return /\.(mp4|webm|ogg)$/i.test(getCleanUrl(url)); };
|
|
21
|
+
var isAudioFile = function (url) { return /\.(mp3|wav|ogg)$/i.test(getCleanUrl(url)); };
|
|
21
22
|
// Extensions that should be downloaded directly
|
|
22
23
|
var downloadOnlyExt = [
|
|
23
24
|
"txt", "zip", "rar",
|
|
@@ -96,10 +97,11 @@ export var DefaultMediaSingleListWidget = function (_a) {
|
|
|
96
97
|
var firstUrl = mediaUrls[0];
|
|
97
98
|
if (!firstUrl)
|
|
98
99
|
return _jsx("div", { style: { height: 40, width: 40 } });
|
|
100
|
+
var cleanUrl = getCleanUrl(firstUrl);
|
|
99
101
|
return (_jsx(MediaWithFallback, { src: firstUrl, alt: "media", onClick: function (event) {
|
|
100
102
|
// Only open lightbox for image, video, or audio
|
|
101
103
|
event.stopPropagation();
|
|
102
|
-
if (isImageFile(
|
|
104
|
+
if (isImageFile(cleanUrl) || isVideoFile(cleanUrl) || isAudioFile(cleanUrl)) {
|
|
103
105
|
setLightboxUrls([{ src: firstUrl, downloadUrl: firstUrl }]);
|
|
104
106
|
setOpenLightbox(true);
|
|
105
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidMediaSingleColumn.js","sourceRoot":"","sources":["../../../../../src/components/core/list/columns/SolidMediaSingleColumn.tsx"],"names":[],"mappings":"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","sourcesContent":["\nimport React, { useState } from 'react';\nimport { Column } from \"primereact/column\";\nimport { SolidListViewColumnParams } from '../SolidListViewColumn';\nimport { classNames } from 'primereact/utils';\nimport { SolidMediaListFieldWidgetProps } from '../../../../types/solid-core';\nimport { getExtensionComponent } from '../../../../helpers/registry';\n\n// Helpers for file type detection\nconst isImageFile = (url: string) => /\\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(url);\nconst isVideoFile = (url: string) => /\\.(mp4|webm|ogg)$/i.test(url);\nconst isAudioFile = (url: string) => /\\.(mp3|wav|ogg)$/i.test(url);\n\n// Extensions that should be downloaded directly\nconst downloadOnlyExt = [\n \"txt\", \"zip\", \"rar\",\n \"doc\", \"docx\",\n \"xls\", \"xlsx\",\n \"ppt\", \"pptx\",\n \"pdf\"\n];\n\n// Media component with fallback for broken links\nconst MediaWithFallback = ({ src, alt, onClick }: { src: string; alt: string; onClick: (event: React.MouseEvent) => void }) => {\n const [isBroken, setIsBroken] = useState(false);\n\n const handleClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n const cleanUrl = src.split(\"?\")[0];\n const ext = cleanUrl.split(\".\").pop()?.toLowerCase();\n\n if (ext && downloadOnlyExt.includes(ext)) {\n // Trigger download for docs/archives\n const link = document.createElement(\"a\");\n link.href = src;\n link.download = \"\";\n link.target = \"_blank\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } else {\n onClick(event);\n }\n };\n\n if (!isBroken) {\n if (isImageFile(src)) {\n return (\n <img\n src={src}\n alt={alt}\n className=\"shadow-2 border-round\"\n width={40}\n height={40}\n style={{ objectFit: \"cover\", cursor: \"pointer\" }}\n onError={() => setIsBroken(true)}\n onClick={handleClick}\n />\n );\n }\n\n if (isVideoFile(src)) {\n return (\n <video\n src={src}\n width={40}\n height={40}\n className=\"shadow-2 border-round\"\n style={{ objectFit: \"cover\", cursor: \"pointer\" }}\n onError={() => setIsBroken(true)}\n onClick={handleClick}\n muted\n />\n );\n }\n\n if (isAudioFile(src)) {\n return (\n <div\n className=\"shadow-2 border-round flex align-items-center justify-content-center bg-gray-100\"\n style={{ width: 40, height: 40, cursor: \"pointer\" }}\n onClick={handleClick}\n >\n <i className=\"pi pi-volume-up text-xl text-gray-600\"></i>\n </div>\n );\n }\n }\n\n // fallback icon (docs/others)\n return (\n <div\n style={{ width: 40, height: 40, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", cursor: \"pointer\" }}\n onClick={handleClick}\n >\n <i className={classNames(\"pi pi-file\", \"text-3xl text-gray-400\")}></i>\n </div>\n );\n};\n\n// Main column renderer\nconst SolidMediaSingleColumn = ({ solidListViewMetaData, fieldMetadata, column, setLightboxUrls, setOpenLightbox }: SolidListViewColumnParams) => {\n const header = column.attrs.label ?? fieldMetadata.displayName;\n\n return (\n <Column\n key={fieldMetadata.name}\n field={fieldMetadata.name}\n header={header}\n body={(rowData) => {\n let viewWidget = column.attrs.viewWidget;\n if (!viewWidget) {\n viewWidget = 'DefaultMediaSingleListWidget';\n }\n let DynamicWidget = getExtensionComponent(viewWidget);\n const widgetProps: SolidMediaListFieldWidgetProps = {\n rowData,\n solidListViewMetaData,\n fieldMetadata,\n column,\n setLightboxUrls,\n setOpenLightbox\n }\n return (\n <>\n {DynamicWidget && <DynamicWidget {...widgetProps} />}\n </>\n )\n }}\n sortable={column.attrs.sortable}\n showFilterOperator={false}\n filterPlaceholder={`Search by ${fieldMetadata.displayName}`}\n style={{ minWidth: \"12rem\" }}\n headerClassName=\"table-header-fs\"\n />\n );\n};\n\nexport default SolidMediaSingleColumn;\n\n// Default widget for single media field\nexport const DefaultMediaSingleListWidget = ({\n rowData,\n solidListViewMetaData,\n fieldMetadata,\n column,\n setLightboxUrls,\n setOpenLightbox\n}: SolidMediaListFieldWidgetProps) => {\n if (!rowData?._media?.[fieldMetadata.name]) return null;\n const mediaUrls = rowData._media[fieldMetadata.name].map((i: any) => i._full_url);\n\n const firstUrl = mediaUrls[0];\n if (!firstUrl) return <div style={{ height: 40, width: 40 }} />;\n\n return (\n <MediaWithFallback\n src={firstUrl}\n alt=\"media\"\n onClick={(event) => {\n // Only open lightbox for image, video, or audio\n event.stopPropagation()\n if (isImageFile(firstUrl) || isVideoFile(firstUrl) || isAudioFile(firstUrl)) {\n setLightboxUrls([{ src: firstUrl, downloadUrl: firstUrl }]);\n setOpenLightbox(true);\n }\n }}\n />\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"SolidMediaSingleColumn.js","sourceRoot":"","sources":["../../../../../src/components/core/list/columns/SolidMediaSingleColumn.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,IAAM,WAAW,GAAG,UAAC,GAAW,IAAK,OAAA,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAjB,CAAiB,CAAC;AAEvD,kCAAkC;AAClC,IAAM,WAAW,GAAG,UAAC,GAAW,IAAK,OAAA,iCAAiC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAxD,CAAwD,CAAC;AAC9F,IAAM,WAAW,GAAG,UAAC,GAAW,IAAK,OAAA,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAA3C,CAA2C,CAAC;AACjF,IAAM,WAAW,GAAG,UAAC,GAAW,IAAK,OAAA,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAA1C,CAA0C,CAAC;AAEhF,gDAAgD;AAChD,IAAM,eAAe,GAAG;IACpB,KAAK,EAAE,KAAK,EAAE,KAAK;IACnB,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;IACb,KAAK;CACR,CAAC;AAEF,iDAAiD;AACjD,IAAM,iBAAiB,GAAG,UAAC,EAA+F;QAA7F,GAAG,SAAA,EAAE,GAAG,SAAA,EAAE,OAAO,aAAA;IACpC,IAAA,KAA0B,QAAQ,CAAC,KAAK,CAAC,EAAxC,QAAQ,QAAA,EAAE,WAAW,QAAmB,CAAC;IAEhD,IAAM,WAAW,GAAG,UAAC,KAAuB;;QACxC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,IAAM,GAAG,GAAG,MAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,0CAAE,WAAW,EAAE,CAAC;QAErD,IAAI,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACtC,qCAAqC;YACrC,IAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;YAChB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SACnC;aAAM;YACH,OAAO,CAAC,KAAK,CAAC,CAAC;SAClB;IACL,CAAC,CAAC;IAEF,IAAI,CAAC,QAAQ,EAAE;QACX,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE;YAClB,OAAO,CACH,cACI,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAChD,OAAO,EAAE,cAAM,OAAA,WAAW,CAAC,IAAI,CAAC,EAAjB,CAAiB,EAChC,OAAO,EAAE,WAAW,GACtB,CACL,CAAC;SACL;QAED,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE;YAClB,OAAO,CACH,gBACI,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAChD,OAAO,EAAE,cAAM,OAAA,WAAW,CAAC,IAAI,CAAC,EAAjB,CAAiB,EAChC,OAAO,EAAE,WAAW,EACpB,KAAK,SACP,CACL,CAAC;SACL;QAED,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE;YAClB,OAAO,CACH,cACI,SAAS,EAAC,kFAAkF,EAC5F,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EACnD,OAAO,EAAE,WAAW,YAEpB,YAAG,SAAS,EAAC,uCAAuC,GAAK,GACvD,CACT,CAAC;SACL;KACJ;IAED,8BAA8B;IAC9B,OAAO,CACH,cACI,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,EACpH,OAAO,EAAE,WAAW,YAEpB,YAAG,SAAS,EAAE,UAAU,CAAC,YAAY,EAAE,wBAAwB,CAAC,GAAM,GACpE,CACT,CAAC;AACN,CAAC,CAAC;AAEF,uBAAuB;AACvB,IAAM,sBAAsB,GAAG,UAAC,EAA6G;;QAA3G,qBAAqB,2BAAA,EAAE,aAAa,mBAAA,EAAE,MAAM,YAAA,EAAE,eAAe,qBAAA,EAAE,eAAe,qBAAA;IAC5G,IAAM,MAAM,GAAG,MAAA,MAAM,CAAC,KAAK,CAAC,KAAK,mCAAI,aAAa,CAAC,WAAW,CAAC;IAE/D,OAAO,CACH,KAAC,MAAM,IAEH,KAAK,EAAE,aAAa,CAAC,IAAI,EACzB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAC,OAAO;YACV,IAAI,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;YACzC,IAAI,CAAC,UAAU,EAAE;gBACb,UAAU,GAAG,8BAA8B,CAAC;aAC/C;YACD,IAAI,aAAa,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;YACtD,IAAM,WAAW,GAAmC;gBAChD,OAAO,SAAA;gBACP,qBAAqB,uBAAA;gBACrB,aAAa,eAAA;gBACb,MAAM,QAAA;gBACN,eAAe,iBAAA;gBACf,eAAe,iBAAA;aAClB,CAAA;YACD,OAAO,CACH,4BACK,aAAa,IAAI,KAAC,aAAa,eAAK,WAAW,EAAI,GACrD,CACN,CAAA;QACL,CAAC,EACD,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAC/B,kBAAkB,EAAE,KAAK,EACzB,iBAAiB,EAAE,oBAAa,aAAa,CAAC,WAAW,CAAE,EAC3D,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAC5B,eAAe,EAAC,iBAAiB,IA3B5B,aAAa,CAAC,IAAI,CA4BzB,CACL,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,sBAAsB,CAAC;AAEtC,wCAAwC;AACxC,MAAM,CAAC,IAAM,4BAA4B,GAAG,UAAC,EAOZ;;QAN7B,OAAO,aAAA,EACP,qBAAqB,2BAAA,EACrB,aAAa,mBAAA,EACb,MAAM,YAAA,EACN,eAAe,qBAAA,EACf,eAAe,qBAAA;IAEf,IAAI,CAAC,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAG,aAAa,CAAC,IAAI,CAAC,CAAA;QAAE,OAAO,IAAI,CAAC;IACxD,IAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAC,CAAM,IAAK,OAAA,CAAC,CAAC,SAAS,EAAX,CAAW,CAAC,CAAC;IAElF,IAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,QAAQ;QAAE,OAAO,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAI,CAAC;IAChE,IAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,CACH,KAAC,iBAAiB,IACd,GAAG,EAAE,QAAQ,EACb,GAAG,EAAC,OAAO,EACX,OAAO,EAAE,UAAC,KAAK;YACX,gDAAgD;YAChD,KAAK,CAAC,eAAe,EAAE,CAAA;YACvB,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE;gBACzE,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAC5D,eAAe,CAAC,IAAI,CAAC,CAAC;aACzB;QACL,CAAC,GACH,CACL,CAAC;AACN,CAAC,CAAC","sourcesContent":["\nimport React, { useState } from 'react';\nimport { Column } from \"primereact/column\";\nimport { SolidListViewColumnParams } from '../SolidListViewColumn';\nimport { classNames } from 'primereact/utils';\nimport { SolidMediaListFieldWidgetProps } from '../../../../types/solid-core';\nimport { getExtensionComponent } from '../../../../helpers/registry';\n\nconst getCleanUrl = (url: string) => url.split(\"?\")[0];\n\n// Helpers for file type detection\nconst isImageFile = (url: string) => /\\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(getCleanUrl(url));\nconst isVideoFile = (url: string) => /\\.(mp4|webm|ogg)$/i.test(getCleanUrl(url));\nconst isAudioFile = (url: string) => /\\.(mp3|wav|ogg)$/i.test(getCleanUrl(url));\n\n// Extensions that should be downloaded directly\nconst downloadOnlyExt = [\n \"txt\", \"zip\", \"rar\",\n \"doc\", \"docx\",\n \"xls\", \"xlsx\",\n \"ppt\", \"pptx\",\n \"pdf\"\n];\n\n// Media component with fallback for broken links\nconst MediaWithFallback = ({ src, alt, onClick }: { src: string; alt: string; onClick: (event: React.MouseEvent) => void }) => {\n const [isBroken, setIsBroken] = useState(false);\n\n const handleClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n const cleanUrl = src.split(\"?\")[0];\n const ext = cleanUrl.split(\".\").pop()?.toLowerCase();\n\n if (ext && downloadOnlyExt.includes(ext)) {\n // Trigger download for docs/archives\n const link = document.createElement(\"a\");\n link.href = src;\n link.download = \"\";\n link.target = \"_blank\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } else {\n onClick(event);\n }\n };\n\n if (!isBroken) {\n if (isImageFile(src)) {\n return (\n <img\n src={src}\n alt={alt}\n className=\"shadow-2 border-round\"\n width={40}\n height={40}\n style={{ objectFit: \"cover\", cursor: \"pointer\" }}\n onError={() => setIsBroken(true)}\n onClick={handleClick}\n />\n );\n }\n\n if (isVideoFile(src)) {\n return (\n <video\n src={src}\n width={40}\n height={40}\n className=\"shadow-2 border-round\"\n style={{ objectFit: \"cover\", cursor: \"pointer\" }}\n onError={() => setIsBroken(true)}\n onClick={handleClick}\n muted\n />\n );\n }\n\n if (isAudioFile(src)) {\n return (\n <div\n className=\"shadow-2 border-round flex align-items-center justify-content-center bg-gray-100\"\n style={{ width: 40, height: 40, cursor: \"pointer\" }}\n onClick={handleClick}\n >\n <i className=\"pi pi-volume-up text-xl text-gray-600\"></i>\n </div>\n );\n }\n }\n\n // fallback icon (docs/others)\n return (\n <div\n style={{ width: 40, height: 40, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", cursor: \"pointer\" }}\n onClick={handleClick}\n >\n <i className={classNames(\"pi pi-file\", \"text-3xl text-gray-400\")}></i>\n </div>\n );\n};\n\n// Main column renderer\nconst SolidMediaSingleColumn = ({ solidListViewMetaData, fieldMetadata, column, setLightboxUrls, setOpenLightbox }: SolidListViewColumnParams) => {\n const header = column.attrs.label ?? fieldMetadata.displayName;\n\n return (\n <Column\n key={fieldMetadata.name}\n field={fieldMetadata.name}\n header={header}\n body={(rowData) => {\n let viewWidget = column.attrs.viewWidget;\n if (!viewWidget) {\n viewWidget = 'DefaultMediaSingleListWidget';\n }\n let DynamicWidget = getExtensionComponent(viewWidget);\n const widgetProps: SolidMediaListFieldWidgetProps = {\n rowData,\n solidListViewMetaData,\n fieldMetadata,\n column,\n setLightboxUrls,\n setOpenLightbox\n }\n return (\n <>\n {DynamicWidget && <DynamicWidget {...widgetProps} />}\n </>\n )\n }}\n sortable={column.attrs.sortable}\n showFilterOperator={false}\n filterPlaceholder={`Search by ${fieldMetadata.displayName}`}\n style={{ minWidth: \"12rem\" }}\n headerClassName=\"table-header-fs\"\n />\n );\n};\n\nexport default SolidMediaSingleColumn;\n\n// Default widget for single media field\nexport const DefaultMediaSingleListWidget = ({\n rowData,\n solidListViewMetaData,\n fieldMetadata,\n column,\n setLightboxUrls,\n setOpenLightbox\n}: SolidMediaListFieldWidgetProps) => {\n if (!rowData?._media?.[fieldMetadata.name]) return null;\n const mediaUrls = rowData._media[fieldMetadata.name].map((i: any) => i._full_url);\n\n const firstUrl = mediaUrls[0];\n if (!firstUrl) return <div style={{ height: 40, width: 40 }} />;\n const cleanUrl = getCleanUrl(firstUrl);\n return (\n <MediaWithFallback\n src={firstUrl}\n alt=\"media\"\n onClick={(event) => {\n // Only open lightbox for image, video, or audio\n event.stopPropagation()\n if (isImageFile(cleanUrl) || isVideoFile(cleanUrl) || isAudioFile(cleanUrl)) {\n setLightboxUrls([{ src: firstUrl, downloadUrl: firstUrl }]);\n setOpenLightbox(true);\n }\n }}\n />\n );\n};\n"]}
|
|
@@ -6,10 +6,12 @@ import { classNames } from 'primereact/utils';
|
|
|
6
6
|
import { SolidMediaListFieldWidgetProps } from '../../../../types/solid-core';
|
|
7
7
|
import { getExtensionComponent } from '../../../../helpers/registry';
|
|
8
8
|
|
|
9
|
+
const getCleanUrl = (url: string) => url.split("?")[0];
|
|
10
|
+
|
|
9
11
|
// Helpers for file type detection
|
|
10
|
-
const isImageFile = (url: string) => /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(url);
|
|
11
|
-
const isVideoFile = (url: string) => /\.(mp4|webm|ogg)$/i.test(url);
|
|
12
|
-
const isAudioFile = (url: string) => /\.(mp3|wav|ogg)$/i.test(url);
|
|
12
|
+
const isImageFile = (url: string) => /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(getCleanUrl(url));
|
|
13
|
+
const isVideoFile = (url: string) => /\.(mp4|webm|ogg)$/i.test(getCleanUrl(url));
|
|
14
|
+
const isAudioFile = (url: string) => /\.(mp3|wav|ogg)$/i.test(getCleanUrl(url));
|
|
13
15
|
|
|
14
16
|
// Extensions that should be downloaded directly
|
|
15
17
|
const downloadOnlyExt = [
|
|
@@ -152,7 +154,7 @@ export const DefaultMediaSingleListWidget = ({
|
|
|
152
154
|
|
|
153
155
|
const firstUrl = mediaUrls[0];
|
|
154
156
|
if (!firstUrl) return <div style={{ height: 40, width: 40 }} />;
|
|
155
|
-
|
|
157
|
+
const cleanUrl = getCleanUrl(firstUrl);
|
|
156
158
|
return (
|
|
157
159
|
<MediaWithFallback
|
|
158
160
|
src={firstUrl}
|
|
@@ -160,7 +162,7 @@ export const DefaultMediaSingleListWidget = ({
|
|
|
160
162
|
onClick={(event) => {
|
|
161
163
|
// Only open lightbox for image, video, or audio
|
|
162
164
|
event.stopPropagation()
|
|
163
|
-
if (isImageFile(
|
|
165
|
+
if (isImageFile(cleanUrl) || isVideoFile(cleanUrl) || isAudioFile(cleanUrl)) {
|
|
164
166
|
setLightboxUrls([{ src: firstUrl, downloadUrl: firstUrl }]);
|
|
165
167
|
setOpenLightbox(true);
|
|
166
168
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type FetchS3UrlOptions = {
|
|
2
|
+
s3Key: string;
|
|
3
|
+
fileType?: string;
|
|
4
|
+
bucketName?: string;
|
|
5
|
+
mediaStorageProviderUserKey?: string;
|
|
6
|
+
isPrivate?: string | boolean;
|
|
7
|
+
};
|
|
8
|
+
type ResolveS3UrlResponse = {
|
|
9
|
+
statusCode?: number | string;
|
|
10
|
+
data?: {
|
|
11
|
+
url?: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
type ResolveS3UrlMutation = (data: FetchS3UrlOptions) => {
|
|
15
|
+
unwrap: () => Promise<ResolveS3UrlResponse>;
|
|
16
|
+
};
|
|
17
|
+
export declare const fetchS3Url: (resolveS3Url: ResolveS3UrlMutation, options: FetchS3UrlOptions) => Promise<string | null>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=fetchS3Url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchS3Url.d.ts","sourceRoot":"","sources":["../../src/helpers/fetchS3Url.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAChC,CAAC;AAEF,KAAK,oBAAoB,GAAG;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE;QACH,GAAG,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACL,CAAC;AAEF,KAAK,oBAAoB,GAAG,CAAC,IAAI,EAAE,iBAAiB,KAAK;IACrD,MAAM,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC/C,CAAC;AAEF,eAAO,MAAM,UAAU,iBAAwB,oBAAoB,WAAU,iBAAiB,KAAG,QAAQ,MAAM,GAAG,IAAI,CAarH,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
export var fetchS3Url = function (resolveS3Url, options) { return __awaiter(void 0, void 0, void 0, function () {
|
|
38
|
+
var result, isSuccess, error_1;
|
|
39
|
+
var _a, _b;
|
|
40
|
+
return __generator(this, function (_c) {
|
|
41
|
+
switch (_c.label) {
|
|
42
|
+
case 0:
|
|
43
|
+
_c.trys.push([0, 2, , 3]);
|
|
44
|
+
return [4 /*yield*/, resolveS3Url(options).unwrap()];
|
|
45
|
+
case 1:
|
|
46
|
+
result = _c.sent();
|
|
47
|
+
isSuccess = (result === null || result === void 0 ? void 0 : result.statusCode) === 200 || (result === null || result === void 0 ? void 0 : result.statusCode) === "200";
|
|
48
|
+
if (isSuccess) {
|
|
49
|
+
return [2 /*return*/, (_b = (_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : null];
|
|
50
|
+
}
|
|
51
|
+
return [3 /*break*/, 3];
|
|
52
|
+
case 2:
|
|
53
|
+
error_1 = _c.sent();
|
|
54
|
+
console.error("Failed to resolve S3 URL:", error_1);
|
|
55
|
+
return [3 /*break*/, 3];
|
|
56
|
+
case 3: return [2 /*return*/, null];
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}); };
|
|
60
|
+
//# sourceMappingURL=fetchS3Url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchS3Url.js","sourceRoot":"","sources":["../../src/helpers/fetchS3Url.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,MAAM,CAAC,IAAM,UAAU,GAAG,UAAO,YAAkC,EAAC,OAA0B;;;;;;;gBAEvE,qBAAM,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAA;;gBAA7C,MAAM,GAAG,SAAoC;gBAC7C,SAAS,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,MAAK,GAAG,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,MAAK,KAAK,CAAC;gBAE7E,IAAI,SAAS,EAAE;oBACX,sBAAO,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,0CAAE,GAAG,mCAAI,IAAI,EAAC;iBACpC;;;;gBAED,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,OAAK,CAAC,CAAC;;oBAGtD,sBAAO,IAAI,EAAC;;;KACf,CAAC","sourcesContent":["export type FetchS3UrlOptions = {\n s3Key: string;\n fileType?: string;\n bucketName?: string;\n mediaStorageProviderUserKey?: string;\n isPrivate?: string | boolean;\n};\n\ntype ResolveS3UrlResponse = {\n statusCode?: number | string;\n data?: {\n url?: string;\n };\n};\n\ntype ResolveS3UrlMutation = (data: FetchS3UrlOptions) => {\n unwrap: () => Promise<ResolveS3UrlResponse>;\n};\n\nexport const fetchS3Url = async (resolveS3Url: ResolveS3UrlMutation,options: FetchS3UrlOptions): Promise<string | null> => {\n try {\n const result = await resolveS3Url(options).unwrap();\n const isSuccess = result?.statusCode === 200 || result?.statusCode === \"200\";\n\n if (isSuccess) {\n return result?.data?.url ?? null;\n }\n } catch (error) {\n console.error(\"Failed to resolve S3 URL:\", error);\n }\n\n return null;\n};\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type FetchS3UrlOptions = {
|
|
2
|
+
s3Key: string;
|
|
3
|
+
fileType?: string;
|
|
4
|
+
bucketName?: string;
|
|
5
|
+
mediaStorageProviderUserKey?: string;
|
|
6
|
+
isPrivate?: string | boolean;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
type ResolveS3UrlResponse = {
|
|
10
|
+
statusCode?: number | string;
|
|
11
|
+
data?: {
|
|
12
|
+
url?: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
type ResolveS3UrlMutation = (data: FetchS3UrlOptions) => {
|
|
17
|
+
unwrap: () => Promise<ResolveS3UrlResponse>;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const fetchS3Url = async (resolveS3Url: ResolveS3UrlMutation,options: FetchS3UrlOptions): Promise<string | null> => {
|
|
21
|
+
try {
|
|
22
|
+
const result = await resolveS3Url(options).unwrap();
|
|
23
|
+
const isSuccess = result?.statusCode === 200 || result?.statusCode === "200";
|
|
24
|
+
|
|
25
|
+
if (isSuccess) {
|
|
26
|
+
return result?.data?.url ?? null;
|
|
27
|
+
}
|
|
28
|
+
} catch (error) {
|
|
29
|
+
console.error("Failed to resolve S3 URL:", error);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return null;
|
|
33
|
+
};
|