bec50829c1
about to test something generate programatically beginning of the frontend stripe integration page seems to be working add user put functionality behind conditional tag connect frontend working well adding environment variables to save success and failure url bugfix bugfix final clean up adding credit card page seems to be coming along calls successfully coming from the frontend fixing up frontend cleaning up frontend coming along client secret working basic frontend in place adding tip page adding more to the tip frontend frontend almost done tabs coming along one last thing to do for frontend adding explainer text as custom function putting finishing touches on tabs support tabs working well disable fiat toggle when card not connected fix frontend gui bug bugfix and pull out label function fix symbol for tip gui modal when card is not yet saved fix fiat disabled bug knowing whether card is added programatically sending tip with frontend tip functionality working show unpaid balance add frontend for card add section update frontend update frontend bugfix change to use react instead of css update how stripe is instantiated fix bug use customer setup coming along working but needs optimization persist if card is saved adding anonymous tip functionality fix nan bug build stripe endpoints programatically show for all users for time being allow the stripe key to automatically switch to live environment bugfix bugfix fix jslint fix channel page support button better docs show customer transactions on frontend basic table in place various page updates per jeremys notes showing card details nicer tip history table add better prompt to add card on file viewer page some linting time put connect account behind fiat enabled no persist fiat mode wallet calls tip stuff
194 lines
6.1 KiB
JavaScript
194 lines
6.1 KiB
JavaScript
// @flow
|
|
import * as ICONS from 'constants/icons';
|
|
import React from 'react';
|
|
import Button from 'component/button';
|
|
import Card from 'component/common/card';
|
|
import { Lbryio } from 'lbryinc';
|
|
import { URL, WEBPACK_WEB_PORT, STRIPE_PUBLIC_KEY } from 'config';
|
|
|
|
const isDev = process.env.NODE_ENV !== 'production';
|
|
|
|
let stripeEnvironment = 'test';
|
|
// if the key contains pk_live it's a live key
|
|
// update the environment for the calls to the backend to indicate which environment to hit
|
|
if (STRIPE_PUBLIC_KEY.indexOf('pk_live') > -1) {
|
|
stripeEnvironment = 'live';
|
|
}
|
|
|
|
let successStripeRedirectUrl, failureStripeRedirectUrl;
|
|
let successEndpoint = '/$/wallet';
|
|
let failureEndpoint = '/$/wallet';
|
|
if (isDev) {
|
|
successStripeRedirectUrl = 'http://localhost:' + WEBPACK_WEB_PORT + successEndpoint;
|
|
failureStripeRedirectUrl = 'http://localhost:' + WEBPACK_WEB_PORT + failureEndpoint;
|
|
} else {
|
|
successStripeRedirectUrl = URL + successEndpoint;
|
|
failureStripeRedirectUrl = URL + failureEndpoint;
|
|
}
|
|
|
|
type Props = {
|
|
source: string,
|
|
user: User,
|
|
};
|
|
|
|
type State = {
|
|
error: boolean,
|
|
loading: boolean,
|
|
content: ?string,
|
|
stripeConnectionUrl: string,
|
|
alreadyUpdated: boolean,
|
|
accountConfirmed: boolean,
|
|
unpaidBalance: string
|
|
};
|
|
|
|
class StripeAccountConnection extends React.Component<Props, State> {
|
|
constructor(props: Props) {
|
|
super(props);
|
|
this.state = {
|
|
error: false,
|
|
content: null,
|
|
loading: true,
|
|
accountConfirmed: false,
|
|
accountPendingConfirmation: false,
|
|
unpaidBalance: 0,
|
|
};
|
|
}
|
|
|
|
componentDidMount() {
|
|
const { user } = this.props;
|
|
|
|
this.experimentalUiEnabled = user && user.experimental_ui;
|
|
|
|
var that = this;
|
|
|
|
function getAndSetAccountLink() {
|
|
Lbryio.call('account', 'link', {
|
|
return_url: successStripeRedirectUrl,
|
|
refresh_url: failureStripeRedirectUrl,
|
|
environment: stripeEnvironment,
|
|
}, 'post').then(accountLinkResponse => {
|
|
// stripe link for user to navigate to and confirm account
|
|
const stripeConnectionUrl = accountLinkResponse.url;
|
|
|
|
that.setState({
|
|
stripeConnectionUrl,
|
|
accountPendingConfirmation: true,
|
|
});
|
|
});
|
|
}
|
|
|
|
// call the account status endpoint
|
|
Lbryio.call('account', 'status', {
|
|
environment: stripeEnvironment,
|
|
}, 'post').then(accountStatusResponse => {
|
|
// if charges already enabled, no need to generate an account link
|
|
if (accountStatusResponse.charges_enabled) {
|
|
// account has already been confirmed
|
|
|
|
const yetToBeCashedOutBalance = accountStatusResponse.total_received_unpaid;
|
|
if (yetToBeCashedOutBalance) {
|
|
that.setState({
|
|
unpaidBalance: yetToBeCashedOutBalance,
|
|
});
|
|
}
|
|
|
|
console.log(accountStatusResponse.total_received_unpaid);
|
|
|
|
that.setState({
|
|
accountConfirmed: true,
|
|
});
|
|
} else {
|
|
// get stripe link and set it on the frontend
|
|
getAndSetAccountLink();
|
|
}
|
|
}).catch(function(error) {
|
|
// errorString passed from the API (with a 403 error)
|
|
const errorString = 'account not linked to user, please link first';
|
|
|
|
// if it's beamer's error indicating the account is not linked yet
|
|
if (error.message.indexOf(errorString) > -1) {
|
|
// get stripe link and set it on the frontend
|
|
getAndSetAccountLink();
|
|
} else {
|
|
// not an error from Beamer, throw it
|
|
throw new Error(error);
|
|
}
|
|
});
|
|
}
|
|
|
|
render() {
|
|
const { stripeConnectionUrl, accountConfirmed, accountPendingConfirmation, unpaidBalance } = this.state;
|
|
|
|
const { user } = this.props;
|
|
|
|
if (user.fiat_enabled) {
|
|
return (
|
|
<Card
|
|
title={<div className="table__header-text">{__(`Connect A Bank Account`)}</div>}
|
|
isBodyList
|
|
body={
|
|
<div>
|
|
{/* show while waiting for account status */}
|
|
{!accountConfirmed && !accountPendingConfirmation &&
|
|
<div className="card__body-actions">
|
|
<div>
|
|
<div>
|
|
<h3>Getting your Bank Account Connection status...</h3>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
{/* user has yet to complete their integration */}
|
|
{!accountConfirmed && accountPendingConfirmation &&
|
|
<div className="card__body-actions">
|
|
<div>
|
|
<div>
|
|
<h3>Connect your Bank Account to Odysee to receive donations directly from users</h3>
|
|
</div>
|
|
<div className="section__actions">
|
|
<a href={stripeConnectionUrl}>
|
|
<Button
|
|
button="secondary"
|
|
label={__('Connect Your Bank Account')}
|
|
icon={ICONS.FINANCE}
|
|
/>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
{/* user has completed their integration */}
|
|
{accountConfirmed &&
|
|
<div className="card__body-actions">
|
|
<div>
|
|
<div>
|
|
<h3>Congratulations! Your account has been connected with Odysee.</h3>
|
|
{unpaidBalance > 0 ? <div><br></br>
|
|
<h3>Your account balance is ${unpaidBalance/100} USD. When the functionality exists you will be able to withdraw your balance.</h3>
|
|
</div> : <div><br></br>
|
|
<h3>Your account balance is $0 USD. When you receive a tip you will see it here.</h3>
|
|
</div>}
|
|
</div>
|
|
<div className="section__actions">
|
|
<a href="/$/wallet">
|
|
<Button
|
|
button="secondary"
|
|
label={__('View Your Transaction History')}
|
|
icon={ICONS.SETTINGS}
|
|
/>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
</div>
|
|
}
|
|
/>
|
|
);
|
|
} else {
|
|
return (<></>);
|
|
}
|
|
}
|
|
}
|
|
|
|
export default StripeAccountConnection;
|