diff --git a/src/App.js b/src/App.js index a3d8d6a..3f3eff7 100644 --- a/src/App.js +++ b/src/App.js @@ -11,6 +11,7 @@ import DocumentListPage from "./Components/Document/DocumentListPage"; import DocEditPage from "./Components/Document/DocEditPage"; import Homepage from "./Components/Home/HomePage"; import Dashboard from "./Components/Dashboard/Dashboard"; +import OptoutPage from "./Components/OptoutPage"; import Container from "react-bootstrap/Container"; import CaseListPage from "./Components/Case/CaseListPage"; import CaseDetailsPage from "./Components/Case/CaseDetailsPage"; @@ -47,6 +48,7 @@ function App() { } /> } /> + } /> } diff --git a/src/Components/OptoutPage.js b/src/Components/OptoutPage.js new file mode 100644 index 0000000..488742a --- /dev/null +++ b/src/Components/OptoutPage.js @@ -0,0 +1,119 @@ +import { useState } from "react"; +import Button from "../pageElements/Button"; +import { useNavigate } from "react-router-dom"; +import Col from "react-bootstrap/Col"; +import Form from "react-bootstrap/Form"; +import Row from "react-bootstrap/Row"; +import { removalFields } from "../Constants/Fields/DemoFields"; +import { useParams } from "react-router-dom"; +import { splitEvery } from "../Utils/Array"; +import TextInput from "../pageElements/TextInput"; +import { objectMap } from "../Utils/Object"; +import { v4 as uuidv4 } from "uuid"; +import { + getFormDataDefaults, + getValidatedFormData, + handleFormDataChange, + isFormDataHasErrors, +} from "../Utils/Form"; +import { db } from "../firebase"; +import { collection, setDoc, doc } from "firebase/firestore"; +import "../styles/demo-request-page.scss"; + +const OptoutPage = () => { + const navigate = useNavigate(); + const token = window.sessionStorage.getItem("token"); + const [isBusy, setIsBusy] = useState(); + const fieldsChunkSize = 2; + const inputFields = removalFields; + const [data, setData] = useState(getFormDataDefaults(inputFields)); + const handleChangeInput = (e, name) => { + const newData = handleFormDataChange(e, name, data, inputFields); + if (newData !== null) { + setData(newData); + } + }; + + const validateData = () => { + const newData = getValidatedFormData(data, inputFields); + const hasErrors = isFormDataHasErrors(newData); + setData(newData); + return hasErrors ? null : objectMap(({ value }) => value, newData); + }; + + async function saveRequestData(dataValues) { + const requestDate = new Date(); + dataValues["requestDate"] = requestDate; + const requestId = uuidv4(); + try { + const reqRemoveRef = collection(db, "removalrequests"); + await setDoc(doc(reqRemoveRef, requestId), dataValues); + } catch (error) { + console.log(`Error saving request data to db: ${error}`); + } + } + + async function handleRequestOptOut() { + const dataValues = validateData(); + if (dataValues === null) { + return; + } + saveRequestData(dataValues); + navigate("/"); + } + + return ( +
+
+
+

Opt Out of Future Emails

+

+ Enter your email address to be removed from our mailing list +

+
+
+ {splitEvery(Object.keys(inputFields), fieldsChunkSize).map( + (names, j) => ( + + {names.map((name, i) => ( + + handleChangeInput(e, name)} + error={data[name].error} + message={data[name].message} + label={ + data[name].value.length === 0 + ? inputFields[name].label + : "" + } + type={inputFields[name].type} + values={inputFields[name].values} + disabled={isBusy} + /> + + ))} + + ) + )} +
+
+
+
+
+ ); +}; + +export default OptoutPage; diff --git a/src/Constants/Fields/DemoFields.js b/src/Constants/Fields/DemoFields.js index 0fc9159..50fa245 100644 --- a/src/Constants/Fields/DemoFields.js +++ b/src/Constants/Fields/DemoFields.js @@ -34,3 +34,7 @@ export const supportFields = { maxLength: 45, }, }; + +export const removalFields = { + email: { required: true, label: "Email", maxLength: 45, type: "email" }, +};