@kimjansheden/payload-video-processor 0.1.13 → 0.1.14
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/README.md +53 -3
- package/dist/admin/VideoField.cjs +73 -7
- 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 +73 -7
- 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/cli/start-worker.cjs.map +1 -1
- package/dist/cli/start-worker.js.map +1 -1
- package/dist/exports/client.cjs +73 -7
- package/dist/exports/client.cjs.map +1 -1
- package/dist/exports/client.js +73 -7
- package/dist/exports/client.js.map +1 -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.map +1 -1
- package/dist/queue/worker.cjs.map +1 -1
- package/dist/queue/worker.js.map +1 -1
- package/dist/{types-B1B4hTX_.d.cts → types-BMErp-xu.d.cts} +51 -1
- package/dist/{types-B1B4hTX_.d.ts → types-BMErp-xu.d.ts} +51 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -73,7 +73,57 @@ tries a preset named `1080`, then `hd1080`, and finally falls back to the first
|
|
|
73
73
|
configured preset.
|
|
74
74
|
Set `autoEnqueuePreset` to force a specific preset name when auto-enqueueing.
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
### Type-safe presets (TypeScript)
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
import videoPlugin, { type VideoPluginOptions } from "@kimjansheden/payload-video-processor";
|
|
80
|
+
|
|
81
|
+
const presets = {
|
|
82
|
+
mobile360: { label: "360p Mobile", args: ["-vf", "scale=-2:360"] },
|
|
83
|
+
hd1080: { label: "Full HD 1080p", args: ["-vf", "scale=-2:1080"] },
|
|
84
|
+
} as const;
|
|
85
|
+
|
|
86
|
+
type PresetName = keyof typeof presets;
|
|
87
|
+
|
|
88
|
+
const options: VideoPluginOptions<PresetName> = {
|
|
89
|
+
presets,
|
|
90
|
+
queue: { redisUrl: process.env.REDIS_URL, concurrency: 1 },
|
|
91
|
+
autoEnqueue: true,
|
|
92
|
+
autoEnqueuePreset: "hd1080",
|
|
93
|
+
autoReplaceOriginal: true,
|
|
94
|
+
};
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Import patterns
|
|
98
|
+
|
|
99
|
+
ESM:
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
import videoPlugin from "@kimjansheden/payload-video-processor";
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
CommonJS:
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
const videoPlugin = require("@kimjansheden/payload-video-processor").default;
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
For the worker options module, either export default (ESM) or use
|
|
112
|
+
`module.exports = options` (CommonJS), then point the CLI at the built file.
|
|
113
|
+
|
|
114
|
+
### Options reference
|
|
115
|
+
|
|
116
|
+
| Option | Type | Notes |
|
|
117
|
+
| --- | --- | --- |
|
|
118
|
+
| `presets` | `Record<string, Preset>` | Required. Keys become preset names. |
|
|
119
|
+
| `queue` | `QueueConfig` | Optional queue name/redis URL/concurrency. |
|
|
120
|
+
| `autoEnqueue` | `boolean` | `true` uses `autoEnqueuePreset` or the default fallback. |
|
|
121
|
+
| `autoEnqueuePreset` | `string` | Must match a preset key, not the label. |
|
|
122
|
+
| `autoReplaceOriginal` | `boolean` | Only applies to auto-enqueued jobs. |
|
|
123
|
+
| `access` | `AccessControl` | Optional access control hooks. |
|
|
124
|
+
| `resolvePaths` | `(args) => ResolvePathsResult` | Override output directory/filename/URL. |
|
|
125
|
+
|
|
126
|
+
1. Provide a worker options module and bundle it to JS (the CLI needs a JS file).
|
|
77
127
|
Example setup:
|
|
78
128
|
|
|
79
129
|
```ts
|
|
@@ -85,7 +135,7 @@ export default videoOptions;
|
|
|
85
135
|
tsup src/videoPluginOptions.ts --format esm --platform node --target es2022 --out-dir dist-config --minify
|
|
86
136
|
```
|
|
87
137
|
|
|
88
|
-
|
|
138
|
+
1. Start a worker in a separate process:
|
|
89
139
|
|
|
90
140
|
```bash
|
|
91
141
|
payload-video-worker \
|
|
@@ -105,7 +155,7 @@ point to project-specific files.
|
|
|
105
155
|
Prefer a fully programmatic setup? Import `createWorker` directly and pass the
|
|
106
156
|
same options object you provide to the plugin.
|
|
107
157
|
|
|
108
|
-
|
|
158
|
+
1. In the Admin UI a "Video processing" panel appears on any upload collection
|
|
109
159
|
that accepts `video/*` mime types. Editors can enqueue presets, preview
|
|
110
160
|
variants, replace the original file with a processed version, or delete
|
|
111
161
|
unwanted variants without writing custom endpoints.
|
|
@@ -50,6 +50,33 @@ var readVariantId = (variant) => {
|
|
|
50
50
|
}
|
|
51
51
|
return void 0;
|
|
52
52
|
};
|
|
53
|
+
var readVariantUrl = (variant) => {
|
|
54
|
+
if (!variant || typeof variant !== "object") return void 0;
|
|
55
|
+
if (typeof variant.url === "string" && variant.url.trim().length > 0) {
|
|
56
|
+
return variant.url.trim();
|
|
57
|
+
}
|
|
58
|
+
return void 0;
|
|
59
|
+
};
|
|
60
|
+
var resolvePreviewVideoUrl = (doc) => {
|
|
61
|
+
if (!doc) return void 0;
|
|
62
|
+
const variants = Array.isArray(doc.variants) ? doc.variants : [];
|
|
63
|
+
const candidates = variants.map((variant) => ({
|
|
64
|
+
url: readVariantUrl(variant),
|
|
65
|
+
size: typeof variant.size === "number" ? variant.size : void 0
|
|
66
|
+
})).filter(
|
|
67
|
+
(candidate) => Boolean(candidate.url)
|
|
68
|
+
);
|
|
69
|
+
if (candidates.length > 0) {
|
|
70
|
+
candidates.sort(
|
|
71
|
+
(left, right) => (left.size ?? Number.POSITIVE_INFINITY) - (right.size ?? Number.POSITIVE_INFINITY)
|
|
72
|
+
);
|
|
73
|
+
return candidates[0].url;
|
|
74
|
+
}
|
|
75
|
+
if (typeof doc.url === "string" && doc.url.trim().length > 0) {
|
|
76
|
+
return doc.url.trim();
|
|
77
|
+
}
|
|
78
|
+
return void 0;
|
|
79
|
+
};
|
|
53
80
|
var resolveVariantIdentifier = (variant, fallback) => {
|
|
54
81
|
return readVariantId(variant) ?? readVariantPreset(variant) ?? fallback ?? "variant";
|
|
55
82
|
};
|
|
@@ -73,10 +100,35 @@ var formatSeconds = (value) => {
|
|
|
73
100
|
const seconds = Math.round(value % 60);
|
|
74
101
|
return `${minutes} min ${seconds}s`;
|
|
75
102
|
};
|
|
103
|
+
var READONLY_FIELDS = [
|
|
104
|
+
"variants",
|
|
105
|
+
"videoProcessingStatus",
|
|
106
|
+
"playbackPosterUrl",
|
|
107
|
+
"playbackPosterPath",
|
|
108
|
+
"filesize",
|
|
109
|
+
"duration",
|
|
110
|
+
"width",
|
|
111
|
+
"height",
|
|
112
|
+
"bitrate"
|
|
113
|
+
];
|
|
114
|
+
var mergeReadOnlyFields = (current, doc) => {
|
|
115
|
+
const hasCurrent = isRecord(current);
|
|
116
|
+
const nextData = hasCurrent ? { ...current } : {};
|
|
117
|
+
READONLY_FIELDS.forEach((field) => {
|
|
118
|
+
if (!Object.prototype.hasOwnProperty.call(doc, field)) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const value = doc[field];
|
|
122
|
+
if (value !== void 0) {
|
|
123
|
+
nextData[field] = value;
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
return hasCurrent ? nextData : doc;
|
|
127
|
+
};
|
|
76
128
|
var VideoField = (props) => {
|
|
77
129
|
const { useEffect, useMemo, useState, useCallback, useRef } = React__default.default;
|
|
78
130
|
const { field } = props;
|
|
79
|
-
const { id, lastUpdateTime, setData } = ui.useDocumentInfo();
|
|
131
|
+
const { id, lastUpdateTime, setData, data: formData } = ui.useDocumentInfo();
|
|
80
132
|
const formModified = ui.useFormModified();
|
|
81
133
|
const custom = field.custom ?? (isVideoVariantFieldConfig(props) ? props : void 0);
|
|
82
134
|
const presets = custom?.presets ?? {};
|
|
@@ -415,9 +467,8 @@ var VideoField = (props) => {
|
|
|
415
467
|
return null;
|
|
416
468
|
}
|
|
417
469
|
setDocData(nextDoc);
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
}
|
|
470
|
+
const nextFormData = formModified ? mergeReadOnlyFields(formData, nextDoc) : nextDoc;
|
|
471
|
+
setData(nextFormData);
|
|
421
472
|
setProcessingStatus(nextDoc.videoProcessingStatus ?? null);
|
|
422
473
|
const docVariants = Array.isArray(nextDoc.variants) ? nextDoc.variants : [];
|
|
423
474
|
setVariants(docVariants);
|
|
@@ -430,7 +481,7 @@ var VideoField = (props) => {
|
|
|
430
481
|
} finally {
|
|
431
482
|
setLoadingDoc(false);
|
|
432
483
|
}
|
|
433
|
-
}, [apiBase, custom, docId, formModified, setData]);
|
|
484
|
+
}, [apiBase, custom, docId, formData, formModified, setData]);
|
|
434
485
|
useEffect(() => {
|
|
435
486
|
void fetchDocument();
|
|
436
487
|
}, [fetchDocument, jobStatus?.state, lastUpdateTime]);
|
|
@@ -486,10 +537,9 @@ var VideoField = (props) => {
|
|
|
486
537
|
return;
|
|
487
538
|
}
|
|
488
539
|
if (active) {
|
|
489
|
-
const refreshNote = formModified ? "Save or reload to see the updated file metadata." : "Original metadata has been refreshed.";
|
|
490
540
|
setMessage({
|
|
491
541
|
type: "info",
|
|
492
|
-
text: `Job ${jobId} completed.
|
|
542
|
+
text: `Job ${jobId} completed. Metadata refreshed.`
|
|
493
543
|
});
|
|
494
544
|
}
|
|
495
545
|
};
|
|
@@ -543,6 +593,10 @@ var VideoField = (props) => {
|
|
|
543
593
|
const cropEnabled = Boolean(preset?.enableCrop);
|
|
544
594
|
const activePresetLabel = expectedPreset ? presets[expectedPreset]?.label ?? expectedPreset : null;
|
|
545
595
|
const posterUrl = typeof docData?.playbackPosterUrl === "string" ? docData.playbackPosterUrl.trim() : "";
|
|
596
|
+
const previewVideoUrl = useMemo(
|
|
597
|
+
() => resolvePreviewVideoUrl(docData),
|
|
598
|
+
[docData]
|
|
599
|
+
);
|
|
546
600
|
useEffect(() => {
|
|
547
601
|
if (!cropEnabled) {
|
|
548
602
|
setCropSelection(DEFAULT_CROP);
|
|
@@ -776,6 +830,18 @@ var VideoField = (props) => {
|
|
|
776
830
|
loading: "lazy"
|
|
777
831
|
}
|
|
778
832
|
) })
|
|
833
|
+
] }) : previewVideoUrl ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 text-xs text-slate-600", children: [
|
|
834
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold uppercase tracking-wide text-slate-500", children: "Poster" }),
|
|
835
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-lg border border-slate-200 bg-slate-50", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
836
|
+
"video",
|
|
837
|
+
{
|
|
838
|
+
className: "h-auto w-full object-contain",
|
|
839
|
+
preload: "metadata",
|
|
840
|
+
muted: true,
|
|
841
|
+
playsInline: true,
|
|
842
|
+
src: previewVideoUrl
|
|
843
|
+
}
|
|
844
|
+
) })
|
|
779
845
|
] }) : null,
|
|
780
846
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 text-xs text-slate-600", children: [
|
|
781
847
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold uppercase tracking-wide text-slate-500", children: "Variants" }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/admin/VideoField.tsx"],"names":["React","useDocumentInfo","useFormModified","preset","jsxs","jsx"],"mappings":"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","file":"VideoField.cjs","sourcesContent":["\"use client\";\n\nimport React, { type FC } from \"react\";\nimport { useDocumentInfo, useFormModified } from \"@payloadcms/ui\";\nimport type { Data } from \"payload\";\nimport type { Area, CropperProps } from \"react-easy-crop\";\n\nimport type {\n VariantRecord,\n VideoProcessingStatus,\n VideoVariantFieldConfig,\n} 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\ntype VideoDocument = {\n url?: string;\n playbackPosterUrl?: string;\n variants?: VariantRecord[];\n videoProcessingStatus?: VideoProcessingStatus | null;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst extractDocument = (payload: unknown): VideoDocument | null => {\n if (!isRecord(payload)) return null;\n const candidate = isRecord(payload.doc) ? payload.doc : payload;\n if (!isRecord(candidate)) return null;\n return candidate as VideoDocument;\n};\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 isActiveJobState = (state?: string): boolean =>\n Boolean(state && state !== \"completed\" && state !== \"failed\");\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, lastUpdateTime, setData } = useDocumentInfo();\n const formModified = useFormModified();\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] =\n useState<React.ComponentType<CropperProps> | null>(null);\n\n useEffect(() => {\n if (typeof window !== \"undefined\" && !EasyCrop) {\n import(\"react-easy-crop\").then((module) => {\n setEasyCrop(() => module.default);\n });\n }\n }, [EasyCrop]);\n\n const [selectedPreset, setSelectedPreset] = useState<string | undefined>(\n presetNames[0],\n );\n const [docData, setDocData] = useState<VideoDocument | null>(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 [processingStatus, setProcessingStatus] =\n useState<VideoProcessingStatus | 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 useEffect(() => {\n if (!processingStatus) return;\n const statusJobId =\n typeof processingStatus.jobId === \"string\"\n ? processingStatus.jobId.trim()\n : \"\";\n if (!statusJobId) return;\n\n if (!jobStatus) {\n setJobStatus({\n id: statusJobId,\n state: processingStatus.state,\n progress: processingStatus.progress,\n });\n }\n\n if (isActiveJobState(processingStatus.state) && !pollingJobId) {\n setPollingJobId(statusJobId);\n if (!expectedPreset && processingStatus.preset) {\n setExpectedPreset(processingStatus.preset);\n }\n }\n\n if (\n processingStatus.preset &&\n presets[processingStatus.preset] &&\n (!selectedPreset ||\n (isActiveJobState(processingStatus.state) &&\n selectedPreset !== processingStatus.preset))\n ) {\n setSelectedPreset(processingStatus.preset);\n }\n }, [\n expectedPreset,\n jobStatus,\n pollingJobId,\n presets,\n processingStatus,\n selectedPreset,\n ]);\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 = extractDocument(payload);\n if (nextDoc) {\n setDocData(nextDoc);\n const docVariants = Array.isArray(nextDoc?.variants)\n ? nextDoc.variants\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 = extractDocument(payload);\n if (nextDoc) {\n setDocData(nextDoc);\n const docVariants = Array.isArray(nextDoc?.variants)\n ? nextDoc.variants\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 = extractDocument(payload);\n\n if (!nextDoc) {\n setDocData(null);\n setVariants([]);\n setProcessingStatus(null);\n return null;\n }\n\n setDocData(nextDoc);\n if (!formModified) {\n setData(nextDoc as Data);\n }\n setProcessingStatus(nextDoc.videoProcessingStatus ?? null);\n\n const docVariants = Array.isArray(nextDoc.variants)\n ? nextDoc.variants\n : [];\n setVariants(docVariants);\n\n return { doc: nextDoc, 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, formModified, setData]);\n\n useEffect(() => {\n void fetchDocument();\n }, [fetchDocument, jobStatus?.state, lastUpdateTime]);\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 result = await fetchDocument();\n const hasVariant = Boolean(\n presetToWaitFor &&\n result?.variants?.some(\n (variant) => readVariantPreset(variant) === presetToWaitFor,\n ),\n );\n\n setExpectedPreset(null);\n setJobStatus({ id: jobId, state: \"completed\", progress: 100 });\n\n if (hasVariant && presetToWaitFor) {\n setMessage({\n type: \"success\",\n text: `Variant \\\"${presetToWaitFor}\\\" saved.`,\n });\n return;\n }\n\n if (active) {\n const refreshNote = formModified\n ? \"Save or reload to see the updated file metadata.\"\n : \"Original metadata has been refreshed.\";\n setMessage({\n type: \"info\",\n text: `Job ${jobId} completed. ${refreshNote}`,\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, formModified, pollingJobId, sleep]);\n\n const preset = selectedPreset ? presets[selectedPreset] : undefined;\n const cropEnabled = Boolean(preset?.enableCrop);\n const activePresetLabel = expectedPreset\n ? (presets[expectedPreset]?.label ?? expectedPreset)\n : null;\n const posterUrl =\n typeof docData?.playbackPosterUrl === \"string\"\n ? docData.playbackPosterUrl.trim()\n : \"\";\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((area: Area) => {\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 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 = extractDocument(payload);\n if (updatedDoc) {\n setDocData(updatedDoc);\n const docVariants = Array.isArray(updatedDoc?.variants)\n ? updatedDoc.variants\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 = extractDocument(payload);\n if (updatedDoc) {\n setDocData(updatedDoc);\n const docVariants = Array.isArray(updatedDoc?.variants)\n ? updatedDoc.variants\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 {jobStatus && isActiveJobState(jobStatus.state) ? (\n <div\n className=\"rounded-lg border border-sky-200 bg-sky-50 px-3 py-2 text-xs text-sky-800\"\n role=\"status\"\n >\n Processing video, please wait...{\" \"}\n {activePresetLabel ? `(${activePresetLabel}) ` : \"\"}\n {formatProgress(jobStatus.progress)}\n </div>\n ) : null}\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 rotation={0}\n aspect={4 / 3}\n minZoom={1}\n maxZoom={3}\n cropShape=\"rect\"\n zoomSpeed={1}\n restrictPosition\n mediaProps={{}}\n cropperProps={{}}\n style={{}}\n classes={{}}\n keyboardStep={1}\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 {posterUrl ? (\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 Poster\n </span>\n <div className=\"overflow-hidden rounded-lg border border-slate-200 bg-slate-50\">\n <img\n src={posterUrl}\n alt=\"Video poster\"\n className=\"h-auto w-full object-contain\"\n loading=\"lazy\"\n />\n </div>\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 poster={posterUrl || undefined}\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":["React","useDocumentInfo","useFormModified","preset","jsxs","jsx"],"mappings":"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","file":"VideoField.cjs","sourcesContent":["\"use client\";\n\nimport React, { type FC } from \"react\";\nimport { useDocumentInfo, useFormModified } from \"@payloadcms/ui\";\nimport type { Data } from \"payload\";\nimport type { Area, CropperProps } from \"react-easy-crop\";\n\nimport type {\n VariantRecord,\n VideoProcessingStatus,\n VideoVariantFieldConfig,\n} 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\ntype VideoDocument = {\n url?: string;\n playbackPosterUrl?: string;\n playbackPosterPath?: string;\n filesize?: number;\n duration?: number;\n width?: number;\n height?: number;\n bitrate?: number;\n variants?: VariantRecord[];\n videoProcessingStatus?: VideoProcessingStatus | null;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst extractDocument = (payload: unknown): VideoDocument | null => {\n if (!isRecord(payload)) return null;\n const candidate = isRecord(payload.doc) ? payload.doc : payload;\n if (!isRecord(candidate)) return null;\n return candidate as VideoDocument;\n};\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 isActiveJobState = (state?: string): boolean =>\n Boolean(state && state !== \"completed\" && state !== \"failed\");\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 readVariantUrl = (variant: VariantRecord | null | undefined) => {\n if (!variant || typeof variant !== \"object\") return undefined;\n if (typeof variant.url === \"string\" && variant.url.trim().length > 0) {\n return variant.url.trim();\n }\n return undefined;\n};\n\nconst resolvePreviewVideoUrl = (\n doc: VideoDocument | null,\n): string | undefined => {\n if (!doc) return undefined;\n const variants = Array.isArray(doc.variants) ? doc.variants : [];\n const candidates = variants\n .map((variant) => ({\n url: readVariantUrl(variant),\n size: typeof variant.size === \"number\" ? variant.size : undefined,\n }))\n .filter(\n (candidate): candidate is { url: string; size: number | undefined } =>\n Boolean(candidate.url),\n );\n if (candidates.length > 0) {\n candidates.sort(\n (left, right) =>\n (left.size ?? Number.POSITIVE_INFINITY) -\n (right.size ?? Number.POSITIVE_INFINITY),\n );\n return candidates[0].url;\n }\n\n if (typeof doc.url === \"string\" && doc.url.trim().length > 0) {\n return doc.url.trim();\n }\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 READONLY_FIELDS = [\n \"variants\",\n \"videoProcessingStatus\",\n \"playbackPosterUrl\",\n \"playbackPosterPath\",\n \"filesize\",\n \"duration\",\n \"width\",\n \"height\",\n \"bitrate\",\n] as const;\n\ntype ReadonlyField = (typeof READONLY_FIELDS)[number];\n\nconst mergeReadOnlyFields = (\n current: Data | undefined,\n doc: VideoDocument,\n): Data => {\n const hasCurrent = isRecord(current);\n const nextData: Record<string, unknown> = hasCurrent ? { ...current } : {};\n\n READONLY_FIELDS.forEach((field) => {\n if (!Object.prototype.hasOwnProperty.call(doc, field)) {\n return;\n }\n const value = doc[field as ReadonlyField];\n if (value !== undefined) {\n nextData[field] = value;\n }\n });\n\n return (hasCurrent ? nextData : doc) as Data;\n};\n\nconst VideoField: FC<FieldProps> = (props) => {\n const { useEffect, useMemo, useState, useCallback, useRef } = React;\n const { field } = props;\n const { id, lastUpdateTime, setData, data: formData } = useDocumentInfo();\n const formModified = useFormModified();\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] =\n useState<React.ComponentType<CropperProps> | null>(null);\n\n useEffect(() => {\n if (typeof window !== \"undefined\" && !EasyCrop) {\n import(\"react-easy-crop\").then((module) => {\n setEasyCrop(() => module.default);\n });\n }\n }, [EasyCrop]);\n\n const [selectedPreset, setSelectedPreset] = useState<string | undefined>(\n presetNames[0],\n );\n const [docData, setDocData] = useState<VideoDocument | null>(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 [processingStatus, setProcessingStatus] =\n useState<VideoProcessingStatus | 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 useEffect(() => {\n if (!processingStatus) return;\n const statusJobId =\n typeof processingStatus.jobId === \"string\"\n ? processingStatus.jobId.trim()\n : \"\";\n if (!statusJobId) return;\n\n if (!jobStatus) {\n setJobStatus({\n id: statusJobId,\n state: processingStatus.state,\n progress: processingStatus.progress,\n });\n }\n\n if (isActiveJobState(processingStatus.state) && !pollingJobId) {\n setPollingJobId(statusJobId);\n if (!expectedPreset && processingStatus.preset) {\n setExpectedPreset(processingStatus.preset);\n }\n }\n\n if (\n processingStatus.preset &&\n presets[processingStatus.preset] &&\n (!selectedPreset ||\n (isActiveJobState(processingStatus.state) &&\n selectedPreset !== processingStatus.preset))\n ) {\n setSelectedPreset(processingStatus.preset);\n }\n }, [\n expectedPreset,\n jobStatus,\n pollingJobId,\n presets,\n processingStatus,\n selectedPreset,\n ]);\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 = extractDocument(payload);\n if (nextDoc) {\n setDocData(nextDoc);\n const docVariants = Array.isArray(nextDoc?.variants)\n ? nextDoc.variants\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 = extractDocument(payload);\n if (nextDoc) {\n setDocData(nextDoc);\n const docVariants = Array.isArray(nextDoc?.variants)\n ? nextDoc.variants\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 = extractDocument(payload);\n\n if (!nextDoc) {\n setDocData(null);\n setVariants([]);\n setProcessingStatus(null);\n return null;\n }\n\n setDocData(nextDoc);\n const nextFormData = formModified\n ? mergeReadOnlyFields(formData, nextDoc)\n : (nextDoc as Data);\n setData(nextFormData);\n setProcessingStatus(nextDoc.videoProcessingStatus ?? null);\n\n const docVariants = Array.isArray(nextDoc.variants)\n ? nextDoc.variants\n : [];\n setVariants(docVariants);\n\n return { doc: nextDoc, 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, formData, formModified, setData]);\n\n useEffect(() => {\n void fetchDocument();\n }, [fetchDocument, jobStatus?.state, lastUpdateTime]);\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 result = await fetchDocument();\n const hasVariant = Boolean(\n presetToWaitFor &&\n result?.variants?.some(\n (variant) => readVariantPreset(variant) === presetToWaitFor,\n ),\n );\n\n setExpectedPreset(null);\n setJobStatus({ id: jobId, state: \"completed\", progress: 100 });\n\n if (hasVariant && presetToWaitFor) {\n setMessage({\n type: \"success\",\n text: `Variant \\\"${presetToWaitFor}\\\" saved.`,\n });\n return;\n }\n\n if (active) {\n setMessage({\n type: \"info\",\n text: `Job ${jobId} completed. Metadata refreshed.`,\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, formModified, pollingJobId, sleep]);\n\n const preset = selectedPreset ? presets[selectedPreset] : undefined;\n const cropEnabled = Boolean(preset?.enableCrop);\n const activePresetLabel = expectedPreset\n ? (presets[expectedPreset]?.label ?? expectedPreset)\n : null;\n const posterUrl =\n typeof docData?.playbackPosterUrl === \"string\"\n ? docData.playbackPosterUrl.trim()\n : \"\";\n const previewVideoUrl = useMemo(\n () => resolvePreviewVideoUrl(docData),\n [docData],\n );\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((area: Area) => {\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 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 = extractDocument(payload);\n if (updatedDoc) {\n setDocData(updatedDoc);\n const docVariants = Array.isArray(updatedDoc?.variants)\n ? updatedDoc.variants\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 = extractDocument(payload);\n if (updatedDoc) {\n setDocData(updatedDoc);\n const docVariants = Array.isArray(updatedDoc?.variants)\n ? updatedDoc.variants\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 {jobStatus && isActiveJobState(jobStatus.state) ? (\n <div\n className=\"rounded-lg border border-sky-200 bg-sky-50 px-3 py-2 text-xs text-sky-800\"\n role=\"status\"\n >\n Processing video, please wait...{\" \"}\n {activePresetLabel ? `(${activePresetLabel}) ` : \"\"}\n {formatProgress(jobStatus.progress)}\n </div>\n ) : null}\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 rotation={0}\n aspect={4 / 3}\n minZoom={1}\n maxZoom={3}\n cropShape=\"rect\"\n zoomSpeed={1}\n restrictPosition\n mediaProps={{}}\n cropperProps={{}}\n style={{}}\n classes={{}}\n keyboardStep={1}\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 {posterUrl ? (\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 Poster\n </span>\n <div className=\"overflow-hidden rounded-lg border border-slate-200 bg-slate-50\">\n <img\n src={posterUrl}\n alt=\"Video poster\"\n className=\"h-auto w-full object-contain\"\n loading=\"lazy\"\n />\n </div>\n </div>\n ) : previewVideoUrl ? (\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 Poster\n </span>\n <div className=\"overflow-hidden rounded-lg border border-slate-200 bg-slate-50\">\n <video\n className=\"h-auto w-full object-contain\"\n preload=\"metadata\"\n muted\n playsInline\n src={previewVideoUrl}\n />\n </div>\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 poster={posterUrl || undefined}\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"]}
|