mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-11-06 12:52:26 +00:00
feat(edit): thumbnail + video file upload in Edit modal (steps 2-3/3)
Brings the Edit modal to upload parity with the Upload modal: re-upload a thumbnail or video file instead of only pasting URLs. - Wire storage services (r2/s3/storageService) + pubkey/npub accessors into EditModal via ModalManager/initEditModal; EditModal constructs a shared MediaUploader. - New editModalUpload.js holds all the upload glue (file-picker wiring, progress, storage-unlock checks, field write-back) to keep EditModal under its file-size budget. EditModal calls initEditModalUpload(this, context) in one line. - edit-video-modal.html: "Replace video file…" (under the URL field) and "Replace thumbnail file…" (under the thumbnail field), each with a hidden file input + status line. - On thumbnail upload: writes the new URL into the thumbnail field. On video upload: writes url + magnet (+ ws/xs hints). All written via setFieldUnlocked, which marks the field edited so EditModal.collect actually persists it (gated behind storage being configured + unlocked). setFieldUnlocked is unit-tested (mutation-verified): without the unlock, the re-upload would silently not save. Build + full lint + unit suite green. NOTE: the upload/storage flow itself can't be unit-tested (browser + R2/S3); pending manual verification of editing a video's thumbnail/file. Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
1 parent
7bbf0f08b1
commit
c8a63c57c6
6 files changed
+287
No files matched your search
@@ -7,6 +7,9 @@ import {
|
||||
import { normalizeAndAugmentMagnet } from "../../magnetUtils.js";
|
||||
import { createModalAccessibility } from "./modalAccessibility.js";
|
||||
import { Nip71FormManager } from "./nip71FormManager.js";
|
||||
import { MediaUploader } from "./mediaUploader.js";
|
||||
import { initEditModalUpload } from "./editModalUpload.js";
|
||||
import { devLogger } from "../../utils/logger.js";
|
||||
|
||||
export class EditModal {
|
||||
constructor({
|
||||
@@ -15,7 +18,13 @@ export class EditModal {
|
||||
sanitizers = {},
|
||||
escapeHtml,
|
||||
showError,
|
||||
showSuccess,
|
||||
getMode,
|
||||
r2Service = null,
|
||||
s3Service = null,
|
||||
storageService = null,
|
||||
getCurrentPubkey = null,
|
||||
safeEncodeNpub = null,
|
||||
eventTarget,
|
||||
container,
|
||||
} = {}) {
|
||||
@@ -25,6 +34,20 @@ export class EditModal {
|
||||
typeof setGlobalModalState === "function" ? setGlobalModalState : () => {};
|
||||
this.escapeHtml = typeof escapeHtml === "function" ? escapeHtml : (value) => `${value ?? ""}`;
|
||||
this.showError = typeof showError === "function" ? showError : () => {};
|
||||
this.showSuccess = typeof showSuccess === "function" ? showSuccess : () => {};
|
||||
// Storage upload wiring (mirrors UploadModal) so Edit can re-upload files.
|
||||
this.storageService = storageService || null;
|
||||
this.getCurrentPubkey =
|
||||
typeof getCurrentPubkey === "function" ? getCurrentPubkey : null;
|
||||
this.mediaUploader = new MediaUploader({
|
||||
r2Service,
|
||||
s3Service,
|
||||
storageService,
|
||||
getCurrentPubkey: () =>
|
||||
this.getCurrentPubkey ? this.getCurrentPubkey() : null,
|
||||
safeEncodeNpub:
|
||||
typeof safeEncodeNpub === "function" ? safeEncodeNpub : (p) => p,
|
||||
});
|
||||
this.getMode =
|
||||
typeof getMode === "function"
|
||||
? getMode
|
||||
@@ -196,6 +219,10 @@ export class EditModal {
|
||||
|
||||
const nip71Context = this.form || context;
|
||||
this.nip71FormManager.registerSection(this.nip71SectionKey, nip71Context);
|
||||
|
||||
// Wire optional "Replace file" upload controls (thumbnail + video). All the
|
||||
// glue lives in editModalUpload.js to keep this module within budget.
|
||||
initEditModalUpload(this, context);
|
||||
}
|
||||
|
||||
setupModalAccessibility() {
|
||||
|
||||
Reference in new issue
Block a user