@@ -4,53 +4,74 @@ import Button from "../Button"
44import Input from "../Input"
55import RTE from "../RTE"
66import Select from "../Select"
7- import appwriteSerice from "../../appwrite/config"
7+ import appwriteService from "../../appwrite/config"
88import { useSelector } from "react-redux"
99import { useNavigate } from "react-router-dom"
1010
1111//* this is the most important form because it uses almost everything that we have built so far
1212
13- export default function PostForm ( { post} )
13+ export default function PostForm ( { post } )
1414 {
15- const { register, handleSubmit, watch, setValue, control, getValues} = useForm ( { //? this will duplicate the post
15+ const { register, handleSubmit, watch, setValue, control, getValues, formState : { errors } } = useForm ( { //? this will duplicate the post
1616 defaultValues : {
1717 tittle : post ?. title || "" ,
1818 slug : post ?. slug || "" ,
1919 content : post ?. content || "" ,
2020 status : post ?. status || "active"
2121 }
22- } )
22+ } ) ;
2323
2424 const navigate = useNavigate ( )
25- const userData = useSelector ( ( state ) => state . auth . userData )
25+ const userData = useSelector ( ( state ) => state . auth . userData ) ;
2626
2727 const submit = async ( data ) => {
28- if ( post ) {
29- const file = data . image [ 0 ] ? await appwriteSerice . uploadFile ( data . image [ 0 ] ) : null
3028
31- if ( file ) { //? if we already have the post
32- appwriteSerice . deleteFile ( post . featuredImage )
33- }
34- const dbPost = await appwriteSerice . updatePost ( post . $id , {
35- ...data ,
36- featuredImage : file ? file . $id : undefined
37- } )
38- if ( dbPost ) {
39- navigate ( `/post/${ dbPost . $id } ` )
40- }
41- } else { //? if we are uploading a fresh post
42- const file = await appwriteSerice . uploadFile ( data . image [ 0 ] )
43- if ( file ) {
44- const fileId = file . $id
45- data . featuredImage = fileId
46- const dbPost = await appwriteSerice . createPost ( { ...data , userId : userData . $id } )
47-
48- if ( dbPost ) {
49- navigate ( `/post/${ dbPost . $id } ` )
29+ // if (post) {
30+ // const file = data.image[0] ? await appwriteSerice.uploadFile(data.image[0]) : null
31+
32+ // if (file) { //? if we already have the post
33+ // appwriteSerice.deleteFile(post.featuredImage)
34+ // }
35+ // const dbPost = await appwriteSerice.updatePost(post.$id, {
36+ // ...data,
37+ // featuredImage: file ? file.$id : undefined
38+ // })
39+ // if (dbPost) {
40+ // navigate(`/post/${dbPost.$id}`)
41+ // }
42+ // } else { //? if we are uploading a fresh post
43+ // const file = await appwriteSerice.uploadFile(data.image[0])
44+ // if (file) {
45+ // const fileId = file.$id
46+ // data.featuredImage = fileId
47+ // const dbPost = await appwriteSerice.createPost({...data, userId: userData.$id})
48+
49+ // if (dbPost) {
50+ // navigate(`/post/${dbPost.$id}`)
51+ // }
52+ // }
53+ // }
54+
55+
56+ try {
57+ let fileId ;
58+ if ( data . image [ 0 ] ) {
59+ const file = await appwriteService . uploadFile ( data . image [ 0 ] ) ;
60+ fileId = file ?. $id ;
61+ if ( post ?. featuredImage ) {
62+ await appwriteService . deleteFile ( post . featuredImage ) ;
5063 }
5164 }
52- }
5365
66+ const dbPost = post
67+ ? await appwriteService . updatePost ( post . $id , { ...data , featuredImage : fileId } )
68+ : await appwriteService . createPost ( { ...data , featuredImage : fileId , userId : userData . $id } ) ;
69+
70+ if ( dbPost ) navigate ( `/post/${ dbPost . $id } ` ) ;
71+ } catch ( error ) {
72+ console . error ( "Error in submission:" , error ) ;
73+ // Display an error notification to the user
74+ }
5475 }
5576
5677 const slugTransform = useCallback ( ( value ) => { //? to create slug from the title
@@ -66,6 +87,7 @@ export default function PostForm({post})
6687 }
6788 } )
6889 } , [ watch , slugTransform , setValue ] )
90+
6991 return (
7092 < form onSubmit = { handleSubmit ( submit ) }
7193 className = "flex flex-wrap"
@@ -75,8 +97,11 @@ export default function PostForm({post})
7597 label = "Title"
7698 placeholder = "Title"
7799 className = "mb-4"
78- { ...register ( "title" , { required : true } ) } //? we have to register input inside the hooks so that they are available as values (...register)
100+ { ...register ( "title" , { required : true } ) } //? we have to register input inside the hooks so that they are available as values (...register)
79101 />
102+ { errors . title && < p className = "text-red-500" > { errors . title . message } </ p > }
103+
104+
80105 < Input
81106 label = "Slug :"
82107 placeholder = "Slug"
@@ -85,6 +110,8 @@ export default function PostForm({post})
85110 onInput = { ( e ) => { //? this input field is setting some values
86111 setValue ( "slug" , slugTransform ( e . currentTarget . value ) , { shouldValidate : true } )
87112 } }
113+ // {errors.slug && <p className="text-red-500">{errors.slug.message}</p> }
114+
88115 />
89116 < RTE
90117 label = "Content: "
@@ -102,6 +129,9 @@ export default function PostForm({post})
102129 accept = "image/png, image/jpg, image/jpeg" //? what type of data to accept
103130 { ...register ( "image" , { required : ! post } ) }
104131 />
132+ { errors . image && < p className = "text-red-500" > { errors . image . message } </ p > }
133+
134+
105135 { post && (
106136 < div className = "w-full mb-4" >
107137 < img src = { appwriteSerice . getFilePreview ( post . featuredImage ) } alt = { post . title }
@@ -116,6 +146,9 @@ export default function PostForm({post})
116146 className = "mb-4"
117147 { ...register ( "status" , { required : true } ) }
118148 />
149+ { errors . status && < p className = "text-red-500" > { errors . status . message } </ p > }
150+
151+
119152 < Button
120153 type = "submit"
121154 bgColor = { post ? "bg-green-500" : undefined }
0 commit comments