VoiceAssist / vafront /src /Pages /AddRollPage.jsx
thejagstudio's picture
Upload 39 files
49d3082 verified
import React, { useState, useEffect } from "react";
import { VoiceAssistAtom, rollsAtom } from "../Variables";
import { useAtom } from "jotai";
function AddRollPage() {
const [name, setName] = useState("");
const [client, setClient] = useState("");
const [stock, setStock] = useState("");
const [description, setDescription] = useState("");
const [image, setImage] = useState(null);
const [success, setSuccess] = useState(null);
const [error, setError] = useState(null);
const [voiceAssist, setVoiceAssist] = useAtom(VoiceAssistAtom);
const [rolls, setRolls] = useAtom(rollsAtom);
useEffect(() => {
voiceAssist.on(["roll number *", "role number * ", "roll no. *", "role no. *"], true).then((i, wildcard) => {
setName(parseInt(wildcard));
});
voiceAssist.on(["client *"], true).then((i, wildcard) => {
setClient(wildcard);
});
voiceAssist.on(["stock *"], true).then((i, wildcard) => {
setStock(parseInt(wildcard));
});
voiceAssist.on(["description *"], true).then((i, wildcard) => {
setDescription(wildcard);
});
voiceAssist.on(["submit"]).then((i) => {
submitBtn.click();
});
}, []);
return (
<div className="flex flex-col lg:flex-row gap-10 items-center justify-center w-full h-full">
<div className="max-w-80 w-[80%] mx-auto lg:mx-0 lg:w-auto">
<h4 className="font-semibold text-primary-900">Upload Image</h4>
<div className="relative overflow-hidden bg-primary-200 hover:bg-primary-300/75 group/upload cursor-pointer border-2 border-dashed transition-all border-primary-900 rounded-lg w-full lg:w-64 h-16 lg:h-64 relativ flex flex-col items-center justify-center">
<input
onChange={(event) => {
let dataUri = URL.createObjectURL(event.target.files[0]);
setImage(dataUri);
}}
id="sampleImage"
type="file"
allow=".png,.jpg,.jpeg"
className="w-full h-full absolute top-0 left-0 opacity-0"
/>
{image === null ? (
<div>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" className="w-32 h-32 text-primary-800 transition-all group-hover/upload:text-primary-700 " xmlSpace="preserve">
<path d="M22.414 23.586a2 2 0 1 1-2.828 2.828L18 24.828V29a2 2 0 0 1-4 0v-4.172l-1.586 1.586a2 2 0 1 1-2.828-2.828l5-5a2 2 0 0 1 2.828 0zM26 10A9 9 0 0 0 8.2 8.12 6 6 0 1 0 7 20h4.758l2.121-2.121A2.98 2.98 0 0 1 16 17c.802 0 1.555.312 2.121.879L20.242 20H26a5 5 0 0 0 0-10" fill="currentColor" />
</svg>
<h6 className=" font-semibold text-primary-900 group-hover/upload:text-primary-800 transition-all -mb-3">Upload Image</h6>
</div>
) : (
<img src={image} className="w-full h-full object-cover"></img>
)}
</div>
</div>
<div className="relative flex flex-col bg-clip-border rounded-xl bg-transparent text-primary-700 shadow-none">
<h4 className="text-xl font-semibold text-primary-900 lg:w-full w-[80%] lg:mx-0 mx-auto">Add New Roll</h4>
<p className="text-primary-700 mt-1 font-normal lg:w-full w-[80%] lg:mx-0 mx-auto">Please fill in the form to register a new roll.</p>
{success && (
<div role="alert" className="relative w-full text-base font-regular px-4 py-4 mt-3 rounded-none border-l-4 border-green-600 bg-green-600/10 font-medium text-green-600 flex" style={{ opacity: 1 }}>
<div className="shrink-0">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" className="h-6 w-6">
<path fillRule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zm13.36-1.814a.75.75 0 10-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 00-1.06 1.06l2.25 2.25a.75.75 0 001.14-.094l3.75-5.25z" clipRule="evenodd" />
</svg>
</div>
<div className="ml-3 mr-12 truncate" id="successMsg">
{success}
</div>
</div>
)}
{error && (
<div role="alert" className="relative w-full text-base font-regular px-4 py-4 mt-3 rounded-none border-l-4 border-red-500 bg-red-500/10 font-medium text-red-500 flex" style={{ opacity: 1 }}>
<div className="shrink-0">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" className="h-6 w-6">
<path fillRule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zm13.36-1.814a.75.75 0 10-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 00-1.06 1.06l2.25 2.25a.75.75 0 001.14-.094l3.75-5.25z" clipRule="evenodd" />
</svg>
</div>
<div className="ml-3 mr-12 truncate" id="errorMsg">
{error}
</div>
</div>
)}
<div className="mt-8 mb-2 max-w-80 lg:w-full w-[80%] lg:mx-0 mx-auto">
<div className="mb-1 flex flex-col gap-3">
<h6 className=" font-semibold text-primary-900">Roll No.</h6>
<input
onChange={(event) => {
setName(event.target.value);
}}
value={name}
placeholder={123}
type="number"
className="w-full h-11 bg-transparent text-primary-700 font-normal outline outline-0 focus:outline-0 disabled:bg-blue-gray-50 disabled:border-0 disabled:cursor-not-allowed transition-all placeholder-shown:border border focus:border-2 border-t-transparent focus:border-t-transparent text-sm px-3 py-3 rounded-md border-blue-gray-200 focus:border-gray-900 !border-t-blue-gray-200 focus:!border-t-gray-900"
/>
<h6 className=" font-semibold text-primary-900">Client</h6>
<input
onChange={(event) => {
setClient(event.target.value);
}}
value={client}
placeholder="Sahi"
className="w-full h-11 bg-transparent text-primary-700 font-normal outline outline-0 focus:outline-0 disabled:bg-blue-gray-50 disabled:border-0 disabled:cursor-not-allowed transition-all placeholder-shown:border border focus:border-2 border-t-transparent focus:border-t-transparent text-sm px-3 py-3 rounded-md border-blue-gray-200 focus:border-gray-900 !border-t-blue-gray-200 focus:!border-t-gray-900"
/>
<h6 className=" font-semibold text-primary-900">Stock</h6>
<input
onChange={(event) => {
setStock(event.target.value);
}}
value={stock}
placeholder={10}
type="number"
className="w-full h-11 bg-transparent text-primary-700 font-normal outline outline-0 focus:outline-0 disabled:bg-blue-gray-50 disabled:border-0 disabled:cursor-not-allowed transition-all placeholder-shown:border border focus:border-2 border-t-transparent focus:border-t-transparent text-sm px-3 py-3 rounded-md border-blue-gray-200 focus:border-gray-900 !border-t-blue-gray-200 focus:!border-t-gray-900"
/>
<h6 className=" font-semibold text-primary-900">Description</h6>
<input
onChange={(event) => {
setDescription(event.target.value);
}}
value={description}
placeholder="Plain white Fabric"
className="w-full h-11 bg-transparent text-primary-700 font-normal outline outline-0 focus:outline-0 disabled:bg-blue-gray-50 disabled:border-0 disabled:cursor-not-allowed transition-all placeholder-shown:border border focus:border-2 border-t-transparent focus:border-t-transparent text-sm px-3 py-3 rounded-md border-blue-gray-200 focus:border-gray-900 !border-t-blue-gray-200 focus:!border-t-gray-900"
/>
</div>
<button
id="submitBtn"
onClick={() => {
console.log(name, client, stock);
if (!name || !client || !stock || !description || !image) {
setError("Please fill all the fields");
setTimeout(() => {
setError(null);
}, 3000);
return;
}
let sampleImage = document.getElementById("sampleImage");
let imageFile = sampleImage.files[0];
let data = new FormData();
data.append("name", name);
data.append("client", client);
data.append("stock", stock);
data.append("description", description);
data.append("image", imageFile);
fetch("/api/rollEntry", {
method: "POST",
body: data,
})
.then((response) => response.json())
.then((data) => {
if (data.status === "success") {
setClient("");
setName("");
setStock("");
setDescription("");
setImage(null);
setSuccess(data.msg);
setTimeout(() => {
setSuccess(null);
}, 3000);
fetch("/api/rolls")
.then((res) => res.json())
.then((data) => {
setRolls(data["data"]);
})
.catch((err) => console.error(err));
} else {
setError(data.msg);
setTimeout(() => {
setError(null);
}, 3000);
voiceAssist.say(data.msg);
}
})
.catch((error) => console.error("Error:", error));
}}
className="align-middle select-none font-sans font-bold text-center uppercase transition-all disabled:opacity-50 disabled:shadow-none disabled:pointer-events-none text-xs py-3 px-6 rounded-lg bg-gradient-to-tr from-primary-950 to-primary-800 text-white shadow-md shadow-gray-900/10 hover:shadow-lg hover:shadow-gray-900/20 focus:opacity-[0.85] focus:shadow-none active:opacity-[0.85] active:shadow-none block w-full mt-6"
type="button"
>
Submit
</button>
</div>
</div>
</div>
);
}
export default AddRollPage;