diff --git a/browser/extensions/api/brave_rewards_api.cc b/browser/extensions/api/brave_rewards_api.cc index 25dc05a56992..06b334508f91 100644 --- a/browser/extensions/api/brave_rewards_api.cc +++ b/browser/extensions/api/brave_rewards_api.cc @@ -578,12 +578,11 @@ BraveRewardsGetRewardsParametersFunction::Run() { } rewards_service->GetRewardsParameters(base::BindOnce( - &BraveRewardsGetRewardsParametersFunction::OnGet, - this)); + &BraveRewardsGetRewardsParametersFunction::OnGetRewardsParameters, this)); return RespondLater(); } -void BraveRewardsGetRewardsParametersFunction::OnGet( +void BraveRewardsGetRewardsParametersFunction::OnGetRewardsParameters( ledger::type::RewardsParametersPtr parameters) { base::DictionaryValue data; @@ -604,6 +603,12 @@ void BraveRewardsGetRewardsParametersFunction::OnGet( } data.SetList("autoContributeChoices", std::move(ac_choices)); + auto payout_status = std::make_unique(); + for (const auto& [key, value] : parameters->payout_status) { + payout_status->SetString(key, value); + } + data.Set("payoutStatus", std::move(payout_status)); + Respond(OneArgument(std::move(data))); } diff --git a/browser/extensions/api/brave_rewards_api.h b/browser/extensions/api/brave_rewards_api.h index 46d0e7d0ac1b..29a06082762d 100644 --- a/browser/extensions/api/brave_rewards_api.h +++ b/browser/extensions/api/brave_rewards_api.h @@ -180,7 +180,7 @@ class BraveRewardsGetRewardsParametersFunction : public ExtensionFunction { ResponseAction Run() override; private: - void OnGet(ledger::type::RewardsParametersPtr parameters); + void OnGetRewardsParameters(ledger::type::RewardsParametersPtr parameters); }; class BraveRewardsGetBalanceReportFunction : public ExtensionFunction { diff --git a/browser/ui/webui/brave_rewards_page_ui.cc b/browser/ui/webui/brave_rewards_page_ui.cc index 69dec2a3a898..91545aa1fa7b 100644 --- a/browser/ui/webui/brave_rewards_page_ui.cc +++ b/browser/ui/webui/brave_rewards_page_ui.cc @@ -667,14 +667,21 @@ void RewardsDOMHandler::OnGetRewardsParameters( base::DictionaryValue data; if (parameters) { - auto choices = std::make_unique(); - for (double const& choice : parameters->auto_contribute_choices) { - choices->Append(choice); + base::ListValue auto_contribute_choices; + for (double const& item : parameters->auto_contribute_choices) { + auto_contribute_choices.Append(item); } - data.SetDouble("rate", parameters->rate); - data.SetDouble("autoContributeChoice", parameters->auto_contribute_choice); - data.SetList("autoContributeChoices", std::move(choices)); + base::DictionaryValue payout_status; + for (const auto& [key, value] : parameters->payout_status) { + payout_status.SetStringKey(key, value); + } + + data.SetDoubleKey("rate", parameters->rate); + data.SetDoubleKey("autoContributeChoice", + parameters->auto_contribute_choice); + data.SetKey("autoContributeChoices", std::move(auto_contribute_choices)); + data.SetKey("payoutStatus", std::move(payout_status)); } CallJavascriptFunction("brave_rewards.rewardsParameters", data); } diff --git a/browser/ui/webui/brave_tip_ui.cc b/browser/ui/webui/brave_tip_ui.cc index ae6188218411..0de5328359db 100644 --- a/browser/ui/webui/brave_tip_ui.cc +++ b/browser/ui/webui/brave_tip_ui.cc @@ -459,10 +459,16 @@ void TipMessageHandler::GetRewardsParametersCallback( ac_choices.Append(item); } + base::Value payout_status(base::Value::Type::DICTIONARY); + for (const auto& item : parameters->payout_status) { + payout_status.SetStringKey(item.first, item.second); + } + data.SetDoubleKey("rate", parameters->rate); data.SetKey("tipChoices", std::move(tip_choices)); data.SetKey("monthlyTipChoices", std::move(monthly_choices)); data.SetKey("autoContributeChoices", std::move(ac_choices)); + data.SetKey("payoutStatus", std::move(payout_status)); } FireWebUIListener("rewardsParametersUpdated", data); diff --git a/common/extensions/api/brave_rewards.json b/common/extensions/api/brave_rewards.json index 7f74e6ad35a9..22627e2f9e54 100644 --- a/common/extensions/api/brave_rewards.json +++ b/common/extensions/api/brave_rewards.json @@ -705,7 +705,7 @@ { "name": "getRewardsParameters", "type": "function", - "description": "Get default values that we get from the server", + "description": "Get default Rewards parameters", "parameters": [ { "type": "function", @@ -734,6 +734,12 @@ "type": "number", "minimum": 0 } + }, + "payoutStatus": { + "type": "object", + "additionalProperties": { + "type": "string" + } } } } diff --git a/components/brave_new_tab_ui/components/default/rewards/index.tsx b/components/brave_new_tab_ui/components/default/rewards/index.tsx index 64d6a478a80c..2eba5379523e 100644 --- a/components/brave_new_tab_ui/components/default/rewards/index.tsx +++ b/components/brave_new_tab_ui/components/default/rewards/index.tsx @@ -1,6 +1,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public -* License, v. 2.0. If a copy of the MPL was not distributed with this file, -* You can obtain one at http://mozilla.org/MPL/2.0/. */ + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ import * as React from 'react' @@ -9,6 +9,7 @@ import createWidget from '../widget/index' import { StyledTitleTab } from '../widgetTitleTab' import { LocaleContext } from '../../../../brave_rewards/resources/shared/lib/locale_context' +import { getProviderPayoutStatus } from '../../../../brave_rewards/resources/shared/lib/provider_payout_status' import { WithThemeVariables } from '../../../../brave_rewards/resources/shared/components/with_theme_variables' import { GrantInfo } from '../../../../brave_rewards/resources/shared/lib/grant_info' import { OnboardingCompletedStore } from '../../../../brave_rewards/resources/shared/lib/onboarding_completed_store' @@ -92,6 +93,12 @@ export const RewardsWidget = createWidget((props: RewardsProps) => { const adsInfo = props.adsAccountStatement || null const grantInfo = getVisibleGrant(props.promotions || []) + const externalWallet = externalWalletFromExtensionData(props.externalWallet) + const walletProvider = externalWallet ? externalWallet.provider : null + const providerPayoutStatus = props.parameters.payoutStatus + ? getProviderPayoutStatus(props.parameters.payoutStatus, walletProvider) + : 'off' + const onClaimGrant = () => { if (grantInfo) { chrome.braveRewards.showGrantCaptcha(grantInfo.id) @@ -107,8 +114,9 @@ export const RewardsWidget = createWidget((props: RewardsProps) => { rewardsBalance={props.balance.total} exchangeCurrency='USD' exchangeRate={props.parameters.rate} + providerPayoutStatus={providerPayoutStatus} grantInfo={grantInfo} - externalWallet={externalWalletFromExtensionData(props.externalWallet)} + externalWallet={externalWallet} nextPaymentDate={adsInfo ? adsInfo.nextPaymentDate : 0} earningsThisMonth={adsInfo ? adsInfo.earningsThisMonth : 0} earningsLastMonth={adsInfo ? adsInfo.earningsLastMonth : 0} diff --git a/components/brave_new_tab_ui/storage/new_tab_storage.ts b/components/brave_new_tab_ui/storage/new_tab_storage.ts index 97a5d1d24983..0185c2c26bb7 100644 --- a/components/brave_new_tab_ui/storage/new_tab_storage.ts +++ b/components/brave_new_tab_ui/storage/new_tab_storage.ts @@ -81,7 +81,8 @@ export const defaultState: NewTab.State = { totalContribution: 0.0, parameters: { rate: 0, - monthlyTipChoices: [] + monthlyTipChoices: [], + payoutStatus: {} } }, currentStackWidget: '', diff --git a/components/brave_rewards/browser/rewards_service.cc b/components/brave_rewards/browser/rewards_service.cc index b7b8cf992c09..4abd76675a27 100644 --- a/components/brave_rewards/browser/rewards_service.cc +++ b/components/brave_rewards/browser/rewards_service.cc @@ -80,6 +80,7 @@ void RewardsService::RegisterProfilePrefs(PrefRegistrySimple* registry) { ""); registry->RegisterStringPref(prefs::kParametersTipChoices, ""); registry->RegisterStringPref(prefs::kParametersMonthlyTipChoices, ""); + registry->RegisterStringPref(prefs::kParametersPayoutStatus, ""); registry->RegisterBooleanPref(prefs::kFetchOldBalance, true); registry->RegisterBooleanPref(prefs::kEmptyBalanceChecked, false); registry->RegisterStringPref(prefs::kWalletBrave, ""); diff --git a/components/brave_rewards/common/pref_names.cc b/components/brave_rewards/common/pref_names.cc index 7d506f14ee9d..18c1631897f0 100644 --- a/components/brave_rewards/common/pref_names.cc +++ b/components/brave_rewards/common/pref_names.cc @@ -64,6 +64,7 @@ const char kParametersTipChoices[] = "brave.rewards.parameters.tip.choices"; const char kParametersMonthlyTipChoices[] = "brave.rewards.parameters.tip.monthly_choices"; +const char kParametersPayoutStatus[] = "brave.rewards.parameters.payout_status"; const char kFetchOldBalance[] = "brave.rewards.fetch_old_balance"; const char kEmptyBalanceChecked[] = diff --git a/components/brave_rewards/common/pref_names.h b/components/brave_rewards/common/pref_names.h index c6dc5fc7cc5a..bad77d3b9a49 100644 --- a/components/brave_rewards/common/pref_names.h +++ b/components/brave_rewards/common/pref_names.h @@ -54,6 +54,7 @@ extern const char kParametersAutoContributeChoice[]; extern const char kParametersAutoContributeChoices[]; extern const char kParametersTipChoices[]; extern const char kParametersMonthlyTipChoices[]; +extern const char kParametersPayoutStatus[]; extern const char kFetchOldBalance[]; extern const char kEmptyBalanceChecked[]; extern const char kWalletBrave[]; diff --git a/components/brave_rewards/resources/android_page/components/adsBox.tsx b/components/brave_rewards/resources/android_page/components/adsBox.tsx index 796513133e99..7e0f9b8ef303 100644 --- a/components/brave_rewards/resources/android_page/components/adsBox.tsx +++ b/components/brave_rewards/resources/android_page/components/adsBox.tsx @@ -23,6 +23,8 @@ import { StyledNeedsBrowserUpdateContentBody } from './style' +import { externalWalletProviderFromString } from '../../shared/lib/external_wallet' +import { getProviderPayoutStatus } from '../../shared/lib/provider_payout_status' import { PaymentStatusView } from '../../shared/components/payment_status_view' // Utils @@ -221,6 +223,7 @@ class AdsBox extends React.Component { const { adsData, balanceReport, + externalWallet, safetyNetFailed, parameters } = this.props.rewardsData @@ -269,6 +272,13 @@ class AdsBox extends React.Component { const tokenString = getLocale('tokens') + const walletStatus = externalWallet ? externalWallet.status : null + const walletProvider = externalWallet + ? externalWalletProviderFromString(externalWallet.type) : null + const providerPayoutStatus = getProviderPayoutStatus( + parameters.payoutStatus, + walletProvider && walletStatus ? walletProvider : null) + return ( { earningsLastMonth={earningsLastMonth} earningsReceived={adEarningsReceived} nextPaymentDate={nextPaymentDate} + providerPayoutStatus={providerPayoutStatus} /> {getLocale('adsCurrentEarnings')}}> diff --git a/components/brave_rewards/resources/android_page/components/pageWallet.tsx b/components/brave_rewards/resources/android_page/components/pageWallet.tsx index 28bf3048ce72..0f66f93c47fd 100644 --- a/components/brave_rewards/resources/android_page/components/pageWallet.tsx +++ b/components/brave_rewards/resources/android_page/components/pageWallet.tsx @@ -13,6 +13,7 @@ import { } from '../../ui/components' import { PendingContributionsModal } from './pending_contributions_modal' import { WalletCard, ExternalWalletAction } from '../../shared/components/wallet_card' +import { getProviderPayoutStatus } from '../../shared/lib/provider_payout_status' import { ExternalWallet, ExternalWalletProvider, ExternalWalletStatus } from '../../shared/lib/external_wallet' import { Provider } from '../../ui/components/profile' import { DetailRow as PendingDetailRow, PendingType } from '../../ui/components/tablePending' @@ -760,6 +761,10 @@ class PageWallet extends React.Component { } } + const providerPayoutStatus = getProviderPayoutStatus( + parameters.payoutStatus, + walletProvider && walletStatus ? walletProvider : null) + const summaryData = { adEarnings: balanceReport && balanceReport.ads || 0, autoContributions: balanceReport && balanceReport.contribute || 0, @@ -773,6 +778,7 @@ class PageWallet extends React.Component { { adsData, adsHistory, balanceReport, + externalWallet, parameters } = this.props.rewardsData @@ -442,6 +445,13 @@ class AdsBox extends React.Component { const rows = this.getGroupedAdsHistory(historyEntries, savedOnly) const tokenString = getLocale('tokens') + const walletStatus = externalWallet ? externalWallet.status : null + const walletProvider = externalWallet + ? externalWalletProviderFromString(externalWallet.type) : null + const providerPayoutStatus = getProviderPayoutStatus( + parameters.payoutStatus, + walletProvider && walletStatus ? walletProvider : null) + return ( <> { earningsLastMonth={earningsLastMonth} earningsReceived={adEarningsReceived} nextPaymentDate={nextPaymentDate} + providerPayoutStatus={providerPayoutStatus} /> @@ -496,7 +507,7 @@ class AdsBox extends React.Component { { } diff --git a/components/brave_rewards/resources/page/components/pageWallet.tsx b/components/brave_rewards/resources/page/components/pageWallet.tsx index d05fbb2a67ba..7930258451ed 100644 --- a/components/brave_rewards/resources/page/components/pageWallet.tsx +++ b/components/brave_rewards/resources/page/components/pageWallet.tsx @@ -13,6 +13,7 @@ import { ModalQRCode } from '../../ui/components' import { WalletCard, ExternalWalletAction } from '../../shared/components/wallet_card' +import { getProviderPayoutStatus } from '../../shared/lib/provider_payout_status' import { ExternalWallet, ExternalWalletProvider, ExternalWalletStatus } from '../../shared/lib/external_wallet' import { Provider } from '../../ui/components/profile' import { DetailRow as PendingDetailRow, PendingType } from '../../ui/components/tablePending' @@ -760,6 +761,10 @@ class PageWallet extends React.Component { } } + const providerPayoutStatus = getProviderPayoutStatus( + parameters.payoutStatus, + walletProvider && walletStatus ? walletProvider : null) + const summaryData = { adEarnings: balanceReport && balanceReport.ads || 0, autoContributions: balanceReport && balanceReport.contribute || 0, @@ -773,6 +778,7 @@ class PageWallet extends React.Component {
options: Options } @@ -75,7 +77,8 @@ export function getRewardsParameters () { exchangeInfo: { currency: 'USD', rate: parameters.rate - } + }, + payoutStatus: parameters.payoutStatus }) }) }) diff --git a/components/brave_rewards/resources/rewards_panel/lib/extension_host.ts b/components/brave_rewards/resources/rewards_panel/lib/extension_host.ts index cb4b604b9353..c19410c5e50d 100644 --- a/components/brave_rewards/resources/rewards_panel/lib/extension_host.ts +++ b/components/brave_rewards/resources/rewards_panel/lib/extension_host.ts @@ -347,8 +347,8 @@ export function createHost (): Host { stateManager.update({ balance }) }), apiAdapter.getRewardsParameters().then((params) => { - const { options, exchangeInfo } = params - stateManager.update({ options, exchangeInfo }) + const { options, exchangeInfo, payoutStatus } = params + stateManager.update({ options, exchangeInfo, payoutStatus }) }), apiAdapter.getSettings().then((settings) => { stateManager.update({ settings }) diff --git a/components/brave_rewards/resources/rewards_panel/lib/initial_state.ts b/components/brave_rewards/resources/rewards_panel/lib/initial_state.ts index aa49368eb6d9..c8468fc4d414 100644 --- a/components/brave_rewards/resources/rewards_panel/lib/initial_state.ts +++ b/components/brave_rewards/resources/rewards_panel/lib/initial_state.ts @@ -29,6 +29,7 @@ export function getInitialState (): HostState { earningsThisMonth: 0, earningsLastMonth: 0 }, + payoutStatus: {}, publisherInfo: null, publisherRefreshing: false, externalWalletProviders: [], diff --git a/components/brave_rewards/resources/rewards_panel/lib/interfaces.ts b/components/brave_rewards/resources/rewards_panel/lib/interfaces.ts index af9f93478bc3..5b08bcf4a53a 100644 --- a/components/brave_rewards/resources/rewards_panel/lib/interfaces.ts +++ b/components/brave_rewards/resources/rewards_panel/lib/interfaces.ts @@ -4,6 +4,7 @@ import { ExternalWallet, ExternalWalletProvider } from '../../shared/lib/external_wallet' import { GrantInfo } from '../../shared/lib/grant_info' +import { ProviderPayoutStatus } from '../../shared/lib/provider_payout_status' import { PublisherPlatform } from '../../shared/lib/publisher_platform' import { ExternalWalletAction, RewardsSummaryData } from '../../shared/components/wallet_card' import { Notification, NotificationAction } from '../../shared/components/notifications' @@ -78,6 +79,7 @@ export interface HostState { adaptiveCaptchaInfo: AdaptiveCaptchaInfo | null exchangeInfo: ExchangeInfo earningsInfo: EarningsInfo + payoutStatus: Record publisherInfo: PublisherInfo | null publisherRefreshing: boolean externalWalletProviders: ExternalWalletProvider[] diff --git a/components/brave_rewards/resources/rewards_panel/stories/index.tsx b/components/brave_rewards/resources/rewards_panel/stories/index.tsx index 2e1f1b43d0af..3065f11f91e9 100644 --- a/components/brave_rewards/resources/rewards_panel/stories/index.tsx +++ b/components/brave_rewards/resources/rewards_panel/stories/index.tsx @@ -74,6 +74,9 @@ function createHost (): Host { earningsLastMonth: 2.4, nextPaymentDate: Date.now() + 1000 * 60 * 60 * 24 * 3 }, + payoutStatus: { + uphold: 'complete' + }, publisherInfo: { id: 'brave.com', name: 'brave.com', diff --git a/components/brave_rewards/resources/shared/components/newtab/rewards_card.tsx b/components/brave_rewards/resources/shared/components/newtab/rewards_card.tsx index e8f73293f345..7d236ced154c 100644 --- a/components/brave_rewards/resources/shared/components/newtab/rewards_card.tsx +++ b/components/brave_rewards/resources/shared/components/newtab/rewards_card.tsx @@ -7,6 +7,7 @@ import * as React from 'react' import { LocaleContext, formatMessage } from '../../lib/locale_context' import { GrantInfo } from '../../lib/grant_info' import { ExternalWallet, getExternalWalletProviderName } from '../../lib/external_wallet' +import { ProviderPayoutStatus } from '../../lib/provider_payout_status' import { ArrowCircleIcon } from '../icons/arrow_circle_icon' import { BatIcon } from '../icons/bat_icon' import { SettingsIcon } from '../icons/settings_icon' @@ -68,6 +69,7 @@ interface Props { rewardsBalance: number exchangeRate: number exchangeCurrency: string + providerPayoutStatus: ProviderPayoutStatus nextPaymentDate: number earningsThisMonth: number earningsLastMonth: number @@ -135,6 +137,7 @@ export function RewardsCard (props: Props) { earningsLastMonth={props.earningsLastMonth} earningsReceived={props.earningsReceived} nextPaymentDate={props.nextPaymentDate} + providerPayoutStatus={props.providerPayoutStatus} /> @@ -174,6 +177,7 @@ export function RewardsCard (props: Props) { earningsLastMonth={props.earningsLastMonth} earningsReceived={props.earningsReceived} nextPaymentDate={props.nextPaymentDate} + providerPayoutStatus={props.providerPayoutStatus} /> diff --git a/components/brave_rewards/resources/shared/components/newtab/stories/index.tsx b/components/brave_rewards/resources/shared/components/newtab/stories/index.tsx index ce09e7b665cd..9d26fea15a2e 100644 --- a/components/brave_rewards/resources/shared/components/newtab/stories/index.tsx +++ b/components/brave_rewards/resources/shared/components/newtab/stories/index.tsx @@ -45,6 +45,7 @@ export function Card () { rewardsBalance={91.5812} exchangeCurrency='USD' exchangeRate={0.82} + providerPayoutStatus={'complete'} grantInfo={showGrant ? { id: '', amount: 0.15, diff --git a/components/brave_rewards/resources/shared/components/payment_status_view.test.ts b/components/brave_rewards/resources/shared/components/payment_status_view.test.ts index d982f2a6b8dd..9a2e3afe01dd 100644 --- a/components/brave_rewards/resources/shared/components/payment_status_view.test.ts +++ b/components/brave_rewards/resources/shared/components/payment_status_view.test.ts @@ -2,10 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { - getDaysUntilRewardsPayment, - shouldShowRewardsPaymentCompleted -} from './payment_status_view' +import { getDaysUntilRewardsPayment } from './payment_status_view' function ms (timeString: string) { return new Date(timeString).getTime() @@ -16,28 +13,6 @@ function mockNow (timeString: string) { } describe('pending_rewards', () => { - describe('shouldShowRewardsPaymentCompleted', () => { - it('returns false if the next payment date is in the past', () => { - mockNow('2021-01-20') - expect(shouldShowRewardsPaymentCompleted(ms('2021-01-19'))) - .toStrictEqual(false) - }) - - it('returns true if we are 2 days past the previous payment date', () => { - mockNow('2021-01-09') - expect(shouldShowRewardsPaymentCompleted(ms('2021-02-07'))) - .toStrictEqual(true) - expect(shouldShowRewardsPaymentCompleted(ms('2021-03-07'))) - .toStrictEqual(true) - }) - - it('returns false if we are 4 days past the previous payment date', () => { - mockNow('2021-01-11') - expect(shouldShowRewardsPaymentCompleted(ms('2021-02-07'))) - .toStrictEqual(false) - }) - }) - describe('getDaysUntilRewardsPayment', () => { it('returns empty if month does not match', () => { mockNow('2021-01-20') diff --git a/components/brave_rewards/resources/shared/components/payment_status_view.tsx b/components/brave_rewards/resources/shared/components/payment_status_view.tsx index 70aee6980796..a11340d13f17 100644 --- a/components/brave_rewards/resources/shared/components/payment_status_view.tsx +++ b/components/brave_rewards/resources/shared/components/payment_status_view.tsx @@ -1,10 +1,11 @@ /* This Source Code Form is subject to the terms of the Mozilla Public -* License, v. 2.0. If a copy of the MPL was not distributed with this file, -* You can obtain one at http://mozilla.org/MPL/2.0/. */ + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ import * as React from 'react' import { LocaleContext, formatMessage } from '../lib/locale_context' +import { ProviderPayoutStatus } from '../lib/provider_payout_status' import { NewTabLink } from './new_tab_link' import { TokenAmount } from './token_amount' @@ -24,24 +25,6 @@ const monthNameFormatter = new Intl.DateTimeFormat(undefined, { month: 'long' }) -const completedMessageDaysVisible = 3 - -export function shouldShowRewardsPaymentCompleted ( - nextPaymentDate: number | Date -) { - if (typeof nextPaymentDate === 'number') { - nextPaymentDate = new Date(nextPaymentDate) - } - - const now = Date.now() - if (nextPaymentDate.getTime() < now) { - return false - } - - const days = new Date(now).getDate() - nextPaymentDate.getDate() - return days >= 0 && days <= completedMessageDaysVisible -} - export function getDaysUntilRewardsPayment (nextPaymentDate: number | Date) { if (typeof nextPaymentDate === 'number') { nextPaymentDate = new Date(nextPaymentDate) @@ -95,6 +78,7 @@ interface Props { earningsLastMonth: number earningsReceived: boolean nextPaymentDate: number + providerPayoutStatus: ProviderPayoutStatus } export function PaymentStatusView (props: Props) { @@ -122,11 +106,7 @@ export function PaymentStatusView (props: Props) { ) } - if (!shouldShowRewardsPaymentCompleted(props.nextPaymentDate)) { - return null - } - - if (props.earningsReceived) { + if (props.earningsReceived && props.providerPayoutStatus === 'complete') { return (
@@ -141,30 +121,32 @@ export function PaymentStatusView (props: Props) { ) } - return ( -
-
- { - formatMessage(getString('rewardsPaymentProcessing'), [ - , - getPaymentMonth() - ]) - }  - - - {getString('rewardsPaymentCheckStatus')} - - + if (!props.earningsReceived && props.providerPayoutStatus === 'processing') { + return ( +
+
+ { + formatMessage(getString('rewardsPaymentProcessing'), [ + , + getPaymentMonth() + ]) + }  + + + {getString('rewardsPaymentCheckStatus')} + + +
-
- ) + ) + } + + return null } export function shouldRenderPendingRewards ( earningsLastMonth: number, nextPaymentDate: number ) { - return earningsLastMonth > 0 && ( - getDaysUntilRewardsPayment(nextPaymentDate) || - shouldShowRewardsPaymentCompleted(nextPaymentDate)) + return earningsLastMonth > 0 && getDaysUntilRewardsPayment(nextPaymentDate) } diff --git a/components/brave_rewards/resources/shared/components/wallet_card/pending_rewards_view.tsx b/components/brave_rewards/resources/shared/components/wallet_card/pending_rewards_view.tsx index 62257fa2da21..6f1b93b4c474 100644 --- a/components/brave_rewards/resources/shared/components/wallet_card/pending_rewards_view.tsx +++ b/components/brave_rewards/resources/shared/components/wallet_card/pending_rewards_view.tsx @@ -1,10 +1,11 @@ /* This Source Code Form is subject to the terms of the Mozilla Public -* License, v. 2.0. If a copy of the MPL was not distributed with this file, -* You can obtain one at http://mozilla.org/MPL/2.0/. */ + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ import * as React from 'react' import { PaymentStatusView } from '../payment_status_view' +import { ProviderPayoutStatus } from '../../lib/provider_payout_status' import * as style from './pending_rewards_view.style' @@ -12,6 +13,7 @@ interface Props { earningsLastMonth: number earningsReceived: boolean nextPaymentDate: number + providerPayoutStatus: ProviderPayoutStatus } export function PendingRewardsView (props: Props) { @@ -21,6 +23,7 @@ export function PendingRewardsView (props: Props) { earningsLastMonth={props.earningsLastMonth} earningsReceived={props.earningsReceived} nextPaymentDate={props.nextPaymentDate} + providerPayoutStatus={props.providerPayoutStatus} /> ) diff --git a/components/brave_rewards/resources/shared/components/wallet_card/rewards_summary.tsx b/components/brave_rewards/resources/shared/components/wallet_card/rewards_summary.tsx index e25011ffb317..8d94cfb01a26 100644 --- a/components/brave_rewards/resources/shared/components/wallet_card/rewards_summary.tsx +++ b/components/brave_rewards/resources/shared/components/wallet_card/rewards_summary.tsx @@ -5,6 +5,7 @@ import * as React from 'react' import { LocaleContext } from '../../lib/locale_context' +import { ProviderPayoutStatus } from '../../lib/provider_payout_status' import { PendingRewardsView } from './pending_rewards_view' import { TokenAmount } from '../token_amount' import { ExchangeAmount } from '../exchange_amount' @@ -26,6 +27,7 @@ export interface RewardsSummaryData { interface Props { data: RewardsSummaryData + providerPayoutStatus: ProviderPayoutStatus autoContributeEnabled: boolean hideAdEarnings: boolean earningsLastMonth: number @@ -121,6 +123,7 @@ export function RewardsSummary (props: Props) { earningsLastMonth={props.earningsLastMonth} earningsReceived={props.data.adEarnings > 0} nextPaymentDate={props.nextPaymentDate} + providerPayoutStatus={props.providerPayoutStatus} /> diff --git a/components/brave_rewards/resources/shared/components/wallet_card/stories/index.tsx b/components/brave_rewards/resources/shared/components/wallet_card/stories/index.tsx index 2bd6ba578d6b..cad19074e83e 100644 --- a/components/brave_rewards/resources/shared/components/wallet_card/stories/index.tsx +++ b/components/brave_rewards/resources/shared/components/wallet_card/stories/index.tsx @@ -61,6 +61,7 @@ export function Wallet () { 0} nextPaymentDate={props.nextPaymentDate} + providerPayoutStatus={props.providerPayoutStatus} /> } diff --git a/components/brave_rewards/resources/shared/lib/provider_payout_status.ts b/components/brave_rewards/resources/shared/lib/provider_payout_status.ts new file mode 100644 index 000000000000..4d5b0c33e4bd --- /dev/null +++ b/components/brave_rewards/resources/shared/lib/provider_payout_status.ts @@ -0,0 +1,15 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { ExternalWalletProvider } from '../../shared/lib/external_wallet' + +export type ProviderPayoutStatus = 'off' | 'processing' | 'complete' + +export function getProviderPayoutStatus ( + payoutStatus: Record, + walletProvider: ExternalWalletProvider | null +): ProviderPayoutStatus { + const key = walletProvider || 'unverified' + return payoutStatus[key] || 'off' +} diff --git a/components/definitions/newTab.d.ts b/components/definitions/newTab.d.ts index d558da51cce9..7d9ca09d3b88 100644 --- a/components/definitions/newTab.d.ts +++ b/components/definitions/newTab.d.ts @@ -279,9 +279,12 @@ declare namespace NewTab { earningsLastMonth: number } + export type ProviderPayoutStatus = 'off' | 'processing' | 'complete' + export interface RewardsParameters { rate: number monthlyTipChoices: number[] + payoutStatus?: Record } export interface DefaultSuperReferralTopSite { diff --git a/components/definitions/rewards.d.ts b/components/definitions/rewards.d.ts index 67e1905062fe..68c155b50333 100644 --- a/components/definitions/rewards.d.ts +++ b/components/definitions/rewards.d.ts @@ -95,10 +95,13 @@ declare namespace Rewards { } } + export type ProviderPayoutStatus = 'off' | 'processing' | 'complete' + export interface RewardsParameters { rate: number autoContributeChoice: number autoContributeChoices: number[] + payoutStatus: Record } export interface ComponentProps { diff --git a/components/definitions/rewardsExtensions.d.ts b/components/definitions/rewardsExtensions.d.ts index 480853b4be4a..e7a988d32e5c 100644 --- a/components/definitions/rewardsExtensions.d.ts +++ b/components/definitions/rewardsExtensions.d.ts @@ -119,10 +119,13 @@ declare namespace RewardsExtension { hint: string } + export type ProviderPayoutStatus = 'off' | 'processing' | 'complete' + export interface RewardsParameters { rate: number monthlyTipChoices: number[] autoContributeChoices: number[] + payoutStatus: Record } export interface BalanceReport { diff --git a/test/data/rewards-data/parameters_resp.json b/test/data/rewards-data/parameters_resp.json index 8fa2f2c499a3..ea596988b2c8 100644 --- a/test/data/rewards-data/parameters_resp.json +++ b/test/data/rewards-data/parameters_resp.json @@ -13,5 +13,11 @@ "defaultMonthlyChoices": [ 1, 10, 100 ] + }, + "payoutStatus": { + "bitflyer": "off", + "gemini": "off", + "uphold": "off", + "unverified": "off" } -} \ No newline at end of file +} diff --git a/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom b/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom index 3de94b5e277e..c58c542b3700 100644 --- a/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom +++ b/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom @@ -119,6 +119,7 @@ struct RewardsParameters { array auto_contribute_choices; array tip_choices; array monthly_tip_choices; + map payout_status; }; struct Balance { diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters.cc index 4217ed828214..b943e04339b9 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters.cc @@ -2,6 +2,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + #include "bat/ledger/internal/endpoint/api/get_parameters/get_parameters.h" #include @@ -129,6 +130,18 @@ type::Result GetParameters::ParseBody( parameters->monthly_tip_choices.push_back(choice.GetDouble()); } + const auto* payout_status_dict = value->GetDict().FindDict("payoutStatus"); + if (!payout_status_dict) { + BLOG(0, "Missing payout status"); + return type::Result::LEDGER_ERROR; + } + + for (auto&& [key, value] : *payout_status_dict) { + if (value.is_string()) { + parameters->payout_status.emplace(key, value.GetString()); + } + } + return type::Result::LEDGER_OK; } diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters.h b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters.h index 97d91dcd5e55..59b14c8edfd6 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters.h @@ -3,8 +3,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef BRAVELEDGER_ENDPOINT_API_GET_PARAMETERS_GET_PARAMETERS_H_ -#define BRAVELEDGER_ENDPOINT_API_GET_PARAMETERS_GET_PARAMETERS_H_ +#ifndef BRAVE_VENDOR_BAT_NATIVE_LEDGER_SRC_BAT_LEDGER_INTERNAL_ENDPOINT_API_GET_PARAMETERS_GET_PARAMETERS_H_ +#define BRAVE_VENDOR_BAT_NATIVE_LEDGER_SRC_BAT_LEDGER_INTERNAL_ENDPOINT_API_GET_PARAMETERS_GET_PARAMETERS_H_ #include @@ -46,6 +46,12 @@ // 10, // 100 // ] +// }, +// "payoutStatus": { +// "unverified": "off", +// "uphold": "off", +// "gemini": "off", +// "bitflyer": "complete" // } // } @@ -86,4 +92,4 @@ class GetParameters { } // namespace endpoint } // namespace ledger -#endif // BRAVELEDGER_ENDPOINT_API_GET_PARAMETERS_GET_PARAMETERS_H_ +#endif // BRAVE_VENDOR_BAT_NATIVE_LEDGER_SRC_BAT_LEDGER_INTERNAL_ENDPOINT_API_GET_PARAMETERS_GET_PARAMETERS_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters_unittest.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters_unittest.cc index e1699be913a2..ff4cb4813371 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters_unittest.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters_unittest.cc @@ -19,6 +19,7 @@ using ::testing::_; using ::testing::Invoke; +using ::testing::NiceMock; namespace ledger { namespace endpoint { @@ -34,9 +35,10 @@ class GetParametersTest : public testing::Test { std::unique_ptr parameters_; GetParametersTest() { - mock_ledger_client_ = std::make_unique(); - mock_ledger_impl_ = - std::make_unique(mock_ledger_client_.get()); + mock_ledger_client_ = + std::make_unique>(); + mock_ledger_impl_ = std::make_unique>( + mock_ledger_client_.get()); parameters_ = std::make_unique(mock_ledger_impl_.get()); } }; @@ -71,6 +73,12 @@ TEST_F(GetParametersTest, ServerOK) { 10, 15 ] + }, + "payoutStatus": { + "unverified": "off", + "uphold": "off", + "gemini": "off", + "bitflyer": "complete" } })"; callback(response); @@ -85,6 +93,10 @@ TEST_F(GetParametersTest, ServerOK) { expected_parameters.auto_contribute_choices = {5, 10, 15}; expected_parameters.tip_choices = {1, 10, 100}; expected_parameters.monthly_tip_choices = {5, 10, 15}; + expected_parameters.payout_status = {{"unverified", "off"}, + {"uphold", "off"}, + {"gemini", "off"}, + {"bitflyer", "complete"}}; EXPECT_EQ(result, type::Result::LEDGER_OK); EXPECT_TRUE(expected_parameters.Equals(parameters)); }); @@ -184,6 +196,12 @@ TEST_F(GetParametersTest, WrongListValues) { "10", "100" ] + }, + "payoutStatus": { + "unverified": "off", + "uphold": "off", + "gemini": "off", + "bitflyer": "complete" } })"; callback(response); @@ -196,6 +214,10 @@ TEST_F(GetParametersTest, WrongListValues) { EXPECT_EQ(result, type::Result::LEDGER_OK); expected_parameters.rate = 0.2476573499489187; expected_parameters.auto_contribute_choice = 20; + expected_parameters.payout_status = {{"unverified", "off"}, + {"uphold", "off"}, + {"gemini", "off"}, + {"bitflyer", "complete"}}; EXPECT_TRUE(expected_parameters.Equals(parameters)); }); } @@ -230,6 +252,12 @@ TEST_F(GetParametersTest, DoubleListValues) { 10.5, 15.0 ] + }, + "payoutStatus": { + "unverified": "off", + "uphold": "off", + "gemini": "off", + "bitflyer": "complete" } })"; callback(response); @@ -244,6 +272,10 @@ TEST_F(GetParametersTest, DoubleListValues) { expected_parameters.auto_contribute_choices = {5, 10.5, 15}; expected_parameters.tip_choices = {1, 10.5, 100}; expected_parameters.monthly_tip_choices = {5, 10.5, 15}; + expected_parameters.payout_status = {{"unverified", "off"}, + {"uphold", "off"}, + {"gemini", "off"}, + {"bitflyer", "complete"}}; EXPECT_EQ(result, type::Result::LEDGER_OK); EXPECT_TRUE(expected_parameters.Equals(parameters)); }); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/state/state.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/state/state.cc index c4f346b63c69..df96a36fd28e 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/state/state.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/state/state.cc @@ -4,6 +4,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include +#include #include "base/base64.h" #include "base/json/json_reader.h" @@ -53,6 +54,39 @@ std::vector StringToVectorDouble(const std::string& items_string) { return items; } +std::string PayoutStatusToString( + const base::flat_map& payout_status) { + base::Value::Dict dict; + for (const auto& status : payout_status) { + dict.Set(status.first, status.second); + } + + std::string payout_status_string; + base::JSONWriter::Write(dict, &payout_status_string); + + return payout_status_string; +} + +base::flat_map StringToPayoutStatus( + const std::string& payout_status_string) { + base::DictionaryValue* dictionary_value = nullptr; + auto dict = base::JSONReader::Read(payout_status_string); + if (!dict || !dict->GetAsDictionary(&dictionary_value)) { + return {}; + } + DCHECK(dictionary_value); + + base::flat_map payout_status; + for (const auto [key, value] : dictionary_value->GetDict()) { + if (!value.is_string()) { + continue; + } + payout_status.emplace(key, value.GetString()); + } + + return payout_status; +} + std::string ConvertInlineTipPlatformToKey( const ledger::type::InlineTipsPlatforms platform) { switch (platform) { @@ -263,6 +297,8 @@ void State::SetRewardsParameters(const type::RewardsParameters& parameters) { ledger_->ledger_client()->SetStringState( kParametersMonthlyTipChoices, VectorDoubleToString(parameters.monthly_tip_choices)); + ledger_->ledger_client()->SetStringState( + kParametersPayoutStatus, PayoutStatusToString(parameters.payout_status)); } type::RewardsParametersPtr State::GetRewardsParameters() { @@ -272,6 +308,7 @@ type::RewardsParametersPtr State::GetRewardsParameters() { parameters->auto_contribute_choices = GetAutoContributeChoices(); parameters->tip_choices = GetTipChoices(); parameters->monthly_tip_choices = GetMonthlyTipChoices(); + parameters->payout_status = GetPayoutStatus(); return parameters; } @@ -318,6 +355,11 @@ std::vector State::GetMonthlyTipChoices() { kParametersMonthlyTipChoices)); } +base::flat_map State::GetPayoutStatus() { + return StringToPayoutStatus( + ledger_->ledger_client()->GetStringState(kParametersPayoutStatus)); +} + void State::SetFetchOldBalanceEnabled(bool enabled) { ledger_->database()->SaveEventLog(kFetchOldBalance, std::to_string(enabled)); ledger_->ledger_client()->SetBooleanState(kFetchOldBalance, enabled); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/state/state.h b/vendor/bat-native-ledger/src/bat/ledger/internal/state/state.h index 8adc298ca9f7..3ae7b34379ff 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/state/state.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/state/state.h @@ -10,6 +10,7 @@ #include #include +#include "base/containers/flat_map.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace ledger { @@ -89,6 +90,8 @@ class State { std::vector GetMonthlyTipChoices(); + base::flat_map GetPayoutStatus(); + void SetFetchOldBalanceEnabled(bool enabled); bool GetFetchOldBalanceEnabled(); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/state/state_keys.h b/vendor/bat-native-ledger/src/bat/ledger/internal/state/state_keys.h index 9a4a06d754be..057072eb4911 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/state/state_keys.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/state/state_keys.h @@ -38,6 +38,7 @@ const char kParametersAutoContributeChoices[] = "parameters.ac.choices"; const char kParametersTipChoices[] = "parameters.tip.choices"; const char kParametersMonthlyTipChoices[] = "parameters.tip.monthly_choices"; +const char kParametersPayoutStatus[] = "parameters.payout_status"; const char kFetchOldBalance[] = "fetch_old_balance"; const char kEmptyBalanceChecked[] = "empty_balance_checked"; const char kExternalWalletType[] = "external_wallet_type";