2017-04-09 17:06:23 +02:00
import React from 'react' ;
import lbryio from '../lbryio.js' ;
2017-04-10 14:32:40 +02:00
import Modal from './modal.js' ;
2017-04-09 17:06:23 +02:00
import ModalPage from './modal-page.js' ;
2017-04-10 14:32:40 +02:00
import { Link , RewardLink } from '../component/link.js' ;
import { FormField , FormRow } from '../component/form.js' ;
2017-04-15 00:23:42 +02:00
import { CreditAmount } from '../component/common.js' ;
2017-04-10 14:32:40 +02:00
import rewards from '../rewards.js' ;
2017-04-09 17:06:23 +02:00
const SubmitEmailStage = React . createClass ( {
getInitialState : function ( ) {
return {
rewardType : null ,
email : '' ,
submitting : false
} ;
} ,
handleEmailChanged : function ( event ) {
this . setState ( {
email : event . target . value ,
} ) ;
} ,
handleSubmit : function ( event ) {
event . preventDefault ( ) ;
this . setState ( {
submitting : true ,
} ) ;
lbryio . call ( 'user_email' , 'new' , { email : this . state . email } , 'post' ) . then ( ( ) => {
2017-04-18 21:45:15 +02:00
this . props . onEmailSaved ( this . state . email ) ;
2017-04-09 17:06:23 +02:00
} , ( error ) => {
2017-04-18 21:45:15 +02:00
if ( error . xhr && error . xhr . status == 409 ) {
this . props . onEmailSaved ( this . state . email ) ;
return ;
} else if ( this . _emailRow ) {
2017-04-10 14:32:40 +02:00
this . _emailRow . showError ( error . message )
2017-04-09 17:06:23 +02:00
}
this . setState ( { submitting : false } ) ;
} ) ;
} ,
render : function ( ) {
return (
< section >
< form onSubmit = { this . handleSubmit } >
2017-04-17 22:45:51 +02:00
< FormRow ref = { ( ref ) => { this . _emailRow = ref } } type = "text" label = "Email" placeholder = "scrwvwls@lbry.io"
2017-04-09 17:06:23 +02:00
name = "email" value = { this . state . email }
onChange = { this . handleEmailChanged } / >
2017-04-10 14:32:40 +02:00
< div className = "form-row-submit" >
2017-04-09 17:06:23 +02:00
< Link button = "primary" label = "Next" disabled = { this . state . submitting } onClick = { this . handleSubmit } / >
< / d i v >
< / f o r m >
< / s e c t i o n >
) ;
}
} ) ;
const ConfirmEmailStage = React . createClass ( {
getInitialState : function ( ) {
return {
rewardType : null ,
code : '' ,
submitting : false ,
errorMessage : null ,
} ;
} ,
handleCodeChanged : function ( event ) {
this . setState ( {
code : event . target . value ,
} ) ;
} ,
handleSubmit : function ( event ) {
event . preventDefault ( ) ;
this . setState ( {
submitting : true ,
} ) ;
2017-04-10 14:32:40 +02:00
const onSubmitError = function ( error ) {
if ( this . _codeRow ) {
this . _codeRow . showError ( error . message )
2017-04-09 17:06:23 +02:00
}
2017-04-10 14:32:40 +02:00
this . setState ( { submitting : false } ) ;
} . bind ( this )
2017-04-18 22:51:00 +02:00
lbryio . call ( 'user_email' , 'confirm' , { verification _token : this . state . code , email : this . props . email } , 'post' ) . then ( ( userEmail ) => {
2017-04-10 14:32:40 +02:00
if ( userEmail . IsVerified ) {
this . props . onEmailConfirmed ( ) ;
} else {
onSubmitError ( new Error ( "Your email is still not verified." ) ) //shouldn't happen?
}
} , onSubmitError ) ;
2017-04-09 17:06:23 +02:00
} ,
render : function ( ) {
return (
< section >
< form onSubmit = { this . handleSubmit } >
2017-04-10 14:32:40 +02:00
< FormRow label = "Verification Code" ref = { ( ref ) => { this . _codeRow = ref } } type = "text"
2017-04-09 17:06:23 +02:00
name = "code" placeholder = "a94bXXXXXXXXXXXXXX" value = { this . state . code } onChange = { this . handleCodeChanged }
helper = "A verification code is required to access this version." / >
2017-04-10 14:32:40 +02:00
< div className = "form-row-submit" >
2017-04-09 17:06:23 +02:00
< Link button = "primary" label = "Verify" disabled = { this . state . submitting } onClick = { this . handleSubmit } / >
< / d i v >
< / f o r m >
< / s e c t i o n >
) ;
}
} ) ;
2017-04-10 14:32:40 +02:00
const WelcomeStage = React . createClass ( {
2017-04-12 22:23:20 +02:00
propTypes : {
endAuth : React . PropTypes . func ,
} ,
getInitialState : function ( ) {
return {
hasReward : false ,
rewardAmount : null ,
}
} ,
onRewardClaim : function ( reward ) {
this . setState ( {
hasReward : true ,
2017-04-15 00:23:42 +02:00
rewardAmount : reward . amount
2017-04-12 22:23:20 +02:00
} )
} ,
2017-04-10 14:32:40 +02:00
render : function ( ) {
return (
2017-04-12 22:23:20 +02:00
! this . state . hasReward ?
< Modal type = "custom" isOpen = { true } contentLabel = "Welcome to LBRY" { ... this . props } >
< section >
< h3 className = "modal__header" > Welcome to LBRY . < / h 3 >
2017-04-13 20:52:26 +02:00
< p > Using LBRY is like dating a centaur . Totally normal up top , and < em > way different < / e m > u n d e r n e a t h . < / p >
2017-04-17 22:45:51 +02:00
< p > Up top , LBRY is similar to popular media sites . < / p >
< p > Below , LBRY is controlled by users -- you -- via blockchain and decentralization . < / p >
< p > Thank you for making content freedom possible ! Here ' s a nickel , kid . < / p >
2017-04-12 22:23:20 +02:00
< div style = { { textAlign : "center" , marginBottom : "12px" } } >
< RewardLink type = "new_user" button = "primary" onRewardClaim = { this . onRewardClaim } onRewardFailure = { this . props . endAuth } / >
< / d i v >
< / s e c t i o n >
< / M o d a l > :
< Modal type = "alert" overlayClassName = "modal-overlay modal-overlay--clear" isOpen = { true } contentLabel = "Welcome to LBRY" { ... this . props } onConfirmed = { this . props . endAuth } >
< section >
< h3 className = "modal__header" > About Your Reward < / h 3 >
2017-04-15 00:23:42 +02:00
< p > You earned a reward of < CreditAmount amount = { this . state . rewardAmount } label = { false } / > LBRY credits , or < em > LBC < / e m > . < / p >
< p > This reward will show in your Wallet momentarily , probably while you are reading this message . < / p >
2017-04-12 22:23:20 +02:00
< p > LBC is used to compensate creators , to publish , and to have say in how the network works . < / p >
< p > No need to understand it all just yet ! Try watching or downloading something next . < / p >
2017-04-17 22:45:51 +02:00
< p > Finally , know that LBRY is a beta and that it earns the name . < / p >
2017-04-12 22:23:20 +02:00
< / s e c t i o n >
< / M o d a l >
2017-04-10 14:32:40 +02:00
) ;
}
} ) ;
2017-04-09 17:06:23 +02:00
const ErrorStage = React . createClass ( {
render : function ( ) {
return (
< section >
< p > An error was encountered that we cannot continue from . < / p >
< p > At least we ' re earning the name beta . < / p >
2017-04-17 22:45:51 +02:00
{ this . props . errorText ? < p > Message : { this . props . errorText } < / p > : ' ' }
2017-04-09 17:06:23 +02:00
< Link button = "alt" label = "Try Reload" onClick = { ( ) => { window . location . reload ( ) } } / >
< / s e c t i o n >
) ;
}
} ) ;
const PendingStage = React . createClass ( {
render : function ( ) {
return (
< section >
< p > Preparing for first access < span className = "busy-indicator" > < / s p a n > < / p >
< / s e c t i o n >
) ;
}
} ) ;
export const AuthOverlay = React . createClass ( {
_stages : {
pending : PendingStage ,
error : ErrorStage ,
email : SubmitEmailStage ,
confirm : ConfirmEmailStage ,
2017-04-12 22:23:20 +02:00
welcome : WelcomeStage
2017-04-09 17:06:23 +02:00
} ,
getInitialState : function ( ) {
return {
2017-04-18 21:45:15 +02:00
stage : "pending" ,
2017-04-09 17:06:23 +02:00
stageProps : { }
} ;
} ,
2017-04-10 14:32:40 +02:00
endAuth : function ( ) {
this . setState ( {
stage : null
} ) ;
} ,
2017-04-09 17:06:23 +02:00
componentWillMount : function ( ) {
2017-04-10 20:12:07 +02:00
lbryio . authenticate ( ) . then ( function ( user ) {
if ( ! user . HasVerifiedEmail ) { //oops I fucked this up
this . setState ( {
stage : "email" ,
stageProps : {
2017-04-18 21:45:15 +02:00
onEmailSaved : function ( email ) {
2017-04-10 20:12:07 +02:00
this . setState ( {
stage : "confirm" ,
stageProps : {
2017-04-18 22:51:00 +02:00
email : email ,
onEmailConfirmed : function ( ) { this . setState ( { stage : "welcome" } ) } . bind ( this )
2017-04-10 20:12:07 +02:00
}
} )
} . bind ( this )
}
} )
} else {
2017-04-12 22:23:20 +02:00
lbryio . call ( 'reward' , 'list' , { } ) . then ( function ( userRewards ) {
userRewards . filter ( function ( reward ) {
return reward . RewardType == "new_user" && reward . TransactionID ;
} ) . length ?
this . endAuth ( ) :
this . setState ( { stage : "welcome" } )
} . bind ( this ) ) ;
2017-04-10 20:12:07 +02:00
}
} . bind ( this ) ) . catch ( ( err ) => {
this . setState ( {
stage : "error" ,
stageProps : { errorText : err . message }
} )
document . dispatchEvent ( new CustomEvent ( 'unhandledError' , {
detail : {
message : err . message ,
data : err . stack
}
} ) ) ;
} )
2017-04-09 17:06:23 +02:00
} ,
render : function ( ) {
2017-04-12 22:23:20 +02:00
if ( ! this . state . stage ) {
2017-04-12 18:59:43 +02:00
return null ;
2017-04-09 17:06:23 +02:00
}
const StageContent = this . _stages [ this . state . stage ] ;
return (
2017-04-10 14:32:40 +02:00
this . state . stage != "welcome" ?
2017-04-12 22:23:20 +02:00
< ModalPage className = "modal-page--full" isOpen = { true } contentLabel = "Authentication" { ... this . props } >
2017-04-10 14:32:40 +02:00
< h1 > LBRY Early Access < / h 1 >
< StageContent { ... this . state . stageProps } / >
< / M o d a l P a g e > :
2017-04-12 22:23:20 +02:00
< StageContent endAuth = { this . endAuth } { ... this . state . stageProps } / >
2017-04-09 17:06:23 +02:00
) ;
}
} ) ;