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 {TYPE_NEW_USER} 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) {
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 == 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} />
);
}
}