diff --git a/frontend/src/lib/components/CreateProject.svelte b/frontend/src/lib/components/CreateProject.svelte index 924680a0..bb7cc770 100644 --- a/frontend/src/lib/components/CreateProject.svelte +++ b/frontend/src/lib/components/CreateProject.svelte @@ -16,6 +16,13 @@ }); let events: Event[] = $state([]); let fetchedEvents = false; + let formErrors = $state({ + name: "", + description: "", + image_url: "", + event: "", + }); + let submitting = $state(false); async function fetchEvents() { try { @@ -29,8 +36,58 @@ } } - async function createProject() { + function validate() { + let isValid = true; + + formErrors = { + name: "", + description: "", + image_url: "", + event: "", + }; + + if (!project.name.trim()) { + formErrors.name = "Project name is required"; + isValid = false; + } + + if (!project.description.trim()) { + formErrors.description = "Project description is required"; + isValid = false; + } + + // img url check + if (project.image_url.trim()) { + const validExt = [".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg"]; + const isValidExt = validExt.some((ext) => + project.image_url.toLowerCase().endsWith(ext), + ); + + if (!isValidExt) { + formErrors.image_url = + "Image URL must end with a valid image extension (.jpg, .jpeg, .png, .gif, .webp, .svg)"; + isValid = false; + } + } + + if (!project.event[0]) { + formErrors.event = "Please select an event"; + isValid = false; + } + + return isValid; + } + + async function createProject(e: Event) { + e.preventDefault(); + + if (!validate()) { + toast.error("Please fix the errors in the form"); + return; + } + try { + submitting = true; await ProjectsService.createProjectProjectsPost({ body: project, throwOnError: true, @@ -48,12 +105,14 @@ }; } catch (err) { handleError(err); + } finally { + submitting = false; } }
-
+