diff --git a/server/notes.db b/server/notes.db index 9fb91df..4a2fd04 100644 Binary files a/server/notes.db and b/server/notes.db differ diff --git a/src/components/CreateNoteForm.jsx b/src/components/CreateNoteForm.jsx index ffb1252..b876f4e 100644 --- a/src/components/CreateNoteForm.jsx +++ b/src/components/CreateNoteForm.jsx @@ -1,25 +1,85 @@ -// TODO: Import useForm, zodResolver, axios, useNavigate, useState, and noteSchema - - +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import axios from "axios"; +import { useState } from "react"; +import { noteSchema } from "../schema/notes"; import { Save } from "lucide-react"; +import { useNavigate } from "react-router-dom"; -const CreateNoteForm = () => { - // TODO: Setup isSubmitting state with useState - // TODO: create navigate variable and set to useNavigate() - +const CreateNoteForm = ({ onSubmitSuccess }) => { + const [isSubmitting, setIsSubmitting] = useState(false); + const navigate = useNavigate() - // TODO: Set up the form with useForm from react-hook-form and zodResolver from @hookform/resolvers/zod + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: zodResolver(noteSchema), + }); const sendToTheServer = async (data) => { - // TODO: Send the data to the server - // TODO: Use axios to create a new note in the server using the endpoint http://localhost:3001/api/notes + try { + setIsSubmitting(true); + await axios.post("http://localhost:3001/api/notes", data); + if (onSubmitSuccess) { + onSubmitSuccess(); // notify parent page + + } + setTimeout(() => { + navigate("/notes"); + }, 2000); + } catch (error) { + console.error("Error creating note:", error); + } finally { + setIsSubmitting(false); + } }; return ( - <> -

Create Note

- {/* TODO: Setup the form with TailwindCSS, create a form with the following fields: title, content, and submit button */} - +
+ {/* Title */} + + + {errors.title && ( +

{errors.title.message}

+ )} + + {/* Content */} + + + {errors.content && ( +

{errors.content.message}

+ )} + + {/* Submit Button */} + +
); }; diff --git a/src/schema/notes.js b/src/schema/notes.js index 4621c8c..6416a10 100644 --- a/src/schema/notes.js +++ b/src/schema/notes.js @@ -4,5 +4,13 @@ export const noteSchema = z.object({ //TODO: create the title and content schema, // Make sure the title is required and the content is required // Make sure the title is max 50 characters and the content is max 500 characters + title: z + .string() + .min(1, "Title is required") + .max(50, "Title must be at most 50 characters"), + content: z + .string() + .min(1, "Content is required") + .max(500, "Content must be at most 500 characters"), }); \ No newline at end of file