1+ import { useState } from "react" ;
2+ import { toast } from "react-toastify" ;
3+ import { collection , addDoc , serverTimestamp } from "firebase/firestore" ;
4+ import { useAuth } from "../../hooks/AuthContext" ;
5+ import { db } from "../../config/firebaseConfig" ;
16
27const CreateBlog = ( ) => {
8+ const [ title , setTitle ] = useState ( "" ) ;
9+ const [ content , setContent ] = useState ( "" ) ;
10+ const [ tags , setTags ] = useState ( "" ) ;
11+ const { user } = useAuth ( ) ;
12+ const [ isPreview , setIsPreview ] = useState ( false ) ;
13+
14+ const handleSubmit = async ( ) => {
15+ if ( ! title || ! content || ! tags ) {
16+ toast . error ( "All fields are required!" ) ;
17+ return ;
18+ }
19+
20+ try {
21+ await addDoc ( collection ( db , "Blogs" ) , {
22+ title,
23+ content,
24+ tags : tags . split ( "," ) . map ( ( tag ) => tag . trim ( ) ) ,
25+ author : user ?. displayName || user ?. email || "Anonymous" ,
26+ createdAt : serverTimestamp ( ) ,
27+ } ) ;
28+ toast . success ( "Blog created successfully!" ) ;
29+ setTitle ( "" ) ;
30+ setContent ( "" ) ;
31+ setTags ( "" ) ;
32+ setIsPreview ( false ) ;
33+ } catch ( error ) {
34+ console . error ( "Error creating blog: " , error ) ;
35+ toast . error ( "Failed to create blog. Please try again." ) ;
36+ }
37+ } ;
38+
339 return (
4- < div > CreateBlog</ div >
5- )
6- }
40+ < div className = "grid grid-cols-2 gap-8 p-8 h-screen" >
41+ { /* Blog Form */ }
42+ < form
43+ className = "p-6 border rounded-lg bg-gray-900"
44+ onSubmit = { ( e ) => {
45+ e . preventDefault ( ) ;
46+ setIsPreview ( true ) ;
47+ } }
48+ >
49+ < h2 className = "text-2xl font-bold mb-6 text-green-400" >
50+ Create a New Blog
51+ </ h2 >
52+ < div className = "mb-4" >
53+ < label className = "block text-white text-sm font-bold mb-2" >
54+ Title
55+ </ label >
56+ < input
57+ type = "text"
58+ className = "w-full px-3 py-2 border border-green-400 focus:outline-none bg-transparent text-white"
59+ value = { title }
60+ onChange = { ( e ) => setTitle ( e . target . value ) }
61+ placeholder = "Enter blog title"
62+ />
63+ </ div >
64+ < div className = "mb-4" >
65+ < label className = "block text-white text-sm font-bold mb-2" >
66+ Content
67+ </ label >
68+ < textarea
69+ className = "w-full px-3 py-2 border border-green-400 focus:outline-none bg-transparent text-white"
70+ value = { content }
71+ onChange = { ( e ) => setContent ( e . target . value ) }
72+ placeholder = "Write your blog content here..."
73+ rows = { 5 }
74+ > </ textarea >
75+ </ div >
76+ < div className = "mb-4" >
77+ < label className = "block text-white text-sm font-bold mb-2" >
78+ Tags (comma separated)
79+ </ label >
80+ < input
81+ type = "text"
82+ className = "w-full px-3 py-2 border border-green-400 focus:outline-none bg-transparent text-white"
83+ value = { tags }
84+ onChange = { ( e ) => setTags ( e . target . value ) }
85+ placeholder = "e.g., React, JavaScript, Firebase"
86+ />
87+ </ div >
88+ < button
89+ type = "submit"
90+ className = "border border-green-400 text-green-400 px-4 py-2"
91+ >
92+ Preview Blog
93+ </ button >
94+ </ form >
95+
96+ { /* Blog Preview */ }
97+ { isPreview && (
98+ < div className = "p-6 border rounded-lg bg-gray-800" >
99+ < h2 className = "text-2xl font-bold mb-6 text-green-400" > Preview</ h2 >
100+ < h3 className = "text-lg font-semibold mb-2 text-white" >
101+ { title || "Untitled" }
102+ </ h3 >
103+ < p className = "mb-4 text-white" > { content || "No content provided." } </ p >
104+ < div className = "mb-4" >
105+ < span className = "text-sm font-bold text-green-400" > Tags: </ span >
106+ < span className = "text-white" > { tags || "No tags" } </ span >
107+ </ div >
108+ < div className = "flex gap-4" >
109+ < button
110+ onClick = { ( ) => setIsPreview ( false ) }
111+ className = "border border-yellow-500 text-yellow-500 px-4 py-2"
112+ >
113+ Edit Blog
114+ </ button >
115+ < button
116+ onClick = { handleSubmit }
117+ className = "border border-green-400 text-green-400 px-4 py-2"
118+ >
119+ Publish Blog
120+ </ button >
121+ </ div >
122+ </ div >
123+ ) }
124+ </ div >
125+ ) ;
126+ } ;
7127
8- export default CreateBlog
128+ export default CreateBlog ;
0 commit comments