ad19495702
Naomi comment websockets increase slow mode time to 5 seconds fix to prevent duplicate comments update livestream details fix channel pin electron boom fix rebase prune unused icons updating meme updating meme update livestream for naomi fix rebase DigitalCashNetwork remove electroboom pin Slavguns Joel So he can edit his claims add streamTypes param to claimTilesDiscover so following section can search for all types of content fix typo
185 lines
5.9 KiB
JavaScript
185 lines
5.9 KiB
JavaScript
// @flow
|
|
import React from 'react';
|
|
import Page from 'component/page';
|
|
import Card from 'component/common/card';
|
|
import Spinner from 'component/spinner';
|
|
import hmacSHA256 from 'crypto-js/hmac-sha256';
|
|
import Base64 from 'crypto-js/enc-base64';
|
|
import { countries as countryData } from 'country-data';
|
|
import { FormField } from 'component/common/form';
|
|
import { SUPPORTED_MOONPAY_COUNTRIES } from 'constants/moonpay';
|
|
import { useHistory } from 'react-router';
|
|
import Button from 'component/button';
|
|
import Nag from 'component/common/nag';
|
|
import I18nMessage from 'component/i18nMessage';
|
|
import LbcSymbol from 'component/common/lbc-symbol';
|
|
|
|
const MOONPAY_KEY = process.env.MOONPAY_SECRET_KEY;
|
|
const COUNTRIES = Array.from(
|
|
new Set(
|
|
countryData.all
|
|
.map((country) => country.name)
|
|
.sort((a, b) => {
|
|
if (a > b) {
|
|
return 1;
|
|
}
|
|
|
|
if (b > a) {
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
})
|
|
)
|
|
);
|
|
|
|
type Props = {
|
|
receiveAddress: ?string,
|
|
gettingNewAddress: boolean,
|
|
email: string,
|
|
user: ?User,
|
|
doGetNewAddress: () => void,
|
|
doUserSetCountry: (string) => void,
|
|
};
|
|
|
|
export default function BuyPage(props: Props) {
|
|
const { receiveAddress, gettingNewAddress, doGetNewAddress, email, user, doUserSetCountry } = props;
|
|
const initialCountry = (user && user.country) || '';
|
|
const [url, setUrl] = React.useState();
|
|
const [country, setCountry] = React.useState(initialCountry);
|
|
const [showPurchaseScreen, setShowPurchaseScreen] = React.useState(false);
|
|
const isValid = SUPPORTED_MOONPAY_COUNTRIES.includes(country);
|
|
const { goBack } = useHistory();
|
|
|
|
React.useEffect(() => {
|
|
if (country) {
|
|
doUserSetCountry(country);
|
|
}
|
|
}, [country, doUserSetCountry, isValid, setShowPurchaseScreen]);
|
|
|
|
React.useEffect(() => {
|
|
if (!receiveAddress && !gettingNewAddress) {
|
|
doGetNewAddress();
|
|
}
|
|
}, [doGetNewAddress, receiveAddress, gettingNewAddress]);
|
|
|
|
React.useEffect(() => {
|
|
if (MOONPAY_KEY && !url && receiveAddress) {
|
|
let url = `https://buy.moonpay.io?apiKey=pk_live_xNFffrN5NWKy6fu0ggbV8VQIwRieRzy&colorCode=%23fa6165¤cyCode=lbc&showWalletAddressForm=true&walletAddress=${receiveAddress}`;
|
|
if (email) {
|
|
url += `&email=${encodeURIComponent(email)}`;
|
|
}
|
|
|
|
url += `&enabledPaymentMethods=${encodeURIComponent('credit_debit_card,sepa_bank_transfer,gbp_bank_transfer')}`;
|
|
|
|
const query = new URL(url).search;
|
|
const signature = Base64.stringify(hmacSHA256(query, MOONPAY_KEY));
|
|
|
|
setUrl(`${url}&signature=${encodeURIComponent(signature)}`);
|
|
}
|
|
}, [url, setUrl, receiveAddress, email]);
|
|
|
|
const title = __('Buy Credits');
|
|
const subtitle = (
|
|
<I18nMessage
|
|
tokens={{
|
|
learn_more: <Button button="link" label={__('Learn more')} href="https://lbry.com/faq/buy-lbc" />,
|
|
}}
|
|
>
|
|
LBRY, Inc. partners with Moonpay to provide the option to purchase LBRY Credits. %learn_more%.
|
|
</I18nMessage>
|
|
);
|
|
|
|
return (
|
|
<Page
|
|
noSideNavigation
|
|
className="main--buy"
|
|
backout={{
|
|
backoutLabel: __('Done'),
|
|
title: (
|
|
<>
|
|
<LbcSymbol prefix={__('Buy')} size={28} />
|
|
</>
|
|
),
|
|
}}
|
|
>
|
|
{!user && (
|
|
<div className="main--empty">
|
|
<Spinner delayed />
|
|
</div>
|
|
)}
|
|
|
|
{user && (
|
|
<>
|
|
{showPurchaseScreen ? (
|
|
<Card
|
|
title={title}
|
|
subtitle={subtitle}
|
|
actions={
|
|
url ? (
|
|
<iframe
|
|
allow="accelerometer; autoplay; camera; gyroscope; payment"
|
|
frameBorder="0"
|
|
src={url}
|
|
width="100%"
|
|
>
|
|
<p>{__('Your browser does not support iframes.')}</p>
|
|
</iframe>
|
|
) : (
|
|
<div className="main--empty">
|
|
<Spinner delayed />
|
|
</div>
|
|
)
|
|
}
|
|
/>
|
|
) : (
|
|
<Card
|
|
title={title}
|
|
subtitle={subtitle}
|
|
nag={country && !isValid && <Nag relative type="helpful" message={"This country isn't supported yet."} />}
|
|
actions={
|
|
<div>
|
|
<div className="section">
|
|
<FormField
|
|
label={__('Country')}
|
|
type="select"
|
|
name="country-codes"
|
|
helper={__(
|
|
'Only some countries are eligible at this time. We are working to make this available to everyone.'
|
|
)}
|
|
value={country}
|
|
onChange={(e) => setCountry(e.target.value)}
|
|
>
|
|
<option value="" disabled defaultValue>
|
|
{__('Select your country')}
|
|
</option>
|
|
{COUNTRIES.map((country, index) => (
|
|
<option key={country} value={country}>
|
|
{country}
|
|
</option>
|
|
))}
|
|
</FormField>
|
|
</div>
|
|
{country && (
|
|
<div className="section">
|
|
{isValid ? (
|
|
<div className="section__actions">
|
|
<Button button="primary" label={__('Continue')} onClick={() => setShowPurchaseScreen(true)} />
|
|
</div>
|
|
) : (
|
|
<div className="section__actions">
|
|
<Button button="alt" label={__('Go Back')} onClick={() => goBack()} />
|
|
<Button button="link" label={__('Try Anyway')} onClick={() => setShowPurchaseScreen(true)} />
|
|
</div>
|
|
)}
|
|
</div>
|
|
)}
|
|
</div>
|
|
}
|
|
/>
|
|
)}
|
|
</>
|
|
)}
|
|
</Page>
|
|
);
|
|
}
|