onfido-sdk-ui
Version:
JavaScript SDK view layer for Onfido identity verification
174 lines (151 loc) • 4.79 kB
JavaScript
console.log("demo.js")
import { h, render, Component } from 'preact'
if (process.env.NODE_ENV === 'development') {
require('preact/devtools');
}
/*
The SDK can be consumed either via npm or via global window.
Via npm there are also two ways, via commonjs require or via ES import.
*/
/// #if DEMO_IMPORT_MODE === "window"
const Onfido = window.Onfido
/// #elif DEMO_IMPORT_MODE === "es"
import * as Onfido from '../index.js' // eslint-disable-line no-redeclare
/// #elif DEMO_IMPORT_MODE === "commonjs"
const Onfido = require('../index.js') // eslint-disable-line no-redeclare
/// #endif
const queryStrings = window.location
.search.slice(1)
.split('&')
.reduce((/*Object*/ a, /*String*/ b) => {
b = b.split('=');
a[b[0]] = decodeURIComponent(b[1]);
return a;
}, {});
const useModal = queryStrings.useModal === "true"
const withOneDocument = queryStrings.oneDoc === "true"
const documentTypes = withOneDocument ? { passport: true } : {}
const steps = [
'welcome',
queryStrings.poa === "true" ?
{type:'poa'} : undefined,
{
type:'document',
options: {
useWebcam: queryStrings.useWebcam === "true",
documentTypes,
forceCrossDevice: queryStrings.forceCrossDevice === "true"
}
},
{
type: 'face',
options:{
requestedVariant: queryStrings.liveness === "true" ? 'video' : 'standard',
useWebcam: queryStrings.useWebcam !== "false",
uploadFallback: queryStrings.uploadFallback !== "false",
useMultipleSelfieCapture: queryStrings.useMultipleSelfieCapture === "true",
snapshotInterval: queryStrings.snapshotInterval ? parseInt(queryStrings.snapshotInterval, 10) : 1000
}
},
'complete'
].filter(a=>a)
const language = queryStrings.language === "customTranslations" ? {
locale: 'fr',
phrases: {'welcome.title': 'Ouvrez votre nouveau compte bancaire'}
} : queryStrings.language
const smsNumberCountryCode = queryStrings.countryCode ? { smsNumberCountryCode: queryStrings.countryCode } : {}
const getToken = function(onSuccess) {
const url = process.env.JWT_FACTORY
const request = new XMLHttpRequest()
request.open('GET', url, true)
request.onload = function() {
if (request.status >= 200 && request.status < 400) {
const data = JSON.parse(request.responseText)
// Only log the applicant ID in development - it is sensitive data
console.log("Applicant ID: " + data.applicant_id)
onSuccess(data.message)
}
}
request.send()
}
class SDK extends Component{
componentDidMount () {
this.initSDK(this.props.options)
}
componentWillReceiveProps({options}){
if (this.state.onfidoSdk){
this.state.onfidoSdk.setOptions(options)
if (options.tearDown) {
this.state.onfidoSdk.tearDown()
}
}
}
componentWillUnmount () {
if (this.state.onfidoSdk) this.state.onfidoSdk.tearDown()
}
initSDK = (options)=> {
const onfidoSdk = Onfido.init(options)
this.setState({onfidoSdk})
window.onfidoSdkHandle = onfidoSdk
}
shouldComponentUpdate () {
return false
}
render = () => <div id="onfido-mount"></div>
}
class Demo extends Component{
constructor (props) {
super(props)
getToken((token)=> {
this.setState({token})
})
}
state = {
token: null,
isModalOpen: false
}
sdkOptions = (clientSdkOptions={})=> ({
...(queryStrings.link_id ?
{ mobileFlow: true,
roomId: queryStrings.link_id.substring(2) } :
{
token: this.state.token,
useModal,
onComplete: (data) => {
/*callback for when */ console.log("everything is complete", data)
},
isModalOpen: this.state.isModalOpen,
language,
steps,
mobileFlow: !!queryStrings.link_id,
userDetails: {
smsNumber: queryStrings.smsNumber,
},
onModalRequestClose: () => {
this.setState({isModalOpen: false})
},
...smsNumberCountryCode,
...clientSdkOptions,
}
)
})
render () {
return <div class="container">
{ useModal &&
<button
id="button"
type="button"
onClick={ () => this.setState({isModalOpen: true}) }>
Verify identity
</button>
}
{queryStrings.async === "false" && this.state.token === null ?
null : <SDK options={this.sdkOptions(this.props.options)}></SDK>
}
</div>
}
}
const container = render(<Demo/>, document.getElementById("demo-app") )
window.updateOptions = (newOptions)=>{
render(<Demo options={newOptions}/>, document.getElementById("demo-app"), container )
}