diff --git a/browser/ui/webui/brave_donate_ui.cc b/browser/ui/webui/brave_donate_ui.cc index cd243cc01e32..172fde80096f 100644 --- a/browser/ui/webui/brave_donate_ui.cc +++ b/browser/ui/webui/brave_donate_ui.cc @@ -1,9 +1,15 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public +/* Copyright (c) 2019 The Brave Authors. All rights reserved. + * 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 "brave/browser/ui/webui/brave_donate_ui.h" +#include +#include +#include + +#include "base/memory/weak_ptr.h" #include "brave/browser/brave_browser_process_impl.h" #include "brave/browser/ui/webui/basic_ui.h" #include "brave/common/pref_names.h" @@ -32,8 +38,8 @@ namespace { // The handler for Javascript messages for Brave about: pages class RewardsDonateDOMHandler : public WebUIMessageHandler, public brave_rewards::RewardsServiceObserver { -public: - RewardsDonateDOMHandler() {}; + public: + RewardsDonateDOMHandler(); ~RewardsDonateDOMHandler() override; void Init(); @@ -41,26 +47,34 @@ class RewardsDonateDOMHandler : public WebUIMessageHandler, // WebUIMessageHandler implementation. void RegisterMessages() override; -private: + private: void GetPublisherDonateData(const base::ListValue* args); void GetWalletProperties(const base::ListValue* args); void OnDonate(const base::ListValue* args); void GetRecurringDonations(const base::ListValue* args); + void GetReconcileStamp(const base::ListValue* args); + void OnReconcileStamp(uint64_t reconcile_stamp); // RewardsServiceObserver implementation - void OnWalletProperties(brave_rewards::RewardsService* rewards_service, + void OnWalletProperties( + brave_rewards::RewardsService* rewards_service, int error_code, - std::unique_ptr wallet_properties) override; - void OnRecurringDonationUpdated(brave_rewards::RewardsService* rewards_service, - brave_rewards::ContentSiteList) override; + std::unique_ptr wallet_properties) + override; + void OnRecurringDonationUpdated( + brave_rewards::RewardsService* rewards_service, + brave_rewards::ContentSiteList) override; void OnPublisherBanner(brave_rewards::RewardsService* rewards_service, const brave_rewards::PublisherBanner banner) override; brave_rewards::RewardsService* rewards_service_; // NOT OWNED + base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(RewardsDonateDOMHandler); }; +RewardsDonateDOMHandler::RewardsDonateDOMHandler() : weak_factory_(this) {} + RewardsDonateDOMHandler::~RewardsDonateDOMHandler() { if (rewards_service_) rewards_service_->RemoveObserver(this); @@ -75,21 +89,30 @@ void RewardsDonateDOMHandler::Init() { } void RewardsDonateDOMHandler::RegisterMessages() { - web_ui()->RegisterMessageCallback("brave_rewards_donate.getPublisherBanner", - base::BindRepeating(&RewardsDonateDOMHandler::GetPublisherDonateData, - base::Unretained(this))); - web_ui()->RegisterMessageCallback("brave_rewards_donate.getWalletProperties", - base::BindRepeating(&RewardsDonateDOMHandler::GetWalletProperties, - base::Unretained(this))); - web_ui()->RegisterMessageCallback("brave_rewards_donate.onDonate", - base::BindRepeating(&RewardsDonateDOMHandler::OnDonate, - base::Unretained(this))); - web_ui()->RegisterMessageCallback("brave_rewards_donate.getRecurringDonations", - base::BindRepeating(&RewardsDonateDOMHandler::GetRecurringDonations, - base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "brave_rewards_donate.getPublisherBanner", + base::BindRepeating(&RewardsDonateDOMHandler::GetPublisherDonateData, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "brave_rewards_donate.getWalletProperties", + base::BindRepeating(&RewardsDonateDOMHandler::GetWalletProperties, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "brave_rewards_donate.onDonate", + base::BindRepeating(&RewardsDonateDOMHandler::OnDonate, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "brave_rewards_donate.getRecurringDonations", + base::BindRepeating(&RewardsDonateDOMHandler::GetRecurringDonations, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "brave_rewards_donate.getReconcileStamp", + base::BindRepeating(&RewardsDonateDOMHandler::GetReconcileStamp, + base::Unretained(this))); } -void RewardsDonateDOMHandler::GetPublisherDonateData(const base::ListValue* args) { +void RewardsDonateDOMHandler::GetPublisherDonateData( + const base::ListValue* args) { std::string publisher_key; args->GetString(0, &publisher_key); rewards_service_->GetPublisherBanner(publisher_key); @@ -149,7 +172,8 @@ void RewardsDonateDOMHandler::OnWalletProperties( result.SetDictionary("wallet", std::move(walletInfo)); - web_ui()->CallJavascriptFunctionUnsafe("brave_rewards_donate.walletProperties", result); + web_ui()->CallJavascriptFunctionUnsafe( + "brave_rewards_donate.walletProperties", result); } void RewardsDonateDOMHandler::OnDonate(const base::ListValue* args) { @@ -164,36 +188,42 @@ void RewardsDonateDOMHandler::OnDonate(const base::ListValue* args) { args->GetBoolean(2, &recurring); if (publisher_key.empty() || amount < 1) { - // TODO add error + // TODO(nejczdovc) add error return; } rewards_service_->OnDonate(publisher_key, amount, recurring); } -void RewardsDonateDOMHandler::GetRecurringDonations(const base::ListValue *args) { +void RewardsDonateDOMHandler::GetRecurringDonations( + const base::ListValue *args) { if (rewards_service_) { rewards_service_->UpdateRecurringDonationsList(); } } -void RewardsDonateDOMHandler::OnRecurringDonationUpdated(brave_rewards::RewardsService* rewards_service, - const brave_rewards::ContentSiteList list) { - if (web_ui()->CanCallJavascript()) { - auto publishers = std::make_unique(); - for (auto const& item : list) { - auto publisher = std::make_unique(); - publisher->SetString("publisherKey", item.id); - publisher->SetInteger("monthlyDate", item.reconcile_stamp); - publishers->Append(std::move(publisher)); - } +void RewardsDonateDOMHandler::OnRecurringDonationUpdated( + brave_rewards::RewardsService* rewards_service, + const brave_rewards::ContentSiteList list) { + if (!web_ui()->CanCallJavascript()) { + return; + } - web_ui()->CallJavascriptFunctionUnsafe("brave_rewards_donate.recurringDonations", *publishers); + auto publishers = std::make_unique(); + for (auto const& item : list) { + auto publisher = std::make_unique(); + publisher->SetString("publisherKey", item.id); + publisher->SetInteger("monthlyDate", item.reconcile_stamp); + publishers->Append(std::move(publisher)); } + + web_ui()->CallJavascriptFunctionUnsafe( + "brave_rewards_donate.recurringDonations", *publishers); } -void RewardsDonateDOMHandler::OnPublisherBanner(brave_rewards::RewardsService* rewards_service, - const brave_rewards::PublisherBanner banner) { +void RewardsDonateDOMHandler::OnPublisherBanner( + brave_rewards::RewardsService* rewards_service, + const brave_rewards::PublisherBanner banner) { if (!web_ui()->CanCallJavascript()) { return; } @@ -220,7 +250,8 @@ void RewardsDonateDOMHandler::OnPublisherBanner(brave_rewards::RewardsService* r } result.SetDictionary("social", std::move(social)); - web_ui()->CallJavascriptFunctionUnsafe("brave_rewards_donate.publisherBanner", result); + web_ui()->CallJavascriptFunctionUnsafe( + "brave_rewards_donate.publisherBanner", result); } } // namespace @@ -245,5 +276,23 @@ BraveDonateUI::BraveDonateUI(content::WebUI* web_ui, const std::string& name) handler->Init(); } +void RewardsDonateDOMHandler::GetReconcileStamp(const base::ListValue *args) { + if (rewards_service_) { + rewards_service_->GetReconcileStamp(base::Bind( + &RewardsDonateDOMHandler::OnReconcileStamp, + weak_factory_.GetWeakPtr())); + } +} + +void RewardsDonateDOMHandler::OnReconcileStamp(uint64_t reconcile_stamp) { + if (!web_ui()->CanCallJavascript()) { + return; + } + + const std::string stamp = std::to_string(reconcile_stamp); + web_ui()->CallJavascriptFunctionUnsafe("brave_rewards_donate.reconcileStamp", + base::Value(stamp)); +} + BraveDonateUI::~BraveDonateUI() { } diff --git a/components/brave_rewards/resources/donate/actions/donate_actions.ts b/components/brave_rewards/resources/donate/actions/donate_actions.ts index ae0c8703efb5..3ab5fbb71861 100644 --- a/components/brave_rewards/resources/donate/actions/donate_actions.ts +++ b/components/brave_rewards/resources/donate/actions/donate_actions.ts @@ -31,3 +31,9 @@ export const getRecurringDonations = () => action(types.GET_RECURRING_DONATIONS) export const onRecurringDonations = (recurringDonations: RewardsDonate.RecurringDonation[]) => action(types.ON_RECURRING_DONATIONS, { recurringDonations }) + +export const getReconcileStamp = () => action(types.GET_RECONCILE_STAMP) + +export const onReconcileStamp = (stamp: number) => action(types.ON_RECONCILE_STAMP, { + stamp +}) diff --git a/components/brave_rewards/resources/donate/brave_donate.tsx b/components/brave_rewards/resources/donate/brave_donate.tsx index 121f9500c661..d11ce915f225 100644 --- a/components/brave_rewards/resources/donate/brave_donate.tsx +++ b/components/brave_rewards/resources/donate/brave_donate.tsx @@ -71,11 +71,16 @@ window.cr.define('brave_rewards_donate', function () { getActions().onRecurringDonations(list) } + function reconcileStamp (stamp: number) { + getActions().onReconcileStamp(stamp) + } + return { initialize, publisherBanner, walletProperties, - recurringDonations + recurringDonations, + reconcileStamp } }) diff --git a/components/brave_rewards/resources/donate/components/app.tsx b/components/brave_rewards/resources/donate/components/app.tsx index c0b7304f34fa..1d84f1c53978 100644 --- a/components/brave_rewards/resources/donate/components/app.tsx +++ b/components/brave_rewards/resources/donate/components/app.tsx @@ -30,28 +30,20 @@ export class App extends React.Component { generateDonationOverlay = (publisher: RewardsDonate.Publisher) => { let domain = '' let monthlyDate - let recurringDonation const { currentTipAmount, currentTipRecurring, - recurringDonations + reconcileStamp } = this.props.rewardsDonateData const publisherKey = publisher && publisher.publisherKey - if (!publisherKey || - (currentTipRecurring && !recurringDonations)) { + if (!publisherKey) { return null } - if (recurringDonations) { - recurringDonation = recurringDonations.find((donation: RewardsDonate.RecurringDonation) => { - return donation.publisherKey === publisherKey - }) - } - - if (recurringDonation && recurringDonation.monthlyDate) { - monthlyDate = new Date(recurringDonation.monthlyDate * 1000).toLocaleDateString() + if (currentTipRecurring && reconcileStamp) { + monthlyDate = new Date(reconcileStamp * 1000).toLocaleDateString() } if (publisher.provider && publisher.name) { diff --git a/components/brave_rewards/resources/donate/components/siteBanner.tsx b/components/brave_rewards/resources/donate/components/siteBanner.tsx index 5ebd41392f91..ea4b7b2fd3b5 100644 --- a/components/brave_rewards/resources/donate/components/siteBanner.tsx +++ b/components/brave_rewards/resources/donate/components/siteBanner.tsx @@ -33,6 +33,7 @@ class Banner extends React.Component { componentDidMount () { this.actions.getWalletProperties() this.actions.getRecurringDonations() + this.actions.getReconcileStamp() } get actions () { diff --git a/components/brave_rewards/resources/donate/constants/donate_types.ts b/components/brave_rewards/resources/donate/constants/donate_types.ts index 4d33cfb2ff44..0e51c95076ad 100644 --- a/components/brave_rewards/resources/donate/constants/donate_types.ts +++ b/components/brave_rewards/resources/donate/constants/donate_types.ts @@ -9,5 +9,7 @@ export const enum types { GET_WALLET_PROPERTIES = '@@rewards/GET_WALLET_PROPERTIES', ON_DONATE = '@@rewards/ON_DONATE', GET_RECURRING_DONATIONS = '@@rewards/GET_RECURRING_DONATIONS', - ON_RECURRING_DONATIONS = '@@rewards/ON_RECURRING_DONATIONS' + ON_RECURRING_DONATIONS = '@@rewards/ON_RECURRING_DONATIONS', + GET_RECONCILE_STAMP = '@@rewards/GET_RECONCILE_STAMP', + ON_RECONCILE_STAMP = '@@rewards/ON_RECONCILE_STAMP' } diff --git a/components/brave_rewards/resources/donate/reducers/donate_reducer.ts b/components/brave_rewards/resources/donate/reducers/donate_reducer.ts index 2a90224eddec..c0c1b55fc02e 100644 --- a/components/brave_rewards/resources/donate/reducers/donate_reducer.ts +++ b/components/brave_rewards/resources/donate/reducers/donate_reducer.ts @@ -18,7 +18,8 @@ export const defaultState: RewardsDonate.State = { balance: 0, choices: [], probi: '0' - } + }, + reconcileStamp: 0 } const publishersReducer: Reducer = (state: RewardsDonate.State = defaultState, action) => { @@ -26,6 +27,8 @@ const publishersReducer: Reducer = (state: RewardsDonate.St switch (action.type) { case types.ON_CLOSE_DIALOG: + state = { ...state } + state.currentTipRecurring = false chrome.send('dialogClose') break case types.ON_PUBLISHER_BANNER: @@ -78,6 +81,15 @@ const publishersReducer: Reducer = (state: RewardsDonate.St state.recurringDonations = recurringDonations } break + case types.GET_RECONCILE_STAMP: { + chrome.send('brave_rewards_donate.getReconcileStamp') + break + } + case types.ON_RECONCILE_STAMP: { + state = { ...state } + state.reconcileStamp = action.payload.stamp + break + } } return state diff --git a/components/definitions/rewardsDonate.d.ts b/components/definitions/rewardsDonate.d.ts index 15c1c6efecf8..3f568e03e16c 100644 --- a/components/definitions/rewardsDonate.d.ts +++ b/components/definitions/rewardsDonate.d.ts @@ -7,6 +7,7 @@ declare namespace RewardsDonate { currentTipAmount?: string currentTipRecurring?: boolean recurringDonations?: RecurringDonation[] + reconcileStamp: number } interface ApplicationState {