Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fixes brave/brave-browser#2823

Monthly donation functionality via panel
  • Loading branch information
ryanml committed Mar 20, 2019
1 parent 6e960e9 commit 0ea4276
Show file tree
Hide file tree
Showing 16 changed files with 308 additions and 6 deletions.
81 changes: 81 additions & 0 deletions browser/extensions/api/brave_rewards_api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -270,5 +270,86 @@ void BraveRewardsGetACEnabledFunction::OnGetACEnabled(bool enabled) {
Respond(OneArgument(std::make_unique<base::Value>(enabled)));
}

BraveRewardsSaveRecurringDonationFunction::
~BraveRewardsSaveRecurringDonationFunction() {
}

ExtensionFunction::ResponseAction
BraveRewardsSaveRecurringDonationFunction::Run() {

std::unique_ptr<brave_rewards::SaveRecurringDonation::Params> params(
brave_rewards::SaveRecurringDonation::Params::Create(*args_));

Profile* profile = Profile::FromBrowserContext(browser_context());
RewardsService* rewards_service_ =
RewardsServiceFactory::GetForProfile(profile);

if (rewards_service_) {
rewards_service_->SaveRecurringDonation(
params->publisher_key, params->new_amount);
}

return RespondNow(NoArguments());
}

BraveRewardsRemoveRecurringDonationFunction::
~BraveRewardsRemoveRecurringDonationFunction() {
}

ExtensionFunction::ResponseAction
BraveRewardsRemoveRecurringDonationFunction::Run() {

std::unique_ptr<brave_rewards::RemoveRecurringDonation::Params> params(
brave_rewards::RemoveRecurringDonation::Params::Create(*args_));

Profile* profile = Profile::FromBrowserContext(browser_context());
RewardsService* rewards_service_ =
RewardsServiceFactory::GetForProfile(profile);

if (rewards_service_) {
rewards_service_->RemoveRecurring(params->publisher_key);
}

return RespondNow(NoArguments());
}

BraveRewardsGetRecurringDonationsFunction::
~BraveRewardsGetRecurringDonationsFunction() {
}

ExtensionFunction::ResponseAction
BraveRewardsGetRecurringDonationsFunction::Run() {
Profile* profile = Profile::FromBrowserContext(browser_context());
RewardsService* rewards_service =
RewardsServiceFactory::GetForProfile(profile);

if (!rewards_service) {
return RespondNow(Error("Rewards service is not initialized"));
}

rewards_service->GetRecurringDonationsList(base::Bind(
&BraveRewardsGetRecurringDonationsFunction::OnGetRecurringDonations,
this));
return RespondLater();
}

void BraveRewardsGetRecurringDonationsFunction::OnGetRecurringDonations(
std::unique_ptr<::brave_rewards::ContentSiteList> list) {
std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue());
auto recurringDonations = std::make_unique<base::ListValue>();

if (!list->empty()) {
for (auto const& item: *list) {
auto recurringDonation = std::make_unique<base::DictionaryValue>();
recurringDonation->SetString("publisherKey", item.id);
recurringDonation->SetInteger("amount", item.weight);
recurringDonations->Append(std::move(recurringDonation));
}
}

result->SetList("recurringDonations", std::move(recurringDonations));
Respond(OneArgument(std::move(result)));
}

} // namespace api
} // namespace extensions
38 changes: 38 additions & 0 deletions browser/extensions/api/brave_rewards_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#define BRAVE_BROWSER_EXTENSIONS_API_BRAVE_REWARDS_API_H_

#include "extensions/browser/extension_function.h"
#include "brave/components/brave_rewards/browser/content_site.h"

namespace extensions {
namespace api {
Expand Down Expand Up @@ -155,6 +156,43 @@ class BraveRewardsGetACEnabledFunction : public UIThreadExtensionFunction {
void OnGetACEnabled(bool enabled);
};

class BraveRewardsSaveRecurringDonationFunction :
public UIThreadExtensionFunction {
public:
DECLARE_EXTENSION_FUNCTION("braveRewards.saveRecurringDonation", UNKNOWN)

protected:
~BraveRewardsSaveRecurringDonationFunction() override;

ResponseAction Run() override;
};

class BraveRewardsRemoveRecurringDonationFunction :
public UIThreadExtensionFunction {
public:
DECLARE_EXTENSION_FUNCTION("braveRewards.removeRecurringDonation", UNKNOWN)

protected:
~BraveRewardsRemoveRecurringDonationFunction() override;

ResponseAction Run() override;
};

class BraveRewardsGetRecurringDonationsFunction :
public UIThreadExtensionFunction {
public:
DECLARE_EXTENSION_FUNCTION("braveRewards.getRecurringDonations", UNKNOWN)

protected:
~BraveRewardsGetRecurringDonationsFunction() override;

ResponseAction Run() override;

private:
void OnGetRecurringDonations(
std::unique_ptr<brave_rewards::ContentSiteList> list);
};

} // namespace api
} // namespace extensions

Expand Down
43 changes: 43 additions & 0 deletions common/extensions/api/brave_rewards.json
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,49 @@
"type": "string"
}
]
},
{
"name": "saveRecurringDonation",
"type": "function",
"description": "Updates recurring donation amount for rewards panel",
"parameters": [
{
"name": "publisher_key",
"type": "string"
},
{
"name": "new_amount",
"type": "integer"
}
]
},
{
"name": "removeRecurringDonation",
"type": "function",
"description": "Removes recurring donation for rewards panel",
"parameters": [
{
"name": "publisher_key",
"type": "string"
}
]
},
{
"name": "getRecurringDonations",
"type": "function",
"description": "Gets list of sites with recurring donation data",
"parameters": [
{
"type": "function",
"name": "callback",
"parameters": [
{
"name": "siteList",
"type": "any"
}
]
}
]
}
]
}
Expand Down
2 changes: 2 additions & 0 deletions components/brave_rewards/browser/content_site.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ namespace brave_rewards {
percentage(0),
verified(false),
excluded(0),
weight(0),
reconcile_stamp(0) {
}

Expand All @@ -26,6 +27,7 @@ namespace brave_rewards {
url = properties.url;
provider = properties.provider;
id = properties.id;
weight = properties.weight;
reconcile_stamp = properties.reconcile_stamp;
}

Expand Down
1 change: 1 addition & 0 deletions components/brave_rewards/browser/content_site.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ struct ContentSite {
std::string favicon_url;
std::string url;
std::string provider;
double weight;
uint64_t reconcile_stamp;
};

Expand Down
7 changes: 7 additions & 0 deletions components/brave_rewards/browser/rewards_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ using GetRewardsMainEnabledCallback = base::Callback<void(bool)>;
using ConfirmationsHistoryCallback = base::Callback<void(int, double)>;
using GetRewardsInternalsInfoCallback = base::OnceCallback<void(
std::unique_ptr<brave_rewards::RewardsInternalsInfo>)>;
using GetRecurringDonationsListCallback =
base::OnceCallback<void(std::unique_ptr<brave_rewards::ContentSiteList>)>;

class RewardsService : public KeyedService {
public:
Expand Down Expand Up @@ -188,6 +190,11 @@ class RewardsService : public KeyedService {

static void RegisterProfilePrefs(PrefRegistrySimple* registry);

virtual void SaveRecurringDonation(
const std::string& publisher_key, const int amount) = 0;
virtual void GetRecurringDonationsList(
GetRecurringDonationsListCallback callback) = 0;

protected:
base::ObserverList<RewardsServiceObserver> observers_;

Expand Down
27 changes: 27 additions & 0 deletions components/brave_rewards/browser/rewards_service_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ ContentSite PublisherInfoToContentSite(
content_site.provider = publisher_info.provider;
content_site.favicon_url = publisher_info.favicon_url;
content_site.id = publisher_info.id;
content_site.weight = publisher_info.weight;
content_site.reconcile_stamp = publisher_info.reconcile_stamp;
return content_site;
}
Expand Down Expand Up @@ -2208,6 +2209,32 @@ void RewardsServiceImpl::GetRecurringDonations(
callback));
}

void RewardsServiceImpl::GetRecurringDonationsList(
GetRecurringDonationsListCallback callback) {
base::PostTaskAndReplyWithResult(file_task_runner_.get(), FROM_HERE,
base::BindOnce(&GetRecurringDonationsOnFileTaskRunner,
publisher_info_backend_.get()),
base::BindOnce(&RewardsServiceImpl::OnRecurringDonationsDataList,
AsWeakPtr(),
std::move(callback)));
}

void RewardsServiceImpl::OnRecurringDonationsDataList(
GetRecurringDonationsListCallback callback,
ledger::PublisherInfoList list) {
if (!Connected()) {
return;
}

auto site_list =
std::make_unique<brave_rewards::ContentSiteList>();
for (auto& info : list) {
site_list->push_back(PublisherInfoToContentSite(info));
}

std::move(callback).Run(std::move(site_list));
}

void RewardsServiceImpl::UpdateRecurringDonationsList() {
GetRecurringDonations(
std::bind(&RewardsServiceImpl::OnRecurringDonationUpdated, this, _1));
Expand Down
10 changes: 8 additions & 2 deletions components/brave_rewards/browser/rewards_service_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,9 @@ class RewardsServiceImpl : public RewardsService,
void GetAddressesForPaymentId(const GetAddressesCallback& callback) override;
std::pair<uint64_t, uint64_t> GetEarningsRange();

void SaveRecurringDonation(const std::string& publisher_key,
const int amount) override;

// Testing methods
void SetLedgerEnvForTesting();

Expand Down Expand Up @@ -255,11 +258,12 @@ class RewardsServiceImpl : public RewardsService,
void OnContributionInfoSaved(const ledger::REWARDS_CATEGORY category,
bool success);
void OnRecurringDonationSaved(bool success);
void SaveRecurringDonation(const std::string& publisher_key,
const int amount);
void OnRecurringDonationsData(
const ledger::PublisherInfoListCallback callback,
const ledger::PublisherInfoList list);
void OnRecurringDonationsDataList(
GetRecurringDonationsListCallback callback,
ledger::PublisherInfoList list);
void OnRecurringDonationUpdated(const ledger::PublisherInfoList& list);
void OnTipsUpdatedData(const ledger::PublisherInfoList list);
void TipsUpdated();
Expand Down Expand Up @@ -370,6 +374,8 @@ class RewardsServiceImpl : public RewardsService,
const ledger::REWARDS_CATEGORY category) override;
void GetRecurringDonations(
ledger::PublisherInfoListCallback callback) override;
void GetRecurringDonationsList(
GetRecurringDonationsListCallback callback) override;
std::unique_ptr<ledger::LogStream> Log(
const char* file,
int line,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,16 @@ export const onExcludedSitesChanged = (properties: RewardsExtension.ExcludedSite
action(types.ON_EXCLUDED_SITES_CHANGED, {
properties
})

export const saveRecurringDonation = (publisherKey: string, newAmount: number) => action(types.SAVE_RECURRING_DONATION, {
publisherKey,
newAmount
})

export const removeRecurringContribution = (publisherKey: string) => action(types.REMOVE_RECURRING_DONATION, {
publisherKey
})

export const onRecurringDonations = (result: RewardsExtension.RecurringDonation) => action(types.ON_RECURRING_DONATIONS, {
result
})
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,32 @@ export const rewardsPanelReducer = (state: RewardsExtension.State | undefined, a
}
break
}
case types.REMOVE_RECURRING_DONATION: {
let publisherKey = payload.publisherKey
if (publisherKey == null) {
break
}
chrome.braveRewards.removeRecurringDonation(publisherKey)
break
}
case types.SAVE_RECURRING_DONATION: {
let newAmount = payload.newAmount
let publisherKey = payload.publisherKey

if (newAmount < 0 ||
isNaN(newAmount) ||
publisherKey == null) {
break
}

chrome.braveRewards.saveRecurringDonation(publisherKey, newAmount)
break
}
case types.ON_RECURRING_DONATIONS: {
state = { ...state }
state.recurringDonations = payload.result.recurringDonations
break
}
}
return state
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ export const defaultState: RewardsExtension.State = {
enabledMain: false,
enabledAC: false,
grants: [],
currentGrant: undefined
currentGrant: undefined,
recurringDonations: []
}

const cleanData = (state: RewardsExtension.State) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ export class RewardsPanel extends React.Component<Props, State> {
chrome.braveRewards.getACEnabled(((enabled: boolean) => {
this.props.actions.onEnabledAC(enabled)
}))
chrome.braveRewards.getRecurringDonations((siteList: RewardsExtension.RecurringDonation) => {
this.props.actions.onRecurringDonations(siteList)
})
}

componentDidUpdate (prevProps: Props, prevState: State) {
Expand Down
Loading

0 comments on commit 0ea4276

Please sign in to comment.