import { useEffect, useState } from "react"; import { SubmitHandler, useForm, ControllerRenderProps } from "react-hook-form"; import { Button } from "@/components/ui/button"; import { MultipleOptionSelector } from "@/components/multipleSelector"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { projectFormSchema } from "@/types/schemas/application.schema"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { Label } from "@/components/ui/label"; import { createSupabaseClient } from "@/lib/supabase/clientComponentClient"; import { Textarea } from "./ui/textarea"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@/components/ui/command"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { cn } from "@/lib/utils"; import { ChevronsUpDown, Check, X } from "lucide-react"; type projectSchema = z.infer; type FieldType = ControllerRenderProps; interface ProjectFormProps { onSubmit: SubmitHandler; } const ProjectForm = ({ onSubmit, }: ProjectFormProps & { onSubmit: SubmitHandler }) => { const form = useForm({ resolver: zodResolver(projectFormSchema), defaultValues: {}, }); let supabase = createSupabaseClient(); const [projectType, setProjectType] = useState< { id: number; name: string }[] >([]); const [projectPitch, setProjectPitch] = useState("text"); const [selectedImages, setSelectedImages] = useState([]); const [projectPitchFile, setProjectPitchFile] = useState(""); const [tag, setTag] = useState<{ id: number; value: string }[]>([]); const [open, setOpen] = useState(false); const [selectedTag, setSelectedTag] = useState([]); const handleFileChange = ( event: React.ChangeEvent, field: FieldType ) => { if (event.target.files) { const filesArray = Array.from(event.target.files); console.log("first file", filesArray); setSelectedImages((prevImages) => { const updatedImages = [...prevImages, ...filesArray]; console.log("Updated Images Array:", updatedImages); field.onChange(updatedImages); return updatedImages; }); } }; const handleRemoveImage = (index: number, field: FieldType) => { setSelectedImages((prevImages) => { const updatedImages = prevImages.filter((_, i) => i !== index); console.log("After removal - Updated Images:", updatedImages); field.onChange(updatedImages); return updatedImages; }); }; const fetchProjectType = async () => { let { data: ProjectType, error } = await supabase .from("project_type") .select("id, value"); if (error) { console.error(error); } else { if (ProjectType) { setProjectType( ProjectType.map((item) => ({ id: item.id, name: item.value, })) ); } } }; const fetchTag = async () => { let { data: tag, error } = await supabase.from("tag").select("id, value"); if (error) { console.error(error); } else { if (tag) { setTag( tag.map((item) => ({ id: item.id, value: item.value, })) ); } } }; useEffect(() => { fetchProjectType(); fetchTag(); }, []); return (
)} className="space-y-8" >
{/* project name */} (
Project name
)} /> {/* project type */} ( Project type} fieldName="projectType" choices={projectType} handleFunction={(selectedValues: any) => { field.onChange(selectedValues.name); }} description={ <>Please specify the primary purpose of the funds } placeholder="Select a Project type" selectLabel="Project type" /> )} /> {/* short description */} (
Short description