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