11import React , { useState , useContext } from 'react' ;
22import { useHistory } from 'react-router-dom' ;
33
4- import { changeSessions , changeSession , terminateSession , changeUser , kickUserFromSession } from '../../api' ;
4+ import { changeSessions , changeSession , terminateSession , changeUser , kickUserFromSession , connectChat , disconnectChat } from '../../api' ;
55
66/** Modal building blocks */
77const ModalContext = React . createContext ( { } ) ;
88
99const ModalHeader = ( { children} ) => < h2 > { children } </ h2 >
1010const ModalButtons = ( { children} ) => < p > { children } </ p >
1111
12- const OkButton = ( { label, func, children } ) => {
12+ const OkButton = ( { label, func, errorFunc , disabled } ) => {
1313 const ctx = useContext ( ModalContext ) ;
1414 function clickHandler ( ) {
1515 // TODO disable button while processing
16- func ( ) . then ( ctx . closeFunc ) ;
16+ func ( ) . then ( ctx . closeFunc ) . catch ( err => {
17+ console . error ( "Error" , err ) ;
18+ if ( errorFunc ) {
19+ errorFunc ( err ) ;
20+ }
21+ } ) ;
1722 }
18- return < button onClick = { clickHandler } className = "danger button" > { label } </ button >
23+ return < button onClick = { clickHandler } className = "danger button" disabled = { ! ! disabled } > { label } </ button >
1924}
2025
2126const CancelButton = ( { label= "Cancel" } ) => {
@@ -36,7 +41,7 @@ function SetPasswordModal({targetSetting, title}) {
3641 return < >
3742 < ModalHeader > Set session { title } </ ModalHeader >
3843 < input
39- type = "password"
44+ type = "password"
4045 className = "input-text"
4146 onChange = { e => setPasswd ( e . target . value ) }
4247 />
@@ -114,6 +119,64 @@ function MessageModal() {
114119 </ >
115120}
116121
122+ function ChatConnectModal ( ) {
123+ const [ message , setMessage ] = useState ( '' ) ;
124+ const [ error , setError ] = useState ( '' ) ;
125+ const ctx = useContext ( ModalContext ) ;
126+
127+ function connect ( ) {
128+ setError ( '' ) ;
129+ return connectChat ( ctx . sessionId , message ) ;
130+ }
131+
132+ function catchError ( err ) {
133+ setError ( `${ err } ` . replace ( / ^ E r r o r : \s * / , '' ) ) ;
134+ }
135+
136+ return < >
137+ < ModalHeader > Initial message (required):</ ModalHeader >
138+ { error && < p > < strong > Error:</ strong > { error } </ p > }
139+ < textarea
140+ className = "input-text message-area"
141+ rows = "5"
142+ onChange = { e => setMessage ( e . target . value ) }
143+ />
144+ < ModalButtons >
145+ < OkButton func = { connect } errorFunc = { catchError } label = "Connect" disabled = { message . trim ( ) === '' } />
146+ < CancelButton />
147+ </ ModalButtons >
148+ </ >
149+ }
150+
151+ function ChatDisconnectModal ( ) {
152+ const [ message , setMessage ] = useState ( '' ) ;
153+ const [ error , setError ] = useState ( '' ) ;
154+ const ctx = useContext ( ModalContext ) ;
155+
156+ function disconnect ( ) {
157+ setError ( '' ) ;
158+ return disconnectChat ( ctx . sessionId , message ) ;
159+ }
160+
161+ function catchError ( err ) {
162+ setError ( `${ err } ` . replace ( / ^ E r r o r : \s * / , '' ) ) ;
163+ }
164+
165+ return < >
166+ < ModalHeader > Disconnect message (optional):</ ModalHeader >
167+ { error && < p > < strong > Error:</ strong > { error } </ p > }
168+ < textarea
169+ className = "input-text message-area"
170+ rows = "5"
171+ onChange = { e => setMessage ( e . target . value ) }
172+ />
173+ < ModalButtons >
174+ < OkButton func = { disconnect } errorFunc = { catchError } label = "Disconnect" />
175+ < CancelButton />
176+ </ ModalButtons >
177+ </ >
178+ }
179+
117180export function ModalContent ( { modal, closeFunc} ) {
118181 let m ;
119182 switch ( modal . active ) {
@@ -122,6 +185,8 @@ export function ModalContent({modal, closeFunc}) {
122185 case 'terminate' : m = < TerminateSessionModal /> ; break ;
123186 case 'message' : m = < MessageModal /> ; break ;
124187 case 'kick' : m = < KickUserModal /> ; break ;
188+ case 'chatConnect' : m = < ChatConnectModal /> ; break ;
189+ case 'chatDisconnect' : m = < ChatDisconnectModal /> ; break ;
125190 default : return null ;
126191 }
127192
0 commit comments