diff --git a/ui/component/common/credit-amount.jsx b/ui/component/common/credit-amount.jsx index b22e63cab..92adbba4c 100644 --- a/ui/component/common/credit-amount.jsx +++ b/ui/component/common/credit-amount.jsx @@ -49,6 +49,11 @@ class CreditAmount extends React.PureComponent { isFiat, } = this.props; const minimumRenderableAmount = 10 ** (-1 * precision); + + // return null, otherwise it will try and convert undefined to a string + if (amount === undefined) { + return null; + } const fullPrice = formatFullPrice(amount, 2); const isFree = parseFloat(amount) === 0; diff --git a/ui/component/inviteNew/view.jsx b/ui/component/inviteNew/view.jsx index 78b13336b..00944d830 100644 --- a/ui/component/inviteNew/view.jsx +++ b/ui/component/inviteNew/view.jsx @@ -11,7 +11,7 @@ import LbcSymbol from 'component/common/lbc-symbol'; type Props = { errorMessage: ?string, - inviteNew: string => void, + inviteNew: (string) => void, isPending: boolean, referralLink: string, referralCode: string, @@ -35,10 +35,10 @@ function InviteNew(props: Props) { const [referralSource, setReferralSource] = useState(referralCode); const handleReferralChange = React.useCallback( - code => { + (code) => { setReferralSource(code); // TODO: keep track of this in an array? - const matchingChannel = channels && channels.find(ch => ch.name === code); + const matchingChannel = channels && channels.find((ch) => ch.name === code); if (matchingChannel) { analytics.apiLogPublish(matchingChannel); } @@ -68,80 +68,85 @@ function InviteNew(props: Props) { }, [topChannel, handleReferralChange]); function lookupUrlByClaimName(name, channels) { - const claim = channels.find(channel => channel.name === name); + const claim = channels.find((channel) => channel.name === name); return claim && claim.canonical_url ? claim.canonical_url.replace('lbry://', '') : name; } return (
- }}> - Earn %lbc% for inviting subscribers, followers, fans, friends, etc. to join and follow you on %SITE_NAME%. - You can use invites just like affiliate links. - - } - actions={ - - - {channels && channels.length > 0 && ( - handleReferralChange(e.target.value)} - > - {channels.map(channel => ( - - ))} - - - )} - - } - /> - - }}> - Invite someone you know by email and earn %lbc% when they join %SITE_NAME%. - - } - actions={ - -
- - } - onChange={event => { - handleEmailChanged(event); - }} - /> -

- , - referral_faq_link:

); } diff --git a/ui/component/txoList/view.jsx b/ui/component/txoList/view.jsx index e07b3e6b1..3c1a574b5 100644 --- a/ui/component/txoList/view.jsx +++ b/ui/component/txoList/view.jsx @@ -12,6 +12,20 @@ import { toCapitalCase } from 'util/string'; import classnames from 'classnames'; import HelpLink from 'component/common/help-link'; import FileExporter from 'component/common/file-exporter'; +import WalletFiatPaymentHistory from 'component/walletFiatPaymentHistory'; +import WalletFiatAccountHistory from 'component/walletFiatAccountHistory'; +import { Lbryio } from 'lbryinc'; +import { getStripeEnvironment } from 'util/stripe'; +let stripeEnvironment = getStripeEnvironment(); + +// constants to be used in query params +const QUERY_NAME_CURRENCY = 'currency'; +const QUERY_NAME_TAB = 'tab'; +const QUERY_NAME_FIAT_TYPE = 'fiatType'; +// TODO: this tab will be renamed +const DEFAULT_CURRENCY_PARAM = 'credits'; +const DEFAULT_TAB_PARAM = 'fiat-payment-history'; +const DEFAULT_FIAT_TYPE_PARAM = 'incoming'; type Props = { search: string, @@ -28,7 +42,7 @@ type Props = { }; type Delta = { - dkey: string, + changedParameterKey: string, value: string, }; @@ -45,12 +59,91 @@ function TxoList(props: Props) { transactionsFile, } = props; + const [accountTransactionResponse, setAccountTransactionResponse] = React.useState([]); + const [customerTransactions, setCustomerTransactions] = React.useState([]); + + function getPaymentHistory() { + return Lbryio.call( + 'customer', + 'list', + { + environment: stripeEnvironment, + }, + 'post' + ); + } + + function getAccountTransactions() { + return Lbryio.call( + 'account', + 'list', + { + environment: stripeEnvironment, + }, + 'post' + ); + } + + // calculate account transactions section + React.useEffect(() => { + (async function() { + try { + const accountTransactionResponse = await getAccountTransactions(); + + // reverse so order is from most recent to latest + if (accountTransactionResponse && accountTransactionResponse.length) { + accountTransactionResponse.reverse(); + } + + // TODO: remove this once pagination is implemented + if (accountTransactionResponse && accountTransactionResponse.length && accountTransactionResponse.length > 25) { + accountTransactionResponse.length = 25; + } + + setAccountTransactionResponse(accountTransactionResponse); + } catch (err) { + console.log(err); + } + })(); + }, []); + + // populate customer payment data + React.useEffect(() => { + (async function() { + try { + // get card payments customer has made + let customerTransactionResponse = await getPaymentHistory(); + // console.log('amount of transactions'); + // console.log(customerTransactionResponse.length); + + // reverse so order is from most recent to latest + if (customerTransactionResponse && customerTransactionResponse.length) { + customerTransactionResponse.reverse(); + } + + // TODO: remove this once pagination is implemented + if (customerTransactionResponse && customerTransactionResponse.length && customerTransactionResponse.length > 25) { + customerTransactionResponse.length = 25; + } + + setCustomerTransactions(customerTransactionResponse); + } catch (err) { + console.log(err); + } + })(); + }, []); + const urlParams = new URLSearchParams(search); const page = urlParams.get(TXO.PAGE) || String(1); const pageSize = urlParams.get(TXO.PAGE_SIZE) || String(TXO.PAGE_SIZE_DEFAULT); const type = urlParams.get(TXO.TYPE) || TXO.ALL; const subtype = urlParams.get(TXO.SUB_TYPE); const active = urlParams.get(TXO.ACTIVE) || TXO.ALL; + const currency = urlParams.get(QUERY_NAME_CURRENCY) || DEFAULT_CURRENCY_PARAM; + const fiatType = urlParams.get(QUERY_NAME_FIAT_TYPE) || DEFAULT_FIAT_TYPE_PARAM; + // tab used in the wallet section + // TODO: need to change this eventually + const tab = urlParams.get(QUERY_NAME_TAB) || DEFAULT_TAB_PARAM; const currentUrlParams = { page, @@ -58,11 +151,15 @@ function TxoList(props: Props) { active, type, subtype, + currency, + fiatType, + tab, }; const hideStatus = type === TXO.SENT || (currentUrlParams.type === TXO.RECEIVED && currentUrlParams.subtype !== TXO.TIP); + // this is for sdk params const params = {}; if (currentUrlParams.type) { if (currentUrlParams.type === TXO.ALL) { @@ -121,7 +218,8 @@ function TxoList(props: Props) { function updateUrl(delta: Delta) { const newUrlParams = new URLSearchParams(); - switch (delta.dkey) { + + switch (delta.changedParameterKey) { case TXO.PAGE: if (currentUrlParams.type) { newUrlParams.set(TXO.TYPE, currentUrlParams.type); @@ -133,6 +231,8 @@ function TxoList(props: Props) { newUrlParams.set(TXO.ACTIVE, currentUrlParams.active); } newUrlParams.set(TXO.PAGE, delta.value); + newUrlParams.set(QUERY_NAME_TAB, currentUrlParams.tab); + newUrlParams.set(QUERY_NAME_CURRENCY, currentUrlParams.currency); break; case TXO.TYPE: newUrlParams.set(TXO.TYPE, delta.value); @@ -151,6 +251,8 @@ function TxoList(props: Props) { } newUrlParams.set(TXO.PAGE, String(1)); newUrlParams.set(TXO.PAGE_SIZE, currentUrlParams.pageSize); + newUrlParams.set(QUERY_NAME_TAB, currentUrlParams.tab); + newUrlParams.set(QUERY_NAME_CURRENCY, currentUrlParams.currency); break; case TXO.SUB_TYPE: if (currentUrlParams.type) { @@ -160,6 +262,8 @@ function TxoList(props: Props) { newUrlParams.set(TXO.SUB_TYPE, delta.value); newUrlParams.set(TXO.PAGE, String(1)); newUrlParams.set(TXO.PAGE_SIZE, currentUrlParams.pageSize); + newUrlParams.set(QUERY_NAME_TAB, currentUrlParams.tab); + newUrlParams.set(QUERY_NAME_CURRENCY, currentUrlParams.currency); break; case TXO.ACTIVE: if (currentUrlParams.type) { @@ -171,6 +275,25 @@ function TxoList(props: Props) { newUrlParams.set(TXO.ACTIVE, delta.value); newUrlParams.set(TXO.PAGE, String(1)); newUrlParams.set(TXO.PAGE_SIZE, currentUrlParams.pageSize); + newUrlParams.set(QUERY_NAME_TAB, currentUrlParams.tab); + newUrlParams.set(QUERY_NAME_CURRENCY, currentUrlParams.currency); + break; + // toggling the currency type (lbc/fiat) + case QUERY_NAME_CURRENCY: + newUrlParams.set(QUERY_NAME_CURRENCY, delta.value); + newUrlParams.set(QUERY_NAME_TAB, currentUrlParams.tab); + // only set fiat type (incoming|outgoing) if fiat is being used + if (delta.value === 'credits') { + newUrlParams.delete(QUERY_NAME_FIAT_TYPE); + } else { + newUrlParams.set(QUERY_NAME_FIAT_TYPE, currentUrlParams.fiatType); + } + break; + // toggling the fiat type (incoming/outgoing) + case QUERY_NAME_FIAT_TYPE: + newUrlParams.set(QUERY_NAME_FIAT_TYPE, delta.value); + newUrlParams.set(QUERY_NAME_TAB, currentUrlParams.tab); + newUrlParams.set(QUERY_NAME_CURRENCY, currentUrlParams.currency); break; } @@ -188,63 +311,58 @@ function TxoList(props: Props) { return ( {__(`Transactions`)}} - titleActions={ -
- {!isFetchingTransactions && transactionsFile === null && ( - - )} -
- fetchTransactions()} - progressMsg={isFetchingTransactions ? __('Fetching data') : ''} - /> + title={ + <>
{__(`Transactions`)}
+
+ + {/* toggle between LBC and fiat buttons */} +
+ {/* toggle to LBC */} +
+
-
+ + } isBodyList - body={ -
+ body={currency === 'credits' + ?
+ {/* LBC transactions section */}
-
-
- - {__('Type')} - - - } - value={type || 'all'} - onChange={(e) => handleChange({ dkey: TXO.TYPE, value: e.target.value })} - > - {Object.values(TXO.DROPDOWN_TYPES).map((v) => { - const stringV = String(v); - return ( - - ); - })} - -
- {(type === TXO.SENT || type === TXO.RECEIVED) && ( +
+
+ {/* LBC transaction type dropdown */} handleChange({ dkey: TXO.SUB_TYPE, value: e.target.value })} + name="type" + label={ + <> + {__('Type')} + + + } + value={type || 'all'} + onChange={(e) => handleChange({ changedParameterKey: TXO.TYPE, value: e.target.value, tab })} > - {Object.values(TXO.DROPDOWN_SUBTYPES).map((v) => { + {Object.values(TXO.DROPDOWN_TYPES).map((v) => { const stringV = String(v); return (
- )} - {!hideStatus && ( + {(type === TXO.SENT || type === TXO.RECEIVED) && ( +
+ handleChange({ changedParameterKey: TXO.SUB_TYPE, value: e.target.value, tab })} + > + {Object.values(TXO.DROPDOWN_SUBTYPES).map((v) => { + const stringV = String(v); + return ( + + ); + })} + +
+ )} + {!hideStatus && ( +
+ + +
+ {/* active transactions button */} +
+
+
+ )} +
+ {/* export and refresh buttons */} +
+ {!isFetchingTransactions && transactionsFile === null && ( + + )} +
+ fetchTransactions()} + progressMsg={isFetchingTransactions ? __('Fetching data') : ''} + /> +
+
+
+
+ {/* listing of the lbc transactions */} + + +
+ :
+ {/* FIAT SECTION ( toggle buttons and transactions) */} +
+
+
- +
+ {/* incoming transactions button */}
- )} +
+ {/* listing of the transactions */} + { fiatType === 'incoming' && } + { fiatType === 'outgoing' && } + {/* TODO: have to finish pagination */} + {/* */}
- -
} + /> ); } diff --git a/ui/component/walletBalance/view.jsx b/ui/component/walletBalance/view.jsx index 6746d5c36..5288b63d5 100644 --- a/ui/component/walletBalance/view.jsx +++ b/ui/component/walletBalance/view.jsx @@ -10,6 +10,7 @@ import Card from 'component/common/card'; import LbcSymbol from 'component/common/lbc-symbol'; import I18nMessage from 'component/i18nMessage'; import { formatNumberWithCommas } from 'util/number'; +import WalletFiatBalance from 'component/walletFiatBalance'; type Props = { balance: number, @@ -63,124 +64,139 @@ const WalletBalance = (props: Props) => { }, [doFetchUtxoCounts, balance, detailsExpanded]); return ( - } - subtitle={ - totalLocked > 0 ? ( - }}> - Your total balance. All of this is yours, but some %lbc% is in use on channels and content right now. - - ) : ( - {__('Your total balance.')} - ) - } - actions={ - <> -

- }}> - %lbc_amount% immediately spendable - -

- -

- , - }} - > - %lbc_amount% boosting content - -

- {detailsExpanded && ( -
-
-
- {__('...earned from others')} - ({__('Unlock to spend')}) -
-
- - {Boolean(tipsBalance) && ( -
- -
- {__('...on initial publishes')} - ({__('Delete or edit past content to spend')}) -
-
- -
- -
- {__('...supporting content')} - ({__('Delete supports to spend')}) -
-
- -
-
-
- )} - - {/* @if TARGET='app' */} - {hasSynced ? ( -

- {__('A backup of your wallet is synced with lbry.tv.')} - -

- ) : ( -

- {__('Your wallet is not currently synced with lbry.tv. You are in control of backing up your wallet.')} - -

- )} - {/* @endif */} -
-
- {(otherCount > WALLET_CONSOLIDATE_UTXOS || consolidateIsPending || consolidatingUtxos) && ( -

- doUtxoConsolidate()} - disabled={operationPending} - label={ - consolidateIsPending || consolidatingUtxos ? __('Consolidating...') : __('Consolidate Now') - } - /> - ), - help: , - }} - > - Your wallet has a lot of change lying around. Consolidating will speed up your transactions. This could - take some time. %now%%help% +

+
+ } + subtitle={ + totalLocked > 0 ? ( + }}> + Your total balance. All of this is yours, but some %lbc% is in use on channels and content right now. -

- )} - - } - /> + ) : ( + {__('Your total balance.')} + ) + } + actions={ + <> +

+ }}> + %lbc_amount% immediately spendable + +

+ +

+ , + }} + > + %lbc_amount% boosting content + +

+ {detailsExpanded && ( +
+
+
+ {__('...earned from others')} + ({__('Unlock to spend')}) +
+
+ + {Boolean(tipsBalance) && ( +
+ +
+ {__('...on initial publishes')} + ({__('Delete or edit past content to spend')}) +
+
+ +
+ +
+ {__('...supporting content')} + ({__('Delete supports to spend')}) +
+
+ +
+
+
+ )} + + {/* @if TARGET='app' */} + {hasSynced ? ( +

+ {__('A backup of your wallet is synced with lbry.tv.')} + +

+ ) : ( +

+ {__( + 'Your wallet is not currently synced with lbry.tv. You are in control of backing up your wallet.' + )} + +

+ )} + {/* @endif */} +
+
+ {(otherCount > WALLET_CONSOLIDATE_UTXOS || consolidateIsPending || consolidatingUtxos) && ( +

+ doUtxoConsolidate()} + disabled={operationPending} + label={ + consolidateIsPending || consolidatingUtxos ? __('Consolidating...') : __('Consolidate Now') + } + /> + ), + help: , + }} + > + Your wallet has a lot of change lying around. Consolidating will speed up your transactions. This + could take some time. %now%%help% + +

+ )} + + } + /> +
+
+ {/* fiat balance card */} + +
+
); }; diff --git a/ui/component/walletFiatAccountHistory/view.jsx b/ui/component/walletFiatAccountHistory/view.jsx index 49b1ff299..7e9b688c9 100644 --- a/ui/component/walletFiatAccountHistory/view.jsx +++ b/ui/component/walletFiatAccountHistory/view.jsx @@ -1,7 +1,6 @@ // @flow import React from 'react'; import Button from 'component/button'; -import Card from 'component/common/card'; import moment from 'moment'; type Props = { @@ -21,67 +20,60 @@ const WalletBalance = (props: Props) => { } // if there are more than 10 transactions, limit it to 10 for the frontend - if (accountTransactions && accountTransactions.length > 10) { - accountTransactions.length = 10; - } + // if (accountTransactions && accountTransactions.length > 10) { + // accountTransactions.length = 10; + // } return ( - <> -
- - - - - - - - - - - - - - {accountTransactions && - accountTransactions.map((transaction) => ( - - - - - - - - - - ))} - -
{__('Date')}{<>{__('Receiving Channel Name')}}{__('Tip Location')}{__('Amount (USD)')} {__('Processing Fee')}{__('Odysee Fee')}{__('Received Amount')}
{moment(transaction.created_at).format('LLL')} - - ${transaction.tipped_amount / 100}${transaction.transaction_fee / 100}${transaction.application_fee / 100}${transaction.received_amount / 100}
- {!accountTransactions &&

No Transactions

} -
- - )} - /> - +
+ + + + + + + + + + + + + + {accountTransactions && + accountTransactions.map((transaction) => ( + + + + + + + + + + ))} + +
{__('Date')}{<>{__('Receiving Channel Name')}}{__('Tip Location')}{__('Amount (USD)')} {__('Processing Fee')}{__('Odysee Fee')}{__('Received Amount')}
{moment(transaction.created_at).format('LLL')} + + ${transaction.tipped_amount / 100}${transaction.transaction_fee / 100}${transaction.application_fee / 100}${transaction.received_amount / 100}
+ {!accountTransactions &&

No Transactions

} +
+ ); }; diff --git a/ui/component/walletFiatBalance/view.jsx b/ui/component/walletFiatBalance/view.jsx index 9c71623ba..a4ef1bb28 100644 --- a/ui/component/walletFiatBalance/view.jsx +++ b/ui/component/walletFiatBalance/view.jsx @@ -6,84 +6,64 @@ import Button from 'component/button'; import Card from 'component/common/card'; import Icon from 'component/common/icon'; import I18nMessage from 'component/i18nMessage'; +import { Lbryio } from 'lbryinc'; +import { getStripeEnvironment } from 'util/stripe'; +let stripeEnvironment = getStripeEnvironment(); -type Props = { - accountDetails: any, -}; +const WalletBalance = () => { + const [accountStatusResponse, setAccountStatusResponse] = React.useState(); -const WalletBalance = (props: Props) => { - const { - accountDetails, - } = props; + function getAccountStatus() { + return Lbryio.call( + 'account', + 'status', + { + environment: stripeEnvironment, + }, + 'post' + ); + } + + // calculate account transactions section + React.useEffect(() => { + (async function () { + try { + if (!stripeEnvironment) { + return; + } + const response = await getAccountStatus(); + + setAccountStatusResponse(response); + } catch (err) { + console.log(err); + } + })(); + }, [stripeEnvironment]); return ( <>{{(accountDetails && ((accountDetails.total_received_unpaid - accountDetails.total_paid_out) / 100)) || 0} USD} - subtitle={accountDetails && accountDetails.total_received_unpaid > 0 && + title={<>{(accountStatusResponse && ((accountStatusResponse.total_received_unpaid - accountStatusResponse.total_paid_out) / 100)) || 0} USD} + subtitle={accountStatusResponse && accountStatusResponse.total_received_unpaid > 0 ? ( This is your pending balance that will be automatically sent to your bank account - + ) : ( + + When you begin to receive tips your balance will be updated here + ) } actions={ <>

- ${(accountDetails && (accountDetails.total_received_unpaid / 100)) || 0} Total Received Tips + ${(accountStatusResponse && (accountStatusResponse.total_received_unpaid / 100)) || 0} Total Received Tips

- ${(accountDetails && (accountDetails.total_paid_out / 100)) || 0} Withdrawn - {/*

- {/* view more section */} - {/* commenting out because not implemented, but could be used in the future */} - {/* {detailsExpanded && ( */} - {/*
*/} - {/*
*/} - {/*
*/} - {/* {__('Earned from uploads')} */} - {/* /!* ({__('Earned from channel page')}) *!/ */} - {/*
*/} - {/*
*/} - {/* */} - {/* {Boolean(1) && ( */} - {/*
*/} - - {/*
*/} - {/* {__('Earned from channel page')} */} - {/* /!* ({__('Delete or edit past content to spend')}) *!/ */} - {/*
*/} - {/*
*/} - {/* */} - {/*
*/} - - {/* /!*
*!/ */} - {/* /!* {__('...supporting content')} *!/ */} - {/* /!* ({__('Delete supports to spend')}) *!/ */} - {/* /!*
*!/ */} - {/* /!*
*!/ */} - {/* /!* *!/ */} - {/* /!*
*!/ */} - {/*
*/} - {/*
*/} - {/* )} */} -
- {/*
} diff --git a/ui/component/walletFiatPaymentHistory/view.jsx b/ui/component/walletFiatPaymentHistory/view.jsx index 45d55bde7..2113947c0 100644 --- a/ui/component/walletFiatPaymentHistory/view.jsx +++ b/ui/component/walletFiatPaymentHistory/view.jsx @@ -1,7 +1,6 @@ // @flow import React from 'react'; import Button from 'component/button'; -import Card from 'component/common/card'; import { Lbryio } from 'lbryinc'; import moment from 'moment'; import { getStripeEnvironment } from 'util/stripe'; @@ -16,10 +15,6 @@ const WalletBalance = (props: Props) => { // receive transactions from parent component const { transactions: accountTransactions } = props; - // const [accountStatusResponse, setAccountStatusResponse] = React.useState(); - - // const [subscriptions, setSubscriptions] = React.useState(); - const [lastFour, setLastFour] = React.useState(); function getCustomerStatus() { @@ -35,78 +30,76 @@ const WalletBalance = (props: Props) => { // TODO: this is actually incorrect, last4 should be populated based on the transaction not the current customer details React.useEffect(() => { - (async function () { - const customerStatusResponse = await getCustomerStatus(); + (async function() { + const customerStatusResponse = await getCustomerStatus(); - const lastFour = - customerStatusResponse.PaymentMethods && - customerStatusResponse.PaymentMethods.length && - customerStatusResponse.PaymentMethods[0].card.last4; + const lastFour = customerStatusResponse.PaymentMethods && customerStatusResponse.PaymentMethods.length && customerStatusResponse.PaymentMethods[0].card.last4; - setLastFour(lastFour); + setLastFour(lastFour); })(); }, []); return ( <> - -
- - - - - - - - - - - - - {accountTransactions && - accountTransactions.map((transaction) => ( - - - - - - - - - ))} - -
{__('Date')}{<>{__('Receiving Channel Name')}}{__('Tip Location')}{__('Amount (USD)')} {__('Card Last 4')}{__('Anonymous')}
{moment(transaction.created_at).format('LLL')} - - ${transaction.tipped_amount / 100}{lastFour}{transaction.private_tip ? 'Yes' : 'No'}
- {(!accountTransactions || accountTransactions.length === 0) && ( -

- No Transactions -

- )} -
- - } - /> - +
+
+ + {/* table header */} + + + + + + + + + + + {/* list data for transactions */} + + {accountTransactions && + accountTransactions.map((transaction) => ( + + {/* date */} + + {/* receiving channel name */} + + {/* link to content or channel */} + + {/* how much tipped */} + + {/* TODO: this is incorrect need it per transactions not per user */} + {/* last four of credit card */} + + {/* whether tip is anonymous or not */} + + + ))} + +
{__('Date')}{<>{__('Receiving Channel Name')}}{__('Tip Location')}{__('Amount (USD)')} {__('Card Last 4')}{__('Anonymous')}
{moment(transaction.created_at).format('LLL')} + + ${transaction.tipped_amount / 100}{lastFour}{transaction.private_tip ? 'Yes' : 'No'}
+ {/* show some markup if there's no transactions */} + {(!accountTransactions || accountTransactions.length === 0) &&

No Transactions

} +
+
+ ); }; diff --git a/ui/page/settingsStripeAccount/view.jsx b/ui/page/settingsStripeAccount/view.jsx index fc63e9e42..505e32188 100644 --- a/ui/page/settingsStripeAccount/view.jsx +++ b/ui/page/settingsStripeAccount/view.jsx @@ -281,7 +281,8 @@ class StripeAccountConnection extends React.Component { )}
} - actions={ + // only show additional buttons if its for additional verification or to show transaction page + actions={(stillRequiringVerification || accountConfirmed) && <> {stillRequiringVerification && (