@kimjansheden/payload-video-processor 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/VideoField.cjs +94 -47
- package/dist/admin/VideoField.cjs.map +1 -1
- package/dist/admin/VideoField.d.cts +1 -1
- package/dist/admin/VideoField.d.ts +1 -1
- package/dist/admin/VideoField.js +94 -47
- package/dist/admin/VideoField.js.map +1 -1
- package/dist/admin/client.d.cts +1 -1
- package/dist/admin/client.d.ts +1 -1
- package/dist/exports/client.cjs +94 -47
- package/dist/exports/client.cjs.map +1 -1
- package/dist/exports/client.js +94 -47
- package/dist/exports/client.js.map +1 -1
- package/dist/index.cjs +191 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +191 -1
- package/dist/index.js.map +1 -1
- package/dist/{types-BjFcE25o.d.cts → types-DJGPSfvi.d.cts} +6 -1
- package/dist/{types-BjFcE25o.d.ts → types-DJGPSfvi.d.ts} +6 -1
- package/package.json +7 -6
package/dist/admin/VideoField.js
CHANGED
|
@@ -60,7 +60,7 @@ var formatSeconds = (value) => {
|
|
|
60
60
|
return `${minutes} min ${seconds}s`;
|
|
61
61
|
};
|
|
62
62
|
var VideoField = (props) => {
|
|
63
|
-
const { useEffect, useMemo, useState, useCallback } = React;
|
|
63
|
+
const { useEffect, useMemo, useState, useCallback, useRef } = React;
|
|
64
64
|
const { field } = props;
|
|
65
65
|
const { id } = useDocumentInfo();
|
|
66
66
|
const custom = field.custom ?? (isVideoVariantFieldConfig(props) ? props : void 0);
|
|
@@ -95,6 +95,7 @@ var VideoField = (props) => {
|
|
|
95
95
|
const [message, setMessage] = useState(null);
|
|
96
96
|
const [jobStatus, setJobStatus] = useState(null);
|
|
97
97
|
const [pollingJobId, setPollingJobId] = useState(null);
|
|
98
|
+
const [expectedPreset, setExpectedPreset] = useState(null);
|
|
98
99
|
const [variants, setVariants] = useState([]);
|
|
99
100
|
const [previewKey, setPreviewKey] = useState(null);
|
|
100
101
|
const [replaceLoading, setReplaceLoading] = useState(null);
|
|
@@ -102,6 +103,14 @@ var VideoField = (props) => {
|
|
|
102
103
|
const [cropState, setCropState] = useState({ x: 0, y: 0 });
|
|
103
104
|
const [zoom, setZoom] = useState(1);
|
|
104
105
|
const [cropSelection, setCropSelection] = useState(DEFAULT_CROP);
|
|
106
|
+
const expectedPresetRef = useRef(null);
|
|
107
|
+
const sleep = useCallback(
|
|
108
|
+
(ms) => new Promise((resolve) => setTimeout(resolve, ms)),
|
|
109
|
+
[]
|
|
110
|
+
);
|
|
111
|
+
useEffect(() => {
|
|
112
|
+
expectedPresetRef.current = expectedPreset;
|
|
113
|
+
}, [expectedPreset]);
|
|
105
114
|
const messageClassName = message?.type === "error" ? "bg-rose-50 text-rose-700" : message?.type === "info" ? "bg-slate-50 text-slate-700" : "bg-emerald-50 text-emerald-700";
|
|
106
115
|
const sendEnqueueRequest = useCallback(
|
|
107
116
|
async ({
|
|
@@ -115,6 +124,7 @@ var VideoField = (props) => {
|
|
|
115
124
|
const response = await fetch(custom.enqueuePath, {
|
|
116
125
|
method: "POST",
|
|
117
126
|
credentials: "include",
|
|
127
|
+
cache: "no-store",
|
|
118
128
|
headers: {
|
|
119
129
|
"Content-Type": "application/json"
|
|
120
130
|
},
|
|
@@ -148,6 +158,7 @@ var VideoField = (props) => {
|
|
|
148
158
|
const response = await fetch(custom.removeVariantPath, {
|
|
149
159
|
method: "POST",
|
|
150
160
|
credentials: "include",
|
|
161
|
+
cache: "no-store",
|
|
151
162
|
headers: {
|
|
152
163
|
"Content-Type": "application/json"
|
|
153
164
|
},
|
|
@@ -177,6 +188,7 @@ var VideoField = (props) => {
|
|
|
177
188
|
const response = await fetch(custom.replaceOriginalPath, {
|
|
178
189
|
method: "POST",
|
|
179
190
|
credentials: "include",
|
|
191
|
+
cache: "no-store",
|
|
180
192
|
headers: {
|
|
181
193
|
"Content-Type": "application/json"
|
|
182
194
|
},
|
|
@@ -333,56 +345,49 @@ var VideoField = (props) => {
|
|
|
333
345
|
setSelectedPreset(presetNames[0]);
|
|
334
346
|
}
|
|
335
347
|
}, [presetNames, selectedPreset]);
|
|
336
|
-
|
|
348
|
+
const fetchDocument = useCallback(async () => {
|
|
337
349
|
if (!docId || !custom) {
|
|
338
350
|
setDocData(null);
|
|
339
351
|
setVariants([]);
|
|
340
|
-
|
|
341
|
-
return;
|
|
352
|
+
return null;
|
|
342
353
|
}
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
{
|
|
352
|
-
credentials: "include"
|
|
353
|
-
}
|
|
354
|
-
);
|
|
355
|
-
if (!response.ok) {
|
|
356
|
-
throw new Error(`Failed to load document (${response.status})`);
|
|
357
|
-
}
|
|
358
|
-
const payload = await response.json();
|
|
359
|
-
if (!cancelled) {
|
|
360
|
-
const nextDoc = payload.doc ?? payload;
|
|
361
|
-
setDocData(nextDoc);
|
|
362
|
-
const docVariants = Array.isArray(nextDoc?.variants) ? nextDoc.variants : [];
|
|
363
|
-
setVariants(docVariants);
|
|
364
|
-
}
|
|
365
|
-
} catch (fetchError) {
|
|
366
|
-
if (!cancelled) {
|
|
367
|
-
setError(
|
|
368
|
-
fetchError instanceof Error ? fetchError.message : "Failed to load document data."
|
|
369
|
-
);
|
|
370
|
-
}
|
|
371
|
-
} finally {
|
|
372
|
-
if (!cancelled) {
|
|
373
|
-
setLoadingDoc(false);
|
|
354
|
+
try {
|
|
355
|
+
setLoadingDoc(true);
|
|
356
|
+
setError(null);
|
|
357
|
+
const response = await fetch(
|
|
358
|
+
`${apiBase}/${custom.collectionSlug}/${docId}?t=${Date.now()}`,
|
|
359
|
+
{
|
|
360
|
+
credentials: "include",
|
|
361
|
+
cache: "no-store"
|
|
374
362
|
}
|
|
363
|
+
);
|
|
364
|
+
if (!response.ok) {
|
|
365
|
+
throw new Error(`Failed to load document (${response.status})`);
|
|
375
366
|
}
|
|
376
|
-
|
|
367
|
+
const payload = await response.json();
|
|
368
|
+
const nextDoc = payload.doc ?? payload;
|
|
369
|
+
setDocData(nextDoc);
|
|
370
|
+
const docVariants = Array.isArray(nextDoc?.variants) ? nextDoc.variants : [];
|
|
371
|
+
setVariants(docVariants);
|
|
372
|
+
return { doc: nextDoc, variants: docVariants };
|
|
373
|
+
} catch (fetchError) {
|
|
374
|
+
setError(
|
|
375
|
+
fetchError instanceof Error ? fetchError.message : "Failed to load document data."
|
|
376
|
+
);
|
|
377
|
+
return null;
|
|
378
|
+
} finally {
|
|
379
|
+
setLoadingDoc(false);
|
|
380
|
+
}
|
|
381
|
+
}, [apiBase, custom, docId]);
|
|
382
|
+
useEffect(() => {
|
|
377
383
|
void fetchDocument();
|
|
378
|
-
|
|
379
|
-
cancelled = true;
|
|
380
|
-
};
|
|
381
|
-
}, [apiBase, custom, docId, jobStatus?.state]);
|
|
384
|
+
}, [fetchDocument, jobStatus?.state]);
|
|
382
385
|
const enqueue = useCallback(async () => {
|
|
383
386
|
if (!custom || !docId || !selectedPreset) return;
|
|
384
387
|
try {
|
|
385
388
|
setError(null);
|
|
389
|
+
setMessage(null);
|
|
390
|
+
setExpectedPreset(selectedPreset);
|
|
386
391
|
const allowCrop = Boolean(presets[selectedPreset]?.enableCrop);
|
|
387
392
|
const data = await sendEnqueueRequest({
|
|
388
393
|
documentId: docId,
|
|
@@ -407,16 +412,57 @@ var VideoField = (props) => {
|
|
|
407
412
|
useEffect(() => {
|
|
408
413
|
if (!pollingJobId || !custom) return;
|
|
409
414
|
let active = true;
|
|
415
|
+
const refreshAfterCompletion = async (jobId) => {
|
|
416
|
+
const presetToWaitFor = expectedPresetRef.current;
|
|
417
|
+
if (!presetToWaitFor) {
|
|
418
|
+
await fetchDocument();
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
const maxAttempts = 5;
|
|
422
|
+
for (let attempt = 0; attempt < maxAttempts && active; attempt += 1) {
|
|
423
|
+
const result = await fetchDocument();
|
|
424
|
+
const hasVariant = Boolean(
|
|
425
|
+
result?.variants?.some(
|
|
426
|
+
(variant) => readVariantPreset(variant) === presetToWaitFor
|
|
427
|
+
)
|
|
428
|
+
);
|
|
429
|
+
if (hasVariant) {
|
|
430
|
+
setExpectedPreset(null);
|
|
431
|
+
setJobStatus({ id: jobId, state: "completed", progress: 100 });
|
|
432
|
+
setMessage({
|
|
433
|
+
type: "success",
|
|
434
|
+
text: `Variant "${presetToWaitFor}" saved.`
|
|
435
|
+
});
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
await sleep(1e3);
|
|
439
|
+
}
|
|
440
|
+
if (active) {
|
|
441
|
+
setMessage({
|
|
442
|
+
type: "info",
|
|
443
|
+
text: `Job ${jobId} finished, but the new variant isn\u2019t visible yet. Try refreshing the page.`
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
};
|
|
410
447
|
const interval = window.setInterval(async () => {
|
|
411
448
|
try {
|
|
412
|
-
const response = await fetch(
|
|
413
|
-
|
|
414
|
-
|
|
449
|
+
const response = await fetch(
|
|
450
|
+
`${custom.statusPath}/${pollingJobId}?t=${Date.now()}`,
|
|
451
|
+
{
|
|
452
|
+
credentials: "include",
|
|
453
|
+
cache: "no-store"
|
|
454
|
+
}
|
|
455
|
+
);
|
|
415
456
|
if (!response.ok) {
|
|
416
457
|
if (response.status === 404) {
|
|
417
458
|
if (active) {
|
|
418
|
-
setJobStatus(
|
|
459
|
+
setJobStatus({ id: pollingJobId, state: "unknown" });
|
|
419
460
|
setPollingJobId(null);
|
|
461
|
+
setMessage({
|
|
462
|
+
type: "info",
|
|
463
|
+
text: `Job ${pollingJobId} status is no longer available. Refreshing variants\u2026`
|
|
464
|
+
});
|
|
465
|
+
void refreshAfterCompletion(pollingJobId);
|
|
420
466
|
}
|
|
421
467
|
return;
|
|
422
468
|
}
|
|
@@ -427,6 +473,7 @@ var VideoField = (props) => {
|
|
|
427
473
|
setJobStatus(payload);
|
|
428
474
|
if (payload.state === "completed" || payload.state === "failed") {
|
|
429
475
|
setPollingJobId(null);
|
|
476
|
+
void refreshAfterCompletion(String(payload.id));
|
|
430
477
|
}
|
|
431
478
|
}
|
|
432
479
|
} catch (statusError) {
|
|
@@ -442,7 +489,7 @@ var VideoField = (props) => {
|
|
|
442
489
|
active = false;
|
|
443
490
|
window.clearInterval(interval);
|
|
444
491
|
};
|
|
445
|
-
}, [custom, pollingJobId]);
|
|
492
|
+
}, [custom, fetchDocument, pollingJobId, sleep]);
|
|
446
493
|
const preset = selectedPreset ? presets[selectedPreset] : void 0;
|
|
447
494
|
const cropEnabled = Boolean(preset?.enableCrop);
|
|
448
495
|
useEffect(() => {
|
|
@@ -589,7 +636,7 @@ var VideoField = (props) => {
|
|
|
589
636
|
/* @__PURE__ */ jsx(
|
|
590
637
|
"button",
|
|
591
638
|
{
|
|
592
|
-
className: "rounded-lg bg-slate-900 px-4 py-2 text-sm font-semibold
|
|
639
|
+
className: "rounded-lg bg-slate-900 px-4 py-2 text-sm font-semibold disabled:cursor-not-allowed disabled:bg-slate-400",
|
|
593
640
|
type: "button",
|
|
594
641
|
disabled: !docId || !selectedPreset,
|
|
595
642
|
onClick: enqueue,
|
|
@@ -688,7 +735,7 @@ var VideoField = (props) => {
|
|
|
688
735
|
/* @__PURE__ */ jsx(
|
|
689
736
|
"button",
|
|
690
737
|
{
|
|
691
|
-
className: "rounded-lg bg-slate-900 px-3 py-1 text-xs font-semibold
|
|
738
|
+
className: "rounded-lg bg-slate-900 px-3 py-1 text-xs font-semibold disabled:cursor-not-allowed disabled:bg-slate-400",
|
|
692
739
|
type: "button",
|
|
693
740
|
onClick: () => void handleReplaceOriginalVariant(variant),
|
|
694
741
|
disabled: replacing || deleting,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/admin/VideoField.tsx"],"names":["preset"],"mappings":"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","file":"VideoField.js","sourcesContent":["\"use client\";\n\nimport React, { type FC } from \"react\";\nimport { useDocumentInfo } from \"@payloadcms/ui\";\n\nimport type { VariantRecord, VideoVariantFieldConfig } from \"../types\";\n\nif (typeof document !== \"undefined\") {\n void import(\"./styles.css\");\n}\n\ntype BridgeArgs = {\n mediaId: string;\n preset: string;\n crop?: Record<string, unknown>;\n};\n\ntype BridgeResult = {\n jobId: string;\n};\n\ntype RemoveVariantArgs = {\n mediaId: string;\n preset?: string;\n variantId?: string;\n variantIndex?: number;\n collection?: string;\n};\n\ntype ReplaceOriginalArgs = {\n mediaId: string;\n preset?: string;\n collection?: string;\n};\n\ntype BridgeConfig = {\n presets: string[];\n enqueueTranscode: (args: BridgeArgs) => Promise<BridgeResult>;\n removeVariant: (args: RemoveVariantArgs) => Promise<void>;\n replaceOriginal: (args: ReplaceOriginalArgs) => Promise<void>;\n};\n\ndeclare global {\n interface Window {\n __PAYLOAD_VIDEO_PLUGIN__?: BridgeConfig;\n }\n}\n\ntype JobStatus = {\n id: string | number;\n state: string;\n progress?: number;\n};\n\ntype FieldProps = {\n field: {\n label?: string;\n custom?: VideoVariantFieldConfig;\n };\n} & Partial<VideoVariantFieldConfig>;\n\nconst isVideoVariantFieldConfig = (\n value: unknown,\n): value is VideoVariantFieldConfig => {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as Record<string, unknown>;\n return (\n typeof candidate.enqueuePath === \"string\" &&\n typeof candidate.statusPath === \"string\" &&\n typeof candidate.replaceOriginalPath === \"string\" &&\n typeof candidate.removeVariantPath === \"string\" &&\n typeof candidate.collectionSlug === \"string\" &&\n typeof candidate.queueName === \"string\" &&\n Boolean(candidate.presets) &&\n typeof candidate.presets === \"object\"\n );\n};\n\nconst DEFAULT_CROP = {\n x: 0,\n y: 0,\n width: 1,\n height: 1,\n};\n\nconst resolveApiBase = (enqueuePath: string): string =>\n enqueuePath.replace(/\\/video-queue\\/enqueue$/, \"\");\n\nconst formatProgress = (value?: number): string => {\n if (typeof value !== \"number\") return \"0%\";\n return `${Math.round(value)}%`;\n};\n\nconst readVariantPreset = (variant: VariantRecord | null | undefined) => {\n if (!variant || typeof variant !== \"object\") return undefined;\n if (typeof variant.preset === \"string\" && variant.preset.trim().length > 0) {\n return variant.preset.trim();\n }\n return undefined;\n};\n\nconst readVariantId = (variant: VariantRecord | null | undefined) => {\n const rawId = (variant as { id?: unknown })?.id;\n if (typeof rawId === \"string\" && rawId.trim().length > 0) {\n return rawId.trim();\n }\n return undefined;\n};\n\nconst resolveVariantIdentifier = (\n variant: VariantRecord,\n fallback: string,\n): string => {\n return (\n readVariantId(variant) ??\n readVariantPreset(variant) ??\n fallback ??\n \"variant\"\n );\n};\n\nconst formatBytes = (value?: number): string => {\n if (!value || Number.isNaN(value)) return \"-\";\n const units = [\"B\", \"KB\", \"MB\", \"GB\"];\n let size = value;\n let unitIndex = 0;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex += 1;\n }\n return `${size.toFixed(1)} ${units[unitIndex]}`;\n};\n\nconst formatSeconds = (value?: number): string => {\n if (!value || Number.isNaN(value)) return \"-\";\n if (value < 60) {\n return `${value.toFixed(1)} s`;\n }\n const minutes = Math.floor(value / 60);\n const seconds = Math.round(value % 60);\n return `${minutes} min ${seconds}s`;\n};\n\nconst VideoField: FC<FieldProps> = (props) => {\n const { useEffect, useMemo, useState, useCallback } = React;\n const { field } = props;\n const { id } = useDocumentInfo();\n const custom =\n field.custom ?? (isVideoVariantFieldConfig(props) ? props : undefined);\n const presets = custom?.presets ?? {};\n const apiBase = useMemo(\n () => (custom ? resolveApiBase(custom.enqueuePath) : \"/api\"),\n [custom],\n );\n const presetNames = useMemo(() => Object.keys(presets), [presets]);\n const docId = useMemo(() => {\n if (typeof id === \"undefined\" || id === null) return null;\n const value = String(id);\n if (!value || value === \"create\") return null;\n return value;\n }, [id]);\n\n // Lazy load react-easy-crop to avoid SSR issues\n const [EasyCrop, setEasyCrop] = useState<FC<Record<string, unknown>> | null>(\n null,\n );\n\n useEffect(() => {\n if (typeof window !== \"undefined\" && !EasyCrop) {\n import(\"react-easy-crop\").then((module) => {\n setEasyCrop(() => module.default as any);\n });\n }\n }, [EasyCrop]);\n\n const [selectedPreset, setSelectedPreset] = useState<string | undefined>(\n presetNames[0],\n );\n const [docData, setDocData] = useState<any>(null);\n const [loadingDoc, setLoadingDoc] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [message, setMessage] = useState<{\n type: \"success\" | \"error\" | \"info\";\n text: string;\n } | null>(null);\n const [jobStatus, setJobStatus] = useState<JobStatus | null>(null);\n const [pollingJobId, setPollingJobId] = useState<string | null>(null);\n const [variants, setVariants] = useState<VariantRecord[]>([]);\n const [previewKey, setPreviewKey] = useState<string | null>(null);\n const [replaceLoading, setReplaceLoading] = useState<string | null>(null);\n const [deleteLoading, setDeleteLoading] = useState<string | null>(null);\n const [cropState, setCropState] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const [cropSelection, setCropSelection] = useState(DEFAULT_CROP);\n const messageClassName =\n message?.type === \"error\"\n ? \"bg-rose-50 text-rose-700\"\n : message?.type === \"info\"\n ? \"bg-slate-50 text-slate-700\"\n : \"bg-emerald-50 text-emerald-700\";\n\n const sendEnqueueRequest = useCallback(\n async ({\n documentId,\n presetName,\n crop,\n }: {\n documentId: string;\n presetName: string;\n crop?: Record<string, unknown>;\n }): Promise<JobStatus> => {\n if (!custom) {\n throw new Error(\"Video plugin is not configured.\");\n }\n\n const response = await fetch(custom.enqueuePath, {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n collection: custom.collectionSlug,\n id: documentId,\n preset: presetName,\n crop,\n }),\n });\n\n if (!response.ok) {\n const payload = await response.json().catch(() => ({}));\n throw new Error(\n payload?.error ?? `Request failed (${response.status})`,\n );\n }\n\n return (await response.json()) as JobStatus;\n },\n [custom],\n );\n\n const sendRemoveVariantRequest = useCallback(\n async ({\n documentId,\n preset,\n variantId,\n variantIndex,\n }: {\n documentId: string;\n preset?: string;\n variantId?: string;\n variantIndex?: number;\n }) => {\n if (!custom) {\n throw new Error(\"Video plugin is not configured.\");\n }\n\n const response = await fetch(custom.removeVariantPath, {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n collection: custom.collectionSlug,\n id: documentId,\n preset,\n variantId,\n variantIndex,\n }),\n });\n\n if (!response.ok) {\n const payload = await response.json().catch(() => ({}));\n throw new Error(\n payload?.error ?? `Request failed (${response.status})`,\n );\n }\n\n return (await response.json()) as { doc?: unknown };\n },\n [custom],\n );\n\n const sendReplaceOriginalRequest = useCallback(\n async ({ documentId, preset }: { documentId: string; preset?: string }) => {\n if (!custom) {\n throw new Error(\"Video plugin is not configured.\");\n }\n\n const response = await fetch(custom.replaceOriginalPath, {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n collection: custom.collectionSlug,\n id: documentId,\n preset,\n }),\n });\n\n if (!response.ok) {\n const payload = await response.json().catch(() => ({}));\n throw new Error(\n payload?.error ?? `Request failed (${response.status})`,\n );\n }\n\n return (await response.json()) as { doc?: unknown };\n },\n [custom],\n );\n\n const bridgeEnqueue = useCallback(\n async ({ mediaId, preset, crop }: BridgeArgs): Promise<BridgeResult> => {\n if (!mediaId) {\n throw new Error(\"A media id is required to enqueue transcoding.\");\n }\n\n if (!preset) {\n throw new Error(\"A preset name is required to enqueue transcoding.\");\n }\n\n const job = await sendEnqueueRequest({\n documentId: mediaId,\n presetName: preset,\n crop,\n });\n\n const jobId =\n typeof job.id === \"string\" || typeof job.id === \"number\"\n ? String(job.id)\n : \"\";\n\n if (!jobId) {\n throw new Error(\"Unable to determine job id returned by the server.\");\n }\n\n return { jobId };\n },\n [sendEnqueueRequest],\n );\n\n const bridgeRemoveVariant = useCallback(\n async ({\n mediaId,\n preset,\n variantId,\n variantIndex,\n }: RemoveVariantArgs): Promise<void> => {\n if (!mediaId) {\n throw new Error(\"A media id is required to remove a variant.\");\n }\n\n const payload = await sendRemoveVariantRequest({\n documentId: mediaId,\n preset,\n variantId,\n variantIndex,\n });\n\n if (docId === mediaId) {\n const nextDoc = (payload as any)?.doc;\n if (nextDoc && typeof nextDoc === \"object\") {\n setDocData(nextDoc);\n const docVariants = Array.isArray(nextDoc?.variants)\n ? (nextDoc.variants as VariantRecord[])\n : [];\n setVariants(docVariants);\n } else {\n setVariants((current) =>\n current.filter((variant, index) => {\n if (typeof variantIndex === \"number\" && variantIndex === index) {\n return false;\n }\n if (variantId && readVariantId(variant) === variantId) {\n return false;\n }\n if (preset && readVariantPreset(variant) === preset) {\n return false;\n }\n return true;\n }),\n );\n }\n }\n\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"payload-video-plugin:change\"));\n }\n },\n [docId, sendRemoveVariantRequest],\n );\n\n const bridgeReplaceOriginal = useCallback(\n async ({ mediaId, preset }: ReplaceOriginalArgs) => {\n if (!mediaId) {\n throw new Error(\"A media id is required to replace the original.\");\n }\n\n const payload = await sendReplaceOriginalRequest({\n documentId: mediaId,\n preset,\n });\n\n if (docId === mediaId) {\n const nextDoc = (payload as any)?.doc;\n if (nextDoc && typeof nextDoc === \"object\") {\n setDocData(nextDoc);\n const docVariants = Array.isArray(nextDoc?.variants)\n ? (nextDoc.variants as VariantRecord[])\n : [];\n setVariants(docVariants);\n }\n }\n\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"payload-video-plugin:change\"));\n }\n },\n [docId, sendReplaceOriginalRequest],\n );\n useEffect(() => {\n if (typeof window === \"undefined\" || !custom) {\n return;\n }\n\n const bridge: BridgeConfig = {\n presets: presetNames,\n enqueueTranscode: async (args) => {\n const cropArg = args.crop;\n const presetConfig = presets[args.preset];\n const allowCrop = Boolean(presetConfig?.enableCrop);\n return bridgeEnqueue({\n mediaId: args.mediaId,\n preset: args.preset,\n crop: allowCrop ? cropArg : undefined,\n });\n },\n removeVariant: async (args) =>\n bridgeRemoveVariant({\n mediaId: args.mediaId,\n preset: args.preset,\n variantId: args.variantId,\n variantIndex: args.variantIndex,\n }),\n replaceOriginal: async (args) =>\n bridgeReplaceOriginal({\n mediaId: args.mediaId,\n preset: args.preset,\n }),\n };\n\n window.__PAYLOAD_VIDEO_PLUGIN__ = bridge;\n window.dispatchEvent(new CustomEvent(\"payload-video-plugin:change\"));\n\n return () => {\n if (\n window.__PAYLOAD_VIDEO_PLUGIN__?.enqueueTranscode ===\n bridge.enqueueTranscode\n ) {\n delete window.__PAYLOAD_VIDEO_PLUGIN__;\n window.dispatchEvent(new CustomEvent(\"payload-video-plugin:change\"));\n }\n };\n }, [\n bridgeEnqueue,\n bridgeRemoveVariant,\n bridgeReplaceOriginal,\n custom,\n presetNames,\n presets,\n ]);\n\n useEffect(() => {\n if (presetNames.length > 0 && !selectedPreset) {\n setSelectedPreset(presetNames[0]);\n }\n }, [presetNames, selectedPreset]);\n\n useEffect(() => {\n if (!docId || !custom) {\n setDocData(null);\n setVariants([]);\n setMessage(null);\n return;\n }\n\n let cancelled = false;\n const fetchDocument = async () => {\n try {\n setLoadingDoc(true);\n setError(null);\n setMessage(null);\n const response = await fetch(\n `${apiBase}/${custom.collectionSlug}/${docId}`,\n {\n credentials: \"include\",\n },\n );\n if (!response.ok) {\n throw new Error(`Failed to load document (${response.status})`);\n }\n const payload = await response.json();\n if (!cancelled) {\n const nextDoc = (payload as any).doc ?? payload;\n setDocData(nextDoc);\n const docVariants = Array.isArray(nextDoc?.variants)\n ? (nextDoc.variants as VariantRecord[])\n : [];\n setVariants(docVariants);\n }\n } catch (fetchError) {\n if (!cancelled) {\n setError(\n fetchError instanceof Error\n ? fetchError.message\n : \"Failed to load document data.\",\n );\n }\n } finally {\n if (!cancelled) {\n setLoadingDoc(false);\n }\n }\n };\n\n void fetchDocument();\n return () => {\n cancelled = true;\n };\n }, [apiBase, custom, docId, jobStatus?.state]);\n\n const enqueue = useCallback(async () => {\n if (!custom || !docId || !selectedPreset) return;\n try {\n setError(null);\n const allowCrop = Boolean(presets[selectedPreset]?.enableCrop);\n const data = await sendEnqueueRequest({\n documentId: docId,\n presetName: selectedPreset,\n crop: allowCrop ? cropSelection : undefined,\n });\n setJobStatus(data);\n setPollingJobId(String(data.id));\n } catch (enqueueError) {\n setError(\n enqueueError instanceof Error\n ? enqueueError.message\n : \"Failed to enqueue job.\",\n );\n }\n }, [\n custom,\n cropSelection,\n docId,\n presets,\n selectedPreset,\n sendEnqueueRequest,\n ]);\n\n useEffect(() => {\n if (!pollingJobId || !custom) return;\n let active = true;\n const interval = window.setInterval(async () => {\n try {\n const response = await fetch(`${custom.statusPath}/${pollingJobId}`, {\n credentials: \"include\",\n });\n if (!response.ok) {\n if (response.status === 404) {\n if (active) {\n setJobStatus(null);\n setPollingJobId(null);\n }\n return;\n }\n throw new Error(`Status request failed (${response.status})`);\n }\n const payload = (await response.json()) as JobStatus;\n if (active) {\n setJobStatus(payload);\n if (payload.state === \"completed\" || payload.state === \"failed\") {\n setPollingJobId(null);\n }\n }\n } catch (statusError) {\n if (active) {\n setPollingJobId(null);\n setError(\n statusError instanceof Error\n ? statusError.message\n : \"Status polling failed.\",\n );\n }\n }\n }, 1500);\n\n return () => {\n active = false;\n window.clearInterval(interval);\n };\n }, [custom, pollingJobId]);\n\n const preset = selectedPreset ? presets[selectedPreset] : undefined;\n const cropEnabled = Boolean(preset?.enableCrop);\n\n useEffect(() => {\n if (!cropEnabled) {\n setCropSelection(DEFAULT_CROP);\n setCropState({ x: 0, y: 0 });\n setZoom(1);\n }\n }, [cropEnabled]);\n\n const handleCropComplete = useCallback(\n (area: { width: number; height: number; x: number; y: number }) => {\n setCropSelection({\n width: area.width / 100,\n height: area.height / 100,\n x: area.x / 100,\n y: area.y / 100,\n });\n },\n [],\n );\n\n const handleTogglePreview = useCallback((key: string) => {\n setPreviewKey((current) => (current === key ? null : key));\n }, []);\n\n const handleReplaceOriginalVariant = useCallback(\n async (variant: VariantRecord) => {\n if (!docId) {\n setError(\"Document id is missing; save before replacing the original.\");\n return;\n }\n\n const preset = readVariantPreset(variant);\n const identifier = resolveVariantIdentifier(variant, preset ?? \"variant\");\n\n if (typeof window !== \"undefined\") {\n const confirmation = window.confirm(\n `Replace the original file with variant \"${identifier}\"?`,\n );\n if (!confirmation) {\n return;\n }\n }\n\n setError(null);\n setMessage(null);\n setReplaceLoading(identifier);\n\n try {\n const payload = await sendReplaceOriginalRequest({\n documentId: docId,\n preset,\n });\n const updatedDoc = (payload as any)?.doc;\n if (updatedDoc && typeof updatedDoc === \"object\") {\n setDocData(updatedDoc);\n const docVariants = Array.isArray(updatedDoc?.variants)\n ? (updatedDoc.variants as VariantRecord[])\n : [];\n setVariants(docVariants);\n } else {\n setVariants((current) =>\n current.filter(\n (candidate) =>\n readVariantPreset(candidate) !== readVariantPreset(variant),\n ),\n );\n }\n setPreviewKey((current) => (current === identifier ? null : current));\n setMessage({ type: \"success\", text: \"Original video replaced.\" });\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"payload-video-plugin:change\"));\n }\n } catch (replaceError) {\n setError(\n replaceError instanceof Error\n ? replaceError.message\n : \"Failed to replace the original video.\",\n );\n } finally {\n setReplaceLoading(null);\n }\n },\n [docId, sendReplaceOriginalRequest],\n );\n\n const handleRemoveVariant = useCallback(\n async (variant: VariantRecord, index: number) => {\n if (!docId) {\n setError(\"Document id is missing; save before removing variants.\");\n return;\n }\n\n const fallbackIdentifier = `variant-${index + 1}`;\n const identifier = resolveVariantIdentifier(variant, fallbackIdentifier);\n\n if (typeof window !== \"undefined\") {\n const confirmation = window.confirm(\n `Remove variant \"${identifier}\"? This cannot be undone.`,\n );\n if (!confirmation) {\n return;\n }\n }\n\n setError(null);\n setMessage(null);\n setDeleteLoading(identifier);\n\n try {\n const payload = await sendRemoveVariantRequest({\n documentId: docId,\n preset: readVariantPreset(variant),\n variantId: readVariantId(variant),\n variantIndex: index,\n });\n const updatedDoc = (payload as any)?.doc;\n if (updatedDoc && typeof updatedDoc === \"object\") {\n setDocData(updatedDoc);\n const docVariants = Array.isArray(updatedDoc?.variants)\n ? (updatedDoc.variants as VariantRecord[])\n : [];\n setVariants(docVariants);\n } else {\n setVariants((current) =>\n current.filter(\n (_candidate, candidateIndex) => candidateIndex !== index,\n ),\n );\n }\n setPreviewKey((current) => (current === identifier ? null : current));\n setMessage({ type: \"success\", text: \"Variant removed.\" });\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"payload-video-plugin:change\"));\n }\n } catch (removeError) {\n setError(\n removeError instanceof Error\n ? removeError.message\n : \"Failed to remove variant.\",\n );\n } finally {\n setDeleteLoading(null);\n }\n },\n [docId, sendRemoveVariantRequest],\n );\n\n return (\n <div className=\"flex flex-col gap-4 rounded-xl border border-slate-200 bg-white/60 p-4 shadow-sm\">\n <div className=\"flex flex-col gap-2\">\n <span className=\"text-sm font-semibold text-slate-700\">\n {field.label ?? \"Video processor\"}\n </span>\n <div className=\"flex flex-wrap items-center gap-3\">\n <label className=\"flex flex-col text-xs font-medium text-slate-600\">\n Preset\n <select\n className=\"mt-1 w-48 rounded-lg border border-slate-300 bg-white px-2 py-1 text-sm focus:border-slate-500 focus:outline-none\"\n value={selectedPreset ?? \"\"}\n onChange={(event) => setSelectedPreset(event.target.value)}\n >\n {presetNames.map((name) => (\n <option key={name} value={name}>\n {presets[name]?.label ?? name}\n </option>\n ))}\n </select>\n </label>\n <button\n className=\"rounded-lg bg-slate-900 px-4 py-2 text-sm font-semibold text-white disabled:cursor-not-allowed disabled:bg-slate-400\"\n type=\"button\"\n disabled={!docId || !selectedPreset}\n onClick={enqueue}\n >\n Enqueue variant\n </button>\n {jobStatus ? (\n <span className=\"text-xs text-slate-600\">\n Job {jobStatus.id}: {jobStatus.state} ·{\" \"}\n {formatProgress(jobStatus.progress)}\n </span>\n ) : null}\n {custom?.queueName ? (\n <span className=\"text-xs text-slate-400\">\n Queue: {custom.queueName}\n </span>\n ) : null}\n </div>\n {!docId ? (\n <p className=\"rounded-lg bg-amber-50 px-3 py-2 text-xs text-amber-700\">\n Save the document before enqueuing video variants.\n </p>\n ) : null}\n {error ? (\n <p className=\"rounded-lg bg-rose-50 px-3 py-2 text-xs text-rose-700\">\n {error}\n </p>\n ) : null}\n {message ? (\n <p className={`rounded-lg px-3 py-2 text-xs ${messageClassName}`}>\n {message.text}\n </p>\n ) : null}\n </div>\n\n {cropEnabled && docData?.url ? (\n <div className=\"flex flex-col gap-3\">\n <span className=\"text-xs font-medium uppercase tracking-wide text-slate-500\">\n Crop\n </span>\n <div className=\"video-crop-wrapper\">\n {EasyCrop ? (\n <EasyCrop\n video={docData.url}\n crop={cropState}\n zoom={zoom}\n aspect={undefined}\n onCropChange={setCropState}\n onZoomChange={setZoom}\n onCropComplete={handleCropComplete}\n objectFit=\"contain\"\n showGrid\n />\n ) : (\n <div>Loading cropper...</div>\n )}\n </div>\n <label className=\"flex items-center gap-2 text-xs text-slate-600\">\n Zoom\n <input\n type=\"range\"\n min={1}\n max={3}\n step={0.1}\n value={zoom}\n onChange={(event) => setZoom(Number(event.target.value))}\n className=\"w-48\"\n />\n </label>\n </div>\n ) : null}\n\n <div className=\"flex flex-col gap-2 text-xs text-slate-600\">\n <span className=\"font-semibold uppercase tracking-wide text-slate-500\">\n Variants\n </span>\n {loadingDoc ? (\n <span className=\"text-xs text-slate-500\">\n Loading document metadata…\n </span>\n ) : null}\n {variants.length === 0 ? (\n <p className=\"rounded-lg bg-slate-100 px-3 py-2 text-xs text-slate-600\">\n No variants available yet. Enqueue a preset to generate a new\n version of the video.\n </p>\n ) : (\n <div className=\"flex flex-col gap-3\">\n {variants.map((variant, index) => {\n const presetName =\n readVariantPreset(variant) ?? `Variant ${index + 1}`;\n const identifier = resolveVariantIdentifier(\n variant,\n `variant-${index + 1}`,\n );\n const url =\n typeof variant.url === \"string\" ? variant.url : undefined;\n const previewing = previewKey === identifier;\n const replacing = replaceLoading === identifier;\n const deleting = deleteLoading === identifier;\n\n return (\n <div\n key={`${identifier}-${index}`}\n className=\"flex flex-col gap-2 rounded-lg border border-slate-200 bg-white px-3 py-2\"\n >\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-semibold text-slate-700\">\n {presetName}\n </span>\n <span className=\"text-xs text-slate-500\">\n {formatBytes(variant.size)} ·{\" \"}\n {formatSeconds(variant.duration)}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n {url ? (\n <button\n className=\"rounded-lg border border-slate-300 px-3 py-1 text-xs font-medium text-slate-700 transition hover:border-slate-400 hover:text-slate-900 disabled:cursor-not-allowed disabled:opacity-60\"\n type=\"button\"\n onClick={() => handleTogglePreview(identifier)}\n disabled={replacing || deleting}\n >\n {previewing ? \"Close preview\" : \"Preview\"}\n </button>\n ) : null}\n <button\n className=\"rounded-lg bg-slate-900 px-3 py-1 text-xs font-semibold text-white disabled:cursor-not-allowed disabled:bg-slate-400\"\n type=\"button\"\n onClick={() =>\n void handleReplaceOriginalVariant(variant)\n }\n disabled={replacing || deleting}\n >\n {replacing ? \"Replacing…\" : \"Replace original\"}\n </button>\n <button\n className=\"rounded-lg border border-rose-300 px-3 py-1 text-xs font-semibold text-rose-700 transition hover:border-rose-400 hover:text-rose-900 disabled:cursor-not-allowed disabled:opacity-60\"\n type=\"button\"\n onClick={() => void handleRemoveVariant(variant, index)}\n disabled={deleting || replacing}\n >\n {deleting ? \"Deleting…\" : \"Delete\"}\n </button>\n </div>\n </div>\n {previewing && url ? (\n <div className=\"overflow-hidden rounded-lg border border-slate-200\">\n <video\n className=\"w-full bg-black\"\n controls\n preload=\"metadata\"\n src={url}\n />\n </div>\n ) : null}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default VideoField;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/admin/VideoField.tsx"],"names":["preset"],"mappings":"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","file":"VideoField.js","sourcesContent":["\"use client\";\n\nimport React, { type FC } from \"react\";\nimport { useDocumentInfo } from \"@payloadcms/ui\";\n\nimport type { VariantRecord, VideoVariantFieldConfig } from \"../types\";\n\nif (typeof document !== \"undefined\") {\n void import(\"./styles.css\");\n}\n\ntype BridgeArgs = {\n mediaId: string;\n preset: string;\n crop?: Record<string, unknown>;\n};\n\ntype BridgeResult = {\n jobId: string;\n};\n\ntype RemoveVariantArgs = {\n mediaId: string;\n preset?: string;\n variantId?: string;\n variantIndex?: number;\n collection?: string;\n};\n\ntype ReplaceOriginalArgs = {\n mediaId: string;\n preset?: string;\n collection?: string;\n};\n\ntype BridgeConfig = {\n presets: string[];\n enqueueTranscode: (args: BridgeArgs) => Promise<BridgeResult>;\n removeVariant: (args: RemoveVariantArgs) => Promise<void>;\n replaceOriginal: (args: ReplaceOriginalArgs) => Promise<void>;\n};\n\ndeclare global {\n interface Window {\n __PAYLOAD_VIDEO_PLUGIN__?: BridgeConfig;\n }\n}\n\ntype JobStatus = {\n id: string | number;\n state: string;\n progress?: number;\n};\n\ntype FieldProps = {\n field: {\n label?: string;\n custom?: VideoVariantFieldConfig;\n };\n} & Partial<VideoVariantFieldConfig>;\n\nconst isVideoVariantFieldConfig = (\n value: unknown,\n): value is VideoVariantFieldConfig => {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as Record<string, unknown>;\n return (\n typeof candidate.enqueuePath === \"string\" &&\n typeof candidate.statusPath === \"string\" &&\n typeof candidate.replaceOriginalPath === \"string\" &&\n typeof candidate.removeVariantPath === \"string\" &&\n typeof candidate.collectionSlug === \"string\" &&\n typeof candidate.queueName === \"string\" &&\n Boolean(candidate.presets) &&\n typeof candidate.presets === \"object\"\n );\n};\n\nconst DEFAULT_CROP = {\n x: 0,\n y: 0,\n width: 1,\n height: 1,\n};\n\nconst resolveApiBase = (enqueuePath: string): string =>\n enqueuePath.replace(/\\/video-queue\\/enqueue$/, \"\");\n\nconst formatProgress = (value?: number): string => {\n if (typeof value !== \"number\") return \"0%\";\n return `${Math.round(value)}%`;\n};\n\nconst readVariantPreset = (variant: VariantRecord | null | undefined) => {\n if (!variant || typeof variant !== \"object\") return undefined;\n if (typeof variant.preset === \"string\" && variant.preset.trim().length > 0) {\n return variant.preset.trim();\n }\n return undefined;\n};\n\nconst readVariantId = (variant: VariantRecord | null | undefined) => {\n const rawId = (variant as { id?: unknown })?.id;\n if (typeof rawId === \"string\" && rawId.trim().length > 0) {\n return rawId.trim();\n }\n return undefined;\n};\n\nconst resolveVariantIdentifier = (\n variant: VariantRecord,\n fallback: string,\n): string => {\n return (\n readVariantId(variant) ??\n readVariantPreset(variant) ??\n fallback ??\n \"variant\"\n );\n};\n\nconst formatBytes = (value?: number): string => {\n if (!value || Number.isNaN(value)) return \"-\";\n const units = [\"B\", \"KB\", \"MB\", \"GB\"];\n let size = value;\n let unitIndex = 0;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex += 1;\n }\n return `${size.toFixed(1)} ${units[unitIndex]}`;\n};\n\nconst formatSeconds = (value?: number): string => {\n if (!value || Number.isNaN(value)) return \"-\";\n if (value < 60) {\n return `${value.toFixed(1)} s`;\n }\n const minutes = Math.floor(value / 60);\n const seconds = Math.round(value % 60);\n return `${minutes} min ${seconds}s`;\n};\n\nconst VideoField: FC<FieldProps> = (props) => {\n const { useEffect, useMemo, useState, useCallback, useRef } = React;\n const { field } = props;\n const { id } = useDocumentInfo();\n const custom =\n field.custom ?? (isVideoVariantFieldConfig(props) ? props : undefined);\n const presets = custom?.presets ?? {};\n const apiBase = useMemo(\n () => (custom ? resolveApiBase(custom.enqueuePath) : \"/api\"),\n [custom],\n );\n const presetNames = useMemo(() => Object.keys(presets), [presets]);\n const docId = useMemo(() => {\n if (typeof id === \"undefined\" || id === null) return null;\n const value = String(id);\n if (!value || value === \"create\") return null;\n return value;\n }, [id]);\n\n // Lazy load react-easy-crop to avoid SSR issues\n const [EasyCrop, setEasyCrop] = useState<FC<Record<string, unknown>> | null>(\n null,\n );\n\n useEffect(() => {\n if (typeof window !== \"undefined\" && !EasyCrop) {\n import(\"react-easy-crop\").then((module) => {\n setEasyCrop(() => module.default as any);\n });\n }\n }, [EasyCrop]);\n\n const [selectedPreset, setSelectedPreset] = useState<string | undefined>(\n presetNames[0],\n );\n const [docData, setDocData] = useState<any>(null);\n const [loadingDoc, setLoadingDoc] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [message, setMessage] = useState<{\n type: \"success\" | \"error\" | \"info\";\n text: string;\n } | null>(null);\n const [jobStatus, setJobStatus] = useState<JobStatus | null>(null);\n const [pollingJobId, setPollingJobId] = useState<string | null>(null);\n const [expectedPreset, setExpectedPreset] = useState<string | null>(null);\n const [variants, setVariants] = useState<VariantRecord[]>([]);\n const [previewKey, setPreviewKey] = useState<string | null>(null);\n const [replaceLoading, setReplaceLoading] = useState<string | null>(null);\n const [deleteLoading, setDeleteLoading] = useState<string | null>(null);\n const [cropState, setCropState] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const [cropSelection, setCropSelection] = useState(DEFAULT_CROP);\n const expectedPresetRef = useRef<string | null>(null);\n const sleep = useCallback(\n (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)),\n [],\n );\n\n useEffect(() => {\n expectedPresetRef.current = expectedPreset;\n }, [expectedPreset]);\n\n const messageClassName =\n message?.type === \"error\"\n ? \"bg-rose-50 text-rose-700\"\n : message?.type === \"info\"\n ? \"bg-slate-50 text-slate-700\"\n : \"bg-emerald-50 text-emerald-700\";\n\n const sendEnqueueRequest = useCallback(\n async ({\n documentId,\n presetName,\n crop,\n }: {\n documentId: string;\n presetName: string;\n crop?: Record<string, unknown>;\n }): Promise<JobStatus> => {\n if (!custom) {\n throw new Error(\"Video plugin is not configured.\");\n }\n\n const response = await fetch(custom.enqueuePath, {\n method: \"POST\",\n credentials: \"include\",\n cache: \"no-store\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n collection: custom.collectionSlug,\n id: documentId,\n preset: presetName,\n crop,\n }),\n });\n\n if (!response.ok) {\n const payload = await response.json().catch(() => ({}));\n throw new Error(\n payload?.error ?? `Request failed (${response.status})`,\n );\n }\n\n return (await response.json()) as JobStatus;\n },\n [custom],\n );\n\n const sendRemoveVariantRequest = useCallback(\n async ({\n documentId,\n preset,\n variantId,\n variantIndex,\n }: {\n documentId: string;\n preset?: string;\n variantId?: string;\n variantIndex?: number;\n }) => {\n if (!custom) {\n throw new Error(\"Video plugin is not configured.\");\n }\n\n const response = await fetch(custom.removeVariantPath, {\n method: \"POST\",\n credentials: \"include\",\n cache: \"no-store\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n collection: custom.collectionSlug,\n id: documentId,\n preset,\n variantId,\n variantIndex,\n }),\n });\n\n if (!response.ok) {\n const payload = await response.json().catch(() => ({}));\n throw new Error(\n payload?.error ?? `Request failed (${response.status})`,\n );\n }\n\n return (await response.json()) as { doc?: unknown };\n },\n [custom],\n );\n\n const sendReplaceOriginalRequest = useCallback(\n async ({ documentId, preset }: { documentId: string; preset?: string }) => {\n if (!custom) {\n throw new Error(\"Video plugin is not configured.\");\n }\n\n const response = await fetch(custom.replaceOriginalPath, {\n method: \"POST\",\n credentials: \"include\",\n cache: \"no-store\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n collection: custom.collectionSlug,\n id: documentId,\n preset,\n }),\n });\n\n if (!response.ok) {\n const payload = await response.json().catch(() => ({}));\n throw new Error(\n payload?.error ?? `Request failed (${response.status})`,\n );\n }\n\n return (await response.json()) as { doc?: unknown };\n },\n [custom],\n );\n\n const bridgeEnqueue = useCallback(\n async ({ mediaId, preset, crop }: BridgeArgs): Promise<BridgeResult> => {\n if (!mediaId) {\n throw new Error(\"A media id is required to enqueue transcoding.\");\n }\n\n if (!preset) {\n throw new Error(\"A preset name is required to enqueue transcoding.\");\n }\n\n const job = await sendEnqueueRequest({\n documentId: mediaId,\n presetName: preset,\n crop,\n });\n\n const jobId =\n typeof job.id === \"string\" || typeof job.id === \"number\"\n ? String(job.id)\n : \"\";\n\n if (!jobId) {\n throw new Error(\"Unable to determine job id returned by the server.\");\n }\n\n return { jobId };\n },\n [sendEnqueueRequest],\n );\n\n const bridgeRemoveVariant = useCallback(\n async ({\n mediaId,\n preset,\n variantId,\n variantIndex,\n }: RemoveVariantArgs): Promise<void> => {\n if (!mediaId) {\n throw new Error(\"A media id is required to remove a variant.\");\n }\n\n const payload = await sendRemoveVariantRequest({\n documentId: mediaId,\n preset,\n variantId,\n variantIndex,\n });\n\n if (docId === mediaId) {\n const nextDoc = (payload as any)?.doc;\n if (nextDoc && typeof nextDoc === \"object\") {\n setDocData(nextDoc);\n const docVariants = Array.isArray(nextDoc?.variants)\n ? (nextDoc.variants as VariantRecord[])\n : [];\n setVariants(docVariants);\n } else {\n setVariants((current) =>\n current.filter((variant, index) => {\n if (typeof variantIndex === \"number\" && variantIndex === index) {\n return false;\n }\n if (variantId && readVariantId(variant) === variantId) {\n return false;\n }\n if (preset && readVariantPreset(variant) === preset) {\n return false;\n }\n return true;\n }),\n );\n }\n }\n\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"payload-video-plugin:change\"));\n }\n },\n [docId, sendRemoveVariantRequest],\n );\n\n const bridgeReplaceOriginal = useCallback(\n async ({ mediaId, preset }: ReplaceOriginalArgs) => {\n if (!mediaId) {\n throw new Error(\"A media id is required to replace the original.\");\n }\n\n const payload = await sendReplaceOriginalRequest({\n documentId: mediaId,\n preset,\n });\n\n if (docId === mediaId) {\n const nextDoc = (payload as any)?.doc;\n if (nextDoc && typeof nextDoc === \"object\") {\n setDocData(nextDoc);\n const docVariants = Array.isArray(nextDoc?.variants)\n ? (nextDoc.variants as VariantRecord[])\n : [];\n setVariants(docVariants);\n }\n }\n\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"payload-video-plugin:change\"));\n }\n },\n [docId, sendReplaceOriginalRequest],\n );\n useEffect(() => {\n if (typeof window === \"undefined\" || !custom) {\n return;\n }\n\n const bridge: BridgeConfig = {\n presets: presetNames,\n enqueueTranscode: async (args) => {\n const cropArg = args.crop;\n const presetConfig = presets[args.preset];\n const allowCrop = Boolean(presetConfig?.enableCrop);\n return bridgeEnqueue({\n mediaId: args.mediaId,\n preset: args.preset,\n crop: allowCrop ? cropArg : undefined,\n });\n },\n removeVariant: async (args) =>\n bridgeRemoveVariant({\n mediaId: args.mediaId,\n preset: args.preset,\n variantId: args.variantId,\n variantIndex: args.variantIndex,\n }),\n replaceOriginal: async (args) =>\n bridgeReplaceOriginal({\n mediaId: args.mediaId,\n preset: args.preset,\n }),\n };\n\n window.__PAYLOAD_VIDEO_PLUGIN__ = bridge;\n window.dispatchEvent(new CustomEvent(\"payload-video-plugin:change\"));\n\n return () => {\n if (\n window.__PAYLOAD_VIDEO_PLUGIN__?.enqueueTranscode ===\n bridge.enqueueTranscode\n ) {\n delete window.__PAYLOAD_VIDEO_PLUGIN__;\n window.dispatchEvent(new CustomEvent(\"payload-video-plugin:change\"));\n }\n };\n }, [\n bridgeEnqueue,\n bridgeRemoveVariant,\n bridgeReplaceOriginal,\n custom,\n presetNames,\n presets,\n ]);\n\n useEffect(() => {\n if (presetNames.length > 0 && !selectedPreset) {\n setSelectedPreset(presetNames[0]);\n }\n }, [presetNames, selectedPreset]);\n\n const fetchDocument = useCallback(async () => {\n if (!docId || !custom) {\n setDocData(null);\n setVariants([]);\n return null;\n }\n\n try {\n setLoadingDoc(true);\n setError(null);\n\n const response = await fetch(\n `${apiBase}/${custom.collectionSlug}/${docId}?t=${Date.now()}`,\n {\n credentials: \"include\",\n cache: \"no-store\",\n },\n );\n if (!response.ok) {\n throw new Error(`Failed to load document (${response.status})`);\n }\n\n const payload = await response.json();\n const nextDoc = (payload as any).doc ?? payload;\n setDocData(nextDoc);\n\n const docVariants = Array.isArray(nextDoc?.variants)\n ? (nextDoc.variants as VariantRecord[])\n : [];\n setVariants(docVariants);\n\n return { doc: nextDoc as any, variants: docVariants };\n } catch (fetchError) {\n setError(\n fetchError instanceof Error\n ? fetchError.message\n : \"Failed to load document data.\",\n );\n return null;\n } finally {\n setLoadingDoc(false);\n }\n }, [apiBase, custom, docId]);\n\n useEffect(() => {\n void fetchDocument();\n }, [fetchDocument, jobStatus?.state]);\n\n const enqueue = useCallback(async () => {\n if (!custom || !docId || !selectedPreset) return;\n try {\n setError(null);\n setMessage(null);\n setExpectedPreset(selectedPreset);\n const allowCrop = Boolean(presets[selectedPreset]?.enableCrop);\n const data = await sendEnqueueRequest({\n documentId: docId,\n presetName: selectedPreset,\n crop: allowCrop ? cropSelection : undefined,\n });\n setJobStatus(data);\n setPollingJobId(String(data.id));\n } catch (enqueueError) {\n setError(\n enqueueError instanceof Error\n ? enqueueError.message\n : \"Failed to enqueue job.\",\n );\n }\n }, [\n custom,\n cropSelection,\n docId,\n presets,\n selectedPreset,\n sendEnqueueRequest,\n ]);\n\n useEffect(() => {\n if (!pollingJobId || !custom) return;\n let active = true;\n\n const refreshAfterCompletion = async (jobId: string) => {\n const presetToWaitFor = expectedPresetRef.current;\n if (!presetToWaitFor) {\n await fetchDocument();\n return;\n }\n\n const maxAttempts = 5;\n for (let attempt = 0; attempt < maxAttempts && active; attempt += 1) {\n const result = await fetchDocument();\n const hasVariant = Boolean(\n result?.variants?.some(\n (variant) => readVariantPreset(variant) === presetToWaitFor,\n ),\n );\n if (hasVariant) {\n setExpectedPreset(null);\n setJobStatus({ id: jobId, state: \"completed\", progress: 100 });\n setMessage({\n type: \"success\",\n text: `Variant \\\"${presetToWaitFor}\\\" saved.`,\n });\n return;\n }\n await sleep(1000);\n }\n\n if (active) {\n setMessage({\n type: \"info\",\n text: `Job ${jobId} finished, but the new variant isn’t visible yet. Try refreshing the page.`,\n });\n }\n };\n\n const interval = window.setInterval(async () => {\n try {\n const response = await fetch(\n `${custom.statusPath}/${pollingJobId}?t=${Date.now()}`,\n {\n credentials: \"include\",\n cache: \"no-store\",\n },\n );\n if (!response.ok) {\n if (response.status === 404) {\n if (active) {\n setJobStatus({ id: pollingJobId, state: \"unknown\" });\n setPollingJobId(null);\n setMessage({\n type: \"info\",\n text: `Job ${pollingJobId} status is no longer available. Refreshing variants…`,\n });\n void refreshAfterCompletion(pollingJobId);\n }\n return;\n }\n throw new Error(`Status request failed (${response.status})`);\n }\n const payload = (await response.json()) as JobStatus;\n if (active) {\n setJobStatus(payload);\n if (payload.state === \"completed\" || payload.state === \"failed\") {\n setPollingJobId(null);\n void refreshAfterCompletion(String(payload.id));\n }\n }\n } catch (statusError) {\n if (active) {\n setPollingJobId(null);\n setError(\n statusError instanceof Error\n ? statusError.message\n : \"Status polling failed.\",\n );\n }\n }\n }, 1500);\n\n return () => {\n active = false;\n window.clearInterval(interval);\n };\n }, [custom, fetchDocument, pollingJobId, sleep]);\n\n const preset = selectedPreset ? presets[selectedPreset] : undefined;\n const cropEnabled = Boolean(preset?.enableCrop);\n\n useEffect(() => {\n if (!cropEnabled) {\n setCropSelection(DEFAULT_CROP);\n setCropState({ x: 0, y: 0 });\n setZoom(1);\n }\n }, [cropEnabled]);\n\n const handleCropComplete = useCallback(\n (area: { width: number; height: number; x: number; y: number }) => {\n setCropSelection({\n width: area.width / 100,\n height: area.height / 100,\n x: area.x / 100,\n y: area.y / 100,\n });\n },\n [],\n );\n\n const handleTogglePreview = useCallback((key: string) => {\n setPreviewKey((current) => (current === key ? null : key));\n }, []);\n\n const handleReplaceOriginalVariant = useCallback(\n async (variant: VariantRecord) => {\n if (!docId) {\n setError(\"Document id is missing; save before replacing the original.\");\n return;\n }\n\n const preset = readVariantPreset(variant);\n const identifier = resolveVariantIdentifier(variant, preset ?? \"variant\");\n\n if (typeof window !== \"undefined\") {\n const confirmation = window.confirm(\n `Replace the original file with variant \"${identifier}\"?`,\n );\n if (!confirmation) {\n return;\n }\n }\n\n setError(null);\n setMessage(null);\n setReplaceLoading(identifier);\n\n try {\n const payload = await sendReplaceOriginalRequest({\n documentId: docId,\n preset,\n });\n const updatedDoc = (payload as any)?.doc;\n if (updatedDoc && typeof updatedDoc === \"object\") {\n setDocData(updatedDoc);\n const docVariants = Array.isArray(updatedDoc?.variants)\n ? (updatedDoc.variants as VariantRecord[])\n : [];\n setVariants(docVariants);\n } else {\n setVariants((current) =>\n current.filter(\n (candidate) =>\n readVariantPreset(candidate) !== readVariantPreset(variant),\n ),\n );\n }\n setPreviewKey((current) => (current === identifier ? null : current));\n setMessage({ type: \"success\", text: \"Original video replaced.\" });\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"payload-video-plugin:change\"));\n }\n } catch (replaceError) {\n setError(\n replaceError instanceof Error\n ? replaceError.message\n : \"Failed to replace the original video.\",\n );\n } finally {\n setReplaceLoading(null);\n }\n },\n [docId, sendReplaceOriginalRequest],\n );\n\n const handleRemoveVariant = useCallback(\n async (variant: VariantRecord, index: number) => {\n if (!docId) {\n setError(\"Document id is missing; save before removing variants.\");\n return;\n }\n\n const fallbackIdentifier = `variant-${index + 1}`;\n const identifier = resolveVariantIdentifier(variant, fallbackIdentifier);\n\n if (typeof window !== \"undefined\") {\n const confirmation = window.confirm(\n `Remove variant \"${identifier}\"? This cannot be undone.`,\n );\n if (!confirmation) {\n return;\n }\n }\n\n setError(null);\n setMessage(null);\n setDeleteLoading(identifier);\n\n try {\n const payload = await sendRemoveVariantRequest({\n documentId: docId,\n preset: readVariantPreset(variant),\n variantId: readVariantId(variant),\n variantIndex: index,\n });\n const updatedDoc = (payload as any)?.doc;\n if (updatedDoc && typeof updatedDoc === \"object\") {\n setDocData(updatedDoc);\n const docVariants = Array.isArray(updatedDoc?.variants)\n ? (updatedDoc.variants as VariantRecord[])\n : [];\n setVariants(docVariants);\n } else {\n setVariants((current) =>\n current.filter(\n (_candidate, candidateIndex) => candidateIndex !== index,\n ),\n );\n }\n setPreviewKey((current) => (current === identifier ? null : current));\n setMessage({ type: \"success\", text: \"Variant removed.\" });\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"payload-video-plugin:change\"));\n }\n } catch (removeError) {\n setError(\n removeError instanceof Error\n ? removeError.message\n : \"Failed to remove variant.\",\n );\n } finally {\n setDeleteLoading(null);\n }\n },\n [docId, sendRemoveVariantRequest],\n );\n\n return (\n <div className=\"flex flex-col gap-4 rounded-xl border border-slate-200 bg-white/60 p-4 shadow-sm\">\n <div className=\"flex flex-col gap-2\">\n <span className=\"text-sm font-semibold text-slate-700\">\n {field.label ?? \"Video processor\"}\n </span>\n <div className=\"flex flex-wrap items-center gap-3\">\n <label className=\"flex flex-col text-xs font-medium text-slate-600\">\n Preset\n <select\n className=\"mt-1 w-48 rounded-lg border border-slate-300 bg-white px-2 py-1 text-sm focus:border-slate-500 focus:outline-none\"\n value={selectedPreset ?? \"\"}\n onChange={(event) => setSelectedPreset(event.target.value)}\n >\n {presetNames.map((name) => (\n <option key={name} value={name}>\n {presets[name]?.label ?? name}\n </option>\n ))}\n </select>\n </label>\n <button\n className=\"rounded-lg bg-slate-900 px-4 py-2 text-sm font-semibold disabled:cursor-not-allowed disabled:bg-slate-400\"\n type=\"button\"\n disabled={!docId || !selectedPreset}\n onClick={enqueue}\n >\n Enqueue variant\n </button>\n {jobStatus ? (\n <span className=\"text-xs text-slate-600\">\n Job {jobStatus.id}: {jobStatus.state} ·{\" \"}\n {formatProgress(jobStatus.progress)}\n </span>\n ) : null}\n {custom?.queueName ? (\n <span className=\"text-xs text-slate-400\">\n Queue: {custom.queueName}\n </span>\n ) : null}\n </div>\n {!docId ? (\n <p className=\"rounded-lg bg-amber-50 px-3 py-2 text-xs text-amber-700\">\n Save the document before enqueuing video variants.\n </p>\n ) : null}\n {error ? (\n <p className=\"rounded-lg bg-rose-50 px-3 py-2 text-xs text-rose-700\">\n {error}\n </p>\n ) : null}\n {message ? (\n <p className={`rounded-lg px-3 py-2 text-xs ${messageClassName}`}>\n {message.text}\n </p>\n ) : null}\n </div>\n\n {cropEnabled && docData?.url ? (\n <div className=\"flex flex-col gap-3\">\n <span className=\"text-xs font-medium uppercase tracking-wide text-slate-500\">\n Crop\n </span>\n <div className=\"video-crop-wrapper\">\n {EasyCrop ? (\n <EasyCrop\n video={docData.url}\n crop={cropState}\n zoom={zoom}\n aspect={undefined}\n onCropChange={setCropState}\n onZoomChange={setZoom}\n onCropComplete={handleCropComplete}\n objectFit=\"contain\"\n showGrid\n />\n ) : (\n <div>Loading cropper...</div>\n )}\n </div>\n <label className=\"flex items-center gap-2 text-xs text-slate-600\">\n Zoom\n <input\n type=\"range\"\n min={1}\n max={3}\n step={0.1}\n value={zoom}\n onChange={(event) => setZoom(Number(event.target.value))}\n className=\"w-48\"\n />\n </label>\n </div>\n ) : null}\n\n <div className=\"flex flex-col gap-2 text-xs text-slate-600\">\n <span className=\"font-semibold uppercase tracking-wide text-slate-500\">\n Variants\n </span>\n {loadingDoc ? (\n <span className=\"text-xs text-slate-500\">\n Loading document metadata…\n </span>\n ) : null}\n {variants.length === 0 ? (\n <p className=\"rounded-lg bg-slate-100 px-3 py-2 text-xs text-slate-600\">\n No variants available yet. Enqueue a preset to generate a new\n version of the video.\n </p>\n ) : (\n <div className=\"flex flex-col gap-3\">\n {variants.map((variant, index) => {\n const presetName =\n readVariantPreset(variant) ?? `Variant ${index + 1}`;\n const identifier = resolveVariantIdentifier(\n variant,\n `variant-${index + 1}`,\n );\n const url =\n typeof variant.url === \"string\" ? variant.url : undefined;\n const previewing = previewKey === identifier;\n const replacing = replaceLoading === identifier;\n const deleting = deleteLoading === identifier;\n\n return (\n <div\n key={`${identifier}-${index}`}\n className=\"flex flex-col gap-2 rounded-lg border border-slate-200 bg-white px-3 py-2\"\n >\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-semibold text-slate-700\">\n {presetName}\n </span>\n <span className=\"text-xs text-slate-500\">\n {formatBytes(variant.size)} ·{\" \"}\n {formatSeconds(variant.duration)}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n {url ? (\n <button\n className=\"rounded-lg border border-slate-300 px-3 py-1 text-xs font-medium text-slate-700 transition hover:border-slate-400 hover:text-slate-900 disabled:cursor-not-allowed disabled:opacity-60\"\n type=\"button\"\n onClick={() => handleTogglePreview(identifier)}\n disabled={replacing || deleting}\n >\n {previewing ? \"Close preview\" : \"Preview\"}\n </button>\n ) : null}\n <button\n className=\"rounded-lg bg-slate-900 px-3 py-1 text-xs font-semibold disabled:cursor-not-allowed disabled:bg-slate-400\"\n type=\"button\"\n onClick={() =>\n void handleReplaceOriginalVariant(variant)\n }\n disabled={replacing || deleting}\n >\n {replacing ? \"Replacing…\" : \"Replace original\"}\n </button>\n <button\n className=\"rounded-lg border border-rose-300 px-3 py-1 text-xs font-semibold text-rose-700 transition hover:border-rose-400 hover:text-rose-900 disabled:cursor-not-allowed disabled:opacity-60\"\n type=\"button\"\n onClick={() => void handleRemoveVariant(variant, index)}\n disabled={deleting || replacing}\n >\n {deleting ? \"Deleting…\" : \"Delete\"}\n </button>\n </div>\n </div>\n {previewing && url ? (\n <div className=\"overflow-hidden rounded-lg border border-slate-200\">\n <video\n className=\"w-full bg-black\"\n controls\n preload=\"metadata\"\n src={url}\n />\n </div>\n ) : null}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default VideoField;\n"]}
|
package/dist/admin/client.d.cts
CHANGED
package/dist/admin/client.d.ts
CHANGED