diff --git a/client/app.js b/client/app.js index d44fe90..540136d 100644 --- a/client/app.js +++ b/client/app.js @@ -71,6 +71,8 @@ app.addSetter('load.board', async (data, force) => { }); app.addSetter('load.user', async (data) => { + + console.log("load.user"); store.do("loader.show"); let res = await fetch("/api/whoami"); @@ -96,6 +98,102 @@ app.addSetter("hash.update", (data) => { } }); +app.addSetter("app.uploadDroppedFiles", async (data, evt) => { + + let boardId = store.data.board.id; + + if ( boardId ){ + let hasFiles = event.dataTransfer.types.find(i => i == "Files") == "Files"; + if ( hasFiles ){ + + if ( evt.dataTransfer.items ){ + + let files = []; + + for ( let i = 0; i < evt.dataTransfer.items.length; ++i ){ + if ( evt.dataTransfer.items[i].kind === "file" ){ + let file = evt.dataTransfer.items[i].getAsFile(); + + if ( file.type != "image/jpeg" && file.type != "image/png" ){ + + window.alert("Unsupported file type. JPEG and PNG images are supported."); + console.log("Unsupported file type: " + file.type); + + return; + } + + // check size + if ( file.size >= 26214400 ){ + window.alert("File size exceeds the 25MB limit."); + console.log("File size exceeds the 25MB limit. size=" + file.size); + document.getElementById("fileInput").value = ""; + return; + } + + files.push(file); + + } + } + + console.log("Number of files=" + files.length); + + for ( let i = 0; i < files.length; ++i ){ + + data.dropUploadMessage = `Uploading ${i+1} of ${files.length}`; + + try { + let newPin = await multipartUpload(files[i], boardId); + if ( data.board && data.board.id == boardId ){ + data.board.pins.push(newPin); + } + } catch (e){ + window.alert("Error uploading images."); + break; + } + } + + data.dropUploadMessage = null; + + } + + } + } + +}); + +function PostException(statusCode, errorMessage){ + this.statusCode = statusCode; + this.errorMessage = errorMessage; +} + +async function multipartUpload(file, boardId, newBoardName, siteUrl, description){ + console.log("attempting multipart upload"); + let formData = new FormData(); + formData.append("file", file); + formData.append("boardId", boardId); + if ( newBoardName ){ + formData.append("newBoardName", newBoardName); + } + if ( siteUrl ){ + formData.append("siteUrl", siteUrl); + } + if ( description ){ + formData.append("description", description); + } + + let res = await fetch("./multiup", { + method: "POST", + body: formData + }); + + if ( res.status == 200 ){ + return res.json(); + } else { + console.error("error uploading status=" + res.status + " body=" + await res.text()); + throw new PostException(res.status); + } +} + function dispatchSocketConnect(){ window.dispatchEvent(new CustomEvent("socket-connect")); } @@ -121,7 +219,8 @@ let store = new Reef.Store({ previewImageUrl: null, siteUrl: "", description: "", - saveInProgress: false + saveInProgress: false, + didYouKnowDragAndDropMessageDisabled: window.localStorage.addPinModal_didYouKnowDragAndDropMessageDisabled == "true" || false }, pinZoomModal: { active: false, @@ -167,6 +266,23 @@ const appComponent = new Reef("#app", {
+