11/* library imports */
2- import { useState , useEffect , } from 'react' ;
2+ import { useState , useEffect , useContext } from 'react' ;
33import { useSession , } from "@inrupt/solid-ui-react" ;
44import PropTypes from 'prop-types' ;
55
@@ -8,6 +8,9 @@ import SWMessageComponent from '../components/SWMessageComponent'
88import SWAutoScrollDiv from '../components/SWAutoScrollDiv' ;
99import SWLoadingIcon from '../components/SWLoadingIcon' ;
1010
11+ /* context imports */
12+ import { MessageBoxContext } from '../contexts' ;
13+
1114/* service imports */
1215import MessageSolidService from '../services/message.solidservice.js'
1316import UserSolidService from '../services/user.solidservice.js'
@@ -21,39 +24,54 @@ function SWChatComponent({roomUrl, joined}) {
2124 const [ input , setInput ] = useState ( '' ) ;
2225 const [ messages , setMessages ] = useState ( [ ] ) ;
2326 const sessionContext = useSession ( ) ;
27+ const [ messageBox , ] = useContext ( MessageBoxContext ) ;
28+ const [ userNames , setUserNames ] = useState ( { } ) ;
2429
2530 useEffect ( ( ) => {
26- let messageSeriesStreams = null ;
27- let messageStreams = [ ] ;
2831 const fetch = async ( ) => {
29- messageSeriesStreams = await MessageSolidService . getMessageSeriesStream ( sessionContext , roomUrl ) ;
32+ const messageSeriesStreams = await MessageSolidService . getMessageSeriesStream ( sessionContext , roomUrl ) ;
3033 if ( messageSeriesStreams . error ) {
3134 console . error ( messageSeriesStreams . error )
3235 messageSeriesStreams = null ;
3336 setState ( { isLoading : false , hasAccess : false } ) ;
3437 return ;
3538 }
36- console . log ( 'NOW LISTENING FOR MESSAGE STREAMS' )
3739 messageSeriesStreams . on ( 'data' , async ( data ) => {
38- console . log ( 'NEW MESSAGESTREAM ACQUIRED' )
39- let messageStream = await MessageSolidService . getMessageStream ( sessionContext ,
40- data . get ( 'messageSeries' ) . value ) ;
41- messageStreams . push ( messageStream ) ;
42- if ( messageStream . error ) {
40+ const messageSeries = data . get ( 'messageSeries' ) . value ;
41+
42+ let senderName = "Unknown" ;
43+ let creatorUrlStream = await MessageSolidService . getMessageSeriesCreatorStream ( sessionContext , messageSeries ) ;
44+ creatorUrlStream . on ( 'data' , ( data ) => {
45+ const creatorUrl = data ?. get ( 'creator' ) ?. value ;
46+ UserSolidService . getName ( sessionContext , creatorUrl ) . then ( ( name ) => {
47+ if ( ! name . error ) {
48+ setUserNames ( ( userNames ) => {
49+ userNames [ messageSeries ] = name ;
50+ return userNames ;
51+ } ) ;
52+ }
53+ } ) ;
54+ } ) ;
55+
56+ // TODO(Elias): Switch out restart of stream when Incremunica has internal handling for this
57+ let messageStreamAuthCheck = await MessageSolidService . getMessageStream ( sessionContext , messageSeries ) ;
58+ messageStreamAuthCheck . on ( 'data' , async ( data ) => {
59+ messageStreamAuthCheck . close ( ) ;
60+ } ) ;
61+
62+ let messageStream = await MessageSolidService . getMessageStream ( sessionContext , messageSeries ) ;
63+ if ( ! messageStream || messageStream . error ) {
4364 messageStream = null ;
4465 return ;
4566 }
4667 messageStream . on ( 'data' , async ( data ) => {
47- let name = await UserSolidService . getName ( sessionContext , data . get ( 'sender' ) . value ) ;
48- if ( name . error ) {
49- name = '[Anonymous]' ;
50- }
5168 const message = {
52- text : data . get ( 'text' ) . value ,
53- sender : name ,
54- date : new Date ( data . get ( 'dateSent' ) . value ) ,
55- key : ( name + data . get ( 'dateSent' ) . value ) ,
69+ text : data . get ( 'text' ) . value ,
70+ messageBoxUrl : messageSeries ,
71+ date : new Date ( data . get ( 'dateSent' ) . value ) ,
72+ key : ( name + data . get ( 'dateSent' ) . value ) ,
5673 } ;
74+ // TODO: Make this more efficient
5775 setMessages ( messages => (
5876 [ ...messages , message ]
5977 . sort ( ( m1 , m2 ) => ( m1 . date > m2 . date ) ? 1 : ( ( m1 . date < m2 . date ) ? - 1 : 0 ) )
@@ -65,18 +83,6 @@ function SWChatComponent({roomUrl, joined}) {
6583 setState ( { isLoading : false , hasAccess : true } ) ;
6684 }
6785 fetch ( ) ;
68-
69- return ( ( ) => {
70- if ( messageSeriesStreams ) {
71- messageSeriesStreams . close ( ) ;
72- }
73- for ( let i = 0 ; i < messageStreams . length ; i ++ ) {
74- if ( messageStreams [ i ] ) {
75- messageStreams [ i ] . close ( )
76- }
77- }
78- setMessages ( [ ] ) ;
79- } ) ;
8086 } , [ sessionContext . session , sessionContext . sessionRequestInProgress , roomUrl , joined ] )
8187
8288
@@ -85,7 +91,11 @@ function SWChatComponent({roomUrl, joined}) {
8591 if ( input . length === 0 ) {
8692 return ;
8793 }
88- MessageSolidService . createMessage ( sessionContext , input , roomUrl ) ;
94+ MessageSolidService . createMessage ( sessionContext , input , roomUrl , messageBox ) . then ( ( r ) => {
95+ if ( r . error ) {
96+ console . error ( r . error ) ;
97+ }
98+ } )
8999 setInput ( '' ) ;
90100 }
91101
@@ -110,13 +120,18 @@ function SWChatComponent({roomUrl, joined}) {
110120 pageContent = (
111121 < >
112122 < SWAutoScrollDiv className = "overflow-y-auto overflow-x-auto mb-2 shrink" >
113- { messages . map ( ( message ) => < SWMessageComponent message = { message } key = { message . key } /> ) }
123+ { messages . map ( ( message ) => {
124+ const sender = userNames [ message . messageBoxUrl ] ;
125+ return (
126+ < SWMessageComponent message = { { ...message , sender} } key = { message . key } />
127+ ) ;
128+ } ) }
114129 </ SWAutoScrollDiv >
115130 < form autoComplete = "off" className = "grow-0 flex flex-between items-center" onSubmit = { submitMessage } >
116- < input id = "msgInput" className = "px-2 h-10 rgb-bg-1 sw-border w-full"
131+ < input id = "msgInput" className = "px-2 h-10 rgb-bg-1 sw-border w-full border-solid "
117132 onChange = { ( e ) => setInput ( parseMessage ( e . target . value ) ) }
118133 value = { input } type = 'text' />
119- < button className = "sw-btn hidden" > P </ button >
134+ < button className = "sw-btn hidden" > </ button >
120135 </ form >
121136 </ >
122137 ) ;
0 commit comments