{"version":3,"sources":["lib/UploadFile.js","components/FileUploader.js","components/TextUploader.js","components/UploadTabs.js","components/UploadedFiles.js","components/PasswordEntryForm.js","pages/Upload.js","components/Header.js","components/Footer.js","App.js","reportWebVitals.js","index.js"],"names":["UploadFile","fx","this","status","result","time","Date","now","password","a","formData","FormData","append","fetch","encodeURIComponent","method","body","req","text","ok","FileUploader","props","state","files","map","i","onFilesQueued","onDrop","getRootProps","getInputProps","Container","className","Component","TextUploader","value","e","setState","target","preventDefault","length","File","Blob","onSubmit","handleSubmit","placeholder","onChange","handleChange","Button","type","UploadTabs","Tabs","defaultActiveKey","id","Tab","eventKey","title","UploadedFiles","file","href","rel","name","parseStatus","PasswordEntryForm","elem","document","querySelector","window","headers","res","onPasswordEntered","setAttribute","focus","Form","Group","Label","meta","instanceName","Control","variant","PageUpload","uploadPassword","hasUploadPassword","concat","upload","btoa","location","protocol","hostname","port","tagline","maxUploadSizeMB","extensionBlacklist","split","join","pw","updateUploadPassword","f","Header","Navbar","bg","expand","Brand","Toggle","aria-controls","Collapse","Nav","Link","Footer","App","cache","json","Upload","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.966c54b1.chunk.js","sourcesContent":["class UploadFile {\n constructor(fx){\n this.fx = fx;\n this.status = \"pre_upload\";\n this.result = \"\";\n this.time = Date.now();\n }\n\n async upload(password){\n this.status = \"uploading\";\n\n const formData = new FormData();\n formData.append(\"file\", this.fx);\n\n // We pass the password as a GET variable here because if we want to parse a multipart request in Go,\n // we need to also hold on to the files that are part of that request. In theory this could fill up\n // the drive quickly or create situations where contraband is stored before password verification.\n let req = await fetch(\"/upload?password=\" + encodeURIComponent(password), {\n method: 'POST',\n body: formData\n });\n\n this.result = await req.text();\n this.status = (! req.ok) ? \"error\" : \"done\";\n }\n}\n\nexport default UploadFile;","import { Component } from \"react\";\nimport Dropzone from \"react-dropzone\";\nimport { Container } from \"react-bootstrap\";\nimport UploadFile from \"../lib/UploadFile\";\n\nclass FileUploader extends Component {\n constructor(props){\n super(props);\n\n this.state = {};\n this.state.files = [];\n }\n\n async onDrop(files){\n files = files.map(i => new UploadFile(i));\n\n this.props.onFilesQueued(files);\n }\n\n render(){\n return (\n
\n this.onDrop(files)}>\n {({getRootProps, getInputProps}) => (\n \n \n\n Drop a file or click to upload...\n \n )}\n \n
\n )\n }\n}\n\nexport default FileUploader;","import { Component } from \"react\";\nimport { Button } from \"react-bootstrap\";\nimport UploadFile from \"../lib/UploadFile\";\n\nclass TextUploader extends Component {\n constructor(props){\n super(props);\n\n this.state = {};\n this.state.value = \"\";\n }\n\n handleChange(e){\n this.setState({ value: e.target.value });\n }\n\n handleSubmit(e){\n e.preventDefault();\n if( this.state.value.length < 1 ) return;\n this.props.onFilesQueued([new UploadFile(new File([new Blob([this.state.value])], \"file.txt\"))]);\n this.setState({ value: \"\" });\n }\n\n render(){\n return (\n
this.handleSubmit(e)}>\n \n\n

\n\n \n
\n )\n }\n}\n\nexport default TextUploader;","import { Component } from \"react\";\nimport { Tab, Tabs } from \"react-bootstrap\";\nimport FileUploader from \"./FileUploader\";\nimport TextUploader from \"./TextUploader\";\n\nclass UploadTabs extends Component {\n render(){\n return (\n \n \n \n \n \n \n \n \n )\n }\n}\n\nexport default UploadTabs;","import { Component } from \"react\";\n\nclass UploadedFiles extends Component {\n parseStatus(file){\n switch(file.status){\n case \"pre_upload\":\n return Preparing to upload;\n case \"uploading\":\n return Uploading;\n case \"done\":\n return {file.result};\n case \"error\":\n return {file.result};\n default:\n return {file.status};\n }\n }\n\n render() {\n return (\n <>\n

Uploads

\n\n {this.props.files.length > 0 ? this.props.files.map(i => (
  • {i.fx.name} - {this.parseStatus(i)}
  • )) : \"There's nothing here!\"}\n \n )\n }\n}\n\nexport default UploadedFiles;","import { Component } from \"react\";\nimport { Form, Button } from \"react-bootstrap\"\n\nclass PasswordEntryForm extends Component {\n async onSubmit(e){\n e.preventDefault();\n\n let elem = document.querySelector(\"#uploadPassword\");\n\n let res = await fetch(\"/meta\", {\n method: \"POST\",\n body: \"password=\" + window.encodeURIComponent(elem.value),\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\"\n }\n });\n\n if( res.ok ){\n this.props.onPasswordEntered(elem.value);\n } else {\n elem.setAttribute(\"placeholder\", await res.text())\n elem.value = \"\";\n elem.focus();\n }\n }\n\n render(){\n return (
    this.onSubmit(e)}>\n \n {this.props.meta.instanceName} restricts who can upload to it with a password. Enter it below to gain access to the upload form.\n \n\n
    \n\n \n
    \n
    );\n }\n}\n\nexport default PasswordEntryForm;","import { Component } from \"react\";\nimport { Container } from 'react-bootstrap';\nimport UploadTabs from \"../components/UploadTabs\";\nimport UploadedFiles from \"../components/UploadedFiles\";\nimport PasswordEntryForm from \"../components/PasswordEntryForm\";\n\nclass PageUpload extends Component {\n constructor(props){\n super(props);\n\n this.state = {};\n\n // a bit of a hack, but strings coerce to boolean true\n this.state.uploadPassword = props.meta.hasUploadPassword;\n this.state.files = [];\n }\n\n updateUploadPassword(password){\n this.setState({ uploadPassword: password });\n }\n\n async onFilesQueued(files){\n this.setState({ files: this.state.files.concat(files) });\n\n for( let file of files ) {\n await file.upload(this.state.uploadPassword);\n this.setState({ files: this.state.files });\n }\n }\n\n getShareX(){\n return btoa(`{\n \"Version\": \"12.4.1\",\n \"DestinationType\": \"ImageUploader, TextUploader, FileUploader\",\n \"RequestMethod\": \"POST\",\n \"RequestURL\": \"${window.location.protocol}//${window.location.hostname}${window.location.port !== \"\" ? `:${window.location.port}` : \"\"}/upload${this.props.password ? `?password=${this.props.password}` : \"\"}\",\n \"Body\": \"MultipartFormData\",\n \"FileFormName\": \"file\",\n \"URL\": \"$response$\"\n}`);\n }\n\n render() {\n return (\n \n

    {this.props.meta.tagline}

    \n\n Any files up to {this.props.meta.maxUploadSizeMB} MB are accepted{this.props.meta.extensionBlacklist.length > 0 ? (except {\".\" + this.props.meta.extensionBlacklist.split(\",\").join(\", .\")} files) : \"\"}.\n\n

    \n\n {this.props.meta.hasUploadPassword && ! this.state.uploadPassword ?\n this.updateUploadPassword(pw)} /> :\n <> this.onFilesQueued(f)} />
    \n }\n
    \n )\n }\n}\n\nexport default PageUpload;","import { Component } from \"react\";\nimport { Navbar, Nav } from \"react-bootstrap\";\n\nclass Header extends Component {\n render() {\n return (\n \n \n {this.props.title}\n \n \n \n\n \n \n \n \n )\n }\n}\n\nexport default Header;","import { Component } from \"react\";\nimport { Container } from \"react-bootstrap\";\n\nclass Footer extends Component {\n render(){\n return (\n \n
    \n\n Powered by Rainy · No JS mode\n
    \n )\n }\n}\n\nexport default Footer;","import React, { Component } from 'react';\nimport './App.css';\nimport Upload from './pages/Upload';\nimport Header from './components/Header';\nimport Footer from './components/Footer';\n\nclass App extends Component {\n constructor(props){\n super(props);\n\n this.state = {};\n this.state.meta = { extensionBlacklist: \"\" };\n }\n\n async componentDidMount(){\n let meta = await fetch(\"/meta\", {\n headers: {\n \"Accept\": \"application/json\"\n },\n cache: \"no-cache\"\n });\n\n this.setState({meta: await meta.json()});\n\n window.document.title = this.state.meta.instanceName;\n }\n\n render() {\n return (\n
    \n
    \n \n
    \n )\n }\n}\n\nexport default App;\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\n// Bootstrap\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport 'bootstrap/dist/js/bootstrap';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}