1
- import React , { useRef , useState } from 'react' ;
2
1
import styles from './ChatArea.module.scss' ;
3
2
import { Message } from './Message' ;
4
3
import { useChatMessageStore } from '@stores' ;
5
- import { MessageType } from '../types' ;
4
+ import { MessageType , ServerMessageType } from '../types' ;
5
+ import { useChatMessages } from '@hooks' ;
6
+ import { useEffect } from 'react' ;
7
+ import { authTokenKey } from '@config' ;
6
8
7
9
type ChatAreaProps = {
8
10
messages : MessageType [ ] ;
@@ -12,16 +14,67 @@ export function ChatArea({ messages: propMessages }: Readonly<ChatAreaProps>) {
12
14
const { messages : storeMessages } = useChatMessageStore ( ( state ) => ( {
13
15
messages : state . messages ,
14
16
} ) ) ;
15
- const [ loading , setLoading ] = useState ( false ) ;
16
- const [ cursor , setCursor ] = useState < string | null > ( null ) ;
17
- const chatAreaRef = useRef < HTMLDivElement > ( null ) ; // Ref for the chat area container */
17
+ // Call the custom hook and pass the chatRoomId to it
18
+ const chatRoomId = '25e4eb83-5210-448d-be58-3a4c355113be' ;
19
+ const {
20
+ data,
21
+ error,
22
+ fetchNextPage,
23
+ hasNextPage,
24
+ isFetchingNextPage,
25
+ status,
26
+ } = useChatMessages ( chatRoomId ) ;
27
+ useEffect ( ( ) => {
28
+ console . log ( 'Data loaded' , data ?. pages [ 0 ] . messages ) ;
29
+ } , [ data ] ) ;
18
30
31
+ if ( status === 'loading' ) return < p > Loading...</ p > ;
32
+ if ( status === 'error' ) return < p > Error: { error . message } </ p > ;
33
+
34
+ const supabaseData = localStorage . getItem ( authTokenKey ) ;
35
+
36
+ let currentUserId = '' ;
37
+
38
+ if ( supabaseData ) {
39
+ const parsedData = JSON . parse ( supabaseData ) ;
40
+ currentUserId = parsedData . user . id ;
41
+ console . log ( 'Current user id' , currentUserId ) ;
42
+ } else {
43
+ console . error ( 'No Supabase data found in Local Storage' ) ;
44
+ }
45
+
46
+ const restAPIMessages : ServerMessageType [ ] =
47
+ data ?. pages . flatMap ( ( page ) =>
48
+ page . messages . map ( ( message : unknown ) => {
49
+ // Assert the message to be of type ServerMessageType
50
+ const serverMessage = message as unknown as ServerMessageType ;
51
+
52
+ const adaptedMessage : ServerMessageType = {
53
+ id : serverMessage . id ,
54
+ chat_room_id : serverMessage . chat_room_id ,
55
+ sender :
56
+ serverMessage . sender_id === currentUserId ? 'sent' : 'received' , // Set the sender based on the current user's ID
57
+ media_url : serverMessage . media_url ,
58
+ created_at : serverMessage . created_at ,
59
+ content : serverMessage . content ,
60
+ sender_id : serverMessage . sender_id ,
61
+ } ;
62
+
63
+ return adaptedMessage ;
64
+ } )
65
+ ) ?? [ ] ;
66
+
67
+ const combinedMessages = [ ...storeMessages , ...propMessages ] . sort (
68
+ ( a , b ) => new Date ( a . createdAt ) . getTime ( ) - new Date ( b . createdAt ) . getTime ( )
69
+ ) ;
19
70
return (
20
71
< div className = { styles . chatArea } >
21
- { [ ...storeMessages , ...propMessages ] . map ( ( message , timestamp ) => (
22
- < Message key = { timestamp } { ...message } text = { message . content } />
72
+ { restAPIMessages . map ( ( message ) => (
73
+ < Message { ...message } sender = { message . sender } text = { message . content } />
74
+ ) ) }
75
+ { combinedMessages . map ( ( message ) => (
76
+ < Message { ...message } text = { message . content } />
23
77
) ) }
24
- { loading && < div > Loading more messages...</ div > }
25
78
</ div >
26
79
) ;
27
80
}
0 commit comments