Merging in the React Refactor #56

Merged
azpect merged 51 commits from refactor/react into master 2025-12-28 22:27:52 -07:00
2 changed files with 40 additions and 9 deletions
Showing only changes of commit 58691fd7a1 - Show all commits

View File

@ -0,0 +1,34 @@
import type { CreateRecipeFormToggles } from "../../pages/Create";
interface ValidationErrorListProps {
validation: CreateRecipeFormToggles;
}
const MESSAGES: Record<keyof CreateRecipeFormToggles, string> = {
title: "Invalid title provided.",
description: "Invalid description provided.",
prepTime: "Invalid preparation time provided.",
cookTime: "Invalid cook time provided.",
servingSize: "Invalid serving size provided.",
category: "Invalid category selected.",
difficulty: "Invalid difficulty selected.",
ingredients: "Invalid ingredients provided.",
instructions: "Invalid instructions provided.",
}
export default function ValidationErrorList({ validation }: ValidationErrorListProps) {
return (
<div className="my-2">
{Object.entries(validation)
.filter(([, isValid]) => !isValid)
.map(([name]) => {
const key = name as keyof CreateRecipeFormToggles;
return (
<p key={name} className="text-sm text-red-500">
{MESSAGES[key]}
</p>
);
})}
</div>
);
}

View File

@ -2,6 +2,7 @@ import { useEffect, useState } from "react";
import Banner from "../components/Banner"; import Banner from "../components/Banner";
import { isRecipeMeal } from "../types/recipe"; import { isRecipeMeal } from "../types/recipe";
import InstructionForm from "../components/forms/InstructionForm"; import InstructionForm from "../components/forms/InstructionForm";
import ValidationErrorList from "../components/forms/ValidationErrorList";
interface CreateRecipeForm { interface CreateRecipeForm {
title: string; title: string;
@ -18,7 +19,7 @@ interface CreateRecipeForm {
image: File | null; image: File | null;
}; };
interface CreateRecipeFormToggles { export interface CreateRecipeFormToggles {
title: boolean; title: boolean;
description: boolean; description: boolean;
prepTime: boolean; prepTime: boolean;
@ -175,7 +176,6 @@ export default function Create() {
Please provide a unique title for your recipe. This is the most important part! Please provide a unique title for your recipe. This is the most important part!
</p> </p>
<input <input
onKeyDown={keyDownHandler}
className={`${!validation.title ? "border-red-500" : ""} ${INPUT_CLASSES}`} className={`${!validation.title ? "border-red-500" : ""} ${INPUT_CLASSES}`}
type="text" type="text"
name="title" name="title"
@ -228,7 +228,6 @@ export default function Create() {
Please provide a list of tags. <span className="italic">e.g., easy, dairy-free, gluten-free, high protein.</span> Please provide a list of tags. <span className="italic">e.g., easy, dairy-free, gluten-free, high protein.</span>
</p> </p>
<input <input
onKeyDown={keyDownHandler}
className="border border-gray-300 px-4 py-2 rounded-lg focus:outline-none focus:ring-blue-500 focus:ring-2 duration-200 ease-in-out transition-all shadow-sm" className="border border-gray-300 px-4 py-2 rounded-lg focus:outline-none focus:ring-blue-500 focus:ring-2 duration-200 ease-in-out transition-all shadow-sm"
maxLength={32} maxLength={32}
enterKeyHint="done" enterKeyHint="done"
@ -253,7 +252,6 @@ export default function Create() {
Please provide the estimated prep time (minutes). Please provide the estimated prep time (minutes).
</p> </p>
<input <input
onKeyDown={keyDownHandler}
className={`${!validation.prepTime ? "border-red-500" : ""} ${INPUT_CLASSES}`} className={`${!validation.prepTime ? "border-red-500" : ""} ${INPUT_CLASSES}`}
type="number" type="number"
name="prepTime" name="prepTime"
@ -277,7 +275,6 @@ export default function Create() {
Please provide the estimated cook time (minutes). Please provide the estimated cook time (minutes).
</p> </p>
<input <input
onKeyDown={keyDownHandler}
className={`${!validation.cookTime ? "border-red-500" : ""} ${INPUT_CLASSES}`} className={`${!validation.cookTime ? "border-red-500" : ""} ${INPUT_CLASSES}`}
type="number" type="number"
name="cookTime" name="cookTime"
@ -301,7 +298,6 @@ export default function Create() {
Please provide the estimated serving size. Please provide the estimated serving size.
</p> </p>
<input <input
onKeyDown={keyDownHandler}
className={`${!validation.servingSize ? "border-red-500" : ""} ${INPUT_CLASSES}`} className={`${!validation.servingSize ? "border-red-500" : ""} ${INPUT_CLASSES}`}
type="number" type="number"
name="servingSize" name="servingSize"
@ -387,7 +383,6 @@ export default function Create() {
<li className="w-full flex gap-x-2 py-2"> <li className="w-full flex gap-x-2 py-2">
<div className="flex-grow"> <div className="flex-grow">
<input <input
onKeyDown={keyDownHandler}
className="peer w-full border border-gray-300 px-4 py-2 rounded-lg focus:outline-none className="peer w-full border border-gray-300 px-4 py-2 rounded-lg focus:outline-none
focus:ring-blue-500 focus:ring-2 duration-200 ease-in-out transition-all shadow-sm focus:ring-blue-500 focus:ring-2 duration-200 ease-in-out transition-all shadow-sm
invalid:border-red-500" invalid:border-red-500"
@ -404,7 +399,6 @@ export default function Create() {
</div> </div>
<div className="w-1/3"> <div className="w-1/3">
<input <input
onKeyDown={keyDownHandler}
className="peer w-full border border-gray-300 px-4 py-2 rounded-lg focus:outline-none className="peer w-full border border-gray-300 px-4 py-2 rounded-lg focus:outline-none
focus:ring-blue-500 focus:ring-2 duration-200 ease-in-out transition-all shadow-sm focus:ring-blue-500 focus:ring-2 duration-200 ease-in-out transition-all shadow-sm
invalid:border-red-500" invalid:border-red-500"
@ -466,7 +460,10 @@ export default function Create() {
/> />
</div> </div>
<button disabled={!isFormValid} className={`${isFormValid ? "bg-gradient-to-r from-blue-200 to-purple-200 cursor-pointer" : "bg-gray-200 text-gray-500 cursor-not-allowed"} w-full mt-8 py-2 rounded-lg text-lg shadow-md`}> {/* Display the reason for the invalidation */}
<ValidationErrorList validation={validation} />
<button disabled={!isFormValid} className={`${isFormValid ? "bg-gradient-to-r from-blue-200 to-purple-200 cursor-pointer" : "bg-gray-200 text-gray-500 cursor-not-allowed"} w-full py-2 rounded-lg text-lg shadow-md`}>
Create Recipe Create Recipe
</button> </button>
</div> </div>