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 (
);
}
}
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 (
);
}
}
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}
/>;
}
}