import React, {useCallback, useContext, useEffect, useReducer, useRef, useState} from 'react'; import {toast} from "react-toastify"; import {AuthContext} from "../App"; import {SERVER_URL} from "../auth"; import {Input} from "../custom"; const LIMIT = 2 * 1024 * 1024; // 2 mb const dispatch = (state, action) => { switch (action.type) { case "lat": return {...state, lat: action.value} case "long": return {...state, long: action.value} default: return; } } function FileUploadForm() { const {authState} = useContext(AuthContext) const [files, setFiles] = useState(null); const [load, setLoad] = useState(0) const [status, setStatus] = useState("Upload a file") const [latLong, setLatLong] = useReducer(dispatch, {lat: "", long: ""}, undefined) let form = useRef(null); async function query(url, data) { console.debug("FETCH: " + SERVER_URL + url + " - " + data) return new Promise((resolve, reject) => { let req = new XMLHttpRequest() req.open('post', SERVER_URL + url) req.upload.addEventListener('progress', e => { if (e.loaded === e.total) setStatus("Processing...") else { let percent = (e.loaded / e.total * 100) setLoad(percent) setStatus("Uploading " + percent.toFixed(0) + "%") } }); req.addEventListener('load', () => { resolve({status: req.status, json: JSON.parse(req.response)}) }); req.addEventListener('error', e => { resolve({status: req.status, json: JSON.parse(req.response)}) }) req.send(data) }) } const upload = useCallback(async () => { if (!files || files.length === 0) return const target = files[0] if (target.size > LIMIT) return toast.error("File size too large! Max 2 mb.") if (!target.name.includes(".xlsx")) return toast.error("Invalid file type!") const {lat, long} = latLong; setStatus("Uploading") let file = new FormData() file.append("file", target) file.append("token", authState.token); file.append("latitude", lat); file.append("longitude", long); let {status, json} = await query("/data/upload", file) form.current.reset(); setStatus("Upload a file") setLoad(0) if (status !== 200) return toast.error(json.reason) return toast.success("File successfully uploaded.") }, [files, authState.token, form, latLong]) useEffect(() => { (async () => upload())(); }, [files, authState.token, upload, authState, setLoad, setStatus]) return
Upload File Entries
Click the button to upload an .xlsx file

Latitude and longitude is required if your data doesn't have it

setLatLong({type: "lat", value: e})}/> setLatLong({type: "long", value: e})}/>