import React, { useState } from "react"; import { useNavigate, Link } from "react-router-dom"; import { useAuth } from "../contexts/AuthContext"; import { forumAPI } from "../services/api"; import TagInput from "../components/TagInput"; const CreateForumPost: React.FC = () => { const { user } = useAuth(); const navigate = useNavigate(); const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); const [formData, setFormData] = useState({ title: "", content: "", category: "general_discussion" as | "item_request" | "technical_support" | "community_resources" | "general_discussion", tags: [] as string[], }); const categories = [ { value: "item_request", label: "Item Request", description: "Looking to rent a specific item", }, { value: "technical_support", label: "Technical Support", description: "Get help with using the platform", }, { value: "community_resources", label: "Community Resources", description: "Share tips, guides, and resources", }, { value: "general_discussion", label: "General Discussion", description: "Open-ended conversations", }, ]; const handleInputChange = ( e: React.ChangeEvent< HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement > ) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); }; const handleTagsChange = (tags: string[]) => { setFormData((prev) => ({ ...prev, tags })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); // Validation if (!formData.title.trim()) { setError("Title is required"); return; } if (formData.title.length < 10) { setError("Title must be at least 10 characters long"); return; } if (!formData.content.trim()) { setError("Content is required"); return; } if (formData.content.length < 20) { setError("Content must be at least 20 characters long"); return; } try { setIsSubmitting(true); const response = await forumAPI.createPost(formData); navigate(`/forum/${response.data.id}`); } catch (err: any) { setError(err.response?.data?.error || "Failed to create post"); setIsSubmitting(false); } }; if (!user) { return (
You must be logged in to create a post.
Back to Forum
); } return (
{/* Guidelines Card */}
Community Guidelines
  • Be respectful and courteous to others
  • Stay on topic and relevant to the category
  • No spam, advertising, or self-promotion
  • Search before posting to avoid duplicates
  • Use clear, descriptive titles
  • Provide helpful and constructive feedback

Create New Post

{error && (
{error}
)}
{/* Title */}
{formData.title.length}/200 characters (minimum 10)
{/* Category */}
Choose the category that best fits your post
{/* Content */}