@strapi/upload 5.35.0 → 5.36.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/future/App.js +8 -20
- package/dist/admin/future/App.js.map +1 -1
- package/dist/admin/future/App.mjs +8 -20
- package/dist/admin/future/App.mjs.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.js +494 -0
- package/dist/admin/future/components/UploadProgressDialog.js.map +1 -0
- package/dist/admin/future/components/UploadProgressDialog.mjs +473 -0
- package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -0
- package/dist/admin/future/enums.js +12 -0
- package/dist/admin/future/enums.js.map +1 -0
- package/dist/admin/future/enums.mjs +10 -0
- package/dist/admin/future/enums.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/AssetsPage.js +311 -0
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -0
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +290 -0
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +164 -0
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +162 -0
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +198 -0
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +196 -0
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js +127 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs +105 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +107 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +104 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/constants.js +54 -0
- package/dist/admin/future/pages/Assets/constants.js.map +1 -0
- package/dist/admin/future/pages/Assets/constants.mjs +50 -0
- package/dist/admin/future/pages/Assets/constants.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +77 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +74 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -0
- package/dist/admin/future/services/api.js +419 -9
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +417 -9
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/services/assets.js +37 -0
- package/dist/admin/future/services/assets.js.map +1 -0
- package/dist/admin/future/services/assets.mjs +35 -0
- package/dist/admin/future/services/assets.mjs.map +1 -0
- package/dist/admin/future/store/hooks.js +10 -0
- package/dist/admin/future/store/hooks.js.map +1 -0
- package/dist/admin/future/store/hooks.mjs +7 -0
- package/dist/admin/future/store/hooks.mjs.map +1 -0
- package/dist/admin/future/store/uploadProgress.js +156 -0
- package/dist/admin/future/store/uploadProgress.js.map +1 -0
- package/dist/admin/future/store/uploadProgress.mjs +143 -0
- package/dist/admin/future/store/uploadProgress.mjs.map +1 -0
- package/dist/admin/future/utils/files.js +23 -0
- package/dist/admin/future/utils/files.js.map +1 -0
- package/dist/admin/future/utils/files.mjs +19 -0
- package/dist/admin/future/utils/files.mjs.map +1 -0
- package/dist/admin/future/utils/getAssetIcon.js +28 -0
- package/dist/admin/future/utils/getAssetIcon.js.map +1 -0
- package/dist/admin/future/utils/getAssetIcon.mjs +26 -0
- package/dist/admin/future/utils/getAssetIcon.mjs.map +1 -0
- package/dist/admin/index.js +11 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +11 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/package.json.js +11 -9
- package/dist/admin/package.json.js.map +1 -1
- package/dist/admin/package.json.mjs +11 -9
- package/dist/admin/package.json.mjs.map +1 -1
- package/dist/admin/src/future/components/UploadProgressDialog.d.ts +1 -0
- package/dist/admin/src/future/enums.d.ts +6 -0
- package/dist/admin/src/future/pages/Assets/AssetsPage.d.ts +1 -0
- package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +6 -0
- package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +6 -0
- package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZone.d.ts +9 -0
- package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +11 -0
- package/dist/admin/src/future/pages/Assets/constants.d.ts +17 -0
- package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +17 -0
- package/dist/admin/src/future/services/api.d.ts +21 -3
- package/dist/admin/src/future/services/assets.d.ts +13 -0
- package/dist/admin/src/future/store/hooks.d.ts +6 -0
- package/dist/admin/src/future/store/uploadProgress.d.ts +46 -0
- package/dist/admin/src/future/utils/files.d.ts +3 -0
- package/dist/admin/src/future/utils/getAssetIcon.d.ts +12 -0
- package/dist/admin/translations/en.json.js +25 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +25 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/controllers/admin-upload.js +151 -2
- package/dist/server/controllers/admin-upload.js.map +1 -1
- package/dist/server/controllers/admin-upload.mjs +151 -2
- package/dist/server/controllers/admin-upload.mjs.map +1 -1
- package/dist/server/controllers/content-api.js +8 -2
- package/dist/server/controllers/content-api.js.map +1 -1
- package/dist/server/controllers/content-api.mjs +9 -3
- package/dist/server/controllers/content-api.mjs.map +1 -1
- package/dist/server/routes/admin.js +10 -0
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/admin.mjs +10 -0
- package/dist/server/routes/admin.mjs.map +1 -1
- package/dist/server/src/controllers/admin-upload.d.ts +12 -0
- package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
- package/dist/server/src/controllers/content-api.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +1 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +1 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/utils/mime-validation.d.ts +5 -0
- package/dist/server/src/utils/mime-validation.d.ts.map +1 -1
- package/dist/server/utils/mime-validation.js +7 -4
- package/dist/server/utils/mime-validation.js.map +1 -1
- package/dist/server/utils/mime-validation.mjs +7 -4
- package/dist/server/utils/mime-validation.mjs.map +1 -1
- package/dist/shared/contracts/files.d.ts +52 -0
- package/dist/shared/contracts/files.d.ts.map +1 -0
- package/package.json +11 -9
- package/dist/admin/future/pages/AIGenerationPage.js +0 -24
- package/dist/admin/future/pages/AIGenerationPage.js.map +0 -1
- package/dist/admin/future/pages/AIGenerationPage.mjs +0 -22
- package/dist/admin/future/pages/AIGenerationPage.mjs.map +0 -1
- package/dist/admin/future/pages/MediaLibraryPage.js +0 -119
- package/dist/admin/future/pages/MediaLibraryPage.js.map +0 -1
- package/dist/admin/future/pages/MediaLibraryPage.mjs +0 -98
- package/dist/admin/future/pages/MediaLibraryPage.mjs.map +0 -1
- package/dist/admin/src/future/pages/AIGenerationPage.d.ts +0 -1
- package/dist/admin/src/future/pages/MediaLibraryPage.d.ts +0 -1
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useRef, useEffect, useCallback, createContext, useContext } from 'react';
|
|
3
|
+
import { Box } from '@strapi/design-system';
|
|
4
|
+
import { styled } from 'styled-components';
|
|
5
|
+
|
|
6
|
+
/* -------------------------------------------------------------------------------------------------
|
|
7
|
+
* Context
|
|
8
|
+
* -----------------------------------------------------------------------------------------------*/ const UploadDropZoneContext = /*#__PURE__*/ createContext(null);
|
|
9
|
+
/* -------------------------------------------------------------------------------------------------
|
|
10
|
+
* Components
|
|
11
|
+
* -----------------------------------------------------------------------------------------------*/ const DropZoneWrapper = styled(Box)`
|
|
12
|
+
position: relative;
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
min-height: 100%;
|
|
16
|
+
`;
|
|
17
|
+
const UploadDropZoneProvider = ({ children, onDrop })=>{
|
|
18
|
+
const [isDragging, setIsDragging] = useState(false);
|
|
19
|
+
const dragCounterRef = useRef(0);
|
|
20
|
+
const contextValue = {
|
|
21
|
+
isDragging
|
|
22
|
+
};
|
|
23
|
+
useEffect(()=>{
|
|
24
|
+
const handleDragEnd = ()=>{
|
|
25
|
+
setIsDragging(false);
|
|
26
|
+
dragCounterRef.current = 0;
|
|
27
|
+
};
|
|
28
|
+
// Handle drag leaving the entire document/window
|
|
29
|
+
const handleDocumentDragLeave = (e)=>{
|
|
30
|
+
// When relatedTarget is null, we're leaving the document entirely
|
|
31
|
+
if (!e.relatedTarget) {
|
|
32
|
+
setIsDragging(false);
|
|
33
|
+
dragCounterRef.current = 0;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
document.addEventListener('dragend', handleDragEnd);
|
|
37
|
+
document.addEventListener('dragleave', handleDocumentDragLeave);
|
|
38
|
+
return ()=>{
|
|
39
|
+
document.removeEventListener('dragend', handleDragEnd);
|
|
40
|
+
document.removeEventListener('dragleave', handleDocumentDragLeave);
|
|
41
|
+
};
|
|
42
|
+
}, []);
|
|
43
|
+
const handleDragEnter = useCallback((e)=>{
|
|
44
|
+
e.preventDefault();
|
|
45
|
+
e.stopPropagation();
|
|
46
|
+
dragCounterRef.current += 1;
|
|
47
|
+
if (e.dataTransfer.types.includes('Files')) {
|
|
48
|
+
setIsDragging(true);
|
|
49
|
+
}
|
|
50
|
+
}, []);
|
|
51
|
+
const handleDragLeave = useCallback((e)=>{
|
|
52
|
+
e.preventDefault();
|
|
53
|
+
e.stopPropagation();
|
|
54
|
+
dragCounterRef.current -= 1;
|
|
55
|
+
// Only set dragging to false if we've left the dropzone completely
|
|
56
|
+
// (counter reaches 0 or negative)
|
|
57
|
+
if (dragCounterRef.current <= 0) {
|
|
58
|
+
setIsDragging(false);
|
|
59
|
+
dragCounterRef.current = 0;
|
|
60
|
+
}
|
|
61
|
+
}, []);
|
|
62
|
+
const handleDragOver = useCallback((e)=>{
|
|
63
|
+
e.preventDefault();
|
|
64
|
+
e.stopPropagation();
|
|
65
|
+
e.dataTransfer.dropEffect = 'copy';
|
|
66
|
+
}, []);
|
|
67
|
+
const handleDrop = useCallback((e)=>{
|
|
68
|
+
e.preventDefault();
|
|
69
|
+
e.stopPropagation();
|
|
70
|
+
setIsDragging(false);
|
|
71
|
+
dragCounterRef.current = 0;
|
|
72
|
+
const { files } = e.dataTransfer;
|
|
73
|
+
if (files?.length && onDrop) {
|
|
74
|
+
onDrop(Array.from(files));
|
|
75
|
+
}
|
|
76
|
+
}, [
|
|
77
|
+
onDrop
|
|
78
|
+
]);
|
|
79
|
+
return /*#__PURE__*/ jsx(UploadDropZoneContext.Provider, {
|
|
80
|
+
value: contextValue,
|
|
81
|
+
children: /*#__PURE__*/ jsx(DropZoneWrapper, {
|
|
82
|
+
"data-testid": "assets-dropzone",
|
|
83
|
+
onDragEnter: handleDragEnter,
|
|
84
|
+
onDragLeave: handleDragLeave,
|
|
85
|
+
onDragOver: handleDragOver,
|
|
86
|
+
onDrop: handleDrop,
|
|
87
|
+
children: children
|
|
88
|
+
})
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
/* -------------------------------------------------------------------------------------------------
|
|
92
|
+
* Hook
|
|
93
|
+
* -----------------------------------------------------------------------------------------------*/ const useUploadDropZone = ()=>{
|
|
94
|
+
const context = useContext(UploadDropZoneContext);
|
|
95
|
+
if (!context) {
|
|
96
|
+
throw new Error('useUploadDropZone must be used within UploadDropZone');
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
isDragging: context.isDragging
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export { UploadDropZoneProvider, useUploadDropZone };
|
|
104
|
+
//# sourceMappingURL=UploadDropZoneContext.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UploadDropZoneContext.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\n/* -------------------------------------------------------------------------------------------------\n * Types\n * -----------------------------------------------------------------------------------------------*/\n\ntype DropHandler = (files: File[]) => void | Promise<void>;\n\ninterface UploadDropZoneContextValue {\n isDragging: boolean;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst UploadDropZoneContext = createContext<UploadDropZoneContextValue | null>(null);\n\n/* -------------------------------------------------------------------------------------------------\n * Components\n * -----------------------------------------------------------------------------------------------*/\n\nconst DropZoneWrapper = styled(Box)`\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 100%;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UploadDropZoneProps {\n children: ReactNode;\n onDrop?: DropHandler;\n}\n\nexport const UploadDropZoneProvider = ({ children, onDrop }: UploadDropZoneProps) => {\n const [isDragging, setIsDragging] = useState(false);\n const dragCounterRef = useRef(0);\n\n const contextValue: UploadDropZoneContextValue = {\n isDragging,\n };\n\n useEffect(() => {\n const handleDragEnd = () => {\n setIsDragging(false);\n dragCounterRef.current = 0;\n };\n\n // Handle drag leaving the entire document/window\n const handleDocumentDragLeave = (e: globalThis.DragEvent) => {\n // When relatedTarget is null, we're leaving the document entirely\n if (!e.relatedTarget) {\n setIsDragging(false);\n dragCounterRef.current = 0;\n }\n };\n\n document.addEventListener('dragend', handleDragEnd);\n document.addEventListener('dragleave', handleDocumentDragLeave);\n\n return () => {\n document.removeEventListener('dragend', handleDragEnd);\n document.removeEventListener('dragleave', handleDocumentDragLeave);\n };\n }, []);\n\n const handleDragEnter = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n dragCounterRef.current += 1;\n\n if (e.dataTransfer.types.includes('Files')) {\n setIsDragging(true);\n }\n }, []);\n\n const handleDragLeave = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n dragCounterRef.current -= 1;\n\n // Only set dragging to false if we've left the dropzone completely\n // (counter reaches 0 or negative)\n if (dragCounterRef.current <= 0) {\n setIsDragging(false);\n dragCounterRef.current = 0;\n }\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = 'copy';\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n dragCounterRef.current = 0;\n\n const { files } = e.dataTransfer;\n if (files?.length && onDrop) {\n onDrop(Array.from(files));\n }\n },\n [onDrop]\n );\n\n return (\n <UploadDropZoneContext.Provider value={contextValue}>\n <DropZoneWrapper\n data-testid=\"assets-dropzone\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n </DropZoneWrapper>\n </UploadDropZoneContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\nexport const useUploadDropZone = () => {\n const context = useContext(UploadDropZoneContext);\n\n if (!context) {\n throw new Error('useUploadDropZone must be used within UploadDropZone');\n }\n\n return {\n isDragging: context.isDragging,\n };\n};\n"],"names":["UploadDropZoneContext","createContext","DropZoneWrapper","styled","Box","UploadDropZoneProvider","children","onDrop","isDragging","setIsDragging","useState","dragCounterRef","useRef","contextValue","useEffect","handleDragEnd","current","handleDocumentDragLeave","e","relatedTarget","document","addEventListener","removeEventListener","handleDragEnter","useCallback","preventDefault","stopPropagation","dataTransfer","types","includes","handleDragLeave","handleDragOver","dropEffect","handleDrop","files","length","Array","from","_jsx","Provider","value","data-testid","onDragEnter","onDragLeave","onDragOver","useUploadDropZone","context","useContext","Error"],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var translations = require('../../utils/translations.js');
|
|
4
|
+
|
|
5
|
+
const localStorageKeys = {
|
|
6
|
+
view: `STRAPI_UPLOAD_LIBRARY_VIEW`
|
|
7
|
+
};
|
|
8
|
+
const viewOptions = {
|
|
9
|
+
GRID: 0,
|
|
10
|
+
TABLE: 1
|
|
11
|
+
};
|
|
12
|
+
const TABLE_HEADERS = [
|
|
13
|
+
{
|
|
14
|
+
name: 'name',
|
|
15
|
+
label: {
|
|
16
|
+
id: translations.getTranslationKey('list.table.header.name'),
|
|
17
|
+
defaultMessage: 'name'
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'createdAt',
|
|
22
|
+
label: {
|
|
23
|
+
id: translations.getTranslationKey('list.table.header.creationDate'),
|
|
24
|
+
defaultMessage: 'creation date'
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'updatedAt',
|
|
29
|
+
label: {
|
|
30
|
+
id: translations.getTranslationKey('list.table.header.lastModified'),
|
|
31
|
+
defaultMessage: 'last modified'
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'size',
|
|
36
|
+
label: {
|
|
37
|
+
id: translations.getTranslationKey('list.table.header.size'),
|
|
38
|
+
defaultMessage: 'size'
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'actions',
|
|
43
|
+
label: {
|
|
44
|
+
id: translations.getTranslationKey('list.table.header.actions'),
|
|
45
|
+
defaultMessage: 'actions'
|
|
46
|
+
},
|
|
47
|
+
isVisuallyHidden: true
|
|
48
|
+
}
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
exports.TABLE_HEADERS = TABLE_HEADERS;
|
|
52
|
+
exports.localStorageKeys = localStorageKeys;
|
|
53
|
+
exports.viewOptions = viewOptions;
|
|
54
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../../../../admin/src/future/pages/Assets/constants.ts"],"sourcesContent":["import { getTranslationKey } from '../../utils/translations';\n\nexport const localStorageKeys = {\n view: `STRAPI_UPLOAD_LIBRARY_VIEW`,\n};\n\nexport const viewOptions = {\n GRID: 0,\n TABLE: 1,\n};\n\ninterface TableHeader {\n name: string;\n label: { id: string; defaultMessage: string };\n isVisuallyHidden?: boolean;\n}\n\nexport const TABLE_HEADERS: TableHeader[] = [\n {\n name: 'name',\n label: { id: getTranslationKey('list.table.header.name'), defaultMessage: 'name' },\n },\n {\n name: 'createdAt',\n label: {\n id: getTranslationKey('list.table.header.creationDate'),\n defaultMessage: 'creation date',\n },\n },\n {\n name: 'updatedAt',\n label: {\n id: getTranslationKey('list.table.header.lastModified'),\n defaultMessage: 'last modified',\n },\n },\n {\n name: 'size',\n label: { id: getTranslationKey('list.table.header.size'), defaultMessage: 'size' },\n },\n {\n name: 'actions',\n label: { id: getTranslationKey('list.table.header.actions'), defaultMessage: 'actions' },\n isVisuallyHidden: true,\n },\n];\n"],"names":["localStorageKeys","view","viewOptions","GRID","TABLE","TABLE_HEADERS","name","label","id","getTranslationKey","defaultMessage","isVisuallyHidden"],"mappings":";;;;MAEaA,gBAAmB,GAAA;IAC9BC,IAAM,EAAA,CAAC,0BAA0B;AACnC;MAEaC,WAAc,GAAA;IACzBC,IAAM,EAAA,CAAA;IACNC,KAAO,EAAA;AACT;MAQaC,aAA+B,GAAA;AAC1C,IAAA;QACEC,IAAM,EAAA,MAAA;QACNC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIC,8BAAkB,CAAA,wBAAA,CAAA;YAA2BC,cAAgB,EAAA;AAAO;AACnF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,WAAA;QACNC,KAAO,EAAA;AACLC,YAAAA,EAAAA,EAAIC,8BAAkB,CAAA,gCAAA,CAAA;YACtBC,cAAgB,EAAA;AAClB;AACF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,WAAA;QACNC,KAAO,EAAA;AACLC,YAAAA,EAAAA,EAAIC,8BAAkB,CAAA,gCAAA,CAAA;YACtBC,cAAgB,EAAA;AAClB;AACF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,MAAA;QACNC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIC,8BAAkB,CAAA,wBAAA,CAAA;YAA2BC,cAAgB,EAAA;AAAO;AACnF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,SAAA;QACNC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIC,8BAAkB,CAAA,2BAAA,CAAA;YAA8BC,cAAgB,EAAA;AAAU,SAAA;QACvFC,gBAAkB,EAAA;AACpB;;;;;;;"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { getTranslationKey } from '../../utils/translations.mjs';
|
|
2
|
+
|
|
3
|
+
const localStorageKeys = {
|
|
4
|
+
view: `STRAPI_UPLOAD_LIBRARY_VIEW`
|
|
5
|
+
};
|
|
6
|
+
const viewOptions = {
|
|
7
|
+
GRID: 0,
|
|
8
|
+
TABLE: 1
|
|
9
|
+
};
|
|
10
|
+
const TABLE_HEADERS = [
|
|
11
|
+
{
|
|
12
|
+
name: 'name',
|
|
13
|
+
label: {
|
|
14
|
+
id: getTranslationKey('list.table.header.name'),
|
|
15
|
+
defaultMessage: 'name'
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'createdAt',
|
|
20
|
+
label: {
|
|
21
|
+
id: getTranslationKey('list.table.header.creationDate'),
|
|
22
|
+
defaultMessage: 'creation date'
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'updatedAt',
|
|
27
|
+
label: {
|
|
28
|
+
id: getTranslationKey('list.table.header.lastModified'),
|
|
29
|
+
defaultMessage: 'last modified'
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'size',
|
|
34
|
+
label: {
|
|
35
|
+
id: getTranslationKey('list.table.header.size'),
|
|
36
|
+
defaultMessage: 'size'
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'actions',
|
|
41
|
+
label: {
|
|
42
|
+
id: getTranslationKey('list.table.header.actions'),
|
|
43
|
+
defaultMessage: 'actions'
|
|
44
|
+
},
|
|
45
|
+
isVisuallyHidden: true
|
|
46
|
+
}
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
export { TABLE_HEADERS, localStorageKeys, viewOptions };
|
|
50
|
+
//# sourceMappingURL=constants.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.mjs","sources":["../../../../../admin/src/future/pages/Assets/constants.ts"],"sourcesContent":["import { getTranslationKey } from '../../utils/translations';\n\nexport const localStorageKeys = {\n view: `STRAPI_UPLOAD_LIBRARY_VIEW`,\n};\n\nexport const viewOptions = {\n GRID: 0,\n TABLE: 1,\n};\n\ninterface TableHeader {\n name: string;\n label: { id: string; defaultMessage: string };\n isVisuallyHidden?: boolean;\n}\n\nexport const TABLE_HEADERS: TableHeader[] = [\n {\n name: 'name',\n label: { id: getTranslationKey('list.table.header.name'), defaultMessage: 'name' },\n },\n {\n name: 'createdAt',\n label: {\n id: getTranslationKey('list.table.header.creationDate'),\n defaultMessage: 'creation date',\n },\n },\n {\n name: 'updatedAt',\n label: {\n id: getTranslationKey('list.table.header.lastModified'),\n defaultMessage: 'last modified',\n },\n },\n {\n name: 'size',\n label: { id: getTranslationKey('list.table.header.size'), defaultMessage: 'size' },\n },\n {\n name: 'actions',\n label: { id: getTranslationKey('list.table.header.actions'), defaultMessage: 'actions' },\n isVisuallyHidden: true,\n },\n];\n"],"names":["localStorageKeys","view","viewOptions","GRID","TABLE","TABLE_HEADERS","name","label","id","getTranslationKey","defaultMessage","isVisuallyHidden"],"mappings":";;MAEaA,gBAAmB,GAAA;IAC9BC,IAAM,EAAA,CAAC,0BAA0B;AACnC;MAEaC,WAAc,GAAA;IACzBC,IAAM,EAAA,CAAA;IACNC,KAAO,EAAA;AACT;MAQaC,aAA+B,GAAA;AAC1C,IAAA;QACEC,IAAM,EAAA,MAAA;QACNC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIC,iBAAkB,CAAA,wBAAA,CAAA;YAA2BC,cAAgB,EAAA;AAAO;AACnF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,WAAA;QACNC,KAAO,EAAA;AACLC,YAAAA,EAAAA,EAAIC,iBAAkB,CAAA,gCAAA,CAAA;YACtBC,cAAgB,EAAA;AAClB;AACF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,WAAA;QACNC,KAAO,EAAA;AACLC,YAAAA,EAAAA,EAAIC,iBAAkB,CAAA,gCAAA,CAAA;YACtBC,cAAgB,EAAA;AAClB;AACF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,MAAA;QACNC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIC,iBAAkB,CAAA,wBAAA,CAAA;YAA2BC,cAAgB,EAAA;AAAO;AACnF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,SAAA;QACNC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIC,iBAAkB,CAAA,2BAAA,CAAA;YAA8BC,cAAgB,EAAA;AAAU,SAAA;QACvFC,gBAAkB,EAAA;AACpB;;;;;"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var assets = require('../../../services/assets.js');
|
|
5
|
+
|
|
6
|
+
const PAGE_SIZE = 20;
|
|
7
|
+
const useInfiniteAssets = ({ folder = null, sort } = {})=>{
|
|
8
|
+
const [page, setPage] = React.useState(1);
|
|
9
|
+
const lastResultsRef = React.useRef([]);
|
|
10
|
+
const isMountRef = React.useRef(true);
|
|
11
|
+
const { currentData: data, isLoading, isFetching, error } = assets.useGetAssetsQuery({
|
|
12
|
+
folder,
|
|
13
|
+
page,
|
|
14
|
+
pageSize: PAGE_SIZE,
|
|
15
|
+
sort
|
|
16
|
+
});
|
|
17
|
+
const pagination = data?.pagination;
|
|
18
|
+
// Accumulate pages. When cache is invalidated the current page is refetched
|
|
19
|
+
// detect this and reset to avoid a gap in the results.
|
|
20
|
+
const assets$1 = React.useMemo(()=>{
|
|
21
|
+
if (!data) {
|
|
22
|
+
return lastResultsRef.current;
|
|
23
|
+
}
|
|
24
|
+
const currentPageResults = data.results;
|
|
25
|
+
if (page === 1) {
|
|
26
|
+
lastResultsRef.current = currentPageResults;
|
|
27
|
+
} else {
|
|
28
|
+
// If accumulated length doesn't match expectation, cache was cleared
|
|
29
|
+
const expectedPrior = (page - 1) * PAGE_SIZE;
|
|
30
|
+
if (lastResultsRef.current.length < expectedPrior - PAGE_SIZE) {
|
|
31
|
+
return lastResultsRef.current;
|
|
32
|
+
}
|
|
33
|
+
// Only append if these aren't already accumulated
|
|
34
|
+
if (lastResultsRef.current.length < page * PAGE_SIZE) {
|
|
35
|
+
lastResultsRef.current = [
|
|
36
|
+
...lastResultsRef.current,
|
|
37
|
+
...currentPageResults
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return lastResultsRef.current;
|
|
42
|
+
}, [
|
|
43
|
+
data,
|
|
44
|
+
page
|
|
45
|
+
]);
|
|
46
|
+
// Reset on filter/sort change — skip the initial mount since the memo
|
|
47
|
+
// already handles page 1 correctly
|
|
48
|
+
React.useEffect(()=>{
|
|
49
|
+
if (isMountRef.current) {
|
|
50
|
+
isMountRef.current = false;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
setPage(1);
|
|
54
|
+
lastResultsRef.current = [];
|
|
55
|
+
}, [
|
|
56
|
+
folder,
|
|
57
|
+
sort
|
|
58
|
+
]);
|
|
59
|
+
const hasNextPage = pagination ? page < pagination.pageCount : false;
|
|
60
|
+
const isFetchingMore = isFetching && page > 1;
|
|
61
|
+
const fetchNextPage = React.useCallback(()=>{
|
|
62
|
+
setPage((prev)=>prev + 1);
|
|
63
|
+
}, []);
|
|
64
|
+
return {
|
|
65
|
+
assets: assets$1,
|
|
66
|
+
pagination,
|
|
67
|
+
isLoading,
|
|
68
|
+
isFetchingMore,
|
|
69
|
+
hasNextPage,
|
|
70
|
+
fetchNextPage,
|
|
71
|
+
error
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
exports.PAGE_SIZE = PAGE_SIZE;
|
|
76
|
+
exports.useInfiniteAssets = useInfiniteAssets;
|
|
77
|
+
//# sourceMappingURL=useInfiniteAssets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInfiniteAssets.js","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useInfiniteAssets.ts"],"sourcesContent":["import { useState, useCallback, useMemo, useEffect, useRef } from 'react';\n\nimport { useGetAssetsQuery } from '../../../services/assets';\n\nimport type { File } from '../../../../../../shared/contracts/files';\n\nconst PAGE_SIZE = 20;\n\ninterface UseInfiniteAssetsOptions {\n folder?: number | null;\n sort?: string;\n}\n\nconst useInfiniteAssets = ({ folder = null, sort }: UseInfiniteAssetsOptions = {}) => {\n const [page, setPage] = useState(1);\n const lastResultsRef = useRef<File[]>([]);\n const isMountRef = useRef(true);\n\n const {\n currentData: data,\n isLoading,\n isFetching,\n error,\n } = useGetAssetsQuery({\n folder,\n page,\n pageSize: PAGE_SIZE,\n sort,\n });\n\n const pagination = data?.pagination;\n\n // Accumulate pages. When cache is invalidated the current page is refetched\n // detect this and reset to avoid a gap in the results.\n const assets = useMemo(() => {\n if (!data) {\n return lastResultsRef.current;\n }\n\n const currentPageResults = data.results;\n\n if (page === 1) {\n lastResultsRef.current = currentPageResults;\n } else {\n // If accumulated length doesn't match expectation, cache was cleared\n const expectedPrior = (page - 1) * PAGE_SIZE;\n if (lastResultsRef.current.length < expectedPrior - PAGE_SIZE) {\n return lastResultsRef.current;\n }\n\n // Only append if these aren't already accumulated\n if (lastResultsRef.current.length < page * PAGE_SIZE) {\n lastResultsRef.current = [...lastResultsRef.current, ...currentPageResults];\n }\n }\n\n return lastResultsRef.current;\n }, [data, page]);\n\n // Reset on filter/sort change — skip the initial mount since the memo\n // already handles page 1 correctly\n useEffect(() => {\n if (isMountRef.current) {\n isMountRef.current = false;\n\n return;\n }\n setPage(1);\n lastResultsRef.current = [];\n }, [folder, sort]);\n\n const hasNextPage = pagination ? page < pagination.pageCount : false;\n const isFetchingMore = isFetching && page > 1;\n\n const fetchNextPage = useCallback(() => {\n setPage((prev) => prev + 1);\n }, []);\n\n return { assets, pagination, isLoading, isFetchingMore, hasNextPage, fetchNextPage, error };\n};\n\nexport { useInfiniteAssets };\nexport { PAGE_SIZE };\n"],"names":["PAGE_SIZE","useInfiniteAssets","folder","sort","page","setPage","useState","lastResultsRef","useRef","isMountRef","currentData","data","isLoading","isFetching","error","useGetAssetsQuery","pageSize","pagination","assets","useMemo","current","currentPageResults","results","expectedPrior","length","useEffect","hasNextPage","pageCount","isFetchingMore","fetchNextPage","useCallback","prev"],"mappings":";;;;;AAMA,MAAMA,SAAY,GAAA;AAOZC,MAAAA,iBAAAA,GAAoB,CAAC,EAAEC,MAAS,GAAA,IAAI,EAAEC,IAAI,EAA4B,GAAG,EAAE,GAAA;AAC/E,IAAA,MAAM,CAACC,IAAAA,EAAMC,OAAQ,CAAA,GAAGC,cAAS,CAAA,CAAA,CAAA;IACjC,MAAMC,cAAAA,GAAiBC,aAAe,EAAE,CAAA;AACxC,IAAA,MAAMC,aAAaD,YAAO,CAAA,IAAA,CAAA;IAE1B,MAAM,EACJE,WAAaC,EAAAA,IAAI,EACjBC,SAAS,EACTC,UAAU,EACVC,KAAK,EACN,GAAGC,wBAAkB,CAAA;AACpBb,QAAAA,MAAAA;AACAE,QAAAA,IAAAA;QACAY,QAAUhB,EAAAA,SAAAA;AACVG,QAAAA;AACF,KAAA,CAAA;AAEA,IAAA,MAAMc,aAAaN,IAAMM,EAAAA,UAAAA;;;AAIzB,IAAA,MAAMC,WAASC,aAAQ,CAAA,IAAA;AACrB,QAAA,IAAI,CAACR,IAAM,EAAA;AACT,YAAA,OAAOJ,eAAea,OAAO;AAC/B;QAEA,MAAMC,kBAAAA,GAAqBV,KAAKW,OAAO;AAEvC,QAAA,IAAIlB,SAAS,CAAG,EAAA;AACdG,YAAAA,cAAAA,CAAea,OAAO,GAAGC,kBAAAA;SACpB,MAAA;;AAEL,YAAA,MAAME,aAAgB,GAACnB,CAAAA,IAAAA,GAAO,CAAA,IAAKJ,SAAAA;AACnC,YAAA,IAAIO,eAAea,OAAO,CAACI,MAAM,GAAGD,gBAAgBvB,SAAW,EAAA;AAC7D,gBAAA,OAAOO,eAAea,OAAO;AAC/B;;AAGA,YAAA,IAAIb,eAAea,OAAO,CAACI,MAAM,GAAGpB,OAAOJ,SAAW,EAAA;AACpDO,gBAAAA,cAAAA,CAAea,OAAO,GAAG;AAAIb,oBAAAA,GAAAA,cAAAA,CAAea,OAAO;AAAKC,oBAAAA,GAAAA;AAAmB,iBAAA;AAC7E;AACF;AAEA,QAAA,OAAOd,eAAea,OAAO;KAC5B,EAAA;AAACT,QAAAA,IAAAA;AAAMP,QAAAA;AAAK,KAAA,CAAA;;;IAIfqB,eAAU,CAAA,IAAA;QACR,IAAIhB,UAAAA,CAAWW,OAAO,EAAE;AACtBX,YAAAA,UAAAA,CAAWW,OAAO,GAAG,KAAA;AAErB,YAAA;AACF;QACAf,OAAQ,CAAA,CAAA,CAAA;QACRE,cAAea,CAAAA,OAAO,GAAG,EAAE;KAC1B,EAAA;AAAClB,QAAAA,MAAAA;AAAQC,QAAAA;AAAK,KAAA,CAAA;AAEjB,IAAA,MAAMuB,WAAcT,GAAAA,UAAAA,GAAab,IAAOa,GAAAA,UAAAA,CAAWU,SAAS,GAAG,KAAA;IAC/D,MAAMC,cAAAA,GAAiBf,cAAcT,IAAO,GAAA,CAAA;AAE5C,IAAA,MAAMyB,gBAAgBC,iBAAY,CAAA,IAAA;QAChCzB,OAAQ,CAAA,CAAC0B,OAASA,IAAO,GAAA,CAAA,CAAA;AAC3B,KAAA,EAAG,EAAE,CAAA;IAEL,OAAO;AAAEb,gBAAAA,QAAAA;AAAQD,QAAAA,UAAAA;AAAYL,QAAAA,SAAAA;AAAWgB,QAAAA,cAAAA;AAAgBF,QAAAA,WAAAA;AAAaG,QAAAA,aAAAA;AAAef,QAAAA;AAAM,KAAA;AAC5F;;;;;"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { useState, useRef, useMemo, useEffect, useCallback } from 'react';
|
|
2
|
+
import { useGetAssetsQuery } from '../../../services/assets.mjs';
|
|
3
|
+
|
|
4
|
+
const PAGE_SIZE = 20;
|
|
5
|
+
const useInfiniteAssets = ({ folder = null, sort } = {})=>{
|
|
6
|
+
const [page, setPage] = useState(1);
|
|
7
|
+
const lastResultsRef = useRef([]);
|
|
8
|
+
const isMountRef = useRef(true);
|
|
9
|
+
const { currentData: data, isLoading, isFetching, error } = useGetAssetsQuery({
|
|
10
|
+
folder,
|
|
11
|
+
page,
|
|
12
|
+
pageSize: PAGE_SIZE,
|
|
13
|
+
sort
|
|
14
|
+
});
|
|
15
|
+
const pagination = data?.pagination;
|
|
16
|
+
// Accumulate pages. When cache is invalidated the current page is refetched
|
|
17
|
+
// detect this and reset to avoid a gap in the results.
|
|
18
|
+
const assets = useMemo(()=>{
|
|
19
|
+
if (!data) {
|
|
20
|
+
return lastResultsRef.current;
|
|
21
|
+
}
|
|
22
|
+
const currentPageResults = data.results;
|
|
23
|
+
if (page === 1) {
|
|
24
|
+
lastResultsRef.current = currentPageResults;
|
|
25
|
+
} else {
|
|
26
|
+
// If accumulated length doesn't match expectation, cache was cleared
|
|
27
|
+
const expectedPrior = (page - 1) * PAGE_SIZE;
|
|
28
|
+
if (lastResultsRef.current.length < expectedPrior - PAGE_SIZE) {
|
|
29
|
+
return lastResultsRef.current;
|
|
30
|
+
}
|
|
31
|
+
// Only append if these aren't already accumulated
|
|
32
|
+
if (lastResultsRef.current.length < page * PAGE_SIZE) {
|
|
33
|
+
lastResultsRef.current = [
|
|
34
|
+
...lastResultsRef.current,
|
|
35
|
+
...currentPageResults
|
|
36
|
+
];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return lastResultsRef.current;
|
|
40
|
+
}, [
|
|
41
|
+
data,
|
|
42
|
+
page
|
|
43
|
+
]);
|
|
44
|
+
// Reset on filter/sort change — skip the initial mount since the memo
|
|
45
|
+
// already handles page 1 correctly
|
|
46
|
+
useEffect(()=>{
|
|
47
|
+
if (isMountRef.current) {
|
|
48
|
+
isMountRef.current = false;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
setPage(1);
|
|
52
|
+
lastResultsRef.current = [];
|
|
53
|
+
}, [
|
|
54
|
+
folder,
|
|
55
|
+
sort
|
|
56
|
+
]);
|
|
57
|
+
const hasNextPage = pagination ? page < pagination.pageCount : false;
|
|
58
|
+
const isFetchingMore = isFetching && page > 1;
|
|
59
|
+
const fetchNextPage = useCallback(()=>{
|
|
60
|
+
setPage((prev)=>prev + 1);
|
|
61
|
+
}, []);
|
|
62
|
+
return {
|
|
63
|
+
assets,
|
|
64
|
+
pagination,
|
|
65
|
+
isLoading,
|
|
66
|
+
isFetchingMore,
|
|
67
|
+
hasNextPage,
|
|
68
|
+
fetchNextPage,
|
|
69
|
+
error
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export { PAGE_SIZE, useInfiniteAssets };
|
|
74
|
+
//# sourceMappingURL=useInfiniteAssets.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInfiniteAssets.mjs","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useInfiniteAssets.ts"],"sourcesContent":["import { useState, useCallback, useMemo, useEffect, useRef } from 'react';\n\nimport { useGetAssetsQuery } from '../../../services/assets';\n\nimport type { File } from '../../../../../../shared/contracts/files';\n\nconst PAGE_SIZE = 20;\n\ninterface UseInfiniteAssetsOptions {\n folder?: number | null;\n sort?: string;\n}\n\nconst useInfiniteAssets = ({ folder = null, sort }: UseInfiniteAssetsOptions = {}) => {\n const [page, setPage] = useState(1);\n const lastResultsRef = useRef<File[]>([]);\n const isMountRef = useRef(true);\n\n const {\n currentData: data,\n isLoading,\n isFetching,\n error,\n } = useGetAssetsQuery({\n folder,\n page,\n pageSize: PAGE_SIZE,\n sort,\n });\n\n const pagination = data?.pagination;\n\n // Accumulate pages. When cache is invalidated the current page is refetched\n // detect this and reset to avoid a gap in the results.\n const assets = useMemo(() => {\n if (!data) {\n return lastResultsRef.current;\n }\n\n const currentPageResults = data.results;\n\n if (page === 1) {\n lastResultsRef.current = currentPageResults;\n } else {\n // If accumulated length doesn't match expectation, cache was cleared\n const expectedPrior = (page - 1) * PAGE_SIZE;\n if (lastResultsRef.current.length < expectedPrior - PAGE_SIZE) {\n return lastResultsRef.current;\n }\n\n // Only append if these aren't already accumulated\n if (lastResultsRef.current.length < page * PAGE_SIZE) {\n lastResultsRef.current = [...lastResultsRef.current, ...currentPageResults];\n }\n }\n\n return lastResultsRef.current;\n }, [data, page]);\n\n // Reset on filter/sort change — skip the initial mount since the memo\n // already handles page 1 correctly\n useEffect(() => {\n if (isMountRef.current) {\n isMountRef.current = false;\n\n return;\n }\n setPage(1);\n lastResultsRef.current = [];\n }, [folder, sort]);\n\n const hasNextPage = pagination ? page < pagination.pageCount : false;\n const isFetchingMore = isFetching && page > 1;\n\n const fetchNextPage = useCallback(() => {\n setPage((prev) => prev + 1);\n }, []);\n\n return { assets, pagination, isLoading, isFetchingMore, hasNextPage, fetchNextPage, error };\n};\n\nexport { useInfiniteAssets };\nexport { PAGE_SIZE };\n"],"names":["PAGE_SIZE","useInfiniteAssets","folder","sort","page","setPage","useState","lastResultsRef","useRef","isMountRef","currentData","data","isLoading","isFetching","error","useGetAssetsQuery","pageSize","pagination","assets","useMemo","current","currentPageResults","results","expectedPrior","length","useEffect","hasNextPage","pageCount","isFetchingMore","fetchNextPage","useCallback","prev"],"mappings":";;;AAMA,MAAMA,SAAY,GAAA;AAOZC,MAAAA,iBAAAA,GAAoB,CAAC,EAAEC,MAAS,GAAA,IAAI,EAAEC,IAAI,EAA4B,GAAG,EAAE,GAAA;AAC/E,IAAA,MAAM,CAACC,IAAAA,EAAMC,OAAQ,CAAA,GAAGC,QAAS,CAAA,CAAA,CAAA;IACjC,MAAMC,cAAAA,GAAiBC,OAAe,EAAE,CAAA;AACxC,IAAA,MAAMC,aAAaD,MAAO,CAAA,IAAA,CAAA;IAE1B,MAAM,EACJE,WAAaC,EAAAA,IAAI,EACjBC,SAAS,EACTC,UAAU,EACVC,KAAK,EACN,GAAGC,iBAAkB,CAAA;AACpBb,QAAAA,MAAAA;AACAE,QAAAA,IAAAA;QACAY,QAAUhB,EAAAA,SAAAA;AACVG,QAAAA;AACF,KAAA,CAAA;AAEA,IAAA,MAAMc,aAAaN,IAAMM,EAAAA,UAAAA;;;AAIzB,IAAA,MAAMC,SAASC,OAAQ,CAAA,IAAA;AACrB,QAAA,IAAI,CAACR,IAAM,EAAA;AACT,YAAA,OAAOJ,eAAea,OAAO;AAC/B;QAEA,MAAMC,kBAAAA,GAAqBV,KAAKW,OAAO;AAEvC,QAAA,IAAIlB,SAAS,CAAG,EAAA;AACdG,YAAAA,cAAAA,CAAea,OAAO,GAAGC,kBAAAA;SACpB,MAAA;;AAEL,YAAA,MAAME,aAAgB,GAACnB,CAAAA,IAAAA,GAAO,CAAA,IAAKJ,SAAAA;AACnC,YAAA,IAAIO,eAAea,OAAO,CAACI,MAAM,GAAGD,gBAAgBvB,SAAW,EAAA;AAC7D,gBAAA,OAAOO,eAAea,OAAO;AAC/B;;AAGA,YAAA,IAAIb,eAAea,OAAO,CAACI,MAAM,GAAGpB,OAAOJ,SAAW,EAAA;AACpDO,gBAAAA,cAAAA,CAAea,OAAO,GAAG;AAAIb,oBAAAA,GAAAA,cAAAA,CAAea,OAAO;AAAKC,oBAAAA,GAAAA;AAAmB,iBAAA;AAC7E;AACF;AAEA,QAAA,OAAOd,eAAea,OAAO;KAC5B,EAAA;AAACT,QAAAA,IAAAA;AAAMP,QAAAA;AAAK,KAAA,CAAA;;;IAIfqB,SAAU,CAAA,IAAA;QACR,IAAIhB,UAAAA,CAAWW,OAAO,EAAE;AACtBX,YAAAA,UAAAA,CAAWW,OAAO,GAAG,KAAA;AAErB,YAAA;AACF;QACAf,OAAQ,CAAA,CAAA,CAAA;QACRE,cAAea,CAAAA,OAAO,GAAG,EAAE;KAC1B,EAAA;AAAClB,QAAAA,MAAAA;AAAQC,QAAAA;AAAK,KAAA,CAAA;AAEjB,IAAA,MAAMuB,WAAcT,GAAAA,UAAAA,GAAab,IAAOa,GAAAA,UAAAA,CAAWU,SAAS,GAAG,KAAA;IAC/D,MAAMC,cAAAA,GAAiBf,cAAcT,IAAO,GAAA,CAAA;AAE5C,IAAA,MAAMyB,gBAAgBC,WAAY,CAAA,IAAA;QAChCzB,OAAQ,CAAA,CAAC0B,OAASA,IAAO,GAAA,CAAA,CAAA;AAC3B,KAAA,EAAG,EAAE,CAAA;IAEL,OAAO;AAAEb,QAAAA,MAAAA;AAAQD,QAAAA,UAAAA;AAAYL,QAAAA,SAAAA;AAAWgB,QAAAA,cAAAA;AAAgBF,QAAAA,WAAAA;AAAaG,QAAAA,aAAAA;AAAef,QAAAA;AAAM,KAAA;AAC5F;;;;"}
|