import { useAuthContext } from "../../context/AuthContext"; import { useCallback, useEffect, useState } from "react"; import { Button, Card, Divider, Page, Panel } from "../ui" import { DropdownData, IIngredient, IRecipe } from "../../schemas"; import { useSelectorContext } from "../../context/SelectorContext"; import IngredientSelector from "../derived/IngredientSelector"; import Protect from "../../util/Protect"; import API from "../../util/API"; import { v4 } from "uuid"; import RichText from "../ui/RichText"; import { Autocomplete, TextField } from "@mui/material"; const AddRecipe = () => { const { user, token } = useAuthContext(); const { data, setData } = useSelectorContext(); // received recipe data const [input, setInput] = useState({ name: '', preptime: '', description: '', authoruserid: '' }) // UI state handling const [measurements, setMeasurements] = useState([]); const [ingredientFields, setIngredientFields] = useState>([]); const [courseData, setCourseData] = useState([]); const [optionCount, setOptionCount] = useState(0); // status reporting const [toast, setToast] = useState(<>) // store all ingredients on page mount useEffect(() => { token && (async() => { const ingredients = new API.Ingredient(token); const _dropdowns = new API.Dropdowns(token); const result = await ingredients.getAll(); const measurementList = await _dropdowns.getAllMeasurements(); const courseList = await _dropdowns.getAllCourses(); if (result) { setData((prev) => [...prev, ...result]); } if (measurementList) { setMeasurements((prev) => [...prev, ...measurementList]); } if (courseList) { setCourseData((prev) => [...prev, ...courseList]); } })(); }, [token]) useEffect(() => { if (data.length && measurements.length) { setIngredientFields([]); } }, [data, measurements]) // once user information is available, store it in recipe data useEffect(() => { user && setInput((prev: IRecipe) => { return { ...prev, authoruserid: user.id! } }) }, [user]) // submit handler const handleCreate = async () => { if (!token) return; for (let field of Object.keys(input)) { if (!input[field as keyof IRecipe]) { return; } } const recipe = new API.Recipe(token); const result = await recipe.post(input); const recipeID = result.recipe.id; const recipeName = result.recipe.name; setToast(

Created recipe {recipeName} successfully!

View your new recipe here!

) } const destroySelector = useCallback((position: number) => { setIngredientFields((prev) => { const newState = new Array(); for (let i = 0; i < prev.length; i++) { if (i === position) { continue; } else { newState.push(prev[i]); } } return newState; }) }, [ingredientFields]); function handleNewOption() { setIngredientFields((prev) => [...prev, ]) setOptionCount(prev => prev + 1); } useEffect(() => { console.log(courseData); }, [courseData]) return (

Add a New Recipe

setInput({ ...input, name: e.target.value })}/>
setInput({ ...input, preptime: e.target.value })}/>
{ courseData.length && ( )} getOptionLabel={(option) => option.name} />}
{ data && ( <>
{ ingredientFields }
)}
setInput({ ...input, description: text })} />
{ toast }
) } export default AddRecipe;