import React from 'react'; import lbry from '../lbry.js'; import lbryio from '../lbryio.js'; import Modal from './modal.js'; import ModalPage from './modal-page.js'; import Link from 'component/link'; import { RewardLink } from 'component/reward-link'; import { FormRow } from '../component/form.js'; import { CreditAmount, Address } from '../component/common.js'; import { getLocal, setLocal } from '../utils.js'; import rewards from '../rewards'; class SubmitEmailStage extends React.Component { constructor(props) { super(props); this.state = { rewardType: null, email: '', submitting: false }; } handleEmailChanged(event) { this.setState({ email: event.target.value }); } onEmailSaved(email) { this.props.setStage('confirm', { email: email }); } handleSubmit(event) { event.preventDefault(); this.setState({ submitting: true }); lbryio.call('user_email', 'new', { email: this.state.email }, 'post').then( () => { this.onEmailSaved(this.state.email); }, error => { if ( error.xhr && (error.xhr.status == 409 || error.message == __('This email is already in use')) ) { this.onEmailSaved(this.state.email); return; } else if (this._emailRow) { this._emailRow.showError(error.message); } this.setState({ submitting: false }); } ); } render() { return (
{ this.handleSubmit(event); }} > { this._emailRow = ref; }} type="text" label={__('Email')} placeholder="scrwvwls@lbry.io" name="email" value={this.state.email} onChange={event => { this.handleEmailChanged(event); }} />
{ this.handleSubmit(event); }} />
); } } class ConfirmEmailStage extends React.Component { constructor(props) { super(props); this.state = { rewardType: null, code: '', submitting: false, errorMessage: null }; } handleCodeChanged(event) { this.setState({ code: event.target.value }); } handleSubmit(event) { event.preventDefault(); this.setState({ submitting: true }); const onSubmitError = error => { if (this._codeRow) { this._codeRow.showError(error.message); } this.setState({ submitting: false }); }; lbryio .call( 'user_email', 'confirm', { verification_token: this.state.code, email: this.props.email }, 'post' ) .then(userEmail => { if (userEmail.is_verified) { this.props.setStage('welcome'); } else { onSubmitError(new Error(__('Your email is still not verified.'))); //shouldn't happen? } }, onSubmitError); } render() { return (
{ this.handleSubmit(event); }} > { this._codeRow = ref; }} type="text" name="code" placeholder="a94bXXXXXXXXXXXXXX" value={this.state.code} onChange={event => { this.handleCodeChanged(event); }} helper={__( 'A verification code is required to access this version.' )} />
{ this.handleSubmit(event); }} />
{__('No code?')} {' '} { this.props.setStage('nocode'); }} label={__('Click here')} />.
); } } class WelcomeStage extends React.Component { static propTypes = { endAuth: React.PropTypes.func }; constructor(props) { super(props); this.state = { hasReward: false, rewardAmount: null }; } onRewardClaim(reward) { this.setState({ hasReward: true, rewardAmount: reward.amount }); } render() { return !this.state.hasReward ?

{__('Welcome to LBRY.')}

{__( 'Using LBRY is like dating a centaur. Totally normal up top, and way different underneath.' )}

{__('Up top, LBRY is similar to popular media sites.')}

{__( 'Below, LBRY is controlled by users -- you -- via blockchain and decentralization.' )}

{__( "Thank you for making content freedom possible! Here's a nickel, kid." )}

{ this.onRewardClaim(event); }} onRewardFailure={() => this.props.setStage(null)} onConfirmed={() => { this.props.setStage(null); }} />
: { this.props.setStage(null); }} >

{__('About Your Reward')}

{__('You earned a reward of ')} {' '} {' '}{__('LBRY credits, or "LBC".')}

{__( 'This reward will show in your Wallet momentarily, probably while you are reading this message.' )}

{__( 'LBC is used to compensate creators, to publish, and to have say in how the network works.' )}

{__( 'No need to understand it all just yet! Try watching or downloading something next.' )}

{__( 'Finally, know that LBRY is an early beta and that it earns the name.' )}

; } } const ErrorStage = props => { return (

{__('An error was encountered that we cannot continue from.')}

{__("At least we're earning the name beta.")}

{props.errorText ?

{__('Message:')} {props.errorText}

: ''} { window.location.reload(); }} />
); }; const PendingStage = props => { return (

{__('Preparing for first access')}

); }; class CodeRequiredStage extends React.Component { constructor(props) { super(props); this._balanceSubscribeId = null; this.state = { balance: 0, address: getLocal('wallet_address') }; } componentWillMount() { this._balanceSubscribeId = lbry.balanceSubscribe(balance => { this.setState({ balance: balance }); }); if (!this.state.address) { lbry.wallet_unused_address().then(address => { setLocal('wallet_address', address); this.setState({ address: address }); }); } } componentWillUnmount() { if (this._balanceSubscribeId) { lbry.balanceUnsubscribe(this._balanceSubscribeId); } } render() { const disabled = this.state.balance < 1; return (

{__( 'Access to LBRY is restricted as we build and scale the network.' )}

{__('There are two ways in:')}

{__('Own LBRY Credits')}

{__('If you own at least 1 LBC, you can get in right now.')}

{ setLocal('auth_bypassed', true); this.props.setStage(null); }} disabled={disabled} label={__('Let Me In')} button={disabled ? 'alt' : 'primary'} />

{__('Your balance is ')}. {__('To increase your balance, send credits to this address:')}

{__("If you don't understand how to send credits, then...")}

{__('Wait For A Code')}

{__( "If you provide your email, you'll automatically receive a notification when the system is open." )}

{ this.props.setStage('email'); }} label={__('Return')} />

); } } export class AuthOverlay extends React.Component { constructor(props) { super(props); this._stages = { pending: PendingStage, error: ErrorStage, nocode: CodeRequiredStage, email: SubmitEmailStage, confirm: ConfirmEmailStage, welcome: WelcomeStage }; this.state = { stage: 'pending', stageProps: {} }; } setStage(stage, stageProps = {}) { this.setState({ stage: stage, stageProps: stageProps }); } componentWillMount() { lbryio .authenticate() .then(user => { if (!user.has_verified_email) { if (getLocal('auth_bypassed')) { this.setStage(null); } else { this.setStage('email', {}); } } else { lbryio.call('reward', 'list', {}).then(userRewards => { userRewards.filter(function(reward) { return ( reward.reward_type == rewards.TYPE_NEW_USER && reward.transaction_id ); }).length ? this.setStage(null) : this.setStage('welcome'); }); } }) .catch(err => { this.setStage('error', { errorText: err.message }); document.dispatchEvent( new CustomEvent('unhandledError', { detail: { message: err.message, data: err.stack } }) ); }); } render() { if (!this.state.stage) { return null; } const StageContent = this._stages[this.state.stage]; if (!StageContent) { return ( {__('Unknown authentication step.')} ); } return this.state.stage != 'welcome' ?

{__('LBRY Early Access')}

{ this.setStage(stage, stageProps); }} />
: { this.setStage(stage, stageProps); }} {...this.state.stageProps} />; } }