import { useAuthContext } from "../../context/AuthContext"; import { LegacyRef, MutableRefObject, useCallback, useEffect, useRef, useState } from "react"; import { Button, Card, Divider, Form, Page, Panel } from "../ui" import { IIngredient, IRecipe } from "../../schemas"; import API from "../../util/API"; import { createOptionFromText, useSelectorContext } from "../../context/SelectorContext"; import IngredientSelector from "../derived/IngredientSelector"; import { v4 } from "uuid"; const AddRecipe = () => { const { user, token } = useAuthContext(); const { data, setData, options, setOptions } = useSelectorContext(); const [ingredientFields, setIngredientFields] = useState>([]); const [triggerChange, setTriggerChange] = useState(false); const [optionCount, setOptionCount] = useState(0); const [toast, setToast] = useState(<>) const [input, setInput] = useState({ name: '', preptime: '', description: '', authoruserid: '' }) const initialIngredient = useRef(null); // clear out selector state on page load /* useEffect(() => { setData(new Array()); setSelected(new Array()); setOptions(new Array()); }, []) */ // store all ingredients on page mount useEffect(() => { token && (async() => { const ingredients = new API.Ingredient(token); const result = await ingredients.getAll(); if (result) { setData((prev) => [...prev, ...result]); // once async data is received, derive its new states setOptions(result.map((each: IIngredient) => { return { label: each.name, value: each.id } })); setIngredientFields([]); } })(); }, [token]) useEffect(() => { if (data.length) { /* const autocompleteInstance = ( each.label)} onChange={(e) => updateSelection(e.target['innerText' as keyof EventTarget].toString())} onKeyDown={(e) => { if (e.code == 'Enter') { const inputVal: string = e.target['value' as keyof EventTarget].toString(); console.log(inputVal) if (inputVal.length) { setSelected(prev => [...prev, inputVal]) const newOption = createOptionFromText(inputVal, optionCount + 1); setOptions((prev) => [...prev, newOption]); setOptionCount(prev => prev + 1); } } }} renderTags={(value, getTagProps) => value.map((option, idx) => handleDelete(option)} />)} renderInput={(params) => ( )} /> ) */ // create dropdown from new data /* const selectorInstance = ) => onChange(selection)} onCreateOption={(input: string) => onCreateOption(input, () => {})} /> */ // data.length && setSelector(autocompleteInstance); setTriggerChange(true); } }, [data, options]) // once the dropdown data has populated, mount it within the full form /* useEffect(() => { triggerChange && setForm( _config={{ parent: "AddRecipe", keys: ["name", "preptime", "course", "cuisine", "ingredients", "description"], labels: ["Recipe Name:", "Prep Time:", "Course:", "Cuisine:", "Ingredients:", "Description:"], dataTypes: ['text', 'text', 'custom picker', 'custom picker', 'SELECTOR', 'TINYMCE'], initialState: input, getState: getFormState, richTextInitialValue: "

Enter recipe details here!

", }} /> ) }, [triggerChange]) */ useEffect(() => { console.log(options); }, [options]) // once user information is available, store it in recipe data useEffect(() => { if (!user) return; user && setInput((prev: IRecipe) => { return { ...prev, authoruserid: user.id! } }) }, [user]) // store input data from form /* const getFormState = useCallback((data: IRecipe) => { setInput(data); }, [input]) const updateSelection = (target: string) => { setSelected((prev) => { return [...prev, target]; }) } const handleDelete = (target: string) => { setSelected((prev) => { return prev.filter(option => option !== target); }) } */ useEffect(() => { return; }, [ingredientFields]) // submit handler const handleCreate = async () => { if (!token) return; for (let field of Object.keys(input)) { if (!input[field as keyof IRecipe]) { console.log(field); 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(optionCount); }, [optionCount]) return (

Add a New Recipe

{ data && (
{ ingredientFields }
)}
{ "description here" }
{ toast }
) } export default AddRecipe;