{"version":3,"sources":["home.js"],"names":["const","lsKeys","token","chunkSize","parallelUploads","uploadsHistoryOrder","previewImages","fileLength","uploadAge","page","localStorage","private","enableUserAccounts","maxSize","temporaryUploadAges","fileIdentifierLength","album","maxSizeBytes","urlMaxSize","urlMaxSizeBytes","tabs","activeTab","albumSelect","previewTemplate","dropzone","clipboardJS","lazyLoad","imageExts","videoExts","albumTitleMaxLength","albumDescMaxLength","onInitError","error","console","document","querySelector","classList","add","querySelectorAll","forEach","element","uploadButton","innerText","remove","addEventListener","location","reload","response","onUnexpectedError","statusText","520","521","522","523","524","525","526","527","530","status","description","data","swal","skipLog","content","createElement","innerHTML","toString","title","icon","checkIfPublic","onFailure","let","renderShown","axios","get","onDownloadProgress","doRender","then","parseInt","preparePage","catch","prepareUpload","verifyToken","button","href","reloadOnError","post","success","text","removeItem","value","prepareShareX","fetchAlbums","prepareUploadConfig","getPrettyBytes","prepareDropzone","event","uploadUrls","currentTarget","tabsContainer","loop","i","id","dataset","tabContent","setActiveTab","push","tab","length","index","headers","Array","isArray","albums","option","name","appendChild","previewNode","parentNode","removeChild","tabDiv","div","className","previewsContainer","Dropzone","body","url","paramName","clickable","maxFilesize","uploadMultiple","createImageThumbnails","autoProcessQueue","chunking","Boolean","parallelChunkUploads","chunksUploaded","file","done","previewElement","setAttribute","files","uuid","upload","original","type","albumid","filelength","age","updateTemplate","on","xhr","chunked","setRequestHeader","progress","test","size","updateTemplateIcon","contains","urls","split","filter","trim","join","map","firstChild","posted","result","removeAttribute","run","templateElement","iconClass","iconElement","a","clipboard","clipboardText","parentElement","exec","extname","toLowerCase","includes","img","src","onerror","update","expirydate","expiryDate","getPrettyDate","Date","createAlbum","buttons","cancel","confirm","closeModal","download","checked","public","selected","fallback","numConfig","min","max","fileLengthDiv","stored","default","helpText","range","force","disabled","isNaN","Object","keys","key","uploadAgeDiv","parseFloat","getPrettyUploadAge","form","preventDefault","siBytes","uploadFields","checkValidity","prefKeys","elements","numKeys","parsed","Math","hours","minutes","days","window","items","clipboardData","originalEvent","item","kind","blob","getAsFile","File","match","addFile","onload","ClipboardJS","LazyLoad","elements_selector"],"mappings":"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","file":"home.js","sourcesContent":["/* global swal, axios, Dropzone, ClipboardJS, LazyLoad */\n\nconst lsKeys = {\n token: 'token',\n chunkSize: 'chunkSize',\n parallelUploads: 'parallelUploads',\n uploadsHistoryOrder: 'uploadsHistoryOrder',\n previewImages: 'previewImages',\n fileLength: 'fileLength',\n uploadAge: 'uploadAge'\n}\n\nconst page = {\n // user token\n token: localStorage[lsKeys.token],\n\n // configs from api/check\n private: null,\n enableUserAccounts: null,\n maxSize: null,\n chunkSize: null,\n temporaryUploadAges: null,\n fileIdentifierLength: null,\n\n // store album id that will be used with upload requests\n album: null,\n\n parallelUploads: null,\n previewImages: null,\n fileLength: null,\n uploadAge: null,\n\n maxSizeBytes: null,\n urlMaxSize: null,\n urlMaxSizeBytes: null,\n\n tabs: [],\n activeTab: null,\n albumSelect: null,\n previewTemplate: null,\n\n dropzone: null,\n clipboardJS: null,\n lazyLoad: null,\n\n // Include BMP for uploads preview only, cause the real images will be used\n // Sharp isn't capable of making their thumbnails for dashboard and album public pages\n imageExts: ['.webp', '.jpg', '.jpeg', '.bmp', '.gif', '.png', '.tiff', '.tif', '.svg'],\n videoExts: ['.webm', '.mp4', '.wmv', '.avi', '.mov', '.mkv'],\n\n albumTitleMaxLength: 70,\n albumDescMaxLength: 4000\n}\n\n// Error handler for all API requests on init\npage.onInitError = error => {\n console.error(error)\n\n // Hide these elements\n document.querySelector('#albumDiv').classList.add('is-hidden')\n document.querySelector('#tabs').classList.add('is-hidden')\n document.querySelectorAll('.tab-content').forEach(element => {\n return element.classList.add('is-hidden')\n })\n\n // Update upload button\n const uploadButton = document.querySelector('#loginToUpload')\n uploadButton.innerText = 'An error occurred. Try to reload?'\n uploadButton.classList.remove('is-loading')\n uploadButton.classList.remove('is-hidden')\n\n uploadButton.addEventListener('click', () => {\n location.reload()\n })\n\n // Defer to the other handler if not API errors\n if (!error.response)\n return page.onUnexpectedError(error, true)\n\n // Better error messages for Cloudflare errors\n const cloudflareErrors = {\n 520: 'Unknown Error',\n 521: 'Web Server Is Down',\n 522: 'Connection Timed Out',\n 523: 'Origin Is Unreachable',\n 524: 'A Timeout Occurred',\n 525: 'SSL Handshake Failed',\n 526: 'Invalid SSL Certificate',\n 527: 'Railgun Error',\n 530: 'Origin DNS Error'\n }\n const statusText = cloudflareErrors[error.response.status] || error.response.statusText\n const description = error.response.data && error.response.data.description\n ? error.response.data.description\n : 'Please check the console for more information.'\n return swal(`${error.response.status} ${statusText}`, description, 'error')\n}\n\n// Error handler for all other unexpected errors\npage.onUnexpectedError = (error, skipLog) => {\n if (!skipLog) console.error(error)\n\n if (error.response)\n return swal('An error occurred!', 'There was an error with the request, please check the console for more information.', 'error')\n\n const content = document.createElement('div')\n content.innerHTML = `${error.toString()}`\n return swal({\n title: 'An error occurred!',\n icon: 'error',\n content\n })\n}\n\npage.checkIfPublic = onFailure => {\n let renderShown = false\n return axios.get('api/check', {\n onDownloadProgress: () => {\n // Only show render after this request has been initiated\n if (!renderShown && typeof page.doRender === 'function') {\n page.doRender()\n renderShown = true\n }\n }\n }).then(response => {\n page.private = response.data.private\n page.enableUserAccounts = response.data.enableUserAccounts\n page.maxSize = parseInt(response.data.maxSize)\n page.maxSizeBytes = page.maxSize * 1e6\n page.chunkSize = parseInt(response.data.chunkSize)\n page.temporaryUploadAges = response.data.temporaryUploadAges\n page.fileIdentifierLength = response.data.fileIdentifierLength\n return page.preparePage(onFailure)\n }).catch(page.onInitError)\n}\n\npage.preparePage = () => {\n if (page.private)\n if (page.token) {\n return page.verifyToken(page.token, true)\n } else {\n const button = document.querySelector('#loginToUpload')\n button.href = 'auth'\n button.classList.remove('is-loading')\n if (page.enableUserAccounts)\n button.innerText = 'Anonymous upload is disabled. Log in to upload.'\n else\n button.innerText = 'Running in private mode. Log in to upload.'\n }\n else\n return page.prepareUpload()\n}\n\npage.verifyToken = (token, reloadOnError) => {\n return axios.post('api/tokens/verify', { token }).then(response => {\n if (response.data.success === false)\n return swal({\n title: 'An error occurred!',\n text: response.data.description,\n icon: 'error'\n }).then(() => {\n if (!reloadOnError) return\n localStorage.removeItem('token')\n location.reload()\n })\n\n localStorage.token = token\n page.token = token\n return page.prepareUpload()\n }).catch(page.onInitError)\n}\n\npage.prepareUpload = () => {\n // I think this fits best here because we need to check for a valid token before we can get the albums\n if (page.token) {\n // Display the album selection\n document.querySelector('#albumDiv').classList.remove('is-hidden')\n\n page.albumSelect = document.querySelector('#albumSelect')\n page.albumSelect.addEventListener('change', () => {\n page.album = parseInt(page.albumSelect.value)\n // Re-generate ShareX config file\n if (typeof page.prepareShareX === 'function')\n page.prepareShareX()\n })\n\n // Fetch albums\n page.fetchAlbums()\n }\n\n // Prepare & generate config tab\n page.prepareUploadConfig()\n\n // Update elements wherever applicable\n document.querySelector('#maxSize > span').innerHTML = page.getPrettyBytes(page.maxSizeBytes)\n document.querySelector('#loginToUpload').classList.add('is-hidden')\n\n if (!page.token && page.enableUserAccounts)\n document.querySelector('#loginLinkText').innerHTML = 'Create an account and keep track of your uploads'\n\n // Prepare & generate files upload tab\n page.prepareDropzone()\n\n // Generate ShareX config file\n if (typeof page.prepareShareX === 'function')\n page.prepareShareX()\n\n // Prepare urls upload tab\n const urlMaxSize = document.querySelector('#urlMaxSize')\n if (urlMaxSize) {\n page.urlMaxSize = parseInt(urlMaxSize.innerHTML)\n page.urlMaxSizeBytes = page.urlMaxSize * 1e6\n urlMaxSize.innerHTML = page.getPrettyBytes(page.urlMaxSizeBytes)\n document.querySelector('#uploadUrls').addEventListener('click', event => {\n page.uploadUrls(event.currentTarget)\n })\n }\n\n // Get all tabs\n const tabsContainer = document.querySelector('#tabs')\n const tabs = tabsContainer.querySelectorAll('li')\n for (let i = 0; i < tabs.length; i++) {\n const id = tabs[i].dataset.id\n const tabContent = document.querySelector(`#${id}`)\n if (!tabContent) continue\n\n tabs[i].addEventListener('click', () => {\n page.setActiveTab(i)\n })\n page.tabs.push({ tab: tabs[i], content: tabContent })\n }\n\n // Set first valid tab as the default active tab\n if (page.tabs.length) {\n page.setActiveTab(0)\n tabsContainer.classList.remove('is-hidden')\n }\n}\n\npage.setActiveTab = index => {\n for (let i = 0; i < page.tabs.length; i++)\n if (i === index) {\n page.tabs[i].tab.classList.add('is-active')\n page.tabs[i].content.classList.remove('is-hidden')\n page.activeTab = index\n } else {\n page.tabs[i].tab.classList.remove('is-active')\n page.tabs[i].content.classList.add('is-hidden')\n }\n}\n\npage.fetchAlbums = () => {\n return axios.get('api/albums', { headers: { token: page.token } }).then(response => {\n if (response.data.success === false)\n return swal('An error occurred!', response.data.description, 'error')\n\n // Create an option for each album\n if (Array.isArray(response.data.albums) && response.data.albums.length)\n for (let i = 0; i < response.data.albums.length; i++) {\n const album = response.data.albums[i]\n const option = document.createElement('option')\n option.value = album.id\n option.innerHTML = album.name\n page.albumSelect.appendChild(option)\n }\n }).catch(page.onInitError)\n}\n\npage.prepareDropzone = () => {\n // Parse template element\n const previewNode = document.querySelector('#tpl')\n page.previewTemplate = previewNode.innerHTML\n previewNode.parentNode.removeChild(previewNode)\n\n // Generate files upload tab\n const tabDiv = document.querySelector('#tab-files')\n const div = document.createElement('div')\n div.className = 'control is-expanded'\n div.innerHTML = `\n
\n \n \n \n Click here or drag & drop files\n
\n `\n tabDiv.querySelector('.dz-container').appendChild(div)\n\n const previewsContainer = tabDiv.querySelector('#tab-files .field.uploads')\n\n page.dropzone = new Dropzone(document.body, {\n url: 'api/upload',\n paramName: 'files[]',\n clickable: tabDiv.querySelector('#dropzone'),\n maxFilesize: page.maxSizeBytes / 1024 / 1024, // this option expects MiB\n parallelUploads: page.parallelUploads,\n uploadMultiple: false,\n previewsContainer,\n previewTemplate: page.previewTemplate,\n createImageThumbnails: false,\n autoProcessQueue: true,\n headers: { token: page.token },\n chunking: Boolean(page.chunkSize),\n chunkSize: page.chunkSize * 1e6, // the option below expects Bytes\n parallelChunkUploads: false, // when set to true, it often hangs with hundreds of parallel uploads\n chunksUploaded (file, done) {\n file.previewElement.querySelector('.progress').setAttribute('value', 100)\n file.previewElement.querySelector('.progress').innerHTML = '100%'\n\n return axios.post('api/upload/finishchunks', {\n // This API supports an array of multiple files\n files: [{\n uuid: file.upload.uuid,\n original: file.name,\n type: file.type,\n albumid: page.album,\n filelength: page.fileLength,\n age: page.uploadAge\n }]\n }, { headers: { token: page.token } }).catch(error => {\n // Format error for display purpose\n return error.response.data ? error.response : {\n data: {\n success: false,\n description: error.toString()\n }\n }\n }).then(response => {\n file.previewElement.querySelector('.progress').classList.add('is-hidden')\n\n if (response.data.success === false)\n file.previewElement.querySelector('.error').innerHTML = response.data.description\n\n if (response.data.files && response.data.files[0])\n page.updateTemplate(file, response.data.files[0])\n\n return done()\n })\n }\n })\n\n page.dropzone.on('addedfile', file => {\n // Set active tab to file uploads, if necessary\n if (page.activeTab !== 0)\n page.setActiveTab(0)\n // Add file entry\n tabDiv.querySelector('.uploads').classList.remove('is-hidden')\n file.previewElement.querySelector('.name').innerHTML = file.name\n })\n\n page.dropzone.on('sending', (file, xhr) => {\n if (file.upload.chunked) return\n // Add headers if not uploading chunks\n if (page.album !== null) xhr.setRequestHeader('albumid', page.album)\n if (page.fileLength !== null) xhr.setRequestHeader('filelength', page.fileLength)\n if (page.uploadAge !== null) xhr.setRequestHeader('age', page.uploadAge)\n })\n\n // Update the total progress bar\n page.dropzone.on('uploadprogress', (file, progress) => {\n // For some reason, chunked uploads fire 100% progress event\n // for each chunk's successful uploads\n if (file.upload.chunked && progress === 100) return\n file.previewElement.querySelector('.progress').setAttribute('value', progress)\n file.previewElement.querySelector('.progress').innerHTML = `${progress}%`\n })\n\n page.dropzone.on('success', (file, response) => {\n if (!response) return\n file.previewElement.querySelector('.progress').classList.add('is-hidden')\n\n if (response.success === false)\n file.previewElement.querySelector('.error').innerHTML = response.description\n\n if (response.files && response.files[0])\n page.updateTemplate(file, response.files[0])\n })\n\n page.dropzone.on('error', (file, error) => {\n // Clean up file size errors\n if ((typeof error === 'string' && /^File is too big/.test(error)) ||\n (typeof error === 'object' && /File too large/.test(error.description)))\n error = `File too large (${page.getPrettyBytes(file.size)}).`\n\n page.updateTemplateIcon(file.previewElement, 'icon-block')\n file.previewElement.querySelector('.progress').classList.add('is-hidden')\n file.previewElement.querySelector('.name').innerHTML = file.name\n file.previewElement.querySelector('.error').innerHTML = error.description || error\n })\n}\n\npage.uploadUrls = button => {\n const tabDiv = document.querySelector('#tab-urls')\n if (!tabDiv || button.classList.contains('is-loading'))\n return\n\n button.classList.add('is-loading')\n\n function done (error) {\n if (error) swal('An error occurred!', error, 'error')\n button.classList.remove('is-loading')\n }\n\n function run () {\n const headers = {\n token: page.token,\n albumid: page.album,\n age: page.uploadAge,\n filelength: page.fileLength\n }\n\n const previewsContainer = tabDiv.querySelector('.uploads')\n const urls = document.querySelector('#urls').value\n .split(/\\r?\\n/)\n .filter(url => {\n return url.trim().length\n })\n document.querySelector('#urls').value = urls.join('\\n')\n\n if (!urls.length)\n return done('You have not entered any URLs.')\n\n tabDiv.querySelector('.uploads').classList.remove('is-hidden')\n const files = urls.map(url => {\n const previewTemplate = document.createElement('template')\n previewTemplate.innerHTML = page.previewTemplate.trim()\n const previewElement = previewTemplate.content.firstChild\n previewElement.querySelector('.name').innerHTML = url\n previewsContainer.appendChild(previewElement)\n return { url, previewElement }\n })\n\n function post (i) {\n if (i === files.length)\n return done()\n\n function posted (result) {\n files[i].previewElement.querySelector('.progress').classList.add('is-hidden')\n if (result.success) {\n page.updateTemplate(files[i], result.files[0])\n } else {\n page.updateTemplateIcon(files[i].previewElement, 'icon-block')\n files[i].previewElement.querySelector('.error').innerHTML = result.description\n }\n return post(i + 1)\n }\n\n // Animate progress bar\n files[i].previewElement.querySelector('.progress').removeAttribute('value')\n\n return axios.post('api/upload', { urls: [files[i].url] }, { headers }).then(response => {\n return posted(response.data)\n }).catch(error => {\n return posted({\n success: false,\n description: error.response ? error.response.data.description : error.toString()\n })\n })\n }\n return post(0)\n }\n return run()\n}\n\npage.updateTemplateIcon = (templateElement, iconClass) => {\n const iconElement = templateElement.querySelector('.icon')\n if (!iconElement) return\n iconElement.classList.add(iconClass)\n iconElement.classList.remove('is-hidden')\n}\n\npage.updateTemplate = (file, response) => {\n if (!response.url) return\n\n const a = file.previewElement.querySelector('.link > a')\n const clipboard = file.previewElement.querySelector('.clipboard-mobile > .clipboard-js')\n a.href = a.innerHTML = clipboard.dataset.clipboardText = response.url\n clipboard.parentElement.classList.remove('is-hidden')\n\n const exec = /.[\\w]+(\\?|$)/.exec(response.url)\n const extname = exec && exec[0]\n ? exec[0].toLowerCase()\n : null\n\n if (page.imageExts.includes(extname))\n if (page.previewImages) {\n const img = file.previewElement.querySelector('img')\n img.setAttribute('alt', response.name || '')\n img.dataset.src = response.url\n img.classList.remove('is-hidden')\n img.onerror = event => {\n // Hide image elements that fail to load\n // Consequently include WEBP in browsers that do not have WEBP support (e.i. IE)\n event.currentTarget.classList.add('is-hidden')\n page.updateTemplateIcon(file.previewElement, 'icon-picture')\n }\n page.lazyLoad.update(file.previewElement.querySelectorAll('img'))\n } else {\n page.updateTemplateIcon(file.previewElement, 'icon-picture')\n }\n else if (page.videoExts.includes(extname))\n page.updateTemplateIcon(file.previewElement, 'icon-video')\n else\n page.updateTemplateIcon(file.previewElement, 'icon-doc-inv')\n\n if (response.expirydate) {\n const expiryDate = file.previewElement.querySelector('.expiry-date')\n expiryDate.innerHTML = `EXP: ${page.getPrettyDate(new Date(response.expirydate * 1000))}`\n expiryDate.classList.remove('is-hidden')\n }\n}\n\npage.createAlbum = () => {\n const div = document.createElement('div')\n div.innerHTML = `\n
\n
\n \n
\n

Max length is ${page.albumTitleMaxLength} characters.

\n
\n
\n
\n \n
\n

Max length is ${page.albumDescMaxLength} characters.

\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n `\n\n swal({\n title: 'Create new album',\n icon: 'info',\n content: div,\n buttons: {\n cancel: true,\n confirm: {\n closeModal: false\n }\n }\n }).then(value => {\n if (!value) return\n\n const name = document.querySelector('#swalName').value.trim()\n axios.post('api/albums', {\n name,\n description: document.querySelector('#swalDescription').value.trim(),\n download: document.querySelector('#swalDownload').checked,\n public: document.querySelector('#swalPublic').checked\n }, {\n headers: {\n token: page.token\n }\n }).then(response => {\n if (response.data.success === false)\n return swal('An error occurred!', response.data.description, 'error')\n\n const option = document.createElement('option')\n page.albumSelect.appendChild(option)\n option.value = response.data.id\n option.innerHTML = name\n option.selected = true\n\n swal('Woohoo!', 'Album was created successfully.', 'success')\n }).catch(page.onUnexpectedError)\n })\n}\n\npage.prepareUploadConfig = () => {\n const fallback = {\n chunkSize: page.chunkSize,\n parallelUploads: 2\n }\n\n page.chunkSize = parseInt(localStorage[lsKeys.chunkSize]) || fallback.chunkSize\n page.parallelUploads = parseInt(localStorage[lsKeys.parallelUploads]) || fallback.parallelUploads\n document.querySelector('#chunkSize').value = page.chunkSize\n document.querySelector('#parallelUploads').value = page.parallelUploads\n\n const numConfig = {\n chunkSize: { min: 1, max: 95 },\n parallelUploads: { min: 1, max: 10 }\n }\n\n document.querySelector('#chunkSizeDiv .help').innerHTML =\n `Default is ${fallback.chunkSize} MB. Max is ${numConfig.chunkSize.max} MB.`\n document.querySelector('#parallelUploadsDiv .help').innerHTML =\n `Default is ${fallback.parallelUploads}. Max is ${numConfig.parallelUploads.max}.`\n\n const fileLengthDiv = document.querySelector('#fileLengthDiv')\n if (page.fileIdentifierLength && fileLengthDiv) {\n const element = document.querySelector('#fileLength')\n const stored = parseInt(localStorage[lsKeys.fileLength])\n\n fallback.fileLength = page.fileIdentifierLength.default\n let helpText = `Default is ${page.fileIdentifierLength.default}.`\n\n const range = typeof page.fileIdentifierLength.min === 'number' &&\n typeof page.fileIdentifierLength.max === 'number'\n\n if (range) {\n helpText += ` Min is ${page.fileIdentifierLength.min}. Max is ${page.fileIdentifierLength.max}`\n numConfig.fileLength = {\n min: page.fileIdentifierLength.min,\n max: page.fileIdentifierLength.max\n }\n }\n\n if (page.fileIdentifierLength.force) {\n helpText += ' This option is currently disabled.'\n element.disabled = true\n }\n\n if (page.fileIdentifierLength.force ||\n isNaN(stored) ||\n !range ||\n stored < page.fileIdentifierLength.min ||\n stored > page.fileIdentifierLength.max) {\n element.value = fallback.fileLength\n page.fileLength = null\n } else {\n element.value = stored\n page.fileLength = stored\n }\n\n fileLengthDiv.classList.remove('is-hidden')\n fileLengthDiv.querySelector('.help').innerHTML = helpText\n }\n\n Object.keys(numConfig).forEach(key => {\n document.querySelector(`#${key}`).setAttribute('min', numConfig[key].min)\n document.querySelector(`#${key}`).setAttribute('max', numConfig[key].max)\n })\n\n const uploadAgeDiv = document.querySelector('#uploadAgeDiv')\n if (Array.isArray(page.temporaryUploadAges) && page.temporaryUploadAges.length && uploadAgeDiv) {\n const element = document.querySelector('#uploadAge')\n const stored = parseFloat(localStorage[lsKeys.uploadAge])\n for (let i = 0; i < page.temporaryUploadAges.length; i++) {\n const age = page.temporaryUploadAges[i]\n const option = document.createElement('option')\n option.value = i === 0 ? 'default' : age\n option.innerHTML = page.getPrettyUploadAge(age) +\n (i === 0 ? ' (default)' : '')\n element.appendChild(option)\n if (age === stored) {\n element.value = option.value\n page.uploadAge = stored\n }\n }\n uploadAgeDiv.classList.remove('is-hidden')\n }\n\n const tabContent = document.querySelector('#tab-config')\n const form = tabContent.querySelector('form')\n form.addEventListener('submit', event => {\n event.preventDefault()\n })\n\n const siBytes = localStorage[lsKeys.siBytes] !== '0'\n if (!siBytes) document.querySelector('#siBytes').value = '0'\n\n const olderOnTop = localStorage[lsKeys.uploadsHistoryOrder] !== '0'\n if (!olderOnTop) {\n document.querySelector('#uploadsHistoryOrder').value = '0'\n const uploadFields = document.querySelectorAll('.tab-content > .uploads')\n for (let i = 0; i < uploadFields.length; i++)\n uploadFields[i].classList.add('is-reversed')\n }\n\n page.previewImages = localStorage[lsKeys.previewImages] !== '0'\n if (!page.previewImages) document.querySelector('#previewImages').value = '0'\n\n document.querySelector('#saveConfig').addEventListener('click', () => {\n if (!form.checkValidity())\n return\n\n const prefKeys = ['siBytes', 'uploadsHistoryOrder', 'previewImages', 'uploadAge']\n for (let i = 0; i < prefKeys.length; i++) {\n const value = form.elements[prefKeys[i]].value\n if (value !== 'default' && value !== fallback[prefKeys[i]])\n localStorage[lsKeys[prefKeys[i]]] = value\n else\n localStorage.removeItem(lsKeys[prefKeys[i]])\n }\n\n const numKeys = Object.keys(numConfig)\n for (let i = 0; i < numKeys.length; i++) {\n const parsed = parseInt(form.elements[numKeys[i]].value) || 0\n const value = Math.min(Math.max(parsed, numConfig[numKeys[i]].min), numConfig[numKeys[i]].max)\n if (value > 0 && value !== fallback[numKeys[i]])\n localStorage[lsKeys[numKeys[i]]] = value\n else\n localStorage.removeItem(lsKeys[numKeys[i]])\n }\n\n swal({\n title: 'Woohoo!',\n text: 'Configuration saved into this browser.',\n icon: 'success'\n }).then(() => {\n location.reload()\n })\n })\n}\n\npage.getPrettyUploadAge = hours => {\n if (hours === 0) {\n return 'Permanent'\n } else if (hours < 1) {\n const minutes = hours * 60\n return `${minutes} minute${minutes === 1 ? '' : 's'}`\n } else if (hours >= 24) {\n const days = hours / 24\n return `${days} day${days === 1 ? '' : 's'}`\n } else {\n return `${hours} hour${hours === 1 ? '' : 's'}`\n }\n}\n\n// Handle image paste event\nwindow.addEventListener('paste', event => {\n const items = (event.clipboardData || event.originalEvent.clipboardData).items\n const index = Object.keys(items)\n for (let i = 0; i < index.length; i++) {\n const item = items[index[i]]\n if (item.kind === 'file') {\n const blob = item.getAsFile()\n const file = new File([blob], `pasted-image.${blob.type.match(/(?:[^/]*\\/)([^;]*)/)[1]}`, {\n type: blob.type\n })\n page.dropzone.addFile(file)\n }\n }\n})\n\nwindow.onload = () => {\n page.checkIfPublic()\n\n page.clipboardJS = new ClipboardJS('.clipboard-js')\n\n page.clipboardJS.on('success', () => {\n return swal('Copied!', 'The link has been copied to clipboard.', 'success')\n })\n\n page.clipboardJS.on('error', page.onUnexpectedError)\n\n page.lazyLoad = new LazyLoad({\n elements_selector: '.field.uploads img'\n })\n\n document.querySelector('#createAlbum').addEventListener('click', () => {\n page.createAlbum()\n })\n}\n"]}