diff --git a/components/AddItemForm.tsx b/components/AddItemForm.tsx new file mode 100644 index 000000000..2b92c5da1 --- /dev/null +++ b/components/AddItemForm.tsx @@ -0,0 +1,188 @@ +import { useState } from "react"; +import ImgInput from "@/components/ImageInput"; +import resetImg from "@/public/svgs/ic_X.svg"; +import { useRouter } from "next/router"; +import { AddItemFormProps } from "@/types/commontypes"; +import Image from "next/image"; +import styles from "@/styles/additem.module.css"; + +const INITIAL_VALUE = { + name: "", + favoriteCount: 0, + description: "", + price: 0, + images: null, + tags: [], +}; + +export default function AddItemForm({ + initialValues = INITIAL_VALUE, + initialPreview, + onSubmit, + onSubmitSuccess, +}: AddItemFormProps) { + const router = useRouter(); + const [values, setValues] = useState(initialValues); + const [submittingError, setSubmittingError] = useState(null); + const [tagInput, setTagInput] = useState(""); + + // 유효성 검사 + const isValidForm = + values.name?.trim() !== "" && + values.description?.trim() !== "" && + values.price > 0 && + values.tags.length > 0; + + const handleChange = (name: string, value: any) => { + setValues((initialValues) => ({ + ...initialValues, + [name]: value, + })); + }; + + const handleInputChange = ( + e: React.ChangeEvent + ) => { + const { name, value } = e.target; + handleChange(name, value); + }; + + const handleFileChange = (name: string, file: File | null) => { + handleChange(name, file); + }; + + const handleTagInputChange = (e: React.ChangeEvent) => { + setTagInput(e.target.value); + }; + + const handleTagAdd = () => { + if (tagInput.trim() && !values.tags.includes(tagInput.trim())) { + handleChange("tags", [...values.tags, tagInput.trim()]); + setTagInput(""); + } + }; + + const handleTagKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter") { + e.preventDefault(); + handleTagAdd(); + } + }; + + const handleTagRemove = (tagToRemove: string) => { + handleChange( + "tags", + values.tags.filter((tag) => tag !== tagToRemove) + ); + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + const formData = new FormData(); + formData.append("name", values.name); + formData.append("favorite", values.favoriteCount.toString()); + formData.append("description", values.description); + formData.append("price", values.price.toString()); + if (values.images) { + values.images.forEach((image, index) => { + formData.append(`images[${index}]`, image); + }); + } + formData.append("tags", JSON.stringify(values.tags)); + + const result = await onSubmit(formData); + if (!result) return; + + const { review } = result; + setValues(INITIAL_VALUE); + onSubmitSuccess(review); + + router.push("/items"); + }; + + return ( +
+
+
상품 등록하기
+ +
+
+
+
상품 이미지
+ +
+
+
상품명
+ +
+
+
상품 소개
+