@@ -25,41 +25,53 @@ function SWChatComponent({roomUrl, joined}) {
2525 const [ messages , setMessages ] = useState ( [ ] ) ;
2626 const sessionContext = useSession ( ) ;
2727 const [ messageBox , ] = useContext ( MessageBoxContext ) ;
28+ const [ userNames , setUserNames ] = useState ( { } ) ;
2829
2930 useEffect ( ( ) => {
30- let messageSeriesStreams = null ;
31- let messageStreams = [ ] ;
32- let usernames = [ ]
3331 const fetch = async ( ) => {
34- messageSeriesStreams = await MessageSolidService . getMessageSeriesStream ( sessionContext , roomUrl ) ;
32+ const messageSeriesStreams = await MessageSolidService . getMessageSeriesStream ( sessionContext , roomUrl ) ;
3533 if ( messageSeriesStreams . error ) {
3634 console . error ( messageSeriesStreams . error )
3735 messageSeriesStreams = null ;
3836 setState ( { isLoading : false , hasAccess : false } ) ;
3937 return ;
4038 }
4139 messageSeriesStreams . on ( 'data' , async ( data ) => {
42- let messageStream = await MessageSolidService . getMessageStream ( sessionContext ,
43- data . get ( 'messageSeries' ) . value ) ;
44- const senderIndex = messageStreams . length ;
45- messageStreams . push ( messageStream ) ;
46-
47- 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 ) {
4864 messageStream = null ;
4965 return ;
5066 }
5167 messageStream . on ( 'data' , async ( data ) => {
52- if ( usernames . length <= senderIndex ) {
53- let name = await UserSolidService . getName ( sessionContext , data . get ( 'sender' ) . value ) ;
54- name = ( name . error ) ? 'Unknown' : name ;
55- usernames . push ( name ) ;
56- }
5768 const message = {
58- text : data . get ( 'text' ) . value ,
59- sender : usernames [ senderIndex ] ,
60- date : new Date ( data . get ( 'dateSent' ) . value ) ,
61- 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 ) ,
6273 } ;
74+ // TODO: Make this more efficient
6375 setMessages ( messages => (
6476 [ ...messages , message ]
6577 . sort ( ( m1 , m2 ) => ( m1 . date > m2 . date ) ? 1 : ( ( m1 . date < m2 . date ) ? - 1 : 0 ) )
@@ -71,18 +83,6 @@ function SWChatComponent({roomUrl, joined}) {
7183 setState ( { isLoading : false , hasAccess : true } ) ;
7284 }
7385 fetch ( ) ;
74-
75- return ( ( ) => {
76- if ( messageSeriesStreams ) {
77- messageSeriesStreams . close ( ) ;
78- }
79- for ( let i = 0 ; i < messageStreams . length ; i ++ ) {
80- if ( messageStreams [ i ] ) {
81- messageStreams [ i ] . close ( )
82- }
83- }
84- setMessages ( [ ] ) ;
85- } ) ;
8686 } , [ sessionContext . session , sessionContext . sessionRequestInProgress , roomUrl , joined ] )
8787
8888
@@ -120,13 +120,18 @@ function SWChatComponent({roomUrl, joined}) {
120120 pageContent = (
121121 < >
122122 < SWAutoScrollDiv className = "overflow-y-auto overflow-x-auto mb-2 shrink" >
123- { 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+ } ) }
124129 </ SWAutoScrollDiv >
125130 < form autoComplete = "off" className = "grow-0 flex flex-between items-center" onSubmit = { submitMessage } >
126- < 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 "
127132 onChange = { ( e ) => setInput ( parseMessage ( e . target . value ) ) }
128133 value = { input } type = 'text' />
129- < button className = "sw-btn hidden" > P </ button >
134+ < button className = "sw-btn hidden" > </ button >
130135 </ form >
131136 </ >
132137 ) ;
0 commit comments