@@ -3,18 +3,20 @@ import { AppContext } from "../context/AppContext"
33import { Link } from "react-router-dom"
44
55export default function Home ( ) {
6- const { user } = useContext ( AppContext )
6+ const { user, token } = useContext ( AppContext )
77 const [ posts , setPosts ] = useState ( [ ] )
88 const [ selectedPostId , setSelectedPostId ] = useState ( null )
99 const [ comments , setComments ] = useState ( [ ] )
10- const [ likesCount , setLikesCount ] = useState ( { } )
1110 const [ newComment , setNewComment ] = useState ( "" )
11+ const [ newPost , setNewPost ] = useState ( "" )
12+ const [ errors , setErrors ] = useState ( { } )
1213
1314 // Récupérer tous les posts
1415 async function getPosts ( ) {
1516 const res = await fetch ( "/api/posts" )
1617 const data = await res . json ( )
1718 setPosts ( data )
19+ console . log ( data )
1820 }
1921
2022 // Récupérer les likes pour un post donné
@@ -23,7 +25,14 @@ export default function Home() {
2325 headers : { "Authorization" : `Bearer ${ localStorage . getItem ( "token" ) } ` }
2426 } )
2527 const data = await res . json ( )
26- setLikesCount ( prev => ( { ...prev , [ postId ] : data . likes_count } ) )
28+ console . log ( data )
29+ setPosts ( prev =>
30+ prev . map ( post =>
31+ post . id === postId
32+ ? { ...post , likes_count : data . likes_count }
33+ : post
34+ )
35+ ) ;
2736 }
2837
2938 // Liker un post
@@ -66,25 +75,70 @@ export default function Home() {
6675 }
6776 }
6877
78+ function truncateAtWord ( text , maxLength = 100 ) {
79+ if ( ! text || typeof text !== "string" ) return "" ;
80+
81+ const normalized = text
82+ . trim ( )
83+ . replace ( / \s + / g, " " ) ;
84+
85+ if ( normalized . length <= maxLength ) {
86+ return normalized ;
87+ }
88+
89+ let truncated = normalized . slice ( 0 , maxLength ) ;
90+ const lastSpaceIndex = truncated . lastIndexOf ( " " ) ;
91+
92+ if ( lastSpaceIndex > 0 ) {
93+ truncated = truncated . slice ( 0 , lastSpaceIndex ) ;
94+ }
95+
96+ return `${ truncated } ...` ;
97+ }
98+
99+ async function handleSubmitPost ( e ) {
100+ e . preventDefault ( ) ;
101+
102+ const PostData = {
103+ title : truncateAtWord ( newPost , 25 ) ,
104+ body : newPost
105+ } ;
106+ console . log ( PostData )
107+
108+ try {
109+ const res = await fetch ( "/api/posts" , {
110+ method : "POST" ,
111+ headers : {
112+ Authorization : `Bearer ${ token } ` ,
113+ "Content-Type" : "application/json"
114+ } ,
115+ body : JSON . stringify ( PostData )
116+ } ) ;
117+
118+ const data = await res . json ( ) ;
119+ setNewPost ( "" )
120+ getPosts ( )
121+
122+ if ( ! res . ok || data . errors )
123+ setErrors ( data . errors || { general : "Erreur lors de la création du post" } ) ;
124+ } catch {
125+ setErrors ( { general : "Erreur réseau" } ) ;
126+ }
127+ }
128+
69129 useEffect ( ( ) => {
70130 getPosts ( )
71131 } , [ ] )
72132
73- useEffect ( ( ) => {
74- posts . forEach ( post => {
75- fetchLikes ( post . id )
76- } )
77- } , [ posts ] )
78-
79133 return (
80134 < div className = "flex" >
81135 { /* Contenu principal */ }
82136 < div className = "w-3/4 pr-4" >
83137
84- < form onSubmit = { handleCommentSubmit } className = "flex items-end gap-2 mb-4 bg-transparent px-3 py-2 " >
138+ < form onSubmit = { handleSubmitPost } className = "flex items-end gap-2 mb-4 bg-transparent px-3 py-2 " >
85139 < textarea
86- value = { newComment }
87- onChange = { ( e ) => setNewComment ( e . target . value ) }
140+ value = { newPost }
141+ onChange = { ( e ) => setNewPost ( e . target . value ) }
88142 placeholder = { user ? `Alors, ${ user . name } , quoi de neuf ?...` : "Connectez-vous pour publier un post..." }
89143 rows = { 2 }
90144 className = "flex-1 mx-3 resize-none bg-transparent text-gray-600 rounded-3xl placeholder-gray-400 overflow-hidden min-h-[32px] max-h-[120px] text-sm"
@@ -97,7 +151,7 @@ export default function Home() {
97151 { /* Bouton d'envoi (flèche) */ }
98152 < button
99153 type = "submit"
100- disabled = { ! newComment . trim ( ) }
154+ disabled = { ! newPost . trim ( ) }
101155 className = "text-gray-400 hover:text-white transition disabled:opacity-30 disabled:cursor-not-allowed pb-1"
102156 title = "Envoyer"
103157 >
@@ -135,17 +189,13 @@ export default function Home() {
135189 </ div >
136190 </ div >
137191 < p className = "break-words overflow-hidden" > { post . body } </ p >
138- < div className = "mt-2 text-sm text-gray-600 flex items-center gap-2" >
139- < button
140- onClick = { ( e ) => {
141- e . stopPropagation ( )
142- handleLike ( post . id )
143- } }
144- className = "text-red-500 hover:scale-105 transition"
145- >
146- ❤️
147- </ button >
148- < span > { likesCount [ post . id ] ?? 0 } </ span >
192+ < div className = "group mt-2 text-sm text-gray-600 flex items-center gap-2"
193+ onClick = { ( e ) => {
194+ e . stopPropagation ( )
195+ handleLike ( post . id )
196+ } } >
197+ < span className = "group-hover:scale-200 transition" > ❤️</ span >
198+ < span > { post . likes_count ?? 0 } </ span >
149199 </ div >
150200 </ div >
151201 ) )
@@ -169,7 +219,7 @@ export default function Home() {
169219 < textarea
170220 value = { newComment }
171221 onChange = { ( e ) => setNewComment ( e . target . value ) }
172- placeholder = { user ? `${ user . name } , laissez un commentaire ...` : "Connectez-vous pour commenter..." }
222+ placeholder = { user ? `${ user . name } , Commentez ...` : "Connectez-vous pour commenter..." }
173223 rows = { 2 }
174224 className = "flex-1 mx-3 resize-none bg-transparent text-gray-600 rounded-3xl placeholder-gray-400 outline-none border-none overflow-hidden min-h-[32px] max-h-[120px] text-sm"
175225 onInput = { ( e ) => {
0 commit comments