"use client"; import React, { useState } from "react"; import ReactQuill from "react-quill"; import axios from "axios"; import IconTrashLines from "@/components/icon/icon-trash-lines"; import "react-quill/dist/quill.snow.css"; // ReactQuill toolbar options const modules = { toolbar: { container: [ [{ header: [1, 2, 3, false] }], ["bold", "italic", "underline", "strike"], [{ list: "ordered" }, { list: "bullet" }], ["blockquote", "code-block"], [{ align: [] }], ["link", "image", "video"], ["clean"], ], handlers: { image: function () { const input = document.createElement("input"); input.setAttribute("type", "file"); input.setAttribute("accept", "image/*"); input.click(); input.onchange = async () => { const file = input.files?.[0]; if (file) { const reader = new FileReader(); reader.onload = () => { const quill = this.quill; const range = quill.getSelection(); quill.insertEmbed(range?.index || 0, "image", reader.result); }; reader.readAsDataURL(file); } }; }, }, }, }; const formats = [ "header", "bold", "italic", "underline", "strike", "blockquote", "code-block", "list", "bullet", "align", "link", "image", "video", ]; const PostForm = () => { const [formData, setFormData] = useState({ title: "", slug: "", coverImage: null as File | null, description: "", projectId: "", }); const [loading, setLoading] = useState(false); const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData((prev) => { const updated = { ...prev, [name]: value }; // Auto-generate slug from title if empty if (name === "title" && !prev.slug) { updated.slug = value.toLowerCase().replace(/\s+/g, "-"); } return updated; }); }; const handleImageChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0] || null; setFormData((prev) => ({ ...prev, coverImage: file })); }; const handleRemoveImage = () => { setFormData((prev) => ({ ...prev, coverImage: null })); }; const handleDescriptionChange = (value: string) => { setFormData((prev) => ({ ...prev, description: value })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.projectId) { alert("Project ID is required!"); return; } const data = new FormData(); data.append("title", formData.title); data.append("slug", formData.slug); data.append("description", formData.description); data.append("projectId", formData.projectId); if (formData.coverImage) data.append("image", formData.coverImage); try { setLoading(true); const res = await axios.post("http://localhost:3010/api/blog", data, { headers: { "Content-Type": "multipart/form-data" }, }); alert("Blog created successfully!"); console.log("Blog created:", res.data); // Reset form setFormData({ title: "", slug: "", coverImage: null, description: "", projectId: "", }); } catch (err: any) { console.error("Error creating blog:", err.response?.data || err.message); alert("Failed to create blog. " + (err.response?.data?.error || "")); } finally { setLoading(false); } }; return (

Create Blog

{/* Blog Title */}
{/* Slug */}
{/* Project ID */}
{/* Cover Image Upload */}
{/* Image Preview */} {formData.coverImage && (

Preview:

Selected
)} {/* Description */}
{/* Submit Button */}
); }; export default PostForm;