2018-07-10 13:40:32 +00:00
import React from 'react' ;
import PropTypes from 'prop-types' ;
import { WebView , Platform } from 'react-native' ;
import { connect } from 'react-redux' ;
import RocketChat from '../lib/rocketchat' ;
import I18n from '../i18n' ;
2018-08-10 17:26:36 +00:00
import { iconsMap } from '../Icons' ;
2018-07-10 13:40:32 +00:00
const userAgentAndroid = 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1' ;
const userAgent = Platform . OS === 'ios' ? 'UserAgent' : userAgentAndroid ;
@ connect ( state => ( {
server : state . server . server
} ) )
2018-08-31 18:13:30 +00:00
export default class OAuthView extends React . PureComponent {
2018-07-10 13:40:32 +00:00
static navigatorButtons = {
leftButtons : [ {
id : 'close' ,
2018-08-10 17:26:36 +00:00
title : I18n . t ( 'Close' ) ,
icon : Platform . OS === 'android' ? iconsMap . close : undefined
2018-07-10 13:40:32 +00:00
} ]
}
static propTypes = {
navigator : PropTypes . object ,
oAuthUrl : PropTypes . string ,
server : PropTypes . string
}
constructor ( props ) {
super ( props ) ;
this . redirectRegex = new RegExp ( ` (?=.*( ${ props . server } ))(?=.*(credentialToken))(?=.*(credentialSecret)) ` , 'g' ) ;
props . navigator . setOnNavigatorEvent ( this . onNavigatorEvent . bind ( this ) ) ;
}
onNavigatorEvent ( event ) {
const { navigator } = this . props ;
if ( event . type === 'NavBarButtonPress' ) {
if ( event . id === 'close' ) {
navigator . dismissModal ( ) ;
}
}
}
login = async ( params ) => {
try {
await RocketChat . login ( params ) ;
} catch ( e ) {
console . warn ( e ) ;
}
}
render ( ) {
return (
< WebView
source = { { uri : this . props . oAuthUrl } }
userAgent = { userAgent }
onNavigationStateChange = { ( webViewState ) => {
const url = decodeURIComponent ( webViewState . url ) ;
if ( this . redirectRegex . test ( url ) ) {
const parts = url . split ( '#' ) ;
const credentials = JSON . parse ( parts [ 1 ] ) ;
this . login ( { oauth : { ... credentials } } ) ;
this . props . navigator . dismissModal ( ) ;
}
} }
/ >
) ;
}
}