2016-01-12 17:11:15 +03:00
/ *
Copyright 2015 , 2016 OpenMarket Ltd
2017-02-17 18:50:30 +03:00
Copyright 2017 Vector Creations Ltd
2016-01-12 17:11:15 +03:00
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
'use strict' ;
var React = require ( 'react' ) ;
2016-02-09 19:55:03 +03:00
var sdk = require ( '../../../index' ) ;
2016-03-18 18:30:27 +03:00
var MatrixClientPeg = require ( '../../../MatrixClientPeg' ) ;
2016-01-12 17:11:15 +03:00
2017-05-23 17:16:31 +03:00
import _t from 'counterpart-riot' ;
2016-01-12 17:11:15 +03:00
module . exports = React . createClass ( {
displayName : 'RoomPreviewBar' ,
propTypes : {
onJoinClick : React . PropTypes . func ,
2016-01-18 20:39:23 +03:00
onRejectClick : React . PropTypes . func ,
2017-02-17 19:09:25 +03:00
onForgetClick : React . PropTypes . func ,
2016-03-10 20:43:20 +03:00
// if inviterName is specified, the preview bar will shown an invite to the room.
// You should also specify onRejectClick if specifiying inviterName
2016-01-18 20:39:23 +03:00
inviterName : React . PropTypes . string ,
2016-03-17 21:38:25 +03:00
// If invited by 3rd party invite, the email address the invite was sent to
invitedEmail : React . PropTypes . string ,
2016-06-24 17:34:07 +03:00
// A standard client/server API error object. If supplied, indicates that the
// caller was unable to fetch details about the room for the given reason.
error : React . PropTypes . object ,
2016-01-18 20:39:23 +03:00
canPreview : React . PropTypes . bool ,
2016-02-09 19:55:03 +03:00
spinner : React . PropTypes . bool ,
2016-03-17 22:19:05 +03:00
room : React . PropTypes . object ,
2016-06-28 16:59:45 +03:00
// The alias that was used to access this room, if appropriate
2016-06-28 19:11:47 +03:00
// If given, this will be how the room is referred to (eg.
// in error messages).
2017-05-11 19:32:23 +03:00
roomAlias : React . PropTypes . string ,
2016-01-12 17:11:15 +03:00
} ,
getDefaultProps : function ( ) {
return {
onJoinClick : function ( ) { } ,
2016-01-18 20:39:23 +03:00
canPreview : true ,
2016-01-12 17:11:15 +03:00
} ;
} ,
2016-03-18 18:30:27 +03:00
getInitialState : function ( ) {
return {
busy : false
2017-01-20 17:22:27 +03:00
} ;
2016-03-18 18:30:27 +03:00
} ,
componentWillMount : function ( ) {
// If this is an invite and we've been told what email
// address was invited, fetch the user's list of 3pids
// so we can check them against the one that was invited
if ( this . props . inviterName && this . props . invitedEmail ) {
this . setState ( { busy : true } ) ;
MatrixClientPeg . get ( ) . lookupThreePid (
'email' , this . props . invitedEmail
) . finally ( ( ) => {
this . setState ( { busy : false } ) ;
} ) . done ( ( result ) => {
this . setState ( { invitedEmailMxid : result . mxid } ) ;
} , ( err ) => {
this . setState ( { threePidFetchError : err } ) ;
} ) ;
}
} ,
2017-02-17 18:50:30 +03:00
_roomNameElement : function ( fallback ) {
fallback = fallback || 'a room' ;
const name = this . props . room ? this . props . room . name : ( this . props . room _alias || "" ) ;
2017-05-23 17:16:31 +03:00
return name ? { name } : fallback ;
2017-02-17 18:50:30 +03:00
} ,
2016-01-12 17:11:15 +03:00
render : function ( ) {
2016-01-18 20:39:23 +03:00
var joinBlock , previewBlock ;
2016-01-12 17:11:15 +03:00
2016-03-18 18:30:27 +03:00
if ( this . props . spinner || this . state . busy ) {
2016-02-09 19:55:03 +03:00
var Spinner = sdk . getComponent ( "elements.Spinner" ) ;
return ( < div className = "mx_RoomPreviewBar" >
< Spinner / >
< / d i v > ) ;
}
2017-02-17 18:50:30 +03:00
const myMember = this . props . room ? this . props . room . currentState . members [
MatrixClientPeg . get ( ) . credentials . userId
] : null ;
const kicked = (
myMember &&
myMember . membership == 'leave' &&
myMember . events . member . getSender ( ) != MatrixClientPeg . get ( ) . credentials . userId
) ;
const banned = myMember && myMember . membership == 'ban' ;
2016-01-18 23:18:46 +03:00
if ( this . props . inviterName ) {
2016-03-18 18:30:27 +03:00
var emailMatchBlock ;
if ( this . props . invitedEmail ) {
if ( this . state . threePidFetchError ) {
emailMatchBlock = < div className = "error" >
2016-12-22 01:25:46 +03:00
Unable to ascertain that the address this invite was
2016-03-18 18:30:27 +03:00
sent to matches one associated with your account .
2017-01-20 17:22:27 +03:00
< / d i v > ;
2016-03-18 18:30:27 +03:00
} else if ( this . state . invitedEmailMxid != MatrixClientPeg . get ( ) . credentials . userId ) {
2016-03-22 01:05:59 +03:00
emailMatchBlock =
< div className = "mx_RoomPreviewBar_warning" >
< div className = "mx_RoomPreviewBar_warningIcon" >
< img src = "img/warning.svg" width = "24" height = "23" title = "/!\\" alt = "/!\\" / >
< / d i v >
< div className = "mx_RoomPreviewBar_warningText" >
This invitation was sent to < b > < span className = "email" > { this . props . invitedEmail } < / s p a n > < / b > , w h i c h i s n o t a s s o c i a t e d w i t h t h i s a c c o u n t . < b r / >
2016-04-28 17:43:36 +03:00
You may wish to login with a different account , or add this email to this account .
2016-03-22 01:05:59 +03:00
< / d i v >
2017-01-20 17:22:27 +03:00
< / d i v > ;
2016-03-18 18:30:27 +03:00
}
}
2017-05-23 17:16:31 +03:00
// TODO: find a way to respect HTML in counterpart!
2016-01-18 20:39:23 +03:00
joinBlock = (
< div >
< div className = "mx_RoomPreviewBar_invite_text" >
2017-05-23 17:16:31 +03:00
{ _t ( 'You have been invited to join this room by %(inviterName)s' , { inviterName : this . props . inviterName } ) }
2016-01-18 20:39:23 +03:00
< / d i v >
< div className = "mx_RoomPreviewBar_join_text" >
2017-05-23 17:16:31 +03:00
{ _t ( 'Would you like to' ) } < a onClick = { this . props . onJoinClick } > { _t ( 'accept' ) } < / a > { _ t ( ' o r ' ) } < a o n C l i c k = { t h i s . p r o p s . o n R e j e c t C l i c k } > { _ t ( ' d e c l i n e ' ) } < / a > { _ t ( ' t h i s i n v i t a t i o n ? ' ) }
2016-01-18 20:39:23 +03:00
< / d i v >
2016-03-18 18:30:27 +03:00
{ emailMatchBlock }
2016-01-18 20:39:23 +03:00
< / d i v >
) ;
2017-02-17 18:50:30 +03:00
} else if ( kicked || banned ) {
const verb = kicked ? 'kicked' : 'banned' ;
const roomName = this . _roomNameElement ( 'this room' ) ;
2017-02-17 19:35:18 +03:00
const kickerMember = this . props . room . currentState . getMember (
2017-02-17 18:50:30 +03:00
myMember . events . member . getSender ( )
) ;
2017-02-17 19:35:18 +03:00
const kickerName = kickerMember ?
kickerMember . name : myMember . events . member . getSender ( ) ;
2017-02-17 18:50:30 +03:00
let reason ;
if ( myMember . events . member . getContent ( ) . reason ) {
reason = < div > Reason : { myMember . events . member . getContent ( ) . reason } < / d i v >
}
let rejoinBlock ;
if ( ! banned ) {
2017-02-17 19:11:20 +03:00
rejoinBlock = < div > < a onClick = { this . props . onJoinClick } > < b > Rejoin < / b > < / a > < / d i v > ;
2017-02-17 18:50:30 +03:00
}
joinBlock = (
< div >
< div className = "mx_RoomPreviewBar_join_text" >
2017-02-17 19:35:18 +03:00
You have been { verb } from { roomName } by { kickerName } . < br / >
2017-02-17 18:50:30 +03:00
{ reason }
{ rejoinBlock }
2017-02-17 19:11:20 +03:00
< a onClick = { this . props . onForgetClick } > < b > Forget < / b > < / a >
2017-02-17 18:50:30 +03:00
< / d i v >
< / d i v >
) ;
} else if ( this . props . error ) {
2016-06-24 17:34:07 +03:00
var name = this . props . roomAlias || "This room" ;
var error ;
if ( this . props . error . errcode == 'M_NOT_FOUND' ) {
error = name + " does not exist" ;
} else {
error = name + " is not accessible at this time" ;
}
joinBlock = (
< div >
< div className = "mx_RoomPreviewBar_join_text" >
{ error }
< / d i v >
< / d i v >
) ;
2017-02-17 18:50:30 +03:00
} else {
const name = this . _roomNameElement ( ) ;
2016-01-12 17:11:15 +03:00
joinBlock = (
2016-01-18 22:56:56 +03:00
< div >
< div className = "mx_RoomPreviewBar_join_text" >
2017-05-23 17:16:31 +03:00
{ _t ( 'You are trying to access %(roomName)s' , { roomName : name } ) } . < br / >
< a onClick = { this . props . onJoinClick } > < b > { _t ( 'Click here' ) } < / b > < / a > { _ t ( ' t o j o i n t h e d i s c u s s i o n ' ) } !
2016-01-18 22:56:56 +03:00
< / d i v >
2016-01-12 17:11:15 +03:00
< / d i v >
) ;
}
2016-01-18 20:39:23 +03:00
if ( this . props . canPreview ) {
previewBlock = (
2016-01-12 17:11:15 +03:00
< div className = "mx_RoomPreviewBar_preview_text" >
2017-05-23 17:16:31 +03:00
{ _t ( 'This is a preview of this room. Room interactions have been disabled' ) } .
2016-01-12 17:11:15 +03:00
< / d i v >
2016-01-18 20:39:23 +03:00
) ;
}
return (
< div className = "mx_RoomPreviewBar" >
2016-01-18 22:56:56 +03:00
< div className = "mx_RoomPreviewBar_wrapper" >
{ joinBlock }
{ previewBlock }
< / d i v >
2016-01-12 17:11:15 +03:00
< / d i v >
) ;
}
} ) ;