Mercurial > code > home > repos > video
view src/ingest/IngestDrop.ts @ 22:ff73b95fc72f
frontend cleanups and improvements. this commit contains some future work too
author | drewp@bigasterisk.com |
---|---|
date | Mon, 17 Apr 2023 13:33:05 -0700 |
parents | 1b388ee5dd09 |
children | 1a9a8af1aa19 |
line wrap: on
line source
import { LitElement, html, css, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators.js"; @customElement("ingest-drop") export class IngestDrop extends LitElement { static styles = [ css` #drop { min-width: 10em; min-height: 10em; background: gray; border: 5px gray dashed; margin: 1% 10%; } #drop.dnd-hover { background: yellow; } `, ]; render() { return html` <div id="drop" @dragover=${this.dragover} @dragleave=${this.leave} @drop=${this.drop}> Drop video file or url here to upload to <em>TOP${this.folder}</em> </div> } dragover(ev: DragEvent) { this.shadowRoot?.querySelector("#drop")?.classList.add("dnd-hover"); ev.preventDefault(); if (ev.dataTransfer) { ev.dataTransfer.dropEffect = "copy"; } } leave() { this.shadowRoot?.querySelector("#drop")?.classList.remove("dnd-hover"); } drop(ev: DragEvent) { ev.preventDefault(); this.leave(); if (!ev.dataTransfer) { return; } const url = ev.dataTransfer.getData("text/plain"); if (url) { this.queueUrlToFetch(url); } else { for (let i = 0; i < ev.dataTransfer.files.length; i++) { this.uploadVideoFile(ev.dataTransfer.files[i]); } } } queueUrlToFetch(url: string) { fetch("../api/ingest/videoUrl?folder=" + encodeURIComponent(this.folder), { method: "POST", body: url, }); } uploadVideoFile(f: File) { fetch("../api/ingest/videoUpload?name=" + encodeURIComponent(this.folder + "/" + f.name), { method: "POST", body: f.stream(), duplex: "half", } as any /* types don't include 'duplex' */ ); } }