aboutsummaryrefslogtreecommitdiff
path: root/public
diff options
context:
space:
mode:
authorJoris2024-05-20 09:40:11 +0200
committerJoris2024-05-20 09:40:11 +0200
commit436ddf6f23242eb709b591cd5e9cbf1553f8d390 (patch)
treedfed58b5e553f131fd3009f03f095ca40efc5949 /public
parent6baa0419d3b5eb63c70be446226a321f900e433d (diff)
Allow to upload file and download from given link
Diffstat (limited to 'public')
-rw-r--r--public/main.css70
-rw-r--r--public/main.js48
2 files changed, 118 insertions, 0 deletions
diff --git a/public/main.css b/public/main.css
new file mode 100644
index 0000000..0a20779
--- /dev/null
+++ b/public/main.css
@@ -0,0 +1,70 @@
+html {
+ margin: 0 1rem;
+}
+
+body {
+ max-width: 500px;
+ margin: 0 auto;
+ font-family: sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: #06C;
+}
+
+h1 {
+ text-align: center;
+ font-variant: small-caps;
+ font-size: 40px;
+ letter-spacing: 0.2rem;
+}
+
+.g-Link {
+ text-decoration: underline;
+}
+
+label {
+ display: flex;
+ gap: 0.5rem;
+ flex-direction: column;
+ margin-bottom: 2rem;
+}
+
+input[type=submit] {
+ width: 100%;
+}
+
+.g-Loading {
+ display: none;
+ align-items: center;
+ justify-content: center;
+ gap: 1rem;
+ margin-bottom: 2rem;
+}
+
+.g-Error {
+ text-align: center;
+ margin-bottom: 2rem;
+ color: #C00;
+}
+
+.g-Spinner {
+ width: 25px;
+ height: 25px;
+ border: 4px solid #06C;
+ border-bottom-color: transparent;
+ border-radius: 50%;
+ display: inline-block;
+ box-sizing: border-box;
+ animation: rotation 1s linear infinite;
+}
+
+@keyframes rotation {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
diff --git a/public/main.js b/public/main.js
new file mode 100644
index 0000000..1729d38
--- /dev/null
+++ b/public/main.js
@@ -0,0 +1,48 @@
+window.onload = function() {
+ const form = document.querySelector('form')
+
+ if (form !== null) {
+ const submit = document.querySelector('input[type="submit"]')
+ const loading = document.querySelector('.g-Loading')
+ const error = document.querySelector('.g-Error')
+
+ function showError(msg) {
+ loading.style.display = 'none'
+ submit.disabled = false
+ error.innerText = msg
+ error.style.display = 'block'
+ }
+
+ form.onsubmit = function(event) {
+ event.preventDefault()
+
+ loading.style.display = 'flex'
+ submit.disabled = true
+ error.style.display = 'none'
+
+ const key = document.querySelector('input[name="key"]').value
+ const expiration = document.querySelector('select[name="expiration"]').value
+ const file = document.querySelector('input[name="file"]').files[0]
+
+ // Wait a bit to prevent showing the loader too briefly
+ setTimeout(function() {
+ const xhr = new XMLHttpRequest()
+ xhr.open('POST', '/', true)
+ xhr.onload = function () {
+ if (xhr.status === 200) {
+ window.location = `/${xhr.responseText}`
+ } else {
+ showError(`Error uploading: ${xhr.status}`)
+ }
+ }
+ xhr.onerror = function () {
+ showError('Upload error')
+ }
+ xhr.setRequestHeader('X-FileName', file.name)
+ xhr.setRequestHeader('X-Expiration', expiration)
+ xhr.setRequestHeader('X-Key', key)
+ xhr.send(file)
+ }, 500)
+ }
+ }
+}