@strapi/upload 5.46.1 → 5.47.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.
Files changed (49) hide show
  1. package/dist/admin/future/components/Drawer.js +7 -1
  2. package/dist/admin/future/components/Drawer.js.map +1 -1
  3. package/dist/admin/future/components/Drawer.mjs +7 -1
  4. package/dist/admin/future/components/Drawer.mjs.map +1 -1
  5. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +275 -147
  6. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  7. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +279 -152
  8. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  9. package/dist/admin/future/services/assets.js +32 -1
  10. package/dist/admin/future/services/assets.js.map +1 -1
  11. package/dist/admin/future/services/assets.mjs +32 -2
  12. package/dist/admin/future/services/assets.mjs.map +1 -1
  13. package/dist/admin/future/services/folders.js +33 -1
  14. package/dist/admin/future/services/folders.js.map +1 -1
  15. package/dist/admin/future/services/folders.mjs +33 -2
  16. package/dist/admin/future/services/folders.mjs.map +1 -1
  17. package/dist/admin/index.js +1 -1
  18. package/dist/admin/index.mjs +1 -1
  19. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +8 -0
  20. package/dist/admin/src/future/services/assets.d.ts +6 -2
  21. package/dist/admin/src/future/services/folders.d.ts +1 -1
  22. package/dist/admin/translations/{dk.json.js → da.json.js} +3 -3
  23. package/dist/admin/translations/{dk.json.js.map → da.json.js.map} +1 -1
  24. package/dist/admin/translations/{dk.json.mjs → da.json.mjs} +3 -3
  25. package/dist/admin/translations/{dk.json.mjs.map → da.json.mjs.map} +1 -1
  26. package/dist/admin/translations/en.json.js +5 -1
  27. package/dist/admin/translations/en.json.js.map +1 -1
  28. package/dist/admin/translations/en.json.mjs +5 -1
  29. package/dist/admin/translations/en.json.mjs.map +1 -1
  30. package/dist/admin/translations/sk.json.js +105 -1
  31. package/dist/admin/translations/sk.json.js.map +1 -1
  32. package/dist/admin/translations/sk.json.mjs +105 -1
  33. package/dist/admin/translations/sk.json.mjs.map +1 -1
  34. package/dist/server/bootstrap.js +0 -3
  35. package/dist/server/bootstrap.js.map +1 -1
  36. package/dist/server/bootstrap.mjs +0 -3
  37. package/dist/server/bootstrap.mjs.map +1 -1
  38. package/dist/server/services/ai-metadata-jobs.js +0 -23
  39. package/dist/server/services/ai-metadata-jobs.js.map +1 -1
  40. package/dist/server/services/ai-metadata-jobs.mjs +0 -23
  41. package/dist/server/services/ai-metadata-jobs.mjs.map +1 -1
  42. package/dist/server/src/bootstrap.d.ts.map +1 -1
  43. package/dist/server/src/index.d.ts +0 -1
  44. package/dist/server/src/index.d.ts.map +1 -1
  45. package/dist/server/src/services/ai-metadata-jobs.d.ts +0 -1
  46. package/dist/server/src/services/ai-metadata-jobs.d.ts.map +1 -1
  47. package/dist/server/src/services/index.d.ts +0 -1
  48. package/dist/server/src/services/index.d.ts.map +1 -1
  49. package/package.json +7 -7
@@ -1,13 +1,14 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { useQueryParams, getDisplayName } from '@strapi/admin/strapi-admin';
4
- import { VisuallyHidden, Flex, Loader, Alert, Typography, Box, Field, TextInput } from '@strapi/design-system';
3
+ import { useQueryParams, useNotification, Form, Blocker, getDisplayName, useField, useForm } from '@strapi/admin/strapi-admin';
4
+ import { VisuallyHidden, Flex, Loader, Alert, Typography, Box, Button, Field, TextInput, Tooltip, SingleSelect, SingleSelectOption } from '@strapi/design-system';
5
5
  import { FileError, ArrowLineRight, WarningCircle } from '@strapi/icons';
6
6
  import { useIntl } from 'react-intl';
7
7
  import { styled } from 'styled-components';
8
- import { DRAWER_CLOSE_ANIMATION_MS, Drawer } from '../../../../components/Drawer.mjs';
8
+ import { Drawer } from '../../../../components/Drawer.mjs';
9
9
  import { AssetType } from '../../../../enums.mjs';
10
- import { useGetAssetQuery } from '../../../../services/assets.mjs';
10
+ import { useGetAssetQuery, useUpdateAssetMutation } from '../../../../services/assets.mjs';
11
+ import { useGetAllFoldersQuery } from '../../../../services/folders.mjs';
11
12
  import { formatBytes, getFileExtension } from '../../../../utils/files.mjs';
12
13
  import { getAssetIcon } from '../../../../utils/getAssetIcon.mjs';
13
14
  import { getTranslationKey } from '../../../../utils/translations.mjs';
@@ -22,51 +23,49 @@ const URL_PARAM = 'assetId';
22
23
  const detailsId = query?.[URL_PARAM];
23
24
  const assetId = detailsId ? parseInt(detailsId, 10) : null;
24
25
  const hasValidId = assetId !== null && !Number.isNaN(assetId);
25
- const [isClosing, setIsClosing] = React.useState(false);
26
+ // Closing is driven by removing the URL param (a navigation), so navigation
27
+ // guards like <Blocker> can intercept it. `isMounted` keeps the drawer in the
28
+ // tree through the slide-out: it stays true once opened and only flips false
29
+ // when the close animation actually ends (see onCloseAnimationEnd), so the
30
+ // close duration lives entirely in CSS — no JS timer.
31
+ const [isMounted, setIsMounted] = React.useState(hasValidId);
26
32
  const displayAssetId = React.useRef(null);
27
- const isVisible = hasValidId && !isClosing;
28
33
  React.useEffect(()=>{
29
34
  if (hasValidId) {
30
35
  displayAssetId.current = assetId;
36
+ setIsMounted(true);
31
37
  }
32
38
  }, [
33
39
  hasValidId,
34
40
  assetId
35
41
  ]);
42
+ const onCloseAnimationEnd = React.useCallback((event)=>{
43
+ // Ignore animations bubbling up from descendants, and the slide-in.
44
+ if (event.target === event.currentTarget && !hasValidId) {
45
+ setIsMounted(false);
46
+ }
47
+ }, [
48
+ hasValidId
49
+ ]);
36
50
  const openDetails = React.useCallback((id)=>{
37
- setIsClosing(false);
38
51
  setQuery({
39
52
  [URL_PARAM]: String(id)
40
- });
53
+ }, 'push', true);
41
54
  }, [
42
55
  setQuery
43
56
  ]);
44
57
  const closeDetails = React.useCallback(()=>{
45
- if (!hasValidId) return;
46
- setIsClosing(true);
47
- }, [
48
- hasValidId
49
- ]);
50
- React.useEffect(()=>{
51
- if (!isClosing) return;
52
- const timer = window.setTimeout(()=>{
53
- setQuery({
54
- [URL_PARAM]: undefined
55
- }, 'remove');
56
- setIsClosing(false);
57
- displayAssetId.current = null;
58
- }, DRAWER_CLOSE_ANIMATION_MS);
59
- return ()=>window.clearTimeout(timer);
58
+ setQuery({
59
+ [URL_PARAM]: undefined
60
+ }, 'remove', true);
60
61
  }, [
61
- isClosing,
62
62
  setQuery
63
63
  ]);
64
- const shouldRenderDrawer = hasValidId || isClosing;
65
- const drawerAssetId = isClosing ? displayAssetId.current ?? assetId : assetId;
66
64
  return {
67
- assetId: drawerAssetId,
68
- isVisible,
69
- shouldRenderDrawer,
65
+ assetId: hasValidId ? assetId : displayAssetId.current,
66
+ isVisible: hasValidId,
67
+ shouldRenderDrawer: isMounted,
68
+ onCloseAnimationEnd,
70
69
  openDetails,
71
70
  closeDetails
72
71
  };
@@ -104,7 +103,18 @@ const DetailItem = ({ label, value })=>/*#__PURE__*/ jsxs(DetailItemContainer, {
104
103
  fill: ${({ theme })=>theme.colors.warning500};
105
104
  }
106
105
  `;
107
- const DetailField = ({ name, label, value, required })=>/*#__PURE__*/ jsxs(Field.Root, {
106
+ const DetailField = ({ name, label, required })=>{
107
+ const { formatMessage } = useIntl();
108
+ const field = useField(name);
109
+ const isSubmitting = useForm('DetailField', (state)=>state.isSubmitting);
110
+ const value = field.value ?? '';
111
+ const emptyTooltipLabel = formatMessage({
112
+ id: getTranslationKey('asset-details.field.empty'),
113
+ defaultMessage: '{label} is currently empty.'
114
+ }, {
115
+ label
116
+ });
117
+ return /*#__PURE__*/ jsxs(Field.Root, {
108
118
  name: name,
109
119
  required: required,
110
120
  children: [
@@ -112,138 +122,254 @@ const DetailField = ({ name, label, value, required })=>/*#__PURE__*/ jsxs(Field
112
122
  children: label
113
123
  }),
114
124
  /*#__PURE__*/ jsx(TextInput, {
115
- value: value ?? '',
116
- // TODO: handle onChange
117
- onChange: ()=>{},
118
- endAction: !value ? /*#__PURE__*/ jsx(StyledWarning, {}) : undefined,
119
- type: "text"
125
+ value: value,
126
+ onChange: (event)=>field.onChange(name, event.target.value),
127
+ endAction: !value ? /*#__PURE__*/ jsx(Tooltip, {
128
+ label: emptyTooltipLabel,
129
+ children: /*#__PURE__*/ jsx(StyledWarning, {
130
+ "aria-label": emptyTooltipLabel,
131
+ role: "img"
132
+ })
133
+ }) : undefined,
134
+ type: "text",
135
+ disabled: isSubmitting
120
136
  })
121
137
  ]
122
138
  });
123
- const AssetDetails = ({ asset })=>{
124
- const { formatMessage, formatDate } = useIntl();
125
- const isImage = asset.mime?.includes(AssetType.Image);
126
- return /*#__PURE__*/ jsxs(Flex, {
127
- direction: "column",
128
- alignItems: "stretch",
129
- gap: 4,
130
- paddingTop: 4,
131
- paddingBottom: 4,
132
- paddingLeft: 5,
133
- paddingRight: 5,
139
+ };
140
+ const LocationField = ({ label, rootLabel, folders })=>{
141
+ const field = useField('folder');
142
+ const isSubmitting = useForm('LocationField', (state)=>state.isSubmitting);
143
+ return /*#__PURE__*/ jsxs(Field.Root, {
144
+ name: "folder",
145
+ required: true,
134
146
  children: [
135
- /*#__PURE__*/ jsx(Typography, {
136
- variant: "beta",
137
- fontWeight: "semiBold",
138
- tag: "h3",
139
- children: formatMessage({
140
- id: getTranslationKey('asset-details.fileInfo'),
141
- defaultMessage: 'File info'
142
- })
147
+ /*#__PURE__*/ jsx(Field.Label, {
148
+ children: label
143
149
  }),
144
- /*#__PURE__*/ jsxs(Flex, {
145
- wrap: "wrap",
146
- gap: 4,
147
- background: "neutral100",
148
- paddingTop: 4,
149
- paddingBottom: 4,
150
- paddingLeft: 6,
151
- paddingRight: 6,
152
- alignItems: "flex-start",
150
+ /*#__PURE__*/ jsxs(SingleSelect, {
151
+ value: field.value == null ? '' : String(field.value),
152
+ onChange: (value)=>{
153
+ const next = value === '' ? null : Number(value);
154
+ field.onChange('folder', next);
155
+ },
156
+ disabled: isSubmitting,
153
157
  children: [
154
- /*#__PURE__*/ jsx(DetailItem, {
155
- label: formatMessage({
156
- id: getTranslationKey('asset-details.creationDate'),
157
- defaultMessage: 'Creation date'
158
- }),
159
- value: asset.createdAt ? formatDate(new Date(asset.createdAt), {
160
- dateStyle: 'long',
161
- timeStyle: 'short'
162
- }) : null
163
- }),
164
- /*#__PURE__*/ jsx(DetailItem, {
165
- label: formatMessage({
166
- id: getTranslationKey('asset-details.lastUpdated'),
167
- defaultMessage: 'Last updated'
168
- }),
169
- value: asset.updatedAt ? formatDate(new Date(asset.updatedAt), {
170
- dateStyle: 'long',
171
- timeStyle: 'short'
172
- }) : null
173
- }),
174
- /*#__PURE__*/ jsx(DetailItem, {
175
- label: formatMessage({
176
- id: getTranslationKey('asset-details.createdBy'),
177
- defaultMessage: 'Created by'
178
- }),
179
- value: asset.createdBy ? getDisplayName({
180
- firstname: asset.createdBy.firstname ?? undefined,
181
- lastname: asset.createdBy.lastname ?? undefined,
182
- username: asset.createdBy.username ?? undefined,
183
- email: asset.createdBy.email ?? undefined
184
- }) ?? '-' : null
158
+ /*#__PURE__*/ jsx(SingleSelectOption, {
159
+ value: "",
160
+ children: rootLabel
185
161
  }),
186
- /*#__PURE__*/ jsx(DetailItem, {
187
- label: formatMessage({
188
- id: getTranslationKey('asset-details.size'),
189
- defaultMessage: 'Size'
190
- }),
191
- value: asset.size ? formatBytes(asset.size, 1) : null
192
- }),
193
- isImage && (asset.width != null || asset.height != null) && /*#__PURE__*/ jsx(DetailItem, {
194
- label: formatMessage({
195
- id: getTranslationKey('asset-details.dimensions'),
196
- defaultMessage: 'Dimensions'
197
- }),
198
- value: asset.width != null && asset.height != null ? `${asset.width} × ${asset.height}` : null
199
- }),
200
- /*#__PURE__*/ jsx(DetailItem, {
201
- label: formatMessage({
202
- id: getTranslationKey('asset-details.extension'),
203
- defaultMessage: 'Extension'
204
- }),
205
- value: getFileExtension(asset.ext)
206
- }),
207
- /*#__PURE__*/ jsx(DetailItem, {
208
- label: formatMessage({
209
- id: getTranslationKey('asset-details.assetId'),
210
- defaultMessage: 'Asset ID'
211
- }),
212
- value: String(asset.id)
213
- })
162
+ folders.map((folder)=>/*#__PURE__*/ jsx(SingleSelectOption, {
163
+ value: String(folder.id),
164
+ children: folder.name
165
+ }, folder.id))
214
166
  ]
215
- }),
216
- /*#__PURE__*/ jsx(DetailField, {
217
- name: "fileName",
218
- label: formatMessage({
219
- id: getTranslationKey('asset-details.fileName'),
220
- defaultMessage: 'File name'
221
- }),
222
- value: asset.name,
223
- required: true
224
- }),
225
- isImage && /*#__PURE__*/ jsxs(Fragment, {
167
+ })
168
+ ]
169
+ });
170
+ };
171
+ const AssetDetails = ({ asset })=>{
172
+ const { formatMessage, formatDate } = useIntl();
173
+ const { toggleNotification } = useNotification();
174
+ const { data: folders = [] } = useGetAllFoldersQuery();
175
+ const [updateAsset] = useUpdateAssetMutation();
176
+ const isImage = asset.mime?.includes(AssetType.Image);
177
+ const initialValues = {
178
+ name: asset.name ?? '',
179
+ caption: asset.caption ?? '',
180
+ alternativeText: asset.alternativeText ?? '',
181
+ folder: typeof asset.folder === 'object' && asset.folder !== null ? asset.folder.id ?? null : asset.folder ?? null
182
+ };
183
+ const handleSubmit = async (values)=>{
184
+ const res = await updateAsset({
185
+ id: asset.id,
186
+ fileInfo: {
187
+ name: values.name,
188
+ caption: values.caption,
189
+ alternativeText: values.alternativeText,
190
+ folder: values.folder
191
+ }
192
+ });
193
+ if ('error' in res) {
194
+ toggleNotification({
195
+ type: 'danger',
196
+ message: formatMessage({
197
+ id: getTranslationKey('asset-details.update.error'),
198
+ defaultMessage: 'Failed to update the file.'
199
+ })
200
+ });
201
+ return;
202
+ }
203
+ toggleNotification({
204
+ type: 'success',
205
+ message: formatMessage({
206
+ id: getTranslationKey('asset-details.update.success'),
207
+ defaultMessage: 'File updated'
208
+ })
209
+ });
210
+ };
211
+ return(// `key={asset.id}` resets the form when the drawer switches to a different
212
+ // asset so cached values from the previous asset don't bleed in.
213
+ /*#__PURE__*/ jsx(Form, {
214
+ method: "POST",
215
+ initialValues: initialValues,
216
+ onSubmit: handleSubmit,
217
+ children: ({ modified, isSubmitting, values, resetForm })=>{
218
+ const nameIsEmpty = (values.name ?? '').trim() === '';
219
+ return /*#__PURE__*/ jsxs(Fragment, {
226
220
  children: [
227
- /*#__PURE__*/ jsx(DetailField, {
228
- name: "caption",
229
- label: formatMessage({
230
- id: getTranslationKey('asset-details.caption'),
231
- defaultMessage: 'Caption'
232
- }),
233
- value: asset.caption
221
+ /*#__PURE__*/ jsx(Blocker, {
222
+ onProceed: resetForm
234
223
  }),
235
- /*#__PURE__*/ jsx(DetailField, {
236
- name: "alternativeText",
237
- label: formatMessage({
238
- id: getTranslationKey('asset-details.alternativeText'),
239
- defaultMessage: 'Alternative text'
240
- }),
241
- value: asset.alternativeText
224
+ /*#__PURE__*/ jsxs(Flex, {
225
+ direction: "column",
226
+ alignItems: "stretch",
227
+ gap: 4,
228
+ paddingTop: 4,
229
+ paddingBottom: 4,
230
+ paddingLeft: 5,
231
+ paddingRight: 5,
232
+ children: [
233
+ /*#__PURE__*/ jsx(Typography, {
234
+ variant: "beta",
235
+ fontWeight: "semiBold",
236
+ tag: "h3",
237
+ children: formatMessage({
238
+ id: getTranslationKey('asset-details.fileInfo'),
239
+ defaultMessage: 'File info'
240
+ })
241
+ }),
242
+ /*#__PURE__*/ jsxs(Flex, {
243
+ wrap: "wrap",
244
+ gap: 4,
245
+ background: "neutral100",
246
+ paddingTop: 4,
247
+ paddingBottom: 4,
248
+ paddingLeft: 6,
249
+ paddingRight: 6,
250
+ alignItems: "flex-start",
251
+ children: [
252
+ /*#__PURE__*/ jsx(DetailItem, {
253
+ label: formatMessage({
254
+ id: getTranslationKey('asset-details.creationDate'),
255
+ defaultMessage: 'Creation date'
256
+ }),
257
+ value: asset.createdAt ? formatDate(new Date(asset.createdAt), {
258
+ dateStyle: 'long',
259
+ timeStyle: 'short'
260
+ }) : null
261
+ }),
262
+ /*#__PURE__*/ jsx(DetailItem, {
263
+ label: formatMessage({
264
+ id: getTranslationKey('asset-details.lastUpdated'),
265
+ defaultMessage: 'Last updated'
266
+ }),
267
+ value: asset.updatedAt ? formatDate(new Date(asset.updatedAt), {
268
+ dateStyle: 'long',
269
+ timeStyle: 'short'
270
+ }) : null
271
+ }),
272
+ /*#__PURE__*/ jsx(DetailItem, {
273
+ label: formatMessage({
274
+ id: getTranslationKey('asset-details.createdBy'),
275
+ defaultMessage: 'Created by'
276
+ }),
277
+ value: asset.createdBy ? getDisplayName({
278
+ firstname: asset.createdBy.firstname ?? undefined,
279
+ lastname: asset.createdBy.lastname ?? undefined,
280
+ username: asset.createdBy.username ?? undefined,
281
+ email: asset.createdBy.email ?? undefined
282
+ }) ?? '-' : null
283
+ }),
284
+ /*#__PURE__*/ jsx(DetailItem, {
285
+ label: formatMessage({
286
+ id: getTranslationKey('asset-details.size'),
287
+ defaultMessage: 'Size'
288
+ }),
289
+ value: asset.size ? formatBytes(asset.size, 1) : null
290
+ }),
291
+ isImage && (asset.width != null || asset.height != null) && /*#__PURE__*/ jsx(DetailItem, {
292
+ label: formatMessage({
293
+ id: getTranslationKey('asset-details.dimensions'),
294
+ defaultMessage: 'Dimensions'
295
+ }),
296
+ value: asset.width != null && asset.height != null ? `${asset.width} × ${asset.height}` : null
297
+ }),
298
+ /*#__PURE__*/ jsx(DetailItem, {
299
+ label: formatMessage({
300
+ id: getTranslationKey('asset-details.extension'),
301
+ defaultMessage: 'Extension'
302
+ }),
303
+ value: getFileExtension(asset.ext)
304
+ }),
305
+ /*#__PURE__*/ jsx(DetailItem, {
306
+ label: formatMessage({
307
+ id: getTranslationKey('asset-details.assetId'),
308
+ defaultMessage: 'Asset ID'
309
+ }),
310
+ value: String(asset.id)
311
+ })
312
+ ]
313
+ }),
314
+ /*#__PURE__*/ jsx(DetailField, {
315
+ name: "name",
316
+ label: formatMessage({
317
+ id: getTranslationKey('asset-details.fileName'),
318
+ defaultMessage: 'File name'
319
+ }),
320
+ required: true
321
+ }),
322
+ /*#__PURE__*/ jsx(LocationField, {
323
+ label: formatMessage({
324
+ id: getTranslationKey('asset-details.location'),
325
+ defaultMessage: 'Location'
326
+ }),
327
+ rootLabel: formatMessage({
328
+ id: getTranslationKey('plugin.home'),
329
+ defaultMessage: 'Home'
330
+ }),
331
+ folders: folders
332
+ }),
333
+ isImage && /*#__PURE__*/ jsxs(Fragment, {
334
+ children: [
335
+ /*#__PURE__*/ jsx(DetailField, {
336
+ name: "caption",
337
+ label: formatMessage({
338
+ id: getTranslationKey('asset-details.caption'),
339
+ defaultMessage: 'Caption'
340
+ })
341
+ }),
342
+ /*#__PURE__*/ jsx(DetailField, {
343
+ name: "alternativeText",
344
+ label: formatMessage({
345
+ id: getTranslationKey('asset-details.alternativeText'),
346
+ defaultMessage: 'Alternative text'
347
+ })
348
+ })
349
+ ]
350
+ }),
351
+ /*#__PURE__*/ jsx(Flex, {
352
+ justifyContent: "flex-end",
353
+ gap: 2,
354
+ paddingTop: 2,
355
+ children: /*#__PURE__*/ jsx(Button, {
356
+ type: "submit",
357
+ variant: "default",
358
+ loading: isSubmitting,
359
+ // File name is required; block submit when it's empty or whitespace so the API can't 400 on a blank value.
360
+ disabled: !modified || isSubmitting || nameIsEmpty,
361
+ children: formatMessage({
362
+ id: getTranslationKey('asset-details.save'),
363
+ defaultMessage: 'Save changes'
364
+ })
365
+ })
366
+ })
367
+ ]
242
368
  })
243
369
  ]
244
- })
245
- ]
246
- });
370
+ });
371
+ }
372
+ }, asset.id));
247
373
  };
248
374
  const DrawerHeader = ({ asset, closeDetails })=>{
249
375
  const DocIcon = asset ? getAssetIcon(asset.mime, asset.ext) : FileError;
@@ -341,7 +467,7 @@ const DrawerContent = ({ assetId, closeDetails })=>{
341
467
  * AssetDetailsDrawer
342
468
  * -----------------------------------------------------------------------------------------------*/ const AssetDetailsDrawer = ()=>{
343
469
  const { formatMessage } = useIntl();
344
- const { assetId, isVisible, shouldRenderDrawer, closeDetails } = useAssetDetailsParam();
470
+ const { assetId, isVisible, shouldRenderDrawer, onCloseAnimationEnd, closeDetails } = useAssetDetailsParam();
345
471
  if (!shouldRenderDrawer || assetId === null) {
346
472
  return null;
347
473
  }
@@ -371,6 +497,7 @@ const DrawerContent = ({ assetId, closeDetails })=>{
371
497
  animationDirection: "left",
372
498
  width: "41.6rem",
373
499
  height: "100vh",
500
+ onAnimationEnd: onCloseAnimationEnd,
374
501
  children: /*#__PURE__*/ jsx(DrawerContent, {
375
502
  assetId: assetId,
376
503
  closeDetails: closeDetails
@@ -380,5 +507,5 @@ const DrawerContent = ({ assetId, closeDetails })=>{
380
507
  });
381
508
  };
382
509
 
383
- export { AssetDetailsDrawer, useAssetDetailsParam };
510
+ export { AssetDetails, AssetDetailsDrawer, useAssetDetailsParam };
384
511
  //# sourceMappingURL=AssetDetailsDrawer.mjs.map