@maas/payload-plugin-media-cloud 0.0.33 → 0.0.35

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 (58) hide show
  1. package/dist/adapter/handleDelete.mjs.map +1 -1
  2. package/dist/adapter/handleUpload.mjs.map +1 -1
  3. package/dist/adapter/staticHandler.mjs.map +1 -1
  4. package/dist/adapter/storageAdapter.mjs +10 -2
  5. package/dist/adapter/storageAdapter.mjs.map +1 -1
  6. package/dist/collectionHooks/afterChange.mjs.map +1 -1
  7. package/dist/collectionHooks/beforeChange.mjs.map +1 -1
  8. package/dist/collections/mediaCollection.mjs.map +1 -1
  9. package/dist/components/folderFileCard/folderFileCard.mjs +13 -1
  10. package/dist/components/folderFileCard/folderFileCard.mjs.map +1 -1
  11. package/dist/components/gridContext/gridContext.mjs +52 -51
  12. package/dist/components/gridContext/gridContext.mjs.map +1 -1
  13. package/dist/components/gridView/gridView.mjs +95 -12
  14. package/dist/components/gridView/gridView.mjs.map +1 -1
  15. package/dist/components/itemCardGrid/itemCardGrid.mjs +15 -5
  16. package/dist/components/itemCardGrid/itemCardGrid.mjs.map +1 -1
  17. package/dist/components/muxPreview/muxPreview.mjs +9 -1
  18. package/dist/components/muxPreview/muxPreview.mjs.map +1 -1
  19. package/dist/components/uploadHandler/uploadHandler.mjs.map +1 -1
  20. package/dist/components/uploadManager/uploadManager.mjs +101 -5
  21. package/dist/components/uploadManager/uploadManager.mjs.map +1 -1
  22. package/dist/endpoints/fileExistsHandler.mjs.map +1 -1
  23. package/dist/endpoints/muxAssetHandler.mjs.map +1 -1
  24. package/dist/endpoints/muxCreateUploadHandler.mjs.map +1 -1
  25. package/dist/endpoints/muxWebhookHandler.mjs.map +1 -1
  26. package/dist/endpoints/tusCleanupHandler.mjs.map +1 -1
  27. package/dist/endpoints/tusFolderHandler.mjs.map +1 -1
  28. package/dist/endpoints/tusPostProcessorHandler.mjs.map +1 -1
  29. package/dist/fields/alt.mjs.map +1 -1
  30. package/dist/fields/filename.mjs.map +1 -1
  31. package/dist/fields/height.mjs.map +1 -1
  32. package/dist/fields/mux.mjs.map +1 -1
  33. package/dist/fields/path.mjs.map +1 -1
  34. package/dist/fields/storage.mjs.map +1 -1
  35. package/dist/fields/thumbnail.mjs.map +1 -1
  36. package/dist/fields/width.mjs.map +1 -1
  37. package/dist/hooks/useErrorHandler.mjs +8 -25
  38. package/dist/hooks/useErrorHandler.mjs.map +1 -1
  39. package/dist/hooks/useMediaCloudEmitter.mjs.map +1 -1
  40. package/dist/plugin.mjs.map +1 -1
  41. package/dist/tus/stores/s3/expirationManager.mjs.map +1 -1
  42. package/dist/tus/stores/s3/fileOperations.mjs.map +1 -1
  43. package/dist/tus/stores/s3/index.mjs.map +1 -1
  44. package/dist/tus/stores/s3/metadataManager.mjs.map +1 -1
  45. package/dist/tus/stores/s3/partsManager.mjs.map +1 -1
  46. package/dist/tus/stores/s3/s3Store.mjs +2 -2
  47. package/dist/tus/stores/s3/s3Store.mjs.map +1 -1
  48. package/dist/tus/stores/s3/semaphore.mjs.map +1 -1
  49. package/dist/types/errors.mjs.map +1 -1
  50. package/dist/utils/buildS3Path.mjs.map +1 -1
  51. package/dist/utils/buildThumbnailURL.mjs.map +1 -1
  52. package/dist/utils/defaultOptions.mjs.map +1 -1
  53. package/dist/utils/file.mjs.map +1 -1
  54. package/dist/utils/mux.d.mts +3 -3
  55. package/dist/utils/mux.mjs.map +1 -1
  56. package/dist/utils/tus.d.mts +3 -3
  57. package/dist/utils/tus.mjs.map +1 -1
  58. package/package.json +3 -1
@@ -3,12 +3,13 @@
3
3
  import { GridProvider } from "../gridContext/gridContext.mjs";
4
4
  import { ItemCardGrid } from "../itemCardGrid/itemCardGrid.mjs";
5
5
  import { c } from "react/compiler-runtime";
6
- import React, { Fragment, useEffect } from "react";
6
+ import { Fragment, useEffect } from "react";
7
7
  import { useRouter } from "next/navigation";
8
8
  import { getTranslation } from "@payloadcms/translations";
9
9
  import { Gutter, ListControls, ListHeader, ListSelection, PageControls, SelectMany, SelectionProvider, useBulkUpload, useConfig, useListDrawerContext, useListQuery, useModal, useStepNav, useTranslation, useWindowInfo } from "@payloadcms/ui";
10
10
  import { DefaultListViewTabs } from "@payloadcms/ui/elements/DefaultListViewTabs";
11
11
  import { formatAdminURL } from "payload/shared";
12
+ import { jsx, jsxs } from "react/jsx-runtime";
12
13
  import "./gridView.css";
13
14
 
14
15
  //#region src/components/gridView/gridView.tsx
@@ -139,7 +140,11 @@ function GridView(props) {
139
140
  const t11 = `grid-view grid-view--${collectionSlug}`;
140
141
  let t12;
141
142
  if ($[35] !== collectionConfig.disableBulkEdit || $[36] !== disableBulkDelete || $[37] !== disableBulkEdit || $[38] !== i18n || $[39] !== labels?.plural || $[40] !== smallBreak) {
142
- t12 = !smallBreak && <ListSelection disableBulkDelete={disableBulkDelete} disableBulkEdit={collectionConfig.disableBulkEdit ?? disableBulkEdit} key="list-selection" label={getTranslation(labels?.plural, i18n)} />;
143
+ t12 = !smallBreak && /* @__PURE__ */ jsx(ListSelection, {
144
+ disableBulkDelete,
145
+ disableBulkEdit: collectionConfig.disableBulkEdit ?? disableBulkEdit,
146
+ label: getTranslation(labels?.plural, i18n)
147
+ }, "list-selection");
143
148
  $[35] = collectionConfig.disableBulkEdit;
144
149
  $[36] = disableBulkDelete;
145
150
  $[37] = disableBulkEdit;
@@ -150,7 +155,11 @@ function GridView(props) {
150
155
  } else t12 = $[41];
151
156
  let t13;
152
157
  if ($[42] !== collectionConfig || $[43] !== config) {
153
- t13 = <DefaultListViewTabs collectionConfig={collectionConfig} config={config} key="default-list-actions" viewType="list" />;
158
+ t13 = /* @__PURE__ */ jsx(DefaultListViewTabs, {
159
+ collectionConfig,
160
+ config,
161
+ viewType: "list"
162
+ }, "default-list-actions");
154
163
  $[42] = collectionConfig;
155
164
  $[43] = config;
156
165
  $[44] = t13;
@@ -175,7 +184,23 @@ function GridView(props) {
175
184
  } else t15 = $[50];
176
185
  let t16;
177
186
  if ($[51] !== Description || $[52] !== collectionConfig || $[53] !== disableBulkDelete || $[54] !== disableBulkEdit || $[55] !== hasCreatePermission || $[56] !== hasDeletePermission || $[57] !== i18n || $[58] !== isBulkUploadEnabled || $[59] !== isTrashEnabled || $[60] !== newDocumentURL || $[61] !== openBulkUpload || $[62] !== smallBreak || $[63] !== t14 || $[64] !== t15 || $[65] !== viewType) {
178
- t16 = <ListHeader Actions={t14} collectionConfig={collectionConfig} Description={Description} disableBulkDelete={disableBulkDelete} disableBulkEdit={disableBulkEdit} hasCreatePermission={hasCreatePermission} hasDeletePermission={hasDeletePermission} i18n={i18n} isBulkUploadEnabled={isBulkUploadEnabled} isTrashEnabled={isTrashEnabled} newDocumentURL={newDocumentURL} onBulkUploadSuccess={t15} openBulkUpload={openBulkUpload} smallBreak={smallBreak} viewType={viewType} />;
187
+ t16 = /* @__PURE__ */ jsx(ListHeader, {
188
+ Actions: t14,
189
+ collectionConfig,
190
+ Description,
191
+ disableBulkDelete,
192
+ disableBulkEdit,
193
+ hasCreatePermission,
194
+ hasDeletePermission,
195
+ i18n,
196
+ isBulkUploadEnabled,
197
+ isTrashEnabled,
198
+ newDocumentURL,
199
+ onBulkUploadSuccess: t15,
200
+ openBulkUpload,
201
+ smallBreak,
202
+ viewType
203
+ });
179
204
  $[51] = Description;
180
205
  $[52] = collectionConfig;
181
206
  $[53] = disableBulkDelete;
@@ -195,14 +220,33 @@ function GridView(props) {
195
220
  } else t16 = $[66];
196
221
  let t17;
197
222
  if ($[67] !== collectionConfig || $[68] !== collectionSlug) {
198
- t17 = <ListControls collectionConfig={collectionConfig} collectionSlug={collectionSlug} enableColumns={false} />;
223
+ t17 = /* @__PURE__ */ jsx(ListControls, {
224
+ collectionConfig,
225
+ collectionSlug,
226
+ enableColumns: false
227
+ });
199
228
  $[67] = collectionConfig;
200
229
  $[68] = collectionSlug;
201
230
  $[69] = t17;
202
231
  } else t17 = $[69];
203
232
  let t18;
204
233
  if ($[70] !== adminRoute || $[71] !== collectionSlug || $[72] !== docs.length || $[73] !== hasCreatePermission || $[74] !== i18n || $[75] !== labels?.plural || $[76] !== labels?.singular || $[77] !== mappedDocs || $[78] !== newDocumentURL || $[79] !== router || $[80] !== viewType) {
205
- t18 = docs.length === 0 ? <div className="grid-view__no-results"><p>{i18n.t(viewType === "trash" ? "general:noTrashResults" : "general:noResults", { label: getTranslation(labels?.plural, i18n) })}</p>{hasCreatePermission && newDocumentURL && <div className="grid-view__no-results__actions"><button type="button" onClick={() => router.push(newDocumentURL)} className="grid-view__create-link btn btn--icon-style-without-border btn--size-small btn--withoutPopup btn--style-pill btn--withoutPopup">{i18n.t("general:createNewLabel", { label: getTranslation(labels?.singular, i18n) })}</button></div>}</div> : <ItemCardGrid items={mappedDocs} adminRoute={adminRoute} collectionSlug={collectionSlug} />;
234
+ t18 = docs.length === 0 ? /* @__PURE__ */ jsxs("div", {
235
+ className: "grid-view__no-results",
236
+ children: [/* @__PURE__ */ jsx("p", { children: i18n.t(viewType === "trash" ? "general:noTrashResults" : "general:noResults", { label: getTranslation(labels?.plural, i18n) }) }), hasCreatePermission && newDocumentURL && /* @__PURE__ */ jsx("div", {
237
+ className: "grid-view__no-results__actions",
238
+ children: /* @__PURE__ */ jsx("button", {
239
+ type: "button",
240
+ onClick: () => router.push(newDocumentURL),
241
+ className: "grid-view__create-link btn btn--icon-style-without-border btn--size-small btn--withoutPopup btn--style-pill btn--withoutPopup",
242
+ children: i18n.t("general:createNewLabel", { label: getTranslation(labels?.singular, i18n) })
243
+ })
244
+ })]
245
+ }) : /* @__PURE__ */ jsx(ItemCardGrid, {
246
+ items: mappedDocs,
247
+ adminRoute,
248
+ collectionSlug
249
+ });
206
250
  $[70] = adminRoute;
207
251
  $[71] = collectionSlug;
208
252
  $[72] = docs.length;
@@ -218,7 +262,21 @@ function GridView(props) {
218
262
  } else t18 = $[81];
219
263
  let t19;
220
264
  if ($[82] !== beforeActions || $[83] !== collectionConfig || $[84] !== disableBulkDelete || $[85] !== disableBulkEdit || $[86] !== docs.length || $[87] !== i18n || $[88] !== onBulkSelect || $[89] !== smallBreak) {
221
- t19 = docs?.length > 0 && <PageControls AfterPageControls={smallBreak ? <div className="grid-view__list-selection"><ListSelection collectionConfig={collectionConfig} disableBulkDelete={disableBulkDelete} disableBulkEdit={disableBulkEdit} label={getTranslation(collectionConfig.labels.plural, i18n)} /><div className="grid-view__list-selection-actions">{typeof onBulkSelect === "function" ? beforeActions ? [...beforeActions, <SelectMany key="select-many" onClick={onBulkSelect} />] : [<SelectMany key="select-many" onClick={onBulkSelect} />] : beforeActions}</div></div> : null} collectionConfig={collectionConfig} />;
265
+ t19 = docs?.length > 0 && /* @__PURE__ */ jsx(PageControls, {
266
+ AfterPageControls: smallBreak ? /* @__PURE__ */ jsxs("div", {
267
+ className: "grid-view__list-selection",
268
+ children: [/* @__PURE__ */ jsx(ListSelection, {
269
+ collectionConfig,
270
+ disableBulkDelete,
271
+ disableBulkEdit,
272
+ label: getTranslation(collectionConfig.labels.plural, i18n)
273
+ }), /* @__PURE__ */ jsx("div", {
274
+ className: "grid-view__list-selection-actions",
275
+ children: typeof onBulkSelect === "function" ? beforeActions ? [...beforeActions, /* @__PURE__ */ jsx(SelectMany, { onClick: onBulkSelect }, "select-many")] : [/* @__PURE__ */ jsx(SelectMany, { onClick: onBulkSelect }, "select-many")] : beforeActions
276
+ })]
277
+ }) : null,
278
+ collectionConfig
279
+ });
222
280
  $[82] = beforeActions;
223
281
  $[83] = collectionConfig;
224
282
  $[84] = disableBulkDelete;
@@ -231,7 +289,17 @@ function GridView(props) {
231
289
  } else t19 = $[90];
232
290
  let t20;
233
291
  if ($[91] !== AfterListTable || $[92] !== BeforeListTable || $[93] !== t16 || $[94] !== t17 || $[95] !== t18 || $[96] !== t19) {
234
- t20 = <Gutter className="grid-view__wrapper collection-list__wrap">{t16}{t17}{BeforeListTable}{t18}{t19}{AfterListTable}</Gutter>;
292
+ t20 = /* @__PURE__ */ jsxs(Gutter, {
293
+ className: "grid-view__wrapper collection-list__wrap",
294
+ children: [
295
+ t16,
296
+ t17,
297
+ BeforeListTable,
298
+ t18,
299
+ t19,
300
+ AfterListTable
301
+ ]
302
+ });
235
303
  $[91] = AfterListTable;
236
304
  $[92] = BeforeListTable;
237
305
  $[93] = t16;
@@ -242,7 +310,11 @@ function GridView(props) {
242
310
  } else t20 = $[97];
243
311
  let t21;
244
312
  if ($[98] !== AfterList || $[99] !== BeforeList || $[100] !== t20) {
245
- t21 = <Fragment>{BeforeList}{t20}{AfterList}</Fragment>;
313
+ t21 = /* @__PURE__ */ jsxs(Fragment, { children: [
314
+ BeforeList,
315
+ t20,
316
+ AfterList
317
+ ] });
246
318
  $[98] = AfterList;
247
319
  $[99] = BeforeList;
248
320
  $[100] = t20;
@@ -250,21 +322,32 @@ function GridView(props) {
250
322
  } else t21 = $[101];
251
323
  let t22;
252
324
  if ($[102] !== t11 || $[103] !== t21) {
253
- t22 = <div className={t11}>{t21}</div>;
325
+ t22 = /* @__PURE__ */ jsx("div", {
326
+ className: t11,
327
+ children: t21
328
+ });
254
329
  $[102] = t11;
255
330
  $[103] = t21;
256
331
  $[104] = t22;
257
332
  } else t22 = $[104];
258
333
  let t23;
259
334
  if ($[105] !== mappedDocs || $[106] !== t22) {
260
- t23 = <GridProvider allowMultiSelection={true} docs={mappedDocs}>{t22}</GridProvider>;
335
+ t23 = /* @__PURE__ */ jsx(GridProvider, {
336
+ allowMultiSelection: true,
337
+ docs: mappedDocs,
338
+ children: t22
339
+ });
261
340
  $[105] = mappedDocs;
262
341
  $[106] = t22;
263
342
  $[107] = t23;
264
343
  } else t23 = $[107];
265
344
  let t24;
266
345
  if ($[108] !== docs || $[109] !== t10 || $[110] !== t23) {
267
- t24 = <SelectionProvider docs={docs} totalDocs={t10}>{t23}</SelectionProvider>;
346
+ t24 = /* @__PURE__ */ jsx(SelectionProvider, {
347
+ docs,
348
+ totalDocs: t10,
349
+ children: t23
350
+ });
268
351
  $[108] = docs;
269
352
  $[109] = t10;
270
353
  $[110] = t23;
@@ -1 +1 @@
1
- {"version":3,"file":"gridView.mjs","names":["c","_c","React","Fragment","useMemo","useEffect","useRouter","getTranslation","Gutter","useListQuery","useConfig","SelectionProvider","useTranslation","useWindowInfo","useBulkUpload","useModal","useStepNav","ListHeader","ListSelection","ListControls","PageControls","SelectMany","useListDrawerContext","DefaultListViewTabs","formatAdminURL","ItemCardGrid","GridProvider","ListViewClientProps","MediaDocument","id","storage","filename","alt","mimeType","url","thumbnailURL","mux","playbackId","MappedDocument","title","relationTo","GridView","props","$","collectionSlug","AfterList","AfterListTable","BeforeList","BeforeListTable","Description","newDocumentURL","hasCreatePermission","hasDeletePermission","disableBulkDelete","disableBulkEdit","beforeActions","viewType","config","getEntityConfig","routes","t0","admin","adminRoute","router","data","t1","docs","t2","t3","undefined","i18n","setStepNav","openModal","drawerSlug","bulkUploadDrawerSlug","setCollectionSlug","setBulkUploadCollectionSlug","setOnSuccess","breakpoints","t4","s","smallBreak","t5","collectionConfig","labels","upload","isUploadCollection","Boolean","isBulkUploadEnabled","bulkUpload","isTrashEnabled","trash","onBulkSelect","getThumbnailURL","_temp","t6","t7","doc_0","doc","String","map","mappedDocs","refresh","openBulkUpload","t8","plural","baseLabel","label","path","trashLabel","t","navItems","t9","t10","totalDocs","t11","t12","t13","t14","filter","t15","t16","t17","t18","length","singular","push","t19","t20","t21","t22","t23","t24"],"sources":["../../../src/components/gridView/gridView.tsx"],"sourcesContent":["'use client'\n\nimport React, { Fragment, useMemo, useEffect } from 'react'\nimport { useRouter } from 'next/navigation'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n Gutter,\n useListQuery,\n useConfig,\n SelectionProvider,\n useTranslation,\n useWindowInfo,\n useBulkUpload,\n useModal,\n useStepNav,\n ListHeader,\n ListSelection,\n ListControls,\n PageControls,\n SelectMany,\n useListDrawerContext,\n} from '@payloadcms/ui'\nimport { DefaultListViewTabs } from '@payloadcms/ui/elements/DefaultListViewTabs'\nimport { formatAdminURL } from 'payload/shared'\nimport { ItemCardGrid } from '../itemCardGrid/itemCardGrid'\nimport { GridProvider } from '../gridContext/gridContext'\n\nimport type { ListViewClientProps } from 'payload'\n\nimport './gridView.css'\n\n// Type for media document with common properties\ninterface MediaDocument {\n id: string | number\n storage: 'mux' | 's3'\n filename?: string\n alt?: string\n mimeType?: string\n url?: string\n thumbnailURL?: string\n mux?: {\n playbackId?: string\n }\n}\n\nexport interface MappedDocument {\n id: string | number\n storage: 'mux' | 's3'\n title: string\n thumbnailURL?: string\n relationTo: string\n}\n\nexport function GridView(props: ListViewClientProps): React.JSX.Element {\n const baseClass = 'grid-view'\n\n const {\n collectionSlug,\n AfterList,\n AfterListTable,\n BeforeList,\n BeforeListTable,\n Description,\n newDocumentURL,\n hasCreatePermission,\n hasDeletePermission,\n disableBulkDelete,\n disableBulkEdit,\n beforeActions,\n viewType,\n } = props\n\n const { config, getEntityConfig } = useConfig()\n\n const {\n routes: { admin: adminRoute },\n } = config\n\n const router = useRouter()\n\n const { data } = useListQuery() ?? {}\n const { docs = [] } = data ?? {}\n\n const { i18n } = useTranslation()\n const { setStepNav } = useStepNav()\n const { openModal } = useModal()\n\n const {\n drawerSlug: bulkUploadDrawerSlug,\n setCollectionSlug: setBulkUploadCollectionSlug,\n setOnSuccess,\n } = useBulkUpload()\n\n const {\n breakpoints: { s: smallBreak },\n } = useWindowInfo()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n const { labels, upload } = collectionConfig\n\n const isUploadCollection = Boolean(upload)\n\n const isBulkUploadEnabled =\n (isUploadCollection && collectionConfig.upload?.bulkUpload) ?? true\n\n const isTrashEnabled = Boolean(collectionConfig.trash)\n\n const { onBulkSelect } = useListDrawerContext()\n\n const getThumbnailURL = (doc: MediaDocument): string | undefined => {\n if (doc?.storage === 'mux' && doc?.mux?.playbackId) {\n return `https://image.mux.com/${doc.mux.playbackId}/thumbnail.jpg?width=400&height=400&fit_mode=pad`\n }\n\n if (doc?.thumbnailURL) {\n return doc.thumbnailURL\n }\n\n return undefined\n }\n\n const mappedDocs: MappedDocument[] = useMemo(() => {\n return docs.map((doc: MediaDocument) => {\n const title = doc.filename ?? doc.alt ?? String(doc.id)\n return {\n id: doc.id,\n storage: doc.storage,\n title: title,\n thumbnailURL: getThumbnailURL(doc),\n relationTo: collectionSlug,\n }\n })\n }, [docs, collectionSlug])\n\n const openBulkUpload = React.useCallback(() => {\n setBulkUploadCollectionSlug(collectionSlug)\n openModal(bulkUploadDrawerSlug)\n setOnSuccess(() => router.refresh())\n }, [\n router,\n collectionSlug,\n bulkUploadDrawerSlug,\n openModal,\n setBulkUploadCollectionSlug,\n setOnSuccess,\n ])\n\n // Set breadcrumb navigation\n useEffect(() => {\n const baseLabel = {\n label: getTranslation(labels?.plural, i18n),\n url:\n isTrashEnabled && viewType === 'trash'\n ? formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}`,\n })\n : undefined,\n }\n const trashLabel = {\n label: i18n.t('general:trash'),\n }\n const navItems =\n isTrashEnabled && viewType === 'trash'\n ? [baseLabel, trashLabel]\n : [baseLabel]\n setStepNav(navItems)\n }, [\n adminRoute,\n setStepNav,\n labels,\n isTrashEnabled,\n viewType,\n i18n,\n collectionSlug,\n ])\n\n return (\n <SelectionProvider docs={docs} totalDocs={data?.totalDocs ?? 0}>\n <GridProvider allowMultiSelection={true} docs={mappedDocs}>\n <div className={`grid-view grid-view--${collectionSlug}`}>\n <Fragment>\n {BeforeList}\n <Gutter className={`${baseClass}__wrapper collection-list__wrap`}>\n <ListHeader\n Actions={[\n beforeActions,\n !smallBreak && (\n <ListSelection\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={\n collectionConfig.disableBulkEdit ?? disableBulkEdit\n }\n key=\"list-selection\"\n label={getTranslation(labels?.plural, i18n)}\n />\n ),\n <DefaultListViewTabs\n collectionConfig={collectionConfig}\n config={config}\n key=\"default-list-actions\"\n viewType=\"list\"\n />,\n ].filter(Boolean)}\n collectionConfig={collectionConfig}\n Description={Description}\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={disableBulkEdit}\n hasCreatePermission={hasCreatePermission}\n hasDeletePermission={hasDeletePermission}\n i18n={i18n}\n isBulkUploadEnabled={isBulkUploadEnabled}\n isTrashEnabled={isTrashEnabled}\n newDocumentURL={newDocumentURL}\n onBulkUploadSuccess={() => router.refresh()}\n openBulkUpload={openBulkUpload}\n smallBreak={smallBreak}\n viewType={viewType}\n />\n <ListControls\n collectionConfig={collectionConfig}\n collectionSlug={collectionSlug}\n enableColumns={false}\n />\n\n {BeforeListTable}\n\n {docs.length === 0 ? (\n <div className={`${baseClass}__no-results`}>\n <p>\n {i18n.t(\n viewType === 'trash'\n ? 'general:noTrashResults'\n : 'general:noResults',\n {\n label: getTranslation(labels?.plural, i18n),\n }\n )}\n </p>\n {hasCreatePermission && newDocumentURL && (\n <div className={`${baseClass}__no-results__actions`}>\n <button\n type=\"button\"\n onClick={() => router.push(newDocumentURL)}\n className={`${baseClass}__create-link btn btn--icon-style-without-border btn--size-small btn--withoutPopup btn--style-pill btn--withoutPopup`}\n >\n {i18n.t('general:createNewLabel', {\n label: getTranslation(labels?.singular, i18n),\n })}\n </button>\n </div>\n )}\n </div>\n ) : (\n <ItemCardGrid\n items={mappedDocs}\n adminRoute={adminRoute}\n collectionSlug={collectionSlug}\n />\n )}\n\n {docs?.length > 0 && (\n <PageControls\n AfterPageControls={\n smallBreak ? (\n <div className={`${baseClass}__list-selection`}>\n <ListSelection\n collectionConfig={collectionConfig}\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={disableBulkEdit}\n label={getTranslation(\n collectionConfig.labels.plural,\n i18n\n )}\n />\n <div className={`${baseClass}__list-selection-actions`}>\n {typeof onBulkSelect === 'function'\n ? beforeActions\n ? [\n ...beforeActions,\n <SelectMany\n key=\"select-many\"\n onClick={onBulkSelect}\n />,\n ]\n : [\n <SelectMany\n key=\"select-many\"\n onClick={onBulkSelect}\n />,\n ]\n : beforeActions}\n </div>\n </div>\n ) : null\n }\n collectionConfig={collectionConfig}\n />\n )}\n\n {AfterListTable}\n </Gutter>\n {AfterList}\n </Fragment>\n </div>\n </GridProvider>\n </SelectionProvider>\n )\n}\n\nexport default GridView\n"],"mappings":"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"}
1
+ {"version":3,"file":"gridView.mjs","names":["c","_c","React","Fragment","useMemo","useEffect","useRouter","getTranslation","Gutter","useListQuery","useConfig","SelectionProvider","useTranslation","useWindowInfo","useBulkUpload","useModal","useStepNav","ListHeader","ListSelection","ListControls","PageControls","SelectMany","useListDrawerContext","DefaultListViewTabs","formatAdminURL","ItemCardGrid","GridProvider","jsx","_jsx","jsxs","_jsxs","GridView","props","$","collectionSlug","AfterList","AfterListTable","BeforeList","BeforeListTable","Description","newDocumentURL","hasCreatePermission","hasDeletePermission","disableBulkDelete","disableBulkEdit","beforeActions","viewType","config","getEntityConfig","routes","t0","admin","adminRoute","router","data","t1","docs","t2","t3","undefined","i18n","setStepNav","openModal","drawerSlug","bulkUploadDrawerSlug","setCollectionSlug","setBulkUploadCollectionSlug","setOnSuccess","breakpoints","t4","s","smallBreak","t5","collectionConfig","labels","upload","isUploadCollection","Boolean","isBulkUploadEnabled","bulkUpload","isTrashEnabled","trash","onBulkSelect","getThumbnailURL","_temp","t6","t7","doc_0","title","doc","filename","alt","String","id","storage","thumbnailURL","relationTo","map","mappedDocs","refresh","openBulkUpload","t8","plural","baseLabel","label","url","path","trashLabel","t","navItems","t9","t10","totalDocs","t11","t12","t13","t14","filter","t15","t16","Actions","onBulkUploadSuccess","t17","enableColumns","t18","length","singular","className","children","type","onClick","push","t19","AfterPageControls","t20","t21","t22","t23","allowMultiSelection","t24","mux","playbackId"],"sources":["../../../src/components/gridView/gridView.tsx"],"sourcesContent":["'use client'\n\nimport React, { Fragment, useMemo, useEffect } from 'react'\nimport { useRouter } from 'next/navigation'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n Gutter,\n useListQuery,\n useConfig,\n SelectionProvider,\n useTranslation,\n useWindowInfo,\n useBulkUpload,\n useModal,\n useStepNav,\n ListHeader,\n ListSelection,\n ListControls,\n PageControls,\n SelectMany,\n useListDrawerContext,\n} from '@payloadcms/ui'\nimport { DefaultListViewTabs } from '@payloadcms/ui/elements/DefaultListViewTabs'\nimport { formatAdminURL } from 'payload/shared'\nimport { ItemCardGrid } from '../itemCardGrid/itemCardGrid'\nimport { GridProvider } from '../gridContext/gridContext'\n\nimport type { ListViewClientProps } from 'payload'\n\nimport './gridView.css'\n\n// Type for media document with common properties\ninterface MediaDocument {\n id: string | number\n storage: 'mux' | 's3'\n filename?: string\n alt?: string\n mimeType?: string\n url?: string\n thumbnailURL?: string\n mux?: {\n playbackId?: string\n }\n}\n\nexport interface MappedDocument {\n id: string | number\n storage: 'mux' | 's3'\n title: string\n thumbnailURL?: string\n relationTo: string\n}\n\nexport function GridView(props: ListViewClientProps): React.JSX.Element {\n const baseClass = 'grid-view'\n\n const {\n collectionSlug,\n AfterList,\n AfterListTable,\n BeforeList,\n BeforeListTable,\n Description,\n newDocumentURL,\n hasCreatePermission,\n hasDeletePermission,\n disableBulkDelete,\n disableBulkEdit,\n beforeActions,\n viewType,\n } = props\n\n const { config, getEntityConfig } = useConfig()\n\n const {\n routes: { admin: adminRoute },\n } = config\n\n const router = useRouter()\n\n const { data } = useListQuery() ?? {}\n const { docs = [] } = data ?? {}\n\n const { i18n } = useTranslation()\n const { setStepNav } = useStepNav()\n const { openModal } = useModal()\n\n const {\n drawerSlug: bulkUploadDrawerSlug,\n setCollectionSlug: setBulkUploadCollectionSlug,\n setOnSuccess,\n } = useBulkUpload()\n\n const {\n breakpoints: { s: smallBreak },\n } = useWindowInfo()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n const { labels, upload } = collectionConfig\n\n const isUploadCollection = Boolean(upload)\n\n const isBulkUploadEnabled =\n (isUploadCollection && collectionConfig.upload?.bulkUpload) ?? true\n\n const isTrashEnabled = Boolean(collectionConfig.trash)\n\n const { onBulkSelect } = useListDrawerContext()\n\n const getThumbnailURL = (doc: MediaDocument): string | undefined => {\n if (doc?.storage === 'mux' && doc?.mux?.playbackId) {\n return `https://image.mux.com/${doc.mux.playbackId}/thumbnail.jpg?width=400&height=400&fit_mode=pad`\n }\n\n if (doc?.thumbnailURL) {\n return doc.thumbnailURL\n }\n\n return undefined\n }\n\n const mappedDocs: MappedDocument[] = useMemo(() => {\n return docs.map((doc: MediaDocument) => {\n const title = doc.filename ?? doc.alt ?? String(doc.id)\n return {\n id: doc.id,\n storage: doc.storage,\n title: title,\n thumbnailURL: getThumbnailURL(doc),\n relationTo: collectionSlug,\n }\n })\n }, [docs, collectionSlug])\n\n const openBulkUpload = React.useCallback(() => {\n setBulkUploadCollectionSlug(collectionSlug)\n openModal(bulkUploadDrawerSlug)\n setOnSuccess(() => router.refresh())\n }, [\n router,\n collectionSlug,\n bulkUploadDrawerSlug,\n openModal,\n setBulkUploadCollectionSlug,\n setOnSuccess,\n ])\n\n // Set breadcrumb navigation\n useEffect(() => {\n const baseLabel = {\n label: getTranslation(labels?.plural, i18n),\n url:\n isTrashEnabled && viewType === 'trash'\n ? formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}`,\n })\n : undefined,\n }\n const trashLabel = {\n label: i18n.t('general:trash'),\n }\n const navItems =\n isTrashEnabled && viewType === 'trash'\n ? [baseLabel, trashLabel]\n : [baseLabel]\n setStepNav(navItems)\n }, [\n adminRoute,\n setStepNav,\n labels,\n isTrashEnabled,\n viewType,\n i18n,\n collectionSlug,\n ])\n\n return (\n <SelectionProvider docs={docs} totalDocs={data?.totalDocs ?? 0}>\n <GridProvider allowMultiSelection={true} docs={mappedDocs}>\n <div className={`grid-view grid-view--${collectionSlug}`}>\n <Fragment>\n {BeforeList}\n <Gutter className={`${baseClass}__wrapper collection-list__wrap`}>\n <ListHeader\n Actions={[\n beforeActions,\n !smallBreak && (\n <ListSelection\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={\n collectionConfig.disableBulkEdit ?? disableBulkEdit\n }\n key=\"list-selection\"\n label={getTranslation(labels?.plural, i18n)}\n />\n ),\n <DefaultListViewTabs\n collectionConfig={collectionConfig}\n config={config}\n key=\"default-list-actions\"\n viewType=\"list\"\n />,\n ].filter(Boolean)}\n collectionConfig={collectionConfig}\n Description={Description}\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={disableBulkEdit}\n hasCreatePermission={hasCreatePermission}\n hasDeletePermission={hasDeletePermission}\n i18n={i18n}\n isBulkUploadEnabled={isBulkUploadEnabled}\n isTrashEnabled={isTrashEnabled}\n newDocumentURL={newDocumentURL}\n onBulkUploadSuccess={() => router.refresh()}\n openBulkUpload={openBulkUpload}\n smallBreak={smallBreak}\n viewType={viewType}\n />\n <ListControls\n collectionConfig={collectionConfig}\n collectionSlug={collectionSlug}\n enableColumns={false}\n />\n\n {BeforeListTable}\n\n {docs.length === 0 ? (\n <div className={`${baseClass}__no-results`}>\n <p>\n {i18n.t(\n viewType === 'trash'\n ? 'general:noTrashResults'\n : 'general:noResults',\n {\n label: getTranslation(labels?.plural, i18n),\n }\n )}\n </p>\n {hasCreatePermission && newDocumentURL && (\n <div className={`${baseClass}__no-results__actions`}>\n <button\n type=\"button\"\n onClick={() => router.push(newDocumentURL)}\n className={`${baseClass}__create-link btn btn--icon-style-without-border btn--size-small btn--withoutPopup btn--style-pill btn--withoutPopup`}\n >\n {i18n.t('general:createNewLabel', {\n label: getTranslation(labels?.singular, i18n),\n })}\n </button>\n </div>\n )}\n </div>\n ) : (\n <ItemCardGrid\n items={mappedDocs}\n adminRoute={adminRoute}\n collectionSlug={collectionSlug}\n />\n )}\n\n {docs?.length > 0 && (\n <PageControls\n AfterPageControls={\n smallBreak ? (\n <div className={`${baseClass}__list-selection`}>\n <ListSelection\n collectionConfig={collectionConfig}\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={disableBulkEdit}\n label={getTranslation(\n collectionConfig.labels.plural,\n i18n\n )}\n />\n <div className={`${baseClass}__list-selection-actions`}>\n {typeof onBulkSelect === 'function'\n ? beforeActions\n ? [\n ...beforeActions,\n <SelectMany\n key=\"select-many\"\n onClick={onBulkSelect}\n />,\n ]\n : [\n <SelectMany\n key=\"select-many\"\n onClick={onBulkSelect}\n />,\n ]\n : beforeActions}\n </div>\n </div>\n ) : null\n }\n collectionConfig={collectionConfig}\n />\n )}\n\n {AfterListTable}\n </Gutter>\n {AfterList}\n </Fragment>\n </div>\n </GridProvider>\n </SelectionProvider>\n )\n}\n\nexport default GridView\n"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { ContextFolderFileCard } from "../folderFileCard/folderFileCard.mjs";
4
4
  import { c } from "react/compiler-runtime";
5
- import React from "react";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  import "./itemCardGrid.css";
7
7
 
8
8
  //#region src/components/itemCardGrid/itemCardGrid.tsx
@@ -11,25 +11,35 @@ function ItemCardGrid(t0) {
11
11
  const { items, title } = t0;
12
12
  let t1;
13
13
  if ($[0] !== title) {
14
- t1 = title && <p className="item-card-grid__title">{title}</p>;
14
+ t1 = title && /* @__PURE__ */ jsx("p", {
15
+ className: "item-card-grid__title",
16
+ children: title
17
+ });
15
18
  $[0] = title;
16
19
  $[1] = t1;
17
20
  } else t1 = $[1];
18
21
  let t2;
19
22
  if ($[2] !== items) {
20
- t2 = !items || items?.length === 0 ? null : items.map((item) => <ContextFolderFileCard key={item.id} index={items.indexOf(item)} item={item} className="item-card-grid__item" />);
23
+ t2 = !items || items?.length === 0 ? null : items.map((item) => /* @__PURE__ */ jsx(ContextFolderFileCard, {
24
+ index: items.indexOf(item),
25
+ item,
26
+ className: "item-card-grid__item"
27
+ }, item.id));
21
28
  $[2] = items;
22
29
  $[3] = t2;
23
30
  } else t2 = $[3];
24
31
  let t3;
25
32
  if ($[4] !== t2) {
26
- t3 = <div className="item-card-grid">{t2}</div>;
33
+ t3 = /* @__PURE__ */ jsx("div", {
34
+ className: "item-card-grid",
35
+ children: t2
36
+ });
27
37
  $[4] = t2;
28
38
  $[5] = t3;
29
39
  } else t3 = $[5];
30
40
  let t4;
31
41
  if ($[6] !== t1 || $[7] !== t3) {
32
- t4 = <>{t1}{t3}</>;
42
+ t4 = /* @__PURE__ */ jsxs(Fragment, { children: [t1, t3] });
33
43
  $[6] = t1;
34
44
  $[7] = t3;
35
45
  $[8] = t4;
@@ -1 +1 @@
1
- {"version":3,"file":"itemCardGrid.mjs","names":["c","_c","React","ContextFolderFileCard","MappedDocument","ItemCardGridProps","items","title","adminRoute","collectionSlug","ItemCardGrid","t0","$","t1","t2","length","map","item","id","indexOf","t3","baseClass","t4"],"sources":["../../../src/components/itemCardGrid/itemCardGrid.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport { ContextFolderFileCard } from '../folderFileCard/folderFileCard'\n\nimport type { MappedDocument } from '../gridView/gridView'\n\nimport './itemCardGrid.css'\n\ntype ItemCardGridProps = {\n items: MappedDocument[]\n title?: string\n adminRoute: string\n collectionSlug: string\n}\n\nexport function ItemCardGrid({ items, title }: ItemCardGridProps) {\n const baseClass = 'item-card-grid'\n\n return (\n <>\n {title && <p className={`${baseClass}__title`}>{title}</p>}\n <div className={baseClass}>\n {!items || items?.length === 0\n ? null\n : items.map((item) => {\n return (\n <ContextFolderFileCard\n key={item.id}\n index={items.indexOf(item)}\n item={item}\n className={`${baseClass}__item`}\n />\n )\n })}\n </div>\n </>\n )\n}\n"],"mappings":";;;;;;;;AAgBA,SAAOU,aAAAC,IAAA;CAAA,MAAAC,IAAAX,EAAA,EAAA;CAAsB,MAAA,EAAAK,OAAAC,UAAAI;CAAmC,IAAAE;AAAA,KAAAD,EAAA,OAAAL,OAAA;AAKzDM,OAAAN,SAAS,CAAA,EAAc,mCAAwBA,MAAM,EAA5C;AAAgDK,IAAA,KAAAL;AAAAK,IAAA,KAAAC;OAAAA,MAAAD,EAAA;CAAA,IAAAE;AAAA,KAAAF,EAAA,OAAAN,OAAA;AAEvDQ,OAAA,CAACR,SAASA,OAAKS,WAAa,IAA5B,OAEGT,MAAKU,KAAKC,SAEN,CAAC,sBACM,KAAAA,KAAIC,IACF,OAAAZ,MAAKa,QAASF,KAAI,EACnBA,MAAAA,MACK,oCAGf;AAAAL,IAAA,KAAAN;AAAAM,IAAA,KAAAE;OAAAA,MAAAF,EAAA;CAAA,IAAAQ;AAAA,KAAAR,EAAA,OAAAE,IAAA;AAZRM,OAAA,CAAA,IAAgBC,4BACbP,GAYH,EAbA;AAaMF,IAAA,KAAAE;AAAAF,IAAA,KAAAQ;OAAAA,MAAAR,EAAA;CAAA,IAAAU;AAAA,KAAAV,EAAA,OAAAC,MAAAD,EAAA,OAAAQ,IAAA;AAfRE,OAAA,GACGT,IACDO,GAaM;AACLR,IAAA,KAAAC;AAAAD,IAAA,KAAAQ;AAAAR,IAAA,KAAAU;OAAAA,MAAAV,EAAA;AAAA,QAhBHU"}
1
+ {"version":3,"file":"itemCardGrid.mjs","names":["c","_c","React","ContextFolderFileCard","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","ItemCardGrid","t0","$","items","title","t1","className","children","t2","length","map","item","index","indexOf","id","t3","baseClass","t4"],"sources":["../../../src/components/itemCardGrid/itemCardGrid.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport { ContextFolderFileCard } from '../folderFileCard/folderFileCard'\n\nimport type { MappedDocument } from '../gridView/gridView'\n\nimport './itemCardGrid.css'\n\ntype ItemCardGridProps = {\n items: MappedDocument[]\n title?: string\n adminRoute: string\n collectionSlug: string\n}\n\nexport function ItemCardGrid({ items, title }: ItemCardGridProps) {\n const baseClass = 'item-card-grid'\n\n return (\n <>\n {title && <p className={`${baseClass}__title`}>{title}</p>}\n <div className={baseClass}>\n {!items || items?.length === 0\n ? null\n : items.map((item) => {\n return (\n <ContextFolderFileCard\n key={item.id}\n index={items.indexOf(item)}\n item={item}\n className={`${baseClass}__item`}\n />\n )\n })}\n </div>\n </>\n )\n}\n"],"mappings":";;;;;;;;AAgBA,SAAOU,aAAAC,IAAA;CAAA,MAAAC,IAAAX,EAAA,EAAA;CAAsB,MAAA,EAAAY,OAAAC,UAAAH;CAAmC,IAAAI;AAAA,KAAAH,EAAA,OAAAE,OAAA;AAKzDC,OAAAD,SAAAT,oBAAA,KAAA;GAAuBW,WAAA;GAAqBC,UAAGH;GAAS,CAAC;AAAAF,IAAA,KAAAE;AAAAF,IAAA,KAAAG;OAAAA,MAAAH,EAAA;CAAA,IAAAM;AAAA,KAAAN,EAAA,OAAAC,OAAA;AAEvDK,OAAA,CAACL,SAASA,OAAKM,WAAa,IAA5B,OAEGN,MAAKO,KAAKC,SAENhB,oBAACF,uBAAqB;GAEbmB,OAAAT,MAAKU,QAASF,KAAK;GACpBA;GACKL,WAAA;GAAoB,EAH1BK,KAAIG,GAMd,CAAC;AAAAZ,IAAA,KAAAC;AAAAD,IAAA,KAAAM;OAAAA,MAAAN,EAAA;CAAA,IAAAa;AAAA,KAAAb,EAAA,OAAAM,IAAA;AAZRO,OAAApB,oBAAA,OAAA;GAAgBqB,WALF;GAKWT,UACtBC;GAYE,CAAC;AAAAN,IAAA,KAAAM;AAAAN,IAAA,KAAAa;OAAAA,MAAAb,EAAA;CAAA,IAAAe;AAAA,KAAAf,EAAA,OAAAG,MAAAH,EAAA,OAAAa,IAAA;AAfRE,OAAAlB,qBAAAF,UAAA,EAAAU,UAAA,CACGF,IACDU,GAaM,EACN,CAAC;AAAAb,IAAA,KAAAG;AAAAH,IAAA,KAAAa;AAAAb,IAAA,KAAAe;OAAAA,MAAAf,EAAA;AAAA,QAhBHe"}
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { c } from "react/compiler-runtime";
4
4
  import { useEffect, useState } from "react";
5
+ import { jsx } from "react/jsx-runtime";
5
6
  import MuxPlayer from "@mux/mux-player-react";
6
7
 
7
8
  //#region src/components/muxPreview/muxPreview.tsx
@@ -49,7 +50,14 @@ function MuxPreview(props) {
49
50
  useEffect(t2, t3);
50
51
  let t4;
51
52
  if ($[6] !== isClient || $[7] !== playbackId) {
52
- t4 = isClient && playbackId ? <MuxPlayer playbackId={playbackId} streamType="on-demand" disableTracking={true} style={{ height: "60vh" }} nohotkeys={true} preload="metadata" /> : null;
53
+ t4 = isClient && playbackId ? /* @__PURE__ */ jsx(MuxPlayer, {
54
+ playbackId,
55
+ streamType: "on-demand",
56
+ disableTracking: true,
57
+ style: { height: "60vh" },
58
+ nohotkeys: true,
59
+ preload: "metadata"
60
+ }) : null;
53
61
  $[6] = isClient;
54
62
  $[7] = playbackId;
55
63
  $[8] = t4;
@@ -1 +1 @@
1
- {"version":3,"file":"muxPreview.mjs","names":["c","_c","useEffect","useState","MuxPlayer","React","UIFieldClientProps","MuxPreview","props","$","playbackId","setPlaybackId","isClient","setIsClient","t0","t1","Symbol","for","t2","t3","schemaPath","collection","split","docId","window","location","pathname","pop","fetch","then","_temp","data","mux","catch","t4","height","res","json"],"sources":["../../../src/components/muxPreview/muxPreview.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect, useState } from 'react'\nimport MuxPlayer from '@mux/mux-player-react'\n\nimport type React from 'react'\nimport type { UIFieldClientProps } from 'payload'\n\n/**\n * React component for previewing Mux video assets\n * @param props - The UI field client props containing field data\n * @returns JSX element for Mux video preview\n */\nexport function MuxPreview(props: UIFieldClientProps) {\n const [playbackId, setPlaybackId] = useState<string | null>(null)\n const [isClient, setIsClient] = useState(false)\n\n // Ensure we’re on the client side\n useEffect(() => {\n setIsClient(true)\n }, [])\n\n useEffect(() => {\n if (!isClient) {\n return\n }\n\n // Get collection from schemaPath and ID from URL\n const collection = props.schemaPath?.split('.')[0] // \"media.muxPlayer\" -> \"media\"\n const docId = window.location.pathname.split('/').pop() // Get last part of URL\n\n if (collection && docId && docId !== 'create' && docId !== 'admin') {\n fetch(`/api/${collection}/${docId}`)\n .then((res) => res.json())\n .then((data) => setPlaybackId(data.mux?.playbackId || null))\n .catch(() => setPlaybackId(null))\n }\n }, [props.schemaPath, isClient])\n\n // Only render on client with playbackId\n return isClient && playbackId ? (\n <MuxPlayer\n playbackId={playbackId}\n streamType=\"on-demand\"\n disableTracking={true}\n style={{ height: '60vh' }}\n nohotkeys={true}\n preload=\"metadata\"\n />\n ) : null\n}\n"],"mappings":";;;;;;;;;;;;AAaA,SAAOO,WAAAC,OAAA;CAAA,MAAAC,IAAAR,EAAA,EAAA;CACL,MAAA,CAAAS,YAAAC,iBAAoCR,SAAwB,KAAK;CACjE,MAAA,CAAAS,UAAAC,eAAgCV,SAAS,MAAM;CAAA,IAAAW;CAAA,IAAAC;AAAA,KAAAN,EAAA,OAAAO,OAAAC,IAAA,4BAAA,EAAA;AAGrCH,aAAA;AACRD,eAAY,KAAK;;AAChBE,OAAA,EAAE;AAAAN,IAAA,KAAAK;AAAAL,IAAA,KAAAM;QAAA;AAAAD,OAAAL,EAAA;AAAAM,OAAAN,EAAA;;AAFLP,WAAUY,IAEPC,GAAG;CAAA,IAAAG;CAAA,IAAAC;AAAA,KAAAV,EAAA,OAAAG,YAAAH,EAAA,OAAAD,MAAAY,YAAA;AAEIF,aAAA;AACR,OAAI,CAACN,SAAQ;GAKb,MAAAS,aAAmBb,MAAKY,YAAkBE,MAAC,IAAO,CAAA;GAClD,MAAAC,QAAcC,OAAMC,SAASC,SAASJ,MAAO,IAAI,CAAAK,KAAM;AAEvD,OAAIN,cAAAE,SAAuBA,UAAU,YAAYA,UAAU,QACzDK,OAAM,QAAQP,WAAU,GAAIE,QAAQ,CAAAM,KAC5BC,MAAoB,CAAAD,MACpBE,SAAUpB,cAAcoB,KAAIC,KAAgBtB,cAApB,KAA6B,CAAC,CAAAuB,YAC/CtB,cAAc,KAAK,CAAC;;AAEpCQ,OAAA,CAACX,MAAKY,YAAaR,SAAS;AAAAH,IAAA,KAAAG;AAAAH,IAAA,KAAAD,MAAAY;AAAAX,IAAA,KAAAS;AAAAT,IAAA,KAAAU;QAAA;AAAAD,OAAAT,EAAA;AAAAU,OAAAV,EAAA;;AAf/BP,WAAUgB,IAePC,GAA6B;CAAA,IAAAe;AAAA,KAAAzB,EAAA,OAAAG,YAAAH,EAAA,OAAAC,YAAA;AAGzBwB,OAAAtB,YAAAF,aACL,CAAC,UACaA,YAAAA,YACD,uBACM,iBAAA,MACV,OAAA,EAAAyB,QAAU,QAAO,EACb,WAAA,MACH,wBAPL;AASC1B,IAAA,KAAAG;AAAAH,IAAA,KAAAC;AAAAD,IAAA,KAAAyB;OAAAA,MAAAzB,EAAA;AAAA,QATDyB;;AA3BF,SAAAJ,MAAAM,KAAA;AAAA,QAoBgBA,IAAGC,MAAO"}
1
+ {"version":3,"file":"muxPreview.mjs","names":["c","_c","useEffect","useState","MuxPlayer","jsx","_jsx","MuxPreview","props","$","playbackId","setPlaybackId","isClient","setIsClient","t0","t1","Symbol","for","t2","t3","schemaPath","collection","split","docId","window","location","pathname","pop","fetch","then","_temp","data","mux","catch","t4","streamType","disableTracking","style","height","nohotkeys","preload","res","json"],"sources":["../../../src/components/muxPreview/muxPreview.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect, useState } from 'react'\nimport MuxPlayer from '@mux/mux-player-react'\n\nimport type React from 'react'\nimport type { UIFieldClientProps } from 'payload'\n\n/**\n * React component for previewing Mux video assets\n * @param props - The UI field client props containing field data\n * @returns JSX element for Mux video preview\n */\nexport function MuxPreview(props: UIFieldClientProps) {\n const [playbackId, setPlaybackId] = useState<string | null>(null)\n const [isClient, setIsClient] = useState(false)\n\n // Ensure we’re on the client side\n useEffect(() => {\n setIsClient(true)\n }, [])\n\n useEffect(() => {\n if (!isClient) {\n return\n }\n\n // Get collection from schemaPath and ID from URL\n const collection = props.schemaPath?.split('.')[0] // \"media.muxPlayer\" -> \"media\"\n const docId = window.location.pathname.split('/').pop() // Get last part of URL\n\n if (collection && docId && docId !== 'create' && docId !== 'admin') {\n fetch(`/api/${collection}/${docId}`)\n .then((res) => res.json())\n .then((data) => setPlaybackId(data.mux?.playbackId || null))\n .catch(() => setPlaybackId(null))\n }\n }, [props.schemaPath, isClient])\n\n // Only render on client with playbackId\n return isClient && playbackId ? (\n <MuxPlayer\n playbackId={playbackId}\n streamType=\"on-demand\"\n disableTracking={true}\n style={{ height: '60vh' }}\n nohotkeys={true}\n preload=\"metadata\"\n />\n ) : null\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,SAAOO,WAAAC,OAAA;CAAA,MAAAC,IAAAR,EAAA,EAAA;CACL,MAAA,CAAAS,YAAAC,iBAAoCR,SAAwB,KAAK;CACjE,MAAA,CAAAS,UAAAC,eAAgCV,SAAS,MAAM;CAAA,IAAAW;CAAA,IAAAC;AAAA,KAAAN,EAAA,OAAAO,OAAAC,IAAA,4BAAA,EAAA;AAGrCH,aAAA;AACRD,eAAY,KAAK;;AAChBE,OAAA,EAAE;AAAAN,IAAA,KAAAK;AAAAL,IAAA,KAAAM;QAAA;AAAAD,OAAAL,EAAA;AAAAM,OAAAN,EAAA;;AAFLP,WAAUY,IAEPC,GAAG;CAAA,IAAAG;CAAA,IAAAC;AAAA,KAAAV,EAAA,OAAAG,YAAAH,EAAA,OAAAD,MAAAY,YAAA;AAEIF,aAAA;AACR,OAAI,CAACN,SAAQ;GAKb,MAAAS,aAAmBb,MAAKY,YAAkBE,MAAC,IAAO,CAAA;GAClD,MAAAC,QAAcC,OAAMC,SAASC,SAASJ,MAAO,IAAI,CAAAK,KAAM;AAEvD,OAAIN,cAAAE,SAAuBA,UAAU,YAAYA,UAAU,QACzDK,OAAM,QAAQP,WAAU,GAAIE,QAAQ,CAAAM,KAC5BC,MAAoB,CAAAD,MACpBE,SAAUpB,cAAcoB,KAAIC,KAAgBtB,cAApB,KAA6B,CAAC,CAAAuB,YAC/CtB,cAAc,KAAK,CAAC;;AAEpCQ,OAAA,CAACX,MAAKY,YAAaR,SAAS;AAAAH,IAAA,KAAAG;AAAAH,IAAA,KAAAD,MAAAY;AAAAX,IAAA,KAAAS;AAAAT,IAAA,KAAAU;QAAA;AAAAD,OAAAT,EAAA;AAAAU,OAAAV,EAAA;;AAf/BP,WAAUgB,IAePC,GAA6B;CAAA,IAAAe;AAAA,KAAAzB,EAAA,OAAAG,YAAAH,EAAA,OAAAC,YAAA;AAGzBwB,OAAAtB,YAAAF,aAAAJ,oBACJF,WAAS;GACIM;GACDyB,YAAA;GACMC,iBAAA;GACVC,OAAA,EAAAC,QAAU,QAAQ;GACdC,WAAA;GACHC,SAAA;GAEL,CAAC,GATD;AASC/B,IAAA,KAAAG;AAAAH,IAAA,KAAAC;AAAAD,IAAA,KAAAyB;OAAAA,MAAAzB,EAAA;AAAA,QATDyB;;AA3BF,SAAAJ,MAAAW,KAAA;AAAA,QAoBgBA,IAAGC,MAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"uploadHandler.mjs","names":["upchunk","tus","createClientUploadHandler","MediaCloudErrors","MediaCloudLogs","useMediaCloudEmitter","useErrorHandler","isVideo","getMimeType","generateUniqueFilename","sanitizeFilename","MediaCloudPluginOptions","Storage","MimeType","ReactNode","UploadCollectionSlug","useMagicError","UseMagicErrorReturn","UploadArgs","serverURL","apiRoute","file","File","mimeType","prefix","UploadResult","storage","filename","uploadId","MuxCreateUploadResponse","url","MUX_CHUNK_SIZE","TUS_CHUNK_SIZE","TUS_RETRY_DELAYS","magicError","throwError","emitter","muxUpload","args","Promise","endpoint","name","response","fetch","body","JSON","stringify","credentials","method","headers","json","uploader","createUpload","chunkSize","emit","polling","pollingUrl","on","MUX_UPLOAD_ERROR","progress","detail","MUX_DIRECT_UPLOAD_ERROR","error","tusUpload","filetype","type","filesize","size","toString","Object","keys","localStorage","filter","key","startsWith","forEach","removeItem","uploadUrlAvailable","eventListenerAdded","onBeforeUnload","e","BeforeUnloadEvent","window","removeEventListener","preventDefault","onPageUnload","navigator","sendBeacon","resolve","upload","Upload","retryDelays","storeFingerprintForResuming","metadata","contentType","contentLength","contentDisposition","onError","message","TUS_UPLOAD_ERROR","cause","onBeforeRequest","addEventListener","onProgress","bytesUploaded","bytesTotal","percentage","Math","round","onSuccess","onUploadUrlAvailable","start","log","Extra","pluginOptions","ClientUploadHandlerProps","Record","children","collectionSlug","enabled","extra","T","serverHandlerPath","UploadHandler","props","handler","updateFilename","assert","FILE_TYPE_UNKNOWN","allowedMimeTypes","limits","mimeTypes","mimeTypeMatches","some","allowed","endsWith","replace","FILE_TYPE_NOT_ALLOWED","fileSize","Infinity","FILE_SIZE_EXCEEDED","mappedFile","status","S3_STORE_FILE_FOUND","newFilename","NAMING_FUNCTION_ERROR","uploadArgs","StorageMap","NonNullable","storageForMimeType","prototype","hasOwnProperty","call","undefined","isVideoFile","storeOnMux","UPLOAD_HANDLER_ERROR"],"sources":["../../../src/components/uploadHandler/uploadHandler.tsx"],"sourcesContent":["'use client'\n\nimport * as upchunk from '@mux/upchunk'\nimport * as tus from 'tus-js-client'\n\nimport { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client'\n\nimport { MediaCloudErrors, MediaCloudLogs } from '../../types/errors'\nimport { useMediaCloudEmitter } from '../../hooks/useMediaCloudEmitter'\nimport { useErrorHandler } from '../../hooks/useErrorHandler'\nimport {\n isVideo,\n getMimeType,\n generateUniqueFilename,\n sanitizeFilename,\n} from '../../utils/file'\n\nimport type {\n MediaCloudPluginOptions,\n Storage,\n MimeType,\n} from '../../types/index'\nimport type { ReactNode } from 'react'\nimport type { UploadCollectionSlug } from 'payload'\nimport { useMagicError, UseMagicErrorReturn } from '@maas/error-handler'\n\ninterface UploadArgs {\n serverURL: string\n apiRoute: string\n file: File\n mimeType: MimeType\n prefix?: string\n}\n\ninterface UploadResult {\n storage: Storage\n mimeType: MimeType\n filename: string\n uploadId?: string\n}\n\ninterface MuxCreateUploadResponse {\n url: string\n uploadId: string\n filename: string\n}\n\nconst MUX_CHUNK_SIZE = 30720\nconst TUS_CHUNK_SIZE = 1024 * 1024\nconst TUS_RETRY_DELAYS = [0, 1000, 2000, 5000]\n\nconst magicError: UseMagicErrorReturn = useMagicError({\n prefix: 'PLUGIN-MEDIA-CLOUD',\n})\n\nconst { throwError } = magicError\nconst emitter = useMediaCloudEmitter()\n\n/**\n * Handles Mux video upload with progress tracking\n * @param args - The upload arguments including file, server URL, and callbacks\n * @returns Promise that resolves to upload result or null if upload fails\n */\nasync function muxUpload(args: UploadArgs): Promise<UploadResult | null> {\n const { file, serverURL, apiRoute, mimeType } = args\n\n const endpoint = `${serverURL}${apiRoute}`\n const filename = file.name\n\n try {\n // Request upload URL from Mux\n const response = await fetch(`${endpoint}/mux/upload`, {\n body: JSON.stringify({ filename, mimeType }),\n credentials: 'include',\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n const { url, uploadId } = (await response.json()) as MuxCreateUploadResponse\n\n // Create upchunk uploader\n const uploader = await upchunk.createUpload({\n endpoint: url,\n file,\n chunkSize: MUX_CHUNK_SIZE,\n })\n\n // Add upload to tracker\n emitter.emit('addUpload', {\n filename,\n uploadId,\n polling: false,\n pollingUrl: `${endpoint}/mux/asset`,\n })\n\n // Set up event handlers\n uploader.on('error', function () {\n emitter.emit('removeUpload', { uploadId })\n throwError(MediaCloudErrors.MUX_UPLOAD_ERROR)\n })\n\n uploader.on('progress', function (progress) {\n emitter.emit('updateUpload', {\n filename,\n progress: progress.detail,\n })\n })\n\n uploader.on('success', function () {\n emitter.emit('uploadComplete', { filename })\n })\n\n // Update collection entry\n // with filename, uploadId, mimeType, and storage\n return {\n filename,\n uploadId,\n mimeType,\n storage: 'mux',\n }\n } catch {\n throwError(MediaCloudErrors.MUX_DIRECT_UPLOAD_ERROR)\n emitter.emit('uploadError', { filename, error: 'Video upload failed' })\n return null\n }\n}\n\n/**\n * Handles TUS file upload with resumable capabilities\n * @param args - The upload arguments including file, server URL, and callbacks\n * @returns Promise that resolves to upload result or null if upload fails\n */\nasync function tusUpload(args: UploadArgs): Promise<UploadResult | null> {\n const { apiRoute, serverURL, file, prefix = '', mimeType } = args\n\n const filename = file.name\n const filetype = file.type\n const filesize = file.size.toString()\n\n const endpoint = `${serverURL}${apiRoute}/uploads`\n\n // Clear any stale TUS uploads from localStorage\n Object.keys(localStorage)\n .filter((key) => key.startsWith('tus::'))\n .forEach((key) => localStorage.removeItem(key))\n\n // Flag to prevent multiple onUploadUrlAvailable calls\n let uploadUrlAvailable = false\n let eventListenerAdded = false\n\n function onBeforeUnload(e: BeforeUnloadEvent) {\n window.removeEventListener('beforeunload', onBeforeUnload)\n e.preventDefault()\n }\n\n function onPageUnload() {\n window.removeEventListener('unload', onPageUnload)\n navigator.sendBeacon(`${endpoint}/cleanup`, JSON.stringify({ filename }))\n }\n\n return new Promise((resolve) => {\n const upload = new tus.Upload(file, {\n endpoint,\n retryDelays: TUS_RETRY_DELAYS,\n chunkSize: TUS_CHUNK_SIZE,\n storeFingerprintForResuming: false,\n metadata: {\n filetype,\n filesize,\n filename,\n prefix,\n contentType: filetype,\n contentLength: filesize,\n contentDisposition: 'inline',\n },\n onError(error) {\n // Clean up\n navigator.sendBeacon(\n `${endpoint}/cleanup`,\n JSON.stringify({ filename })\n )\n\n // Inform user\n emitter.emit('uploadError', { filename, error: error.message })\n emitter.emit('removeUpload', { filename })\n throwError({ ...MediaCloudErrors.TUS_UPLOAD_ERROR, cause: error })\n resolve(null)\n },\n onBeforeRequest() {\n if (!eventListenerAdded) {\n window.addEventListener('beforeunload', onBeforeUnload)\n window.addEventListener('unload', onPageUnload)\n eventListenerAdded = true\n }\n },\n onProgress: function (bytesUploaded, bytesTotal) {\n const percentage = Math.round((bytesUploaded / bytesTotal) * 100)\n emitter.emit('updateUpload', {\n filename,\n progress: percentage,\n })\n },\n async onSuccess() {\n // Clean up beforeunload listener\n window.removeEventListener('beforeunload', onBeforeUnload)\n window.removeEventListener('unload', onPageUnload)\n\n // Mark upload as complete in UI\n emitter.emit('uploadComplete', { filename })\n\n // Trigger post upload processing\n await fetch(`${endpoint}/${filename}/process`)\n\n // Move file to correct folder\n await fetch(`${endpoint}/${filename}/folder`)\n },\n onUploadUrlAvailable: async function () {\n // Prevent multiple callbacks\n if (uploadUrlAvailable) {\n return\n }\n\n // Update flag\n uploadUrlAvailable = true\n\n // Add upload to UI\n emitter.emit('addUpload', { filename })\n\n // Update collection entry\n // with filename, mimeType, and storage\n resolve({\n filename,\n mimeType,\n storage: 's3',\n })\n },\n })\n\n upload.start()\n })\n}\n\nconst { log } = useErrorHandler()\n\ninterface Extra {\n pluginOptions: MediaCloudPluginOptions\n}\n\ntype ClientUploadHandlerProps<T extends Record<string, unknown>> = {\n children: ReactNode\n collectionSlug: UploadCollectionSlug\n enabled?: boolean\n extra: T\n prefix?: string\n serverHandlerPath: `/${string}`\n}\n\nexport function UploadHandler(\n props: ClientUploadHandlerProps<{ pluginOptions: MediaCloudPluginOptions }>\n) {\n return createClientUploadHandler({\n handler: async function (args) {\n const { serverURL, apiRoute, file, prefix, updateFilename, extra } = args\n const { pluginOptions } = extra as unknown as Extra\n\n // Check mime type\n const mimeType = await getMimeType(file)\n\n magicError.assert(mimeType, MediaCloudErrors.FILE_TYPE_UNKNOWN)\n\n const allowedMimeTypes = pluginOptions.limits?.mimeTypes ?? []\n const mimeTypeMatches = allowedMimeTypes.some((allowed) =>\n allowed.endsWith('/*')\n ? mimeType?.startsWith(allowed.replace('/*', '/'))\n : mimeType === allowed\n )\n\n if (!mimeTypeMatches) {\n throwError(MediaCloudErrors.FILE_TYPE_NOT_ALLOWED)\n return null\n }\n\n // Check file size limit\n if (file.size > (pluginOptions.limits?.fileSize ?? Infinity)) {\n throwError(MediaCloudErrors.FILE_SIZE_EXCEEDED)\n return null\n }\n\n // Clone file\n let mappedFile = file\n\n try {\n // Check if file with same name exists\n const endpoint = `${serverURL}${apiRoute}/uploads`\n const response = await fetch(`${endpoint}/${file.name}/exists`)\n\n if (response?.status === 200) {\n log(MediaCloudLogs.S3_STORE_FILE_FOUND)\n }\n\n // If file exists, generate a cloned file with a unique filename\n // If not, generate a cloned file with a sanitized filename\n const newFilename =\n response?.status === 200\n ? generateUniqueFilename(file.name)\n : sanitizeFilename(file.name)\n\n mappedFile = new File([file], newFilename, {\n type: file.type,\n })\n\n await updateFilename(newFilename)\n } catch (error) {\n throwError({\n ...MediaCloudErrors.NAMING_FUNCTION_ERROR,\n cause: error,\n })\n return null\n }\n\n try {\n const uploadArgs: UploadArgs = {\n file: mappedFile,\n serverURL,\n apiRoute,\n mimeType,\n prefix,\n }\n\n // Check storage mapping for mime type\n type StorageMap = NonNullable<typeof pluginOptions.storage>\n\n const storageForMimeType =\n pluginOptions.storage &&\n Object.prototype.hasOwnProperty.call(pluginOptions.storage, mimeType)\n ? pluginOptions.storage[mimeType as keyof StorageMap]\n : undefined\n\n const isVideoFile = await isVideo(file)\n const storeOnMux =\n pluginOptions.storage?.['video/*'] === 'mux' ||\n storageForMimeType === 'mux'\n\n switch (true) {\n case storeOnMux && isVideoFile:\n return await muxUpload(uploadArgs)\n default:\n return await tusUpload(uploadArgs)\n }\n } catch (error) {\n throwError({ ...MediaCloudErrors.UPLOAD_HANDLER_ERROR, cause: error })\n return null\n }\n },\n })(props)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"uploadHandler.mjs","names":["upchunk","tus","createClientUploadHandler","MediaCloudErrors","MediaCloudLogs","useMediaCloudEmitter","useErrorHandler","isVideo","getMimeType","generateUniqueFilename","sanitizeFilename","useMagicError","MUX_CHUNK_SIZE","TUS_CHUNK_SIZE","TUS_RETRY_DELAYS","magicError","prefix","throwError","emitter","muxUpload","args","file","serverURL","apiRoute","mimeType","endpoint","filename","name","response","fetch","body","JSON","stringify","credentials","method","headers","url","uploadId","json","uploader","createUpload","chunkSize","emit","polling","pollingUrl","on","MUX_UPLOAD_ERROR","progress","detail","storage","MUX_DIRECT_UPLOAD_ERROR","error","tusUpload","filetype","type","filesize","size","toString","Object","keys","localStorage","filter","key","startsWith","forEach","removeItem","uploadUrlAvailable","eventListenerAdded","onBeforeUnload","e","window","removeEventListener","preventDefault","onPageUnload","navigator","sendBeacon","Promise","resolve","upload","Upload","retryDelays","storeFingerprintForResuming","metadata","contentType","contentLength","contentDisposition","onError","message","TUS_UPLOAD_ERROR","cause","onBeforeRequest","addEventListener","onProgress","bytesUploaded","bytesTotal","percentage","Math","round","onSuccess","onUploadUrlAvailable","start","log","UploadHandler","props","handler","updateFilename","extra","pluginOptions","assert","FILE_TYPE_UNKNOWN","allowedMimeTypes","limits","mimeTypes","mimeTypeMatches","some","allowed","endsWith","replace","FILE_TYPE_NOT_ALLOWED","fileSize","Infinity","FILE_SIZE_EXCEEDED","mappedFile","status","S3_STORE_FILE_FOUND","newFilename","File","NAMING_FUNCTION_ERROR","uploadArgs","storageForMimeType","prototype","hasOwnProperty","call","undefined","isVideoFile","storeOnMux","UPLOAD_HANDLER_ERROR"],"sources":["../../../src/components/uploadHandler/uploadHandler.tsx"],"sourcesContent":["'use client'\n\nimport * as upchunk from '@mux/upchunk'\nimport * as tus from 'tus-js-client'\n\nimport { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client'\n\nimport { MediaCloudErrors, MediaCloudLogs } from '../../types/errors'\nimport { useMediaCloudEmitter } from '../../hooks/useMediaCloudEmitter'\nimport { useErrorHandler } from '../../hooks/useErrorHandler'\nimport {\n isVideo,\n getMimeType,\n generateUniqueFilename,\n sanitizeFilename,\n} from '../../utils/file'\n\nimport type {\n MediaCloudPluginOptions,\n Storage,\n MimeType,\n} from '../../types/index'\nimport type { ReactNode } from 'react'\nimport type { UploadCollectionSlug } from 'payload'\nimport { useMagicError, UseMagicErrorReturn } from '@maas/error-handler'\n\ninterface UploadArgs {\n serverURL: string\n apiRoute: string\n file: File\n mimeType: MimeType\n prefix?: string\n}\n\ninterface UploadResult {\n storage: Storage\n mimeType: MimeType\n filename: string\n uploadId?: string\n}\n\ninterface MuxCreateUploadResponse {\n url: string\n uploadId: string\n filename: string\n}\n\nconst MUX_CHUNK_SIZE = 30720\nconst TUS_CHUNK_SIZE = 1024 * 1024\nconst TUS_RETRY_DELAYS = [0, 1000, 2000, 5000]\n\nconst magicError: UseMagicErrorReturn = useMagicError({\n prefix: 'PLUGIN-MEDIA-CLOUD',\n})\n\nconst { throwError } = magicError\nconst emitter = useMediaCloudEmitter()\n\n/**\n * Handles Mux video upload with progress tracking\n * @param args - The upload arguments including file, server URL, and callbacks\n * @returns Promise that resolves to upload result or null if upload fails\n */\nasync function muxUpload(args: UploadArgs): Promise<UploadResult | null> {\n const { file, serverURL, apiRoute, mimeType } = args\n\n const endpoint = `${serverURL}${apiRoute}`\n const filename = file.name\n\n try {\n // Request upload URL from Mux\n const response = await fetch(`${endpoint}/mux/upload`, {\n body: JSON.stringify({ filename, mimeType }),\n credentials: 'include',\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n const { url, uploadId } = (await response.json()) as MuxCreateUploadResponse\n\n // Create upchunk uploader\n const uploader = await upchunk.createUpload({\n endpoint: url,\n file,\n chunkSize: MUX_CHUNK_SIZE,\n })\n\n // Add upload to tracker\n emitter.emit('addUpload', {\n filename,\n uploadId,\n polling: false,\n pollingUrl: `${endpoint}/mux/asset`,\n })\n\n // Set up event handlers\n uploader.on('error', function () {\n emitter.emit('removeUpload', { uploadId })\n throwError(MediaCloudErrors.MUX_UPLOAD_ERROR)\n })\n\n uploader.on('progress', function (progress) {\n emitter.emit('updateUpload', {\n filename,\n progress: progress.detail,\n })\n })\n\n uploader.on('success', function () {\n emitter.emit('uploadComplete', { filename })\n })\n\n // Update collection entry\n // with filename, uploadId, mimeType, and storage\n return {\n filename,\n uploadId,\n mimeType,\n storage: 'mux',\n }\n } catch {\n throwError(MediaCloudErrors.MUX_DIRECT_UPLOAD_ERROR)\n emitter.emit('uploadError', { filename, error: 'Video upload failed' })\n return null\n }\n}\n\n/**\n * Handles TUS file upload with resumable capabilities\n * @param args - The upload arguments including file, server URL, and callbacks\n * @returns Promise that resolves to upload result or null if upload fails\n */\nasync function tusUpload(args: UploadArgs): Promise<UploadResult | null> {\n const { apiRoute, serverURL, file, prefix = '', mimeType } = args\n\n const filename = file.name\n const filetype = file.type\n const filesize = file.size.toString()\n\n const endpoint = `${serverURL}${apiRoute}/uploads`\n\n // Clear any stale TUS uploads from localStorage\n Object.keys(localStorage)\n .filter((key) => key.startsWith('tus::'))\n .forEach((key) => localStorage.removeItem(key))\n\n // Flag to prevent multiple onUploadUrlAvailable calls\n let uploadUrlAvailable = false\n let eventListenerAdded = false\n\n function onBeforeUnload(e: BeforeUnloadEvent) {\n window.removeEventListener('beforeunload', onBeforeUnload)\n e.preventDefault()\n }\n\n function onPageUnload() {\n window.removeEventListener('unload', onPageUnload)\n navigator.sendBeacon(`${endpoint}/cleanup`, JSON.stringify({ filename }))\n }\n\n return new Promise((resolve) => {\n const upload = new tus.Upload(file, {\n endpoint,\n retryDelays: TUS_RETRY_DELAYS,\n chunkSize: TUS_CHUNK_SIZE,\n storeFingerprintForResuming: false,\n metadata: {\n filetype,\n filesize,\n filename,\n prefix,\n contentType: filetype,\n contentLength: filesize,\n contentDisposition: 'inline',\n },\n onError(error) {\n // Clean up\n navigator.sendBeacon(\n `${endpoint}/cleanup`,\n JSON.stringify({ filename })\n )\n\n // Inform user\n emitter.emit('uploadError', { filename, error: error.message })\n emitter.emit('removeUpload', { filename })\n throwError({ ...MediaCloudErrors.TUS_UPLOAD_ERROR, cause: error })\n resolve(null)\n },\n onBeforeRequest() {\n if (!eventListenerAdded) {\n window.addEventListener('beforeunload', onBeforeUnload)\n window.addEventListener('unload', onPageUnload)\n eventListenerAdded = true\n }\n },\n onProgress: function (bytesUploaded, bytesTotal) {\n const percentage = Math.round((bytesUploaded / bytesTotal) * 100)\n emitter.emit('updateUpload', {\n filename,\n progress: percentage,\n })\n },\n async onSuccess() {\n // Clean up beforeunload listener\n window.removeEventListener('beforeunload', onBeforeUnload)\n window.removeEventListener('unload', onPageUnload)\n\n // Mark upload as complete in UI\n emitter.emit('uploadComplete', { filename })\n\n // Trigger post upload processing\n await fetch(`${endpoint}/${filename}/process`)\n\n // Move file to correct folder\n await fetch(`${endpoint}/${filename}/folder`)\n },\n onUploadUrlAvailable: async function () {\n // Prevent multiple callbacks\n if (uploadUrlAvailable) {\n return\n }\n\n // Update flag\n uploadUrlAvailable = true\n\n // Add upload to UI\n emitter.emit('addUpload', { filename })\n\n // Update collection entry\n // with filename, mimeType, and storage\n resolve({\n filename,\n mimeType,\n storage: 's3',\n })\n },\n })\n\n upload.start()\n })\n}\n\nconst { log } = useErrorHandler()\n\ninterface Extra {\n pluginOptions: MediaCloudPluginOptions\n}\n\ntype ClientUploadHandlerProps<T extends Record<string, unknown>> = {\n children: ReactNode\n collectionSlug: UploadCollectionSlug\n enabled?: boolean\n extra: T\n prefix?: string\n serverHandlerPath: `/${string}`\n}\n\nexport function UploadHandler(\n props: ClientUploadHandlerProps<{ pluginOptions: MediaCloudPluginOptions }>\n) {\n return createClientUploadHandler({\n handler: async function (args) {\n const { serverURL, apiRoute, file, prefix, updateFilename, extra } = args\n const { pluginOptions } = extra as unknown as Extra\n\n // Check mime type\n const mimeType = await getMimeType(file)\n\n magicError.assert(mimeType, MediaCloudErrors.FILE_TYPE_UNKNOWN)\n\n const allowedMimeTypes = pluginOptions.limits?.mimeTypes ?? []\n const mimeTypeMatches = allowedMimeTypes.some((allowed) =>\n allowed.endsWith('/*')\n ? mimeType?.startsWith(allowed.replace('/*', '/'))\n : mimeType === allowed\n )\n\n if (!mimeTypeMatches) {\n throwError(MediaCloudErrors.FILE_TYPE_NOT_ALLOWED)\n return null\n }\n\n // Check file size limit\n if (file.size > (pluginOptions.limits?.fileSize ?? Infinity)) {\n throwError(MediaCloudErrors.FILE_SIZE_EXCEEDED)\n return null\n }\n\n // Clone file\n let mappedFile = file\n\n try {\n // Check if file with same name exists\n const endpoint = `${serverURL}${apiRoute}/uploads`\n const response = await fetch(`${endpoint}/${file.name}/exists`)\n\n if (response?.status === 200) {\n log(MediaCloudLogs.S3_STORE_FILE_FOUND)\n }\n\n // If file exists, generate a cloned file with a unique filename\n // If not, generate a cloned file with a sanitized filename\n const newFilename =\n response?.status === 200\n ? generateUniqueFilename(file.name)\n : sanitizeFilename(file.name)\n\n mappedFile = new File([file], newFilename, {\n type: file.type,\n })\n\n await updateFilename(newFilename)\n } catch (error) {\n throwError({\n ...MediaCloudErrors.NAMING_FUNCTION_ERROR,\n cause: error,\n })\n return null\n }\n\n try {\n const uploadArgs: UploadArgs = {\n file: mappedFile,\n serverURL,\n apiRoute,\n mimeType,\n prefix,\n }\n\n // Check storage mapping for mime type\n type StorageMap = NonNullable<typeof pluginOptions.storage>\n\n const storageForMimeType =\n pluginOptions.storage &&\n Object.prototype.hasOwnProperty.call(pluginOptions.storage, mimeType)\n ? pluginOptions.storage[mimeType as keyof StorageMap]\n : undefined\n\n const isVideoFile = await isVideo(file)\n const storeOnMux =\n pluginOptions.storage?.['video/*'] === 'mux' ||\n storageForMimeType === 'mux'\n\n switch (true) {\n case storeOnMux && isVideoFile:\n return await muxUpload(uploadArgs)\n default:\n return await tusUpload(uploadArgs)\n }\n } catch (error) {\n throwError({ ...MediaCloudErrors.UPLOAD_HANDLER_ERROR, cause: error })\n return null\n }\n },\n })(props)\n}\n"],"mappings":"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"}