From b5044f4a777ce4a4310e8a3ac2b1936e4b700e3d Mon Sep 17 00:00:00 2001 From: Szilard Szaloki Date: Wed, 9 Nov 2022 16:34:23 -0500 Subject: [PATCH] `WalletStatus` cleanup, external wallet flows refactor. --- .../browser/BraveRewardsExternalWallet.java | 45 +- .../browser/BraveRewardsNativeWorker.java | 4 +- .../chrome/browser/BraveRewardsObserver.java | 2 +- .../BraveRewardsUserWalletActivity.java | 68 +- .../rewards/BraveRewardsBannerInfo.java | 16 - .../BraveRewardsCreatorPanelFragment.java | 7 +- .../browser/rewards/BraveRewardsPanel.java | 79 +- .../android/brave_rewards_native_worker.cc | 10 +- .../android/brave_rewards_native_worker.h | 8 +- browser/extensions/api/brave_rewards_api.cc | 12 +- browser/extensions/api/brave_rewards_api.h | 7 +- .../android/strings/android_brave_strings.grd | 15 - .../webui/brave_rewards/rewards_panel_ui.cc | 10 +- .../ui/webui/brave_rewards_internals_ui.cc | 23 +- browser/ui/webui/brave_rewards_page_ui.cc | 105 +- browser/ui/webui/brave_tip_ui.cc | 15 +- browser/ui/webui/brave_webui_source.cc | 6 +- build/android/config.gni | 1 + common/extensions/api/brave_rewards.json | 4 - .../brave_new_tab_ui/api/initialData.ts | 2 +- .../brave_rewards/browser/rewards_service.h | 30 +- .../browser/rewards_service_impl.cc | 105 +- .../browser/rewards_service_impl.h | 22 +- .../common/rewards_browsertest_contribution.h | 4 +- .../rewards_browsertest_network_util.cc | 51 +- .../common/rewards_browsertest_network_util.h | 4 +- .../common/rewards_browsertest_response.cc | 11 +- .../common/rewards_browsertest_response.h | 3 - .../browser/test/rewards_browsertest.cc | 65 - .../test/rewards_contribution_browsertest.cc | 26 +- .../browser/test/rewards_state_browsertest.cc | 270 ++- .../actions/rewards_internals_actions.ts | 3 +- .../internals/brave_rewards_internals.tsx | 6 +- .../internals/components/externalWallet.tsx | 24 +- .../constants/rewards_internals_types.ts | 2 +- .../reducers/rewards_internals_reducer.ts | 2 +- .../brave_rewards/resources/page/BUILD.gn | 9 +- .../resources/page/actions/rewards_actions.ts | 16 +- .../resources/page/actions/rewards_types.ts | 8 +- .../resources/page/brave_rewards_page.tsx | 13 +- .../resources/page/components/pageWallet.tsx | 25 +- .../components/provider_redirect_modal.tsx | 68 +- .../resources/page/components/settings.tsx | 5 +- .../page/reducers/rewards_reducer.ts | 90 +- .../resources/page/reducers/wallet_reducer.ts | 78 +- .../lib/extension_api_adapter.ts | 4 +- .../rewards_panel/lib/notification_adapter.ts | 16 +- .../resources/rewards_panel/stories/index.tsx | 3 +- .../rewards_panel/stories/locale_strings.ts | 4 + .../shared/components/newtab/rewards_card.tsx | 4 +- .../components/newtab/stories/index.tsx | 3 +- .../shared/components/notifications/index.ts | 6 + .../components/notifications/notification.ts | 14 +- .../notifications/uphold_bat_not_allowed.tsx | 23 + .../uphold_insufficient_capabilities.tsx | 23 + .../external_wallet_bubble.style.ts | 28 +- .../wallet_card/external_wallet_bubble.tsx | 43 +- .../wallet_card/external_wallet_view.tsx | 9 +- .../wallet_card/icons/pending_icon.tsx | 13 - .../components/wallet_card/stories/index.tsx | 5 +- .../wallet_card/stories/locale_strings.ts | 2 - .../components/wallet_card/wallet_card.tsx | 4 +- .../shared/lib/external_wallet.test.ts | 23 +- .../resources/shared/lib/external_wallet.ts | 23 +- .../resources/shared/lib/mojom.ts | 5 + .../tip/components/publisher_banner.tsx | 8 +- .../resources/tip/lib/interfaces.ts | 12 +- components/definitions/chromel.d.ts | 2 +- components/definitions/rewards.d.ts | 32 +- components/definitions/rewardsExtensions.d.ts | 11 +- components/definitions/rewardsInternals.d.ts | 11 +- .../resources/brave_components_strings.grd | 4 +- components/resources/rewards_strings.grdp | 18 +- .../services/bat_ledger/bat_ledger_impl.cc | 25 +- .../services/bat_ledger/bat_ledger_impl.h | 13 +- .../bat_ledger/bat_ledger_service_impl.cc | 5 + .../bat_ledger/bat_ledger_service_impl.h | 1 + .../bat_ledger/public/interfaces/BUILD.gn | 11 +- .../public/interfaces/bat_ledger.mojom | 6 +- ios/browser/api/ledger/brave_ledger.h | 19 - ios/browser/api/ledger/brave_ledger.mm | 75 - .../api/ledger/brave_ledger_observer.h | 3 - vendor/bat-native-ledger/BUILD.gn | 38 +- .../include/bat/ledger/ledger.h | 24 +- .../include/bat/ledger/public/DEPS | 1 + .../bat/ledger/public/interfaces/BUILD.gn | 26 + .../bat/ledger/public/interfaces/ledger.mojom | 39 +- .../public/interfaces/ledger_endpoints.mojom | 8 +- .../public/interfaces/ledger_types.mojom | 80 + .../interfaces/ledger_types_mojom_traits.cc | 135 ++ .../interfaces/ledger_types_mojom_traits.h | 60 + .../bat/ledger/internal/bitflyer/bitflyer.cc | 111 +- .../bat/ledger/internal/bitflyer/bitflyer.h | 34 +- .../bitflyer/bitflyer_authorization.cc | 231 --- .../bitflyer/bitflyer_authorization.h | 53 - .../internal/bitflyer/bitflyer_transfer.cc | 25 +- .../internal/bitflyer/bitflyer_transfer.h | 4 +- .../internal/bitflyer/bitflyer_unittest.cc | 36 +- .../ledger/internal/bitflyer/bitflyer_util.cc | 27 +- .../ledger/internal/bitflyer/bitflyer_util.h | 2 +- .../bitflyer/bitflyer_util_unittest.cc | 34 +- .../internal/bitflyer/bitflyer_wallet.cc | 91 - .../internal/bitflyer/bitflyer_wallet.h | 33 - .../contribution_external_wallet.cc | 26 +- .../post_oauth/post_oauth_bitflyer.cc | 5 - .../post_oauth_bitflyer_unittest.cc | 21 - .../endpoint/uphold/post_oauth/post_oauth.cc | 111 -- .../endpoint/uphold/post_oauth/post_oauth.h | 69 - .../uphold/post_oauth/post_oauth_unittest.cc | 107 -- .../internal/endpoint/uphold/uphold_server.cc | 7 +- .../internal/endpoint/uphold/uphold_server.h | 6 +- .../endpoints/post_connect/post_connect.cc | 48 +- .../endpoints/post_connect/post_connect.h | 4 +- .../post_connect/post_connect_unittest.cc | 4 +- .../uphold/post_oauth/post_oauth_uphold.cc | 81 + .../uphold/post_oauth/post_oauth_uphold.h | 68 + .../post_oauth/post_oauth_uphold_unittest.cc | 122 ++ .../src/bat/ledger/internal/gemini/gemini.cc | 111 +- .../src/bat/ledger/internal/gemini/gemini.h | 32 +- .../internal/gemini/gemini_authorization.cc | 265 --- .../internal/gemini/gemini_authorization.h | 63 - .../ledger/internal/gemini/gemini_transfer.cc | 37 +- .../ledger/internal/gemini/gemini_transfer.h | 4 +- .../ledger/internal/gemini/gemini_unittest.cc | 36 +- .../bat/ledger/internal/gemini/gemini_util.cc | 27 +- .../bat/ledger/internal/gemini/gemini_util.h | 2 +- .../internal/gemini/gemini_util_unittest.cc | 73 +- .../ledger/internal/gemini/gemini_wallet.cc | 78 - .../ledger/internal/gemini/gemini_wallet.h | 35 - .../src/bat/ledger/internal/ledger_impl.cc | 57 +- .../src/bat/ledger/internal/ledger_impl.h | 6 +- .../ledger/internal/logging/event_log_util.cc | 26 +- .../ledger/internal/logging/event_log_util.h | 3 +- .../notifications/notification_keys.h | 3 + .../ledger/internal/state/state_migration.cc | 14 +- .../ledger/internal/state/state_migration.h | 2 + .../internal/state/state_migration_v10.cc | 55 +- .../internal/state/state_migration_v12.cc | 119 ++ .../internal/state/state_migration_v12.h | 34 + .../src/bat/ledger/internal/uphold/uphold.cc | 155 +- .../src/bat/ledger/internal/uphold/uphold.h | 52 +- .../internal/uphold/uphold_authorization.cc | 155 -- .../internal/uphold/uphold_authorization.h | 41 - .../bat/ledger/internal/uphold/uphold_card.cc | 74 +- .../bat/ledger/internal/uphold/uphold_card.h | 18 +- .../ledger/internal/uphold/uphold_transfer.cc | 62 +- .../ledger/internal/uphold/uphold_transfer.h | 12 +- .../ledger/internal/uphold/uphold_unittest.cc | 1712 +---------------- .../bat/ledger/internal/uphold/uphold_user.cc | 66 - .../bat/ledger/internal/uphold/uphold_user.h | 40 +- .../bat/ledger/internal/uphold/uphold_util.cc | 55 +- .../bat/ledger/internal/uphold/uphold_util.h | 4 +- .../internal/uphold/uphold_util_unittest.cc | 28 +- .../ledger/internal/uphold/uphold_wallet.cc | 306 --- .../ledger/internal/uphold/uphold_wallet.h | 53 - .../src/bat/ledger/internal/wallet/wallet.cc | 130 +- .../src/bat/ledger/internal/wallet/wallet.h | 7 +- .../ledger/internal/wallet/wallet_balance.cc | 36 +- .../bat/ledger/internal/wallet/wallet_util.cc | 310 ++- .../bat/ledger/internal/wallet/wallet_util.h | 32 +- .../internal/wallet/wallet_utils_unittest.cc | 304 ++- .../bitflyer/connect_bitflyer_wallet.cc | 108 ++ .../bitflyer/connect_bitflyer_wallet.h | 49 + .../bitflyer/get_bitflyer_wallet.cc | 23 + .../bitflyer/get_bitflyer_wallet.h | 31 + .../connect_external_wallet.cc | 177 ++ .../wallet_provider/connect_external_wallet.h | 59 + .../connect_external_wallet_unittest.cc | 351 ++++ .../gemini/connect_gemini_wallet.cc | 174 ++ .../gemini/connect_gemini_wallet.h | 59 + .../gemini/get_gemini_wallet.cc | 23 + .../gemini/get_gemini_wallet.h | 31 + .../wallet_provider/get_external_wallet.cc | 55 + .../wallet_provider/get_external_wallet.h | 39 + .../uphold/connect_uphold_wallet.cc | 321 ++++ .../uphold/connect_uphold_wallet.h | 62 + .../uphold/get_uphold_wallet.cc | 23 + .../uphold/get_uphold_wallet.h | 31 + .../src/bat/ledger/ledger.cc | 1 + vendor/bat-native-ledger/test/BUILD.gn | 3 +- 180 files changed, 4359 insertions(+), 5656 deletions(-) create mode 100644 components/brave_rewards/resources/shared/components/notifications/uphold_bat_not_allowed.tsx create mode 100644 components/brave_rewards/resources/shared/components/notifications/uphold_insufficient_capabilities.tsx delete mode 100644 components/brave_rewards/resources/shared/components/wallet_card/icons/pending_icon.tsx create mode 100644 components/brave_rewards/resources/shared/lib/mojom.ts create mode 100644 vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger_types.mojom create mode 100644 vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger_types_mojom_traits.cc create mode 100644 vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger_types_mojom_traits.h delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/bitflyer/bitflyer_authorization.cc delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/bitflyer/bitflyer_authorization.h delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/bitflyer/bitflyer_wallet.cc delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/bitflyer/bitflyer_wallet.h delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/uphold/post_oauth/post_oauth.cc delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/uphold/post_oauth/post_oauth.h delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/uphold/post_oauth/post_oauth_unittest.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoints/uphold/post_oauth/post_oauth_uphold.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoints/uphold/post_oauth/post_oauth_uphold.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoints/uphold/post_oauth/post_oauth_uphold_unittest.cc delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/gemini/gemini_authorization.cc delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/gemini/gemini_authorization.h delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/gemini/gemini_wallet.cc delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/gemini/gemini_wallet.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/state/state_migration_v12.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/state/state_migration_v12.h delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/uphold/uphold_authorization.cc delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/uphold/uphold_authorization.h delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/uphold/uphold_user.cc delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/uphold/uphold_wallet.cc delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/uphold/uphold_wallet.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/bitflyer/connect_bitflyer_wallet.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/bitflyer/connect_bitflyer_wallet.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/bitflyer/get_bitflyer_wallet.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/bitflyer/get_bitflyer_wallet.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/connect_external_wallet.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/connect_external_wallet.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/connect_external_wallet_unittest.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/gemini/connect_gemini_wallet.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/gemini/connect_gemini_wallet.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/gemini/get_gemini_wallet.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/gemini/get_gemini_wallet.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/get_external_wallet.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/get_external_wallet.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/uphold/connect_uphold_wallet.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/uphold/connect_uphold_wallet.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/uphold/get_uphold_wallet.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/wallet_provider/uphold/get_uphold_wallet.h diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsExternalWallet.java b/android/java/org/chromium/chrome/browser/BraveRewardsExternalWallet.java index 829bd7a2be3..3994c866585 100644 --- a/android/java/org/chromium/chrome/browser/BraveRewardsExternalWallet.java +++ b/android/java/org/chromium/chrome/browser/BraveRewardsExternalWallet.java @@ -6,16 +6,15 @@ package org.chromium.chrome.browser; import android.content.Context; -import androidx.annotation.IntDef; + import androidx.annotation.VisibleForTesting; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; +import org.json.JSONException; +import org.json.JSONObject; import org.chromium.base.ContextUtils; import org.chromium.chrome.R; -import org.json.JSONException; -import org.json.JSONObject; +import org.chromium.ledger.mojom.WalletStatus; public class BraveRewardsExternalWallet { //fields @@ -29,23 +28,9 @@ public class BraveRewardsExternalWallet { public static final String WITHDRAW_URL = "withdraw_url"; public static final String LOGIN_URL = "login_url"; - //WalletStatus @ - //vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom - @Retention(RetentionPolicy.SOURCE) - @IntDef({NOT_CONNECTED, CONNECTED, VERIFIED, DISCONNECTED_NOT_VERIFIED, - DISCONNECTED_VERIFIED, PENDING}) - public @interface WalletStatus {} - public static final int NOT_CONNECTED = 0; - public static final int CONNECTED = 1; - public static final int VERIFIED = 2; - public static final int DISCONNECTED_NOT_VERIFIED = 3; - public static final int DISCONNECTED_VERIFIED = 4; - public static final int PENDING = 5; - private String mAccountUrl; private String mAddUrl; private String mAddress; - @WalletStatus private int mStatus; private String mToken; private String mType; @@ -116,33 +101,21 @@ public class BraveRewardsExternalWallet { + '\'' + ", mLoginUrl='" + mLoginUrl + '\'' + '}'; } - public static String WalletStatusToString (@WalletStatus int status){ + public static String WalletStatusToString(int status) { String value = ""; Context context = ContextUtils.getApplicationContext(); switch (status){ - case NOT_CONNECTED: + case WalletStatus.NOT_CONNECTED: value = context.getResources().getString( R.string.user_wallet_status_not_connected); break; - case CONNECTED: - value = context.getResources().getString( - R.string.user_wallet_status_connected); - break; - case VERIFIED: + case WalletStatus.CONNECTED: value = context.getResources().getString( R.string.user_wallet_status_verified); break; - case DISCONNECTED_NOT_VERIFIED: + case WalletStatus.LOGGED_OUT: value = context.getResources().getString( - R.string.user_wallet_status_disconnected_not_verified); - break; - case DISCONNECTED_VERIFIED: - value = context.getResources().getString( - R.string.user_wallet_status_disconnected_verified); - break; - case PENDING: - value = context.getResources().getString( - R.string.user_wallet_status_pending); + R.string.brave_ui_wallet_button_logged_out); break; default: break; diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java b/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java index d4554235730..cffef9e4b86 100644 --- a/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java +++ b/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java @@ -635,9 +635,9 @@ public class BraveRewardsNativeWorker { } @CalledByNative - public void OnGetExternalWallet(int error_code, String external_wallet) { + public void OnGetExternalWallet(String external_wallet) { for (BraveRewardsObserver observer : mObservers) { - observer.OnGetExternalWallet(error_code, external_wallet); + observer.OnGetExternalWallet(external_wallet); } } diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsObserver.java b/android/java/org/chromium/chrome/browser/BraveRewardsObserver.java index decd03bb199..29f3def8dac 100644 --- a/android/java/org/chromium/chrome/browser/BraveRewardsObserver.java +++ b/android/java/org/chromium/chrome/browser/BraveRewardsObserver.java @@ -21,7 +21,7 @@ public interface BraveRewardsObserver { default public void OnRecurringDonationUpdated(){}; default public void OnResetTheWholeState(boolean success){}; default public void OnGrantFinish(int result){}; - default public void OnGetExternalWallet(int error_code, String external_wallet){}; + default public void OnGetExternalWallet(String external_wallet){}; default public void onGetAvailableCountries(String[] countries){}; default public void OnDisconnectWallet(int error_code, String external_wallet){}; default public void OnClaimPromotion(int error_code){}; diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsUserWalletActivity.java b/android/java/org/chromium/chrome/browser/BraveRewardsUserWalletActivity.java index 6a1f09c54ac..eab5176d8e4 100644 --- a/android/java/org/chromium/chrome/browser/BraveRewardsUserWalletActivity.java +++ b/android/java/org/chromium/chrome/browser/BraveRewardsUserWalletActivity.java @@ -17,6 +17,7 @@ import android.widget.TextView; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; +import org.chromium.base.Log; import org.chromium.chrome.R; import org.chromium.chrome.browser.BraveRewardsBalance; import org.chromium.chrome.browser.BraveRewardsExternalWallet; @@ -24,9 +25,12 @@ import org.chromium.chrome.browser.BraveRewardsNativeWorker; import org.chromium.chrome.browser.BraveWalletProvider; import org.chromium.chrome.browser.app.BraveActivity; import org.chromium.chrome.browser.init.AsyncInitializationActivity; +import org.chromium.ledger.mojom.WalletStatus; public class BraveRewardsUserWalletActivity extends AsyncInitializationActivity { + private static final String TAG = "BraveRewards"; public static final String DISCONNECT_WALLET_URL = "brave://rewards/#disconnect-wallet"; + public static final int UNDEFINED_WALLET_STATUS = -1; private String walletType = BraveRewardsNativeWorker.getInstance().getExternalWalletType(); private String walletTypeString; @@ -51,7 +55,8 @@ public class BraveRewardsUserWalletActivity extends AsyncInitializationActivity private void SetUIControls() { Intent intent = getIntent(); - final int status = intent.getIntExtra(BraveRewardsExternalWallet.STATUS, -1); + final int status = + intent.getIntExtra(BraveRewardsExternalWallet.STATUS, UNDEFINED_WALLET_STATUS); TextView txtUserId = (TextView) findViewById(R.id.user_id); TextView txtUserStatus = (TextView) findViewById(R.id.user_status); Button btn1 = (Button) findViewById(R.id.user_wallet_btn1); @@ -60,37 +65,31 @@ public class BraveRewardsUserWalletActivity extends AsyncInitializationActivity btnGotoProvider.setText(String.format( getResources().getString(R.string.user_wallet_goto_provider), walletTypeString)); - if (status < BraveRewardsExternalWallet.NOT_CONNECTED - || status > BraveRewardsExternalWallet.PENDING) { - finish(); - } else if (status == BraveRewardsExternalWallet.VERIFIED) { - // set 2nd button visible - findViewById(R.id.user_wallet_btn2_separator).setVisibility(View.VISIBLE); - btn2 = (Button) findViewById(R.id.user_wallet_btn2); - btn2.setVisibility(View.VISIBLE); + switch (status) { + case WalletStatus.CONNECTED: + // set 2nd button visible + findViewById(R.id.user_wallet_btn2_separator).setVisibility(View.VISIBLE); + btn2 = (Button) findViewById(R.id.user_wallet_btn2); + btn2.setVisibility(View.VISIBLE); - // Buttons: - // Add funds - // Withdraw - // Go to provider - // Disconnect - btn1.setText(getResources().getString(R.string.brave_rewards_local_panel_add_funds)); - btn2.setText(getResources().getString(R.string.user_wallet_withdraw_funds)); - txtUserStatus.setText(BraveRewardsExternalWallet.WalletStatusToString(status)); + // Buttons: + // Add funds + // Withdraw + // Go to provider + // Disconnect + btn1.setText( + getResources().getString(R.string.brave_rewards_local_panel_add_funds)); + btn2.setText(getResources().getString(R.string.user_wallet_withdraw_funds)); + txtUserStatus.setText(BraveRewardsExternalWallet.WalletStatusToString(status)); - SetBtnOpenUrlClickHandler( - btn1, intent.getStringExtra(BraveRewardsExternalWallet.ADD_URL)); - SetBtnOpenUrlClickHandler( - btn2, intent.getStringExtra(BraveRewardsExternalWallet.WITHDRAW_URL)); - } else { - // CONNECTED or PENDING - // Buttons: - // Complete verification - // Go to provider - // Disconnect - btn1.setText(getResources().getString(R.string.user_wallet_complete_verification)); - SetBtnOpenUrlClickHandler( - btn1, intent.getStringExtra(BraveRewardsExternalWallet.LOGIN_URL)); + SetBtnOpenUrlClickHandler( + btn1, intent.getStringExtra(BraveRewardsExternalWallet.ADD_URL)); + SetBtnOpenUrlClickHandler( + btn2, intent.getStringExtra(BraveRewardsExternalWallet.WITHDRAW_URL)); + break; + case UNDEFINED_WALLET_STATUS: + finish(); + break; } SetBtnOpenUrlClickHandler( @@ -137,15 +136,6 @@ public class BraveRewardsUserWalletActivity extends AsyncInitializationActivity String.format(getResources().getString(R.string.user_wallet_disconnect_rewards), walletTypeString)); SetBtnOpenUrlClickHandler(btnDisconnect, DISCONNECT_WALLET_URL); - /* - -- Use this code when android transitions to native code for Brave Rewards UI -- - btnDisconnect.setOnClickListener((View v) -> { - BraveRewardsNativeWorker.getInstance().DisconnectWallet(); - Intent intent = new Intent(); - setResult(RESULT_OK, intent); - finish(); - }); - */ } @Override diff --git a/android/java/org/chromium/chrome/browser/rewards/BraveRewardsBannerInfo.java b/android/java/org/chromium/chrome/browser/rewards/BraveRewardsBannerInfo.java index cc741e83ef0..13b5473919d 100644 --- a/android/java/org/chromium/chrome/browser/rewards/BraveRewardsBannerInfo.java +++ b/android/java/org/chromium/chrome/browser/rewards/BraveRewardsBannerInfo.java @@ -11,15 +11,12 @@ import android.content.Context; import android.os.Parcel; import android.os.Parcelable; -import androidx.annotation.IntDef; import androidx.annotation.VisibleForTesting; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.util.Arrays; import java.util.HashMap; @@ -37,18 +34,6 @@ public class BraveRewardsBannerInfo { public static final String LINKS = "links"; public static final String STATUS = "status"; - @Retention(RetentionPolicy.SOURCE) - @IntDef({NOT_CONNECTED, CONNECTED, VERIFIED, DISCONNECTED_NOT_VERIFIED, DISCONNECTED_VERIFIED, - PENDING}) - public @interface WalletStatus {} - - public static final int NOT_CONNECTED = 0; - public static final int CONNECTED = 1; - public static final int VERIFIED = 2; - public static final int DISCONNECTED_NOT_VERIFIED = 3; - public static final int DISCONNECTED_VERIFIED = 4; - public static final int PENDING = 5; - private String mPublisherKey; private String mTitle; private String mName; @@ -58,7 +43,6 @@ public class BraveRewardsBannerInfo { private String mLogo; private String mProvider; private HashMap mLinks; - @WalletStatus private int mStatus; public String getPublisherKey() { diff --git a/android/java/org/chromium/chrome/browser/rewards/BraveRewardsCreatorPanelFragment.java b/android/java/org/chromium/chrome/browser/rewards/BraveRewardsCreatorPanelFragment.java index 24f162195fa..9e9aa026bf8 100644 --- a/android/java/org/chromium/chrome/browser/rewards/BraveRewardsCreatorPanelFragment.java +++ b/android/java/org/chromium/chrome/browser/rewards/BraveRewardsCreatorPanelFragment.java @@ -48,6 +48,7 @@ import org.chromium.chrome.browser.BraveRewardsSiteBannerActivity; import org.chromium.chrome.browser.BraveWalletProvider; import org.chromium.chrome.browser.app.BraveActivity; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.ledger.mojom.WalletStatus; import java.math.RoundingMode; import java.text.DecimalFormat; @@ -264,8 +265,8 @@ public class BraveRewardsCreatorPanelFragment extends Fragment } @Override - public void OnGetExternalWallet(int errorCode, String externalWallet) { - int walletStatus = BraveRewardsExternalWallet.NOT_CONNECTED; + public void OnGetExternalWallet(String externalWallet) { + int walletStatus = WalletStatus.NOT_CONNECTED; if (!TextUtils.isEmpty(externalWallet)) { try { BraveRewardsExternalWallet mExternalWallet = @@ -284,7 +285,7 @@ public class BraveRewardsCreatorPanelFragment extends Fragment private void setPublisherNoteText(@PublisherStatus int pubStatus, int walletStatus) { String notePart1 = ""; String walletType = BraveRewardsNativeWorker.getInstance().getExternalWalletType(); - if (walletStatus == BraveRewardsExternalWallet.NOT_CONNECTED) { + if (walletStatus == WalletStatus.NOT_CONNECTED) { if (pubStatus == BraveRewardsPublisher.CONNECTED || pubStatus == BraveRewardsPublisher.UPHOLD_VERIFIED || pubStatus == BraveRewardsPublisher.BITFLYER_VERIFIED diff --git a/android/java/org/chromium/chrome/browser/rewards/BraveRewardsPanel.java b/android/java/org/chromium/chrome/browser/rewards/BraveRewardsPanel.java index 5849dcbe6c5..ecddeabba39 100644 --- a/android/java/org/chromium/chrome/browser/rewards/BraveRewardsPanel.java +++ b/android/java/org/chromium/chrome/browser/rewards/BraveRewardsPanel.java @@ -75,7 +75,6 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.BraveAdsNativeHelper; import org.chromium.chrome.browser.BraveRewardsBalance; import org.chromium.chrome.browser.BraveRewardsExternalWallet; -import org.chromium.chrome.browser.BraveRewardsExternalWallet.WalletStatus; import org.chromium.chrome.browser.BraveRewardsHelper; import org.chromium.chrome.browser.BraveRewardsNativeWorker; import org.chromium.chrome.browser.BraveRewardsObserver; @@ -100,6 +99,7 @@ import org.chromium.chrome.browser.util.ConfigurationUtils; import org.chromium.chrome.browser.util.PackageUtils; import org.chromium.chrome.browser.util.TabUtils; import org.chromium.components.user_prefs.UserPrefs; +import org.chromium.ledger.mojom.WalletStatus; import org.chromium.ui.base.DeviceFormFactor; import java.math.RoundingMode; @@ -1315,8 +1315,8 @@ public class BraveRewardsPanel } @Override - public void OnGetExternalWallet(int errorCode, String externalWallet) { - int walletStatus = BraveRewardsExternalWallet.NOT_CONNECTED; + public void OnGetExternalWallet(String externalWallet) { + int walletStatus = WalletStatus.NOT_CONNECTED; if (!TextUtils.isEmpty(externalWallet)) { try { mExternalWallet = new BraveRewardsExternalWallet(externalWallet); @@ -1335,7 +1335,7 @@ public class BraveRewardsPanel private void showRewardsFromAdsSummary(int walletStatus) { if (mBraveRewardsNativeWorker != null) { String walletType = mBraveRewardsNativeWorker.getExternalWalletType(); - if (walletStatus == BraveRewardsExternalWallet.VERIFIED + if (walletStatus == WalletStatus.CONNECTED && (walletType.equals(BraveWalletProvider.UPHOLD) || walletType.equals(BraveWalletProvider.BITFLYER) || walletType.equals(BraveWalletProvider.GEMINI))) { @@ -1350,14 +1350,14 @@ public class BraveRewardsPanel .setVisibility(View.VISIBLE); } // Hide rewards from ads when verified but disconnected from provider - if (walletStatus == BraveRewardsExternalWallet.DISCONNECTED_VERIFIED) { + if (walletStatus == WalletStatus.LOGGED_OUT) { mPopupView.findViewById(R.id.rewards_from_ads_summary_layout) .setVisibility(View.GONE); } } } - private void setVerifyWalletButton(@WalletStatus final int status) { + private void setVerifyWalletButton(final int status) { TextView btnVerifyWallet = mPopupView.findViewById(R.id.btn_verify_wallet); SharedPreferences sharedPref = ContextUtils.getAppSharedPreferences(); SharedPreferences.Editor editor = sharedPref.edit(); @@ -1367,26 +1367,13 @@ public class BraveRewardsPanel String walletType = mBraveRewardsNativeWorker.getExternalWalletType(); switch (status) { - case BraveRewardsExternalWallet.NOT_CONNECTED: + case WalletStatus.NOT_CONNECTED: rightDrawable = R.drawable.ic_verify_wallet_arrow; textId = R.string.brave_ui_wallet_button_unverified; btnVerifyWallet.setCompoundDrawablesWithIntrinsicBounds(0, 0, rightDrawable, 0); - Log.e(TAG, "BraveRewardsExternalWallet.NOT_CONNECTED"); + Log.e(TAG, "WalletStatus.NOT_CONNECTED"); break; - case BraveRewardsExternalWallet.CONNECTED: - rightDrawable = R.drawable.verified_disclosure; - textId = R.string.brave_ui_wallet_button_unverified; - btnVerifyWallet.setCompoundDrawablesWithIntrinsicBounds(0, 0, rightDrawable, 0); - break; - case BraveRewardsExternalWallet.PENDING: - editor.putBoolean(PREF_VERIFY_WALLET_ENABLE, true); - editor.apply(); - - rightDrawable = R.drawable.verified_disclosure; - textId = R.string.brave_ui_wallet_button_unverified; - btnVerifyWallet.setCompoundDrawablesWithIntrinsicBounds(0, 0, rightDrawable, 0); - break; - case BraveRewardsExternalWallet.VERIFIED: + case WalletStatus.CONNECTED: editor.putBoolean(PREF_VERIFY_WALLET_ENABLE, true); editor.apply(); @@ -1402,8 +1389,7 @@ public class BraveRewardsPanel mBtnAddFunds.setVisibility(View.VISIBLE); } break; - case BraveRewardsExternalWallet.DISCONNECTED_NOT_VERIFIED: - case BraveRewardsExternalWallet.DISCONNECTED_VERIFIED: + case WalletStatus.LOGGED_OUT: leftDrawable = getWalletIcon(walletType); textId = R.string.brave_ui_wallet_button_logged_out; btnVerifyWallet.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, 0, 0, 0); @@ -1422,14 +1408,13 @@ public class BraveRewardsPanel setVerifyWalletButtonClickEvent(btnVerifyWallet, status); // Update add funds button based on status - if (status != BraveRewardsExternalWallet.VERIFIED) { + if (status != WalletStatus.CONNECTED) { mBtnAddFunds.setEnabled(false); return; } } - private void setVerifyWalletButtonClickEvent( - View btnVerifyWallet, @WalletStatus final int status) { + private void setVerifyWalletButtonClickEvent(View btnVerifyWallet, final int status) { btnVerifyWallet.setOnClickListener((new View.OnClickListener() { @Override public void onClick(View v) { @@ -1442,28 +1427,22 @@ public class BraveRewardsPanel } switch (status) { - case BraveRewardsExternalWallet.NOT_CONNECTED: - case BraveRewardsExternalWallet.CONNECTED: - case BraveRewardsExternalWallet.PENDING: - case BraveRewardsExternalWallet.VERIFIED: - if (status == BraveRewardsExternalWallet.NOT_CONNECTED) { - TabUtils.openUrlInNewTab(false, - BraveActivity.BRAVE_REWARDS_SETTINGS_WALLET_VERIFICATION_URL); - dismiss(); - } else { - int requestCode = (status == BraveRewardsExternalWallet.NOT_CONNECTED) - ? BraveConstants.VERIFY_WALLET_ACTIVITY_REQUEST_CODE - : BraveConstants.USER_WALLET_ACTIVITY_REQUEST_CODE; - Intent intent = BuildVerifyWalletActivityIntent(status); - if (intent != null) { - mActivity.startActivityForResult(intent, requestCode); - } - } - break; - case BraveRewardsExternalWallet.DISCONNECTED_NOT_VERIFIED: - case BraveRewardsExternalWallet.DISCONNECTED_VERIFIED: + case WalletStatus.NOT_CONNECTED: TabUtils.openUrlInNewTab(false, BraveActivity.BRAVE_REWARDS_SETTINGS_WALLET_VERIFICATION_URL); + dismiss(); + break; + case WalletStatus.CONNECTED: + int requestCode = BraveConstants.USER_WALLET_ACTIVITY_REQUEST_CODE; + Intent intent = BuildVerifyWalletActivityIntent(status); + if (intent != null) { + mActivity.startActivityForResult(intent, requestCode); + } + break; + case WalletStatus.LOGGED_OUT: + TabUtils.openUrlInNewTab(false, + BraveActivity.BRAVE_REWARDS_SETTINGS_WALLET_VERIFICATION_URL); + dismiss(); break; default: Log.e(TAG, "Unexpected external wallet status"); @@ -1732,12 +1711,10 @@ public class BraveRewardsPanel return sharedPreferences.getBoolean(PREF_VERIFY_WALLET_ENABLE, false); } - private Intent BuildVerifyWalletActivityIntent(@WalletStatus final int status) { + private Intent BuildVerifyWalletActivityIntent(final int status) { Class clazz = null; switch (status) { - case BraveRewardsExternalWallet.CONNECTED: - case BraveRewardsExternalWallet.PENDING: - case BraveRewardsExternalWallet.VERIFIED: + case WalletStatus.CONNECTED: clazz = BraveRewardsUserWalletActivity.class; break; default: diff --git a/browser/brave_rewards/android/brave_rewards_native_worker.cc b/browser/brave_rewards/android/brave_rewards_native_worker.cc index 8c495c68012..ec915c203d1 100644 --- a/browser/brave_rewards/android/brave_rewards_native_worker.cc +++ b/browser/brave_rewards/android/brave_rewards_native_worker.cc @@ -829,8 +829,9 @@ void BraveRewardsNativeWorker::onPublisherBanner( } void BraveRewardsNativeWorker::OnGetExternalWallet( - const ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet) { + base::expected result) { + auto wallet = std::move(result).value_or(nullptr); std::string json_wallet; if (!wallet) { json_wallet = ""; @@ -850,9 +851,8 @@ void BraveRewardsNativeWorker::OnGetExternalWallet( base::JSONWriter::Write(dict, &json_wallet); } JNIEnv* env = base::android::AttachCurrentThread(); - Java_BraveRewardsNativeWorker_OnGetExternalWallet(env, - weak_java_brave_rewards_native_worker_.get(env), - static_cast(result), + Java_BraveRewardsNativeWorker_OnGetExternalWallet( + env, weak_java_brave_rewards_native_worker_.get(env), base::android::ConvertUTF8ToJavaString(env, json_wallet)); } diff --git a/browser/brave_rewards/android/brave_rewards_native_worker.h b/browser/brave_rewards/android/brave_rewards_native_worker.h index 91e9f1ad3a1..50d2ede1f07 100644 --- a/browser/brave_rewards/android/brave_rewards_native_worker.h +++ b/browser/brave_rewards/android/brave_rewards_native_worker.h @@ -16,10 +16,13 @@ #include "base/containers/flat_map.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" +#include "base/types/expected.h" #include "bat/ledger/mojom_structs.h" +#include "bat/ledger/public/interfaces/ledger_types.mojom.h" #include "brave/components/brave_rewards/browser/rewards_notification_service_observer.h" #include "brave/components/brave_rewards/browser/rewards_service_observer.h" #include "brave/vendor/bat-native-ads/include/bat/ads/public/interfaces/ads.mojom.h" +#include "brave/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger_types.mojom.h" namespace brave_rewards { class RewardsService; @@ -224,8 +227,9 @@ class BraveRewardsNativeWorker void OnClaimPromotion(const ledger::mojom::Result result, ledger::mojom::PromotionPtr promotion); - void OnGetExternalWallet(const ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet); + void OnGetExternalWallet( + base::expected result); void OnGetAvailableCountries(std::vector countries); diff --git a/browser/extensions/api/brave_rewards_api.cc b/browser/extensions/api/brave_rewards_api.cc index 201e707b2b5..e5b8fa24fee 100644 --- a/browser/extensions/api/brave_rewards_api.cc +++ b/browser/extensions/api/brave_rewards_api.cc @@ -1169,15 +1169,14 @@ ExtensionFunction::ResponseAction BraveRewardsGetExternalWalletFunction::Run() { } void BraveRewardsGetExternalWalletFunction::OnGetExternalWallet( - const ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet) { + base::expected result) { + auto wallet = std::move(result).value_or(nullptr); if (!wallet) { - Respond(OneArgument(base::Value(static_cast(result)))); - return; + return Respond(NoArguments()); } base::Value::Dict data; - data.Set("type", wallet->type); data.Set("address", wallet->address); data.Set("status", static_cast(wallet->status)); @@ -1188,8 +1187,7 @@ void BraveRewardsGetExternalWalletFunction::OnGetExternalWallet( data.Set("loginUrl", wallet->login_url); data.Set("activityUrl", wallet->activity_url); - Respond(TwoArguments(base::Value(static_cast(result)), - base::Value(std::move(data)))); + Respond(OneArgument(base::Value(std::move(data)))); } BraveRewardsDisconnectWalletFunction::~BraveRewardsDisconnectWalletFunction() = diff --git a/browser/extensions/api/brave_rewards_api.h b/browser/extensions/api/brave_rewards_api.h index d1aaa051cb4..ae463a2b004 100644 --- a/browser/extensions/api/brave_rewards_api.h +++ b/browser/extensions/api/brave_rewards_api.h @@ -11,8 +11,10 @@ #include #include +#include "base/types/expected.h" #include "brave/vendor/bat-native-ads/include/bat/ads/public/interfaces/ads.mojom.h" #include "brave/vendor/bat-native-ledger/include/bat/ledger/mojom_structs.h" +#include "brave/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger_types.mojom.h" #include "extensions/browser/extension_function.h" namespace extensions { @@ -454,8 +456,9 @@ class BraveRewardsGetExternalWalletFunction : public ExtensionFunction { ResponseAction Run() override; private: - void OnGetExternalWallet(const ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet); + void OnGetExternalWallet( + base::expected result); }; class BraveRewardsDisconnectWalletFunction : public ExtensionFunction { diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd index 325601b93e2..f935071c3d8 100644 --- a/browser/ui/android/strings/android_brave_strings.grd +++ b/browser/ui/android/strings/android_brave_strings.grd @@ -1098,9 +1098,6 @@ Are you sure you want to do this? Brave Software Inc. does not process, store, or access any of the personal information that you provide to %1$s when you establish an account with them. - - Complete wallet verification - User Wallet @@ -1116,21 +1113,9 @@ Are you sure you want to do this? Not connected - - Connected - Verified - - Disconnected not verified - - - Disconnected verified - - - Pending - Brave Default diff --git a/browser/ui/webui/brave_rewards/rewards_panel_ui.cc b/browser/ui/webui/brave_rewards/rewards_panel_ui.cc index d1e83921331..7f3ae97bf16 100644 --- a/browser/ui/webui/brave_rewards/rewards_panel_ui.cc +++ b/browser/ui/webui/brave_rewards/rewards_panel_ui.cc @@ -93,6 +93,14 @@ static constexpr webui::LocalizedString kStrings[] = { IDS_REWARDS_NOTIFICATION_WALLET_DISCONNECTED_TEXT}, {"notificationWalletDisconnectedTitle", IDS_REWARDS_NOTIFICATION_WALLET_DISCONNECTED_TITLE}, + {"notificationUpholdBATNotAllowedText", + IDS_REWARDS_NOTIFICATION_UPHOLD_BAT_NOT_ALLOWED_TEXT}, + {"notificationUpholdBATNotAllowedTitle", + IDS_REWARDS_NOTIFICATION_UPHOLD_BAT_NOT_ALLOWED_TITLE}, + {"notificationUpholdInsufficientCapabilitiesText", + IDS_REWARDS_NOTIFICATION_UPHOLD_INSUFFICIENT_CAPABILITIES_TEXT}, + {"notificationUpholdInsufficientCapabilitiesTitle", + IDS_REWARDS_NOTIFICATION_UPHOLD_INSUFFICIENT_CAPABILITIES_TITLE}, {"notificationTokenGrantTitle", IDS_REWARDS_NOTIFICATION_TOKEN_GRANT_TITLE}, {"ok", IDS_REWARDS_PANEL_OK}, {"onboardingClose", IDS_BRAVE_REWARDS_ONBOARDING_CLOSE}, @@ -200,8 +208,6 @@ static constexpr webui::LocalizedString kStrings[] = { {"walletLogIntoYourAccount", IDS_REWARDS_WALLET_LOG_INTO_YOUR_ACCOUNT}, {"walletMonthlyTips", IDS_REWARDS_WALLET_MONTHLY_TIPS}, {"walletOneTimeTips", IDS_REWARDS_WALLET_ONE_TIME_TIPS}, - {"walletPending", IDS_REWARDS_WALLET_PENDING}, - {"walletPendingText", IDS_REWARDS_WALLET_PENDING_TEXT}, {"walletRewardsFromAds", IDS_REWARDS_WALLET_REWARDS_FROM_ADS}, {"walletRewardsSummary", IDS_REWARDS_WALLET_REWARDS_SUMMARY}, {"walletUnverified", IDS_REWARDS_WALLET_UNVERIFIED}, diff --git a/browser/ui/webui/brave_rewards_internals_ui.cc b/browser/ui/webui/brave_rewards_internals_ui.cc index 700cfcdc220..ead460e93b1 100644 --- a/browser/ui/webui/brave_rewards_internals_ui.cc +++ b/browser/ui/webui/brave_rewards_internals_ui.cc @@ -65,8 +65,7 @@ class RewardsInternalsDOMHandler : public content::WebUIMessageHandler { void ClearLog(const base::Value::List& args); void OnClearLog(const bool success); void GetExternalWallet(const base::Value::List& args); - void OnGetExternalWallet(const ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet); + void OnGetExternalWallet(brave_rewards::GetExternalWalletResult); void GetEventLogs(const base::Value::List& args); void OnGetEventLogs(std::vector logs); void GetAdDiagnostics(const base::Value::List& args); @@ -371,26 +370,20 @@ void RewardsInternalsDOMHandler::GetExternalWallet( } void RewardsInternalsDOMHandler::OnGetExternalWallet( - const ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet) { + brave_rewards::GetExternalWalletResult result) { if (!IsJavascriptAllowed()) { return; } base::Value::Dict data; - data.Set("result", static_cast(result)); - base::Value::Dict wallet_dict; - - if (wallet) { - wallet_dict.Set("address", wallet->address); - wallet_dict.Set("memberId", wallet->member_id); - wallet_dict.Set("status", static_cast(wallet->status)); - wallet_dict.Set("type", wallet->type); + if (auto wallet = std::move(result).value_or(nullptr)) { + data.Set("address", wallet->address); + data.Set("memberId", wallet->member_id); + data.Set("status", static_cast(wallet->status)); + data.Set("type", wallet->type); } - data.Set("wallet", std::move(wallet_dict)); - - CallJavascriptFunction("brave_rewards_internals.externalWallet", + CallJavascriptFunction("brave_rewards_internals.onGetExternalWallet", base::Value(std::move(data))); } diff --git a/browser/ui/webui/brave_rewards_page_ui.cc b/browser/ui/webui/brave_rewards_page_ui.cc index 98720a15eea..c29e06bb3a4 100644 --- a/browser/ui/webui/brave_rewards_page_ui.cc +++ b/browser/ui/webui/brave_rewards_page_ui.cc @@ -156,16 +156,10 @@ class RewardsDOMHandler ledger::mojom::BalancePtr balance); void GetExternalWallet(const base::Value::List& args); - void OnGetExternalWallet(const ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet); + void OnGetExternalWallet(brave_rewards::GetExternalWalletResult); - void ProcessRewardsPageUrl(const base::Value::List& args); - - void OnProcessRewardsPageUrl( - const ledger::mojom::Result result, - const std::string& wallet_type, - const std::string& action, - const base::flat_map& args); + void ConnectExternalWallet(const base::Value::List& args); + void OnConnectExternalWallet(brave_rewards::ConnectExternalWalletResult); void DisconnectWallet(const base::Value::List& args); @@ -196,8 +190,7 @@ class RewardsDOMHandler void GetExternalWalletProviders(const base::Value::List& args); void SetExternalWalletType(const base::Value::List& args); - void OnExternalWalletTypeUpdated(const ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet); + void OnExternalWalletTypeUpdated(brave_rewards::GetExternalWalletResult); void GetIsUnsupportedRegion(const base::Value::List& args); // RewardsServiceObserver implementation @@ -461,8 +454,8 @@ void RewardsDOMHandler::RegisterMessages() { base::BindRepeating(&RewardsDOMHandler::GetExternalWallet, base::Unretained(this))); web_ui()->RegisterMessageCallback( - "brave_rewards.processRewardsPageUrl", - base::BindRepeating(&RewardsDOMHandler::ProcessRewardsPageUrl, + "brave_rewards.connectExternalWallet", + base::BindRepeating(&RewardsDOMHandler::ConnectExternalWallet, base::Unretained(this))); web_ui()->RegisterMessageCallback( "brave_rewards.disconnectWallet", @@ -714,9 +707,9 @@ void RewardsDOMHandler::SetExternalWalletType(const base::Value::List& args) { } void RewardsDOMHandler::OnExternalWalletTypeUpdated( - ledger::mojom::Result, - ledger::mojom::ExternalWalletPtr wallet) { + brave_rewards::GetExternalWalletResult result) { if (IsJavascriptAllowed()) { + auto wallet = std::move(result).value_or(nullptr); CallJavascriptFunction("brave_rewards.externalWalletLogin", base::Value(wallet ? wallet->login_url : "")); } @@ -1696,70 +1689,68 @@ void RewardsDOMHandler::GetExternalWallet(const base::Value::List& args) { } void RewardsDOMHandler::OnGetExternalWallet( - const ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet) { - if (IsJavascriptAllowed()) { - base::Value::Dict data; - data.Set("result", static_cast(result)); - base::Value::Dict wallet_dict; - - if (wallet) { - wallet_dict.Set("type", wallet->type); - wallet_dict.Set("address", wallet->address); - wallet_dict.Set("status", static_cast(wallet->status)); - wallet_dict.Set("addUrl", wallet->add_url); - wallet_dict.Set("withdrawUrl", wallet->withdraw_url); - wallet_dict.Set("userName", wallet->user_name); - wallet_dict.Set("accountUrl", wallet->account_url); - wallet_dict.Set("loginUrl", wallet->login_url); - wallet_dict.Set("activityUrl", wallet->activity_url); - } - - data.Set("wallet", std::move(wallet_dict)); - CallJavascriptFunction("brave_rewards.externalWallet", - base::Value(std::move(data))); - } -} - -void RewardsDOMHandler::OnProcessRewardsPageUrl( - const ledger::mojom::Result result, - const std::string& wallet_type, - const std::string& action, - const base::flat_map& args) { + brave_rewards::GetExternalWalletResult result) { if (!IsJavascriptAllowed()) { return; } base::Value::Dict data; - data.Set("result", static_cast(result)); - data.Set("walletType", wallet_type); - data.Set("action", action); + if (result.has_value()) { + auto wallet = std::move(result.value()); - base::Value::Dict new_args; - for (auto const& arg : args) { - new_args.Set(arg.first, arg.second); + base::Value::Dict wallet_dict; + wallet_dict.Set("type", wallet->type); + wallet_dict.Set("address", wallet->address); + wallet_dict.Set("status", static_cast(wallet->status)); + wallet_dict.Set("addUrl", wallet->add_url); + wallet_dict.Set("withdrawUrl", wallet->withdraw_url); + wallet_dict.Set("userName", wallet->user_name); + wallet_dict.Set("accountUrl", wallet->account_url); + wallet_dict.Set("loginUrl", wallet->login_url); + wallet_dict.Set("activityUrl", wallet->activity_url); + + data.SetByDottedPath("value.wallet", std::move(wallet_dict)); + } else { + data.Set("error", static_cast(result.error())); } - data.Set("args", std::move(new_args)); - CallJavascriptFunction("brave_rewards.processRewardsPageUrl", + CallJavascriptFunction("brave_rewards.onGetExternalWallet", base::Value(std::move(data))); } -void RewardsDOMHandler::ProcessRewardsPageUrl(const base::Value::List& args) { - CHECK_EQ(2U, args.size()); +void RewardsDOMHandler::ConnectExternalWallet(const base::Value::List& args) { if (!rewards_service_) { return; } + CHECK_EQ(2U, args.size()); + AllowJavascript(); const std::string path = args[0].GetString(); const std::string query = args[1].GetString(); - rewards_service_->ProcessRewardsPageUrl( + rewards_service_->ConnectExternalWallet( path, query, - base::BindOnce(&RewardsDOMHandler::OnProcessRewardsPageUrl, + base::BindOnce(&RewardsDOMHandler::OnConnectExternalWallet, weak_factory_.GetWeakPtr())); } +void RewardsDOMHandler::OnConnectExternalWallet( + brave_rewards::ConnectExternalWalletResult result) { + if (!IsJavascriptAllowed()) { + return; + } + + base::Value::Dict data; + if (result.has_value()) { + data.Set("value", base::Value::Dict()); + } else { + data.Set("error", static_cast(result.error())); + } + + CallJavascriptFunction("brave_rewards.onConnectExternalWallet", + std::move(data)); +} + void RewardsDOMHandler::DisconnectWallet(const base::Value::List& args) { if (!rewards_service_) { return; diff --git a/browser/ui/webui/brave_tip_ui.cc b/browser/ui/webui/brave_tip_ui.cc index 044539d1e43..33da601b505 100644 --- a/browser/ui/webui/brave_tip_ui.cc +++ b/browser/ui/webui/brave_tip_ui.cc @@ -34,6 +34,7 @@ #include "content/public/browser/web_ui_message_handler.h" #include "ui/base/l10n/l10n_util.h" +using brave_rewards::GetExternalWalletResult; using brave_rewards::RewardsService; using brave_rewards::RewardsServiceFactory; using brave_rewards::RewardsServiceObserver; @@ -93,8 +94,7 @@ class TipMessageHandler : public WebUIMessageHandler, void GetRecurringTipsCallback( std::vector list); - void GetExternalWalletCallback(const ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet); + void OnGetExternalWallet(GetExternalWalletResult); void GetPublisherBannerCallback(ledger::mojom::PublisherBannerPtr banner); @@ -338,9 +338,8 @@ void TipMessageHandler::GetExternalWallet(const base::Value::List& args) { if (!rewards_service_) { return; } - rewards_service_->GetExternalWallet( - base::BindOnce(&TipMessageHandler::GetExternalWalletCallback, - weak_factory_.GetWeakPtr())); + rewards_service_->GetExternalWallet(base::BindOnce( + &TipMessageHandler::OnGetExternalWallet, weak_factory_.GetWeakPtr())); } void TipMessageHandler::GetRecurringTips(const base::Value::List& args) { @@ -493,15 +492,13 @@ void TipMessageHandler::FetchBalanceCallback( FireWebUIListener("balanceUpdated", base::Value(std::move(data))); } -void TipMessageHandler::GetExternalWalletCallback( - const ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet) { +void TipMessageHandler::OnGetExternalWallet(GetExternalWalletResult result) { if (!IsJavascriptAllowed()) { return; } base::Value::Dict data; - if (wallet) { + if (auto wallet = std::move(result).value_or(nullptr)) { data.Set("type", wallet->type); data.Set("status", static_cast(wallet->status)); } diff --git a/browser/ui/webui/brave_webui_source.cc b/browser/ui/webui/brave_webui_source.cc index 9f5a795ac91..985956ccc9b 100644 --- a/browser/ui/webui/brave_webui_source.cc +++ b/browser/ui/webui/brave_webui_source.cc @@ -843,9 +843,7 @@ void CustomizeWebUIHTMLSource(content::WebUI* web_ui, { "walletLogIntoYourAccount", IDS_REWARDS_WALLET_LOG_INTO_YOUR_ACCOUNT }, // NOLINT { "walletMonthlyTips", IDS_REWARDS_WALLET_MONTHLY_TIPS }, { "walletOneTimeTips", IDS_REWARDS_WALLET_ONE_TIME_TIPS }, - { "walletPending", IDS_REWARDS_WALLET_PENDING }, { "walletPendingContributions", IDS_REWARDS_WALLET_PENDING_CONTRIBUTIONS }, // NOLINT - { "walletPendingText", IDS_REWARDS_WALLET_PENDING_TEXT }, { "walletRewardsFromAds", IDS_REWARDS_WALLET_REWARDS_FROM_ADS }, { "walletRewardsSummary", IDS_REWARDS_WALLET_REWARDS_SUMMARY }, { "walletUnverified", IDS_REWARDS_WALLET_UNVERIFIED }, @@ -1084,12 +1082,10 @@ void CustomizeWebUIHTMLSource(content::WebUI* web_ui, { "walletNotCreated", IDS_BRAVE_REWARDS_INTERNALS_WALLET_NOT_CREATED }, { "walletPaymentId", IDS_BRAVE_REWARDS_INTERNALS_WALLET_PAYMENT_ID }, { "walletStatus", IDS_BRAVE_REWARDS_INTERNALS_WALLET_STATUS }, - { "walletStatusConnected", IDS_BRAVE_REWARDS_INTERNALS_WALLET_STATUS_CONNECTED }, // NOLINT { "walletStatusNotConnected", IDS_BRAVE_REWARDS_INTERNALS_WALLET_STATUS_NOT_CONNECTED }, // NOLINT + { "walletStatusNoWallet", IDS_BRAVE_REWARDS_INTERNALS_WALLET_STATUS_NO_WALLET }, // NOLINT { "walletStatusVerified", IDS_BRAVE_REWARDS_INTERNALS_WALLET_STATUS_VERIFIED }, // NOLINT - { "walletStatusDisconnectedNotVerified", IDS_BRAVE_REWARDS_INTERNALS_WALLET_STATUS_DISCONNECTED_NOT_VERIFIED }, // NOLINT { "walletStatusDisconnectedVerified", IDS_BRAVE_REWARDS_INTERNALS_WALLET_STATUS_DISCONNECTED_VERIFIED }, // NOLINT - { "walletStatusPending", IDS_BRAVE_REWARDS_INTERNALS_WALLET_STATUS_PENDING }, // NOLINT } }, { #if BUILDFLAG(ENABLE_TOR) diff --git a/build/android/config.gni b/build/android/config.gni index 690ce7cbb30..720fbd4eda8 100644 --- a/build/android/config.gni +++ b/build/android/config.gni @@ -34,6 +34,7 @@ brave_chrome_java_deps = [ "//brave/third_party/android_deps:com_wireguard_android_java", "//brave/third_party/android_deps:google_play_services_safetynet_java", "//brave/third_party/zxing:zxing_java", + "//brave/vendor/bat-native-ledger/include/bat/ledger/public/interfaces:ledger_types_java", "//third_party/android_deps:google_play_services_vision_common_java", "//third_party/android_deps:google_play_services_vision_java", "//third_party/androidx:androidx_lifecycle_lifecycle_livedata_core_java", diff --git a/common/extensions/api/brave_rewards.json b/common/extensions/api/brave_rewards.json index 93f84f6119e..39a6518b2b3 100644 --- a/common/extensions/api/brave_rewards.json +++ b/common/extensions/api/brave_rewards.json @@ -1354,10 +1354,6 @@ "type": "function", "name": "callback", "parameters": [ - { - "name": "result", - "type": "integer" - }, { "name": "wallet", "type": "object", diff --git a/components/brave_new_tab_ui/api/initialData.ts b/components/brave_new_tab_ui/api/initialData.ts index a5342646c11..e87a9af0e9b 100644 --- a/components/brave_new_tab_ui/api/initialData.ts +++ b/components/brave_new_tab_ui/api/initialData.ts @@ -189,7 +189,7 @@ export async function getRewardsInitialData (): Promise { resolve(parameters) })), new Promise(resolve => { - chrome.braveRewards.getExternalWallet((_, wallet) => resolve(wallet)) + chrome.braveRewards.getExternalWallet((wallet) => resolve(wallet)) }), new Promise(resolve => { chrome.braveRewards.fetchPromotions(resolve) diff --git a/components/brave_rewards/browser/rewards_service.h b/components/brave_rewards/browser/rewards_service.h index 8f23d73cf98..5f2b76ec6ea 100644 --- a/components/brave_rewards/browser/rewards_service.h +++ b/components/brave_rewards/browser/rewards_service.h @@ -13,8 +13,10 @@ #include "base/callback_forward.h" #include "base/containers/flat_map.h" #include "base/observer_list.h" +#include "base/types/expected.h" #include "brave/components/brave_rewards/browser/rewards_notification_service.h" #include "brave/vendor/bat-native-ledger/include/bat/ledger/mojom_structs.h" +#include "brave/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger_types.mojom.h" #include "build/build_config.h" #include "components/keyed_service/core/keyed_service.h" #include "components/sessions/core/session_id.h" @@ -72,14 +74,15 @@ using GetPendingContributionsCallback = base::OnceCallback; +using GetExternalWalletResult = + base::expected; using GetExternalWalletCallback = - base::OnceCallback; -using ProcessRewardsPageUrlCallback = - base::OnceCallback&)>; + base::OnceCallback; +using ConnectExternalWalletResult = + base::expected; +using ConnectExternalWalletCallback = + base::OnceCallback; using ClaimPromotionCallback = base::OnceCallback GetExternalWalletProviders() const = 0; - virtual void ProcessRewardsPageUrl( - const std::string& path, - const std::string& query, - ProcessRewardsPageUrlCallback callback) = 0; + // Connects Rewards with a custodial wallet service (e.g. bitFlyer, Gemini, + // Uphold). + // |path| is the authorization URL's path + // |query| is the authorization URL's query + // The callback is called with a ConnectExternalWalletError on failure, + // and with an empty result on success. + virtual void ConnectExternalWallet(const std::string& path, + const std::string& query, + ConnectExternalWalletCallback) = 0; virtual void DisconnectWallet() = 0; diff --git a/components/brave_rewards/browser/rewards_service_impl.cc b/components/brave_rewards/browser/rewards_service_impl.cc index 2a0dde96ab8..e79ce43394f 100644 --- a/components/brave_rewards/browser/rewards_service_impl.cc +++ b/components/brave_rewards/browser/rewards_service_impl.cc @@ -665,23 +665,23 @@ void RewardsServiceImpl::GetAvailableCountries( } auto on_external_wallet = [](GetAvailableCountriesCallback callback, - ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet) { - // If the user is not currently linked to any wallet provider, then all ISO - // country codes are available. + GetExternalWalletResult result) { + auto wallet = std::move(result).value_or(nullptr); + // If the user is not currently connected to any wallet provider, then all + // ISO country codes are available. if (!wallet || - wallet->status == ledger::mojom::WalletStatus::NOT_CONNECTED) { + wallet->status == ledger::mojom::WalletStatus::kNotConnected) { return std::move(callback).Run(kISOCountries); } - // If the user is currently linked to a bitFlyer wallet, then the only + // If the user is currently connected to a bitFlyer wallet, then the only // available countries are |kBitflyerCountries|. if (wallet->type == ledger::constant::kWalletBitflyer) { return std::move(callback).Run(std::vector( kBitflyerCountries.begin(), kBitflyerCountries.end())); } - // If the user is currently linked to any other external wallet provider, + // If the user is currently connected to any other external wallet provider, // then remove |kBitflyerCountries| from the list of ISO countries. static const std::vector kNonBitflyerCountries = []() { auto countries = kISOCountries; @@ -2316,12 +2316,18 @@ void RewardsServiceImpl::SetLedgerEnvForTesting() { ledger_for_testing_ = true; } +void RewardsServiceImpl::SetLedgerStateTargetVersionForTesting(int version) { + ledger_state_target_version_for_testing_ = version; +} + void RewardsServiceImpl::PrepareLedgerEnvForTesting() { if (!ledger_for_testing_) { return; } bat_ledger_service_->SetTesting(); + bat_ledger_service_->SetStateMigrationTargetVersionForTesting( + ledger_state_target_version_for_testing_); SetRetryInterval(1); profile_->GetPrefs()->SetInteger(prefs::kMinVisitTime, 1); @@ -2590,82 +2596,45 @@ std::string RewardsServiceImpl::GetLegacyWallet() { void RewardsServiceImpl::GetExternalWallet(GetExternalWalletCallback callback) { if (!Connected()) { - return DeferCallback(FROM_HERE, std::move(callback), - ledger::mojom::Result::LEDGER_OK, nullptr); + return DeferCallback( + FROM_HERE, std::move(callback), + base::unexpected(ledger::mojom::GetExternalWalletError::kUnexpected)); } bat_ledger_->GetExternalWallet(GetExternalWalletType(), std::move(callback)); } -void RewardsServiceImpl::ExternalWalletAuthorization( - const std::string& wallet_type, - const base::flat_map& args, - ExternalWalletAuthorizationCallback callback) { - if (!Connected()) { - return DeferCallback(FROM_HERE, std::move(callback), - ledger::mojom::Result::LEDGER_ERROR, - base::flat_map()); - } - - bat_ledger_->ExternalWalletAuthorization(wallet_type, args, - std::move(callback)); -} - -void RewardsServiceImpl::OnProcessExternalWalletAuthorization( - const std::string& wallet_type, - const std::string& action, - ProcessRewardsPageUrlCallback callback, - const ledger::mojom::Result result, - const base::flat_map& args) { - std::move(callback).Run(result, wallet_type, action, args); -} - -void RewardsServiceImpl::ProcessRewardsPageUrl( +void RewardsServiceImpl::ConnectExternalWallet( const std::string& path, const std::string& query, - ProcessRewardsPageUrlCallback callback) { - auto path_items = base::SplitString( - path, - "/", - base::TRIM_WHITESPACE, - base::SPLIT_WANT_NONEMPTY); - - if (path_items.size() < 2) { - return DeferCallback(FROM_HERE, std::move(callback), - ledger::mojom::Result::LEDGER_ERROR, "", "", - base::flat_map()); + ConnectExternalWalletCallback callback) { + if (!Connected()) { + return DeferCallback( + FROM_HERE, std::move(callback), + base::unexpected( + ledger::mojom::ConnectExternalWalletError::kUnexpected)); } - const std::string action = path_items.at(1); - const std::string wallet_type = path_items.at(0); + const auto path_items = base::SplitString(path, "/", base::TRIM_WHITESPACE, + base::SPLIT_WANT_NONEMPTY); + if (path_items.empty()) { + return DeferCallback( + FROM_HERE, std::move(callback), + base::unexpected( + ledger::mojom::ConnectExternalWalletError::kUnexpected)); + } - base::flat_map query_map; + const std::string wallet_type = path_items.at(0); + base::flat_map query_parameters; const auto url = GURL("brave:/" + path + query); for (net::QueryIterator it(url); !it.IsAtEnd(); it.Advance()) { - query_map[std::string(it.GetKey())] = it.GetUnescapedValue(); + query_parameters[static_cast(it.GetKey())] = + it.GetUnescapedValue(); } - if (action == "authorization") { - if (wallet_type == ledger::constant::kWalletUphold || - wallet_type == ledger::constant::kWalletBitflyer || - wallet_type == ledger::constant::kWalletGemini) { - ExternalWalletAuthorization( - wallet_type, - query_map, - base::BindOnce( - &RewardsServiceImpl::OnProcessExternalWalletAuthorization, - AsWeakPtr(), - wallet_type, - action, - std::move(callback))); - return; - } - } - - DeferCallback(FROM_HERE, std::move(callback), - ledger::mojom::Result::LEDGER_ERROR, wallet_type, action, - base::flat_map()); + bat_ledger_->ConnectExternalWallet(wallet_type, query_parameters, + std::move(callback)); } void RewardsServiceImpl::OnDisconnectWallet( diff --git a/components/brave_rewards/browser/rewards_service_impl.h b/components/brave_rewards/browser/rewards_service_impl.h index 607ce16c063..38aac1c781b 100644 --- a/components/brave_rewards/browser/rewards_service_impl.h +++ b/components/brave_rewards/browser/rewards_service_impl.h @@ -89,10 +89,6 @@ using GetTestResponseCallback = base::RepeatingCallback* headers)>; -using ExternalWalletAuthorizationCallback = - base::OnceCallback&)>; - using StopLedgerCallback = base::OnceCallback; class RewardsServiceImpl : public RewardsService, @@ -301,14 +297,9 @@ class RewardsServiceImpl : public RewardsService, std::vector GetExternalWalletProviders() const override; - void ExternalWalletAuthorization( - const std::string& wallet_type, - const base::flat_map& args, - ExternalWalletAuthorizationCallback callback); - - void ProcessRewardsPageUrl(const std::string& path, + void ConnectExternalWallet(const std::string& path, const std::string& query, - ProcessRewardsPageUrlCallback callback) override; + ConnectExternalWalletCallback) override; void DisconnectWallet() override; @@ -337,6 +328,7 @@ class RewardsServiceImpl : public RewardsService, // Testing methods void SetLedgerEnvForTesting(); + void SetLedgerStateTargetVersionForTesting(int version); void PrepareLedgerEnvForTesting(); void StartMonthlyContributionForTest(); void MaybeShowNotificationAddFundsForTesting( @@ -416,13 +408,6 @@ class RewardsServiceImpl : public RewardsService, void OnRemoveAllPendingContributions(const ledger::mojom::Result result); - void OnProcessExternalWalletAuthorization( - const std::string& wallet_type, - const std::string& action, - ProcessRewardsPageUrlCallback callback, - const ledger::mojom::Result result, - const base::flat_map& args); - void OnDisconnectWallet(const std::string& wallet_type, const ledger::mojom::Result result); @@ -653,6 +638,7 @@ class RewardsServiceImpl : public RewardsService, int32_t country_id_ = 0; bool reset_states_; bool ledger_for_testing_ = false; + int ledger_state_target_version_for_testing_ = -1; bool resetting_rewards_ = false; int persist_log_level_ = 0; diff --git a/components/brave_rewards/browser/test/common/rewards_browsertest_contribution.h b/components/brave_rewards/browser/test/common/rewards_browsertest_contribution.h index 08c96e42caa..18a5c982f03 100644 --- a/components/brave_rewards/browser/test/common/rewards_browsertest_contribution.h +++ b/components/brave_rewards/browser/test/common/rewards_browsertest_contribution.h @@ -84,13 +84,13 @@ class RewardsBrowserTestContribution void SetUpUpholdWallet(brave_rewards::RewardsServiceImpl* rewards_service, const double balance, const ledger::mojom::WalletStatus status = - ledger::mojom::WalletStatus::VERIFIED); + ledger::mojom::WalletStatus::kConnected); #if BUILDFLAG(ENABLE_GEMINI_WALLET) void SetUpGeminiWallet(brave_rewards::RewardsServiceImpl* rewards_service, const double balance, const ledger::mojom::WalletStatus status = - ledger::mojom::WalletStatus::VERIFIED); + ledger::mojom::WalletStatus::kConnected); #endif std::vector GetMultipleTipStatus(); diff --git a/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.cc b/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.cc index 5d0a1ca3d3a..b2fbf570f38 100644 --- a/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.cc +++ b/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.cc @@ -87,27 +87,38 @@ std::unique_ptr HandleRequest( return std::move(http_response); } -std::string GetUpholdUser(const bool wallet_verified) { - const std::string verified = wallet_verified - ? "2018-08-01T09:53:51.258Z" - : "null"; +std::string GetUpholdCapabilities() { + return R"( + [ + { + "category": "permissions", + "enabled": true, + "key": "receives", + "name": "Receives", + "requirements": [], + "restrictions": [] + }, + { + "category": "permissions", + "enabled": true, + "key": "sends", + "name": "Sends", + "requirements": [], + "restrictions": [] + } + ] + )"; +} - const std::string status = wallet_verified - ? "ok" - : "pending"; - - const std::string name = "Test User"; - - return base::StringPrintf( - R"({ - "name": "%s", - "memberAt": "%s", - "status": "%s", - "currencies": ["BAT"] - })", - name.c_str(), - verified.c_str(), - status.c_str()); +std::string GetUpholdUser() { + return R"( + { + "name": "Test User", + "memberAt": "2018-08-01T09:53:51.258Z", + "status": "ok", + "currencies": ["BAT"] + } + )"; } std::string GetUpholdCard( diff --git a/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.h b/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.h index 1d4c87cffb3..4f24fe15f99 100644 --- a/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.h +++ b/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.h @@ -19,7 +19,9 @@ namespace rewards_browsertest_util { std::unique_ptr HandleRequest( const net::test_server::HttpRequest& request); -std::string GetUpholdUser(const bool wallet_verified); +std::string GetUpholdCapabilities(); + +std::string GetUpholdUser(); std::string GetUpholdCard( const std::string& balance, diff --git a/components/brave_rewards/browser/test/common/rewards_browsertest_response.cc b/components/brave_rewards/browser/test/common/rewards_browsertest_response.cc index 7795fcc1420..48621077c94 100644 --- a/components/brave_rewards/browser/test/common/rewards_browsertest_response.cc +++ b/components/brave_rewards/browser/test/common/rewards_browsertest_response.cc @@ -303,8 +303,13 @@ void RewardsBrowserTestResponse::Get( return; } + if (url.find("/v0/me/capabilities") != std::string::npos) { + *response = rewards_browsertest_util::GetUpholdCapabilities(); + return; + } + if (url.find("/v0/me") != std::string::npos) { - *response = rewards_browsertest_util::GetUpholdUser(verified_wallet_); + *response = rewards_browsertest_util::GetUpholdUser(); return; } @@ -350,10 +355,6 @@ void RewardsBrowserTestResponse::SetAlternativePublisherList(bool alternative) { alternative_publisher_list_ = alternative; } -void RewardsBrowserTestResponse::SetVerifiedWallet(const bool verified) { - verified_wallet_ = verified; -} - void RewardsBrowserTestResponse::SetExternalBalance( const std::string& balance) { external_balance_ = balance; diff --git a/components/brave_rewards/browser/test/common/rewards_browsertest_response.h b/components/brave_rewards/browser/test/common/rewards_browsertest_response.h index 87847474abd..749454bb8fa 100644 --- a/components/brave_rewards/browser/test/common/rewards_browsertest_response.h +++ b/components/brave_rewards/browser/test/common/rewards_browsertest_response.h @@ -44,8 +44,6 @@ class RewardsBrowserTestResponse { void SetAlternativePublisherList(const bool alternative); - void SetVerifiedWallet(const bool verified); - void SetExternalBalance(const std::string& balance); private: @@ -67,7 +65,6 @@ class RewardsBrowserTestResponse { bool empty_promotion_key_ = false; bool alternative_publisher_list_ = false; ledger::mojom::SKUOrderPtr order_; - bool verified_wallet_ = false; std::string external_balance_ = "0.0"; std::map publisher_prefixes_; }; diff --git a/components/brave_rewards/browser/test/rewards_browsertest.cc b/components/brave_rewards/browser/test/rewards_browsertest.cc index 819ffbefb7a..91d9652abc0 100644 --- a/components/brave_rewards/browser/test/rewards_browsertest.cc +++ b/components/brave_rewards/browser/test/rewards_browsertest.cc @@ -248,8 +248,6 @@ IN_PROC_BROWSER_TEST_F(RewardsBrowserTest, NotVerifiedWallet) { // Check if we are redirected to uphold WaitForNavigation(ledger::uphold::GetUrl() + "/authorize/"); - response_->SetVerifiedWallet(true); - // Fake successful authentication ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( browser(), @@ -283,69 +281,6 @@ IN_PROC_BROWSER_TEST_F(RewardsBrowserTest, ShowACPercentInThePanel) { EXPECT_NE(score.find("100%"), std::string::npos); } -IN_PROC_BROWSER_TEST_F(RewardsBrowserTest, - ZeroBalanceWalletClaimNotCalled_Uphold) { - response_->SetVerifiedWallet(true); - rewards_browsertest_util::CreateRewardsWallet(rewards_service_); - contribution_->SetUpUpholdWallet(rewards_service_, 50.0); - - response_->ClearRequests(); - - base::RunLoop run_loop; - auto test_callback = [&](const ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet) { - auto requests = response_->GetRequests(); - EXPECT_EQ(result, ledger::mojom::Result::LEDGER_OK); - EXPECT_FALSE(requests.empty()); - - // Should not attempt to call /v2/wallet/UUID/claim endpoint - // since by default the wallet should contain 0 `user_funds` - auto wallet_claim_call = - base::ranges::find_if(requests, [](const Request& req) { - return req.url.find("/v2/wallet") != std::string::npos && - req.url.find("/claim") != std::string::npos; - }); - - EXPECT_TRUE(wallet_claim_call == requests.end()); - run_loop.Quit(); - }; - - rewards_service_->GetExternalWallet( - base::BindLambdaForTesting(test_callback)); - run_loop.Run(); -} - -IN_PROC_BROWSER_TEST_F(RewardsBrowserTest, - ZeroBalanceWalletClaimNotCalled_Gemini) { - response_->SetVerifiedWallet(true); - rewards_browsertest_util::CreateRewardsWallet(rewards_service_); - contribution_->SetUpGeminiWallet(rewards_service_, 50.0); - - response_->ClearRequests(); - - base::RunLoop run_loop; - auto test_callback = [&](const ledger::mojom::Result result, - ledger::mojom::ExternalWalletPtr wallet) { - auto requests = response_->GetRequests(); - EXPECT_EQ(result, ledger::mojom::Result::LEDGER_OK); - - // Should not attempt to call /v2/wallet/UUID/claim endpoint - // since by default the wallet should contain 0 `user_funds` - auto wallet_claim_call = - base::ranges::find_if(requests, [](const Request& req) { - return req.url.find("/v2/wallet") != std::string::npos && - req.url.find("/claim") != std::string::npos; - }); - - EXPECT_TRUE(wallet_claim_call == requests.end()); - run_loop.Quit(); - }; - - rewards_service_->GetExternalWallet( - base::BindLambdaForTesting(test_callback)); - run_loop.Run(); -} - IN_PROC_BROWSER_TEST_F(RewardsBrowserTest, ResetRewards) { rewards_browsertest_util::CreateRewardsWallet(rewards_service_); context_helper_->LoadRewardsPage(); diff --git a/components/brave_rewards/browser/test/rewards_contribution_browsertest.cc b/components/brave_rewards/browser/test/rewards_contribution_browsertest.cc index a82254b0dfe..8c439cab349 100644 --- a/components/brave_rewards/browser/test/rewards_contribution_browsertest.cc +++ b/components/brave_rewards/browser/test/rewards_contribution_browsertest.cc @@ -204,10 +204,8 @@ IN_PROC_BROWSER_TEST_F(RewardsContributionBrowserTest, } } -IN_PROC_BROWSER_TEST_F( - RewardsContributionBrowserTest, - AutoContributionMultiplePublishersUphold) { - response_->SetVerifiedWallet(true); +IN_PROC_BROWSER_TEST_F(RewardsContributionBrowserTest, + AutoContributionMultiplePublishersUphold) { rewards_browsertest_util::CreateRewardsWallet(rewards_service_); rewards_service_->SetAutoContributeEnabled(true); context_helper_->LoadRewardsPage(); @@ -425,10 +423,7 @@ IN_PROC_BROWSER_TEST_F(RewardsContributionBrowserTest, popup_contents.get(), "#root", "Insufficient funds"); } -IN_PROC_BROWSER_TEST_F( - RewardsContributionBrowserTest, - TipWithVerifiedWallet) { - response_->SetVerifiedWallet(true); +IN_PROC_BROWSER_TEST_F(RewardsContributionBrowserTest, TipWithVerifiedWallet) { rewards_browsertest_util::CreateRewardsWallet(rewards_service_); contribution_->SetUpUpholdWallet(rewards_service_, 50.0); @@ -445,7 +440,6 @@ IN_PROC_BROWSER_TEST_F( IN_PROC_BROWSER_TEST_F( RewardsContributionBrowserTest, DISABLED_MultipleTipsProduceMultipleFeesWithVerifiedWallet) { - response_->SetVerifiedWallet(true); rewards_browsertest_util::CreateRewardsWallet(rewards_service_); contribution_->SetUpUpholdWallet(rewards_service_, 50.0); @@ -463,8 +457,9 @@ IN_PROC_BROWSER_TEST_F( base::RunLoop run_loop_first; rewards_service_->GetExternalWallet( - base::BindLambdaForTesting([&](const ledger::mojom::Result, - ledger::mojom::ExternalWalletPtr wallet) { + base::BindLambdaForTesting([&](ledger::GetExternalWalletResult result) { + const auto wallet = std::move(result).value_or(nullptr); + ASSERT_TRUE(wallet); ASSERT_EQ(wallet->fees.size(), 2UL); for (auto const& value : wallet->fees) { ASSERT_EQ(value.second, tip_fee); @@ -487,10 +482,8 @@ IN_PROC_BROWSER_TEST_F(RewardsContributionBrowserTest, contribution_->VerifyTip(amount, false, false, true); } -IN_PROC_BROWSER_TEST_F( - RewardsContributionBrowserTest, - TipConnectedPublisherAnonAndConnected) { - response_->SetVerifiedWallet(true); +IN_PROC_BROWSER_TEST_F(RewardsContributionBrowserTest, + TipConnectedPublisherAnonAndConnected) { rewards_browsertest_util::CreateRewardsWallet(rewards_service_); contribution_->SetUpUpholdWallet(rewards_service_, 50.0); context_helper_->LoadRewardsPage(); @@ -505,7 +498,6 @@ IN_PROC_BROWSER_TEST_F( // Reenable when https://github.com/brave/brave-browser/issues/19982 is fixed. IN_PROC_BROWSER_TEST_F(RewardsContributionBrowserTest, DISABLED_TipConnectedPublisherVerified) { - response_->SetVerifiedWallet(true); rewards_browsertest_util::CreateRewardsWallet(rewards_service_); context_helper_->LoadRewardsPage(); contribution_->SetUpUpholdWallet(rewards_service_, 50.0); @@ -645,7 +637,6 @@ IN_PROC_BROWSER_TEST_F(RewardsContributionBrowserTest, IN_PROC_BROWSER_TEST_F(RewardsContributionBrowserTest, DISABLED_SplitProcessorAutoContribution) { - response_->SetVerifiedWallet(true); rewards_browsertest_util::CreateRewardsWallet(rewards_service_); rewards_service_->SetAutoContributeEnabled(true); context_helper_->LoadRewardsPage(); @@ -772,7 +763,6 @@ IN_PROC_BROWSER_TEST_F(RewardsContributionBrowserTest, IN_PROC_BROWSER_TEST_F(RewardsContributionBrowserTest, DISABLED_SplitProcessOneTimeTip) { - response_->SetVerifiedWallet(true); rewards_browsertest_util::CreateRewardsWallet(rewards_service_); contribution_->SetUpUpholdWallet(rewards_service_, 50.0); context_helper_->LoadRewardsPage(); diff --git a/components/brave_rewards/browser/test/rewards_state_browsertest.cc b/components/brave_rewards/browser/test/rewards_state_browsertest.cc index 2b318621222..2e1383c9691 100644 --- a/components/brave_rewards/browser/test/rewards_state_browsertest.cc +++ b/components/brave_rewards/browser/test/rewards_state_browsertest.cc @@ -4,8 +4,11 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include +#include #include "base/base64.h" +#include "base/base64url.h" +#include "base/containers/contains.h" #include "base/containers/flat_map.h" #include "base/files/file_util.h" #include "base/json/json_reader.h" @@ -28,6 +31,7 @@ #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/testing_profile.h" #include "content/public/test/browser_test.h" +#include "crypto/sha2.h" #include "net/dns/mock_host_resolver.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -359,12 +363,12 @@ IN_PROC_BROWSER_TEST_F(RewardsStateBrowserTest, V11EmptyWallet) { EXPECT_TRUE(brave_wallet.empty()); } -class UpholdStateMachine : public RewardsStateBrowserTest, - public ::testing::WithParamInterface< - std::pair> { +class V10 : public RewardsStateBrowserTest, + public ::testing::WithParamInterface< + std::pair> { public: static std::string NameSuffixGenerator( - const ::testing::TestParamInfo& info) { + const ::testing::TestParamInfo& info) { return from_json(std::get<0>(info.param)) + "__" + from_json(std::get<1>(info.param)); } @@ -385,10 +389,22 @@ class UpholdStateMachine : public RewardsStateBrowserTest, } static std::string to_string(int status) { - return status == -1 ? "unknown_WalletStatus_value" - : (std::ostringstream{} - << static_cast(status)) - .str(); + switch (status) { + case 0: + return "NOT_CONNECTED"; + case 1: + return "CONNECTED"; + case 2: + return "VERIFIED"; + case 3: + return "DISCONNECTED_NOT_VERIFIED"; + case 4: + return "DISCONNECTED_VERIFIED"; + case 5: + return "PENDING"; + default: + return "unknown_WalletStatus_value"; + } } static std::string to_string(const std::string& key, @@ -414,7 +430,7 @@ class UpholdStateMachine : public RewardsStateBrowserTest, // clang-format off INSTANTIATE_TEST_SUITE_P( RewardsStateBrowserTest, - UpholdStateMachine, + V10, ::testing::Values( // NOLINTNEXTLINE std::make_pair( // NOT_CONNECTED_token_empty_address_empty__NOT_CONNECTED_token_empty_address_empty @@ -1112,30 +1128,236 @@ INSTANTIATE_TEST_SUITE_P( R"("token":"0047c2fd8f023e067354dbdb5639ee67acf77150",)" R"("user_name":"",)" R"("withdraw_url":""})"})), - UpholdStateMachine::NameSuffixGenerator); + V10::NameSuffixGenerator); // clang-format on -IN_PROC_BROWSER_TEST_P_(UpholdStateMachine, Migration) { - using ledger::state::kWalletUphold; +IN_PROC_BROWSER_TEST_P_(V10, Paths) { + // testing migration from v9 to v10 + profile_->GetPrefs()->SetInteger("brave.rewards.version", 9); + rewards_service_->SetLedgerStateTargetVersionForTesting(10); const auto& params = GetParam(); - const auto& from = std::get<0>(params); - const auto& to = std::get<1>(params); + const auto& from_wallet = std::get<0>(params); + const auto& expected_wallet = std::get<1>(params); - profile_->GetPrefs()->SetInteger("brave.rewards.version", 9); - auto encrypted = - rewards_browsertest_util::EncryptPrefString(rewards_service_, from); - ASSERT_TRUE(encrypted); - profile_->GetPrefs()->SetString("brave.rewards.wallets.uphold", *encrypted); + const auto encrypted_from_wallet = + rewards_browsertest_util::EncryptPrefString(rewards_service_, + from_wallet); + ASSERT_TRUE(encrypted_from_wallet); + profile_->GetPrefs()->SetString("brave.rewards.wallets.uphold", + *encrypted_from_wallet); rewards_browsertest_util::StartProcess(rewards_service_); - const auto uphold_pref = + const auto encrypted_to_wallet = profile_->GetPrefs()->GetString("brave.rewards.wallets.uphold"); - auto decrypted = rewards_browsertest_util::DecryptPrefString(rewards_service_, - uphold_pref); - ASSERT_TRUE(decrypted); - EXPECT_EQ(*decrypted, to); + const auto decrypted_to_wallet = rewards_browsertest_util::DecryptPrefString( + rewards_service_, encrypted_to_wallet); + ASSERT_TRUE(decrypted_to_wallet); + + EXPECT_EQ(*decrypted_to_wallet, expected_wallet); +} + +class V12 + : public RewardsStateBrowserTest, + public testing::WithParamInterface< + std::tuple> {}; + +// clang-format off +INSTANTIATE_TEST_SUITE_P( + RewardsStateBrowserTest, + V12, + testing::Values( + std::tuple( + "pre_v12_NOT_CONNECTED__v12_kNotConnected", + R"( + { + "status": 0, + "token": "token", + "address": "address", + "one_time_string": "", + "code_verifier": "", + "activity_url": "activity_url", + "add_url": "add_url", + "withdraw_url": "withdraw_url" + } + )", + ledger::mojom::WalletStatus::kNotConnected + ), + std::tuple( + "pre_v12_VERIFIED__v12_kConnected", + R"( + { + "status": 2, + "token": "token", + "address": "address", + "one_time_string": "", + "code_verifier": "", + "activity_url": "", + "add_url": "", + "withdraw_url": "" + } + )", + ledger::mojom::WalletStatus::kConnected + ), + std::tuple( + "pre_v12_VERIFIED__v12_kLoggedOut", + R"( + { + "status": 2, + "token": "", + "address": "address", + "one_time_string": "", + "code_verifier": "", + "activity_url": "activity_url", + "add_url": "add_url", + "withdraw_url": "withdraw_url" + } + )", + ledger::mojom::WalletStatus::kLoggedOut + ), + std::tuple( + "pre_v12_DISCONNECTED_VERIFIED_v12_VERIFIED__kLoggedOut", + R"( + { + "status": 4, + "token": "token", + "address": "address", + "one_time_string": "", + "code_verifier": "", + "activity_url": "activity_url", + "add_url": "add_url", + "withdraw_url": "withdraw_url" + } + )", + ledger::mojom::WalletStatus::kLoggedOut + ), + std::tuple( + "pre_v12_CONNECTED__v12_kNotConnected", + R"( + { + "status": 1, + "token": "token", + "address": "address", + "one_time_string": "", + "code_verifier": "", + "activity_url": "activity_url", + "add_url": "add_url", + "withdraw_url": "withdraw_url" + } + )", + ledger::mojom::WalletStatus::kNotConnected + ), + std::tuple( + "pre_v12_DISCONNECTED_NOT_VERIFIED__v12_kNotConnected", + R"( + { + "status": 3, + "token": "token", + "address": "address", + "one_time_string": "", + "code_verifier": "", + "activity_url": "activity_url", + "add_url": "add_url", + "withdraw_url": "withdraw_url" + } + )", + ledger::mojom::WalletStatus::kNotConnected + ), + std::tuple( + "pre_v12_PENDING__v12_kNotConnected", + R"( + { + "status": 5, + "token": "token", + "address": "address", + "one_time_string": "", + "code_verifier": "", + "activity_url": "activity_url", + "add_url": "add_url", + "withdraw_url": "withdraw_url" + } + )", + ledger::mojom::WalletStatus::kNotConnected + ) + ), + [](const auto& info) { + return std::get<0>(info.param); + } +); +// clang-format on + +IN_PROC_BROWSER_TEST_P_(V12, Paths) { + // testing migration from v11 to v12 + profile_->GetPrefs()->SetInteger("brave.rewards.version", 11); + rewards_service_->SetLedgerStateTargetVersionForTesting(12); + + const auto encrypted_from_wallet = + rewards_browsertest_util::EncryptPrefString(rewards_service_, + std::get<1>(GetParam())); + ASSERT_TRUE(encrypted_from_wallet); + profile_->GetPrefs()->SetString("brave.rewards.wallets.bitflyer", + *encrypted_from_wallet); + + rewards_browsertest_util::StartProcess(rewards_service_); + + const auto encrypted_to_wallet = + profile_->GetPrefs()->GetString("brave.rewards.wallets.bitflyer"); + const auto decrypted_to_wallet = rewards_browsertest_util::DecryptPrefString( + rewards_service_, encrypted_to_wallet); + ASSERT_TRUE(decrypted_to_wallet); + + const auto value = base::JSONReader::Read(*decrypted_to_wallet); + ASSERT_TRUE(value && value->is_dict()); + + const auto& wallet_dict = value->GetDict(); + + const auto status = wallet_dict.FindInt("status"); + const auto* token = wallet_dict.FindString("token"); + const auto* address = wallet_dict.FindString("address"); + const auto* one_time_string = wallet_dict.FindString("one_time_string"); + const auto* code_verifier = wallet_dict.FindString("code_verifier"); + const auto* activity_url = wallet_dict.FindString("activity_url"); + const auto* add_url = wallet_dict.FindString("add_url"); + const auto* login_url = wallet_dict.FindString("login_url"); + const auto* withdraw_url = wallet_dict.FindString("withdraw_url"); + + ASSERT_TRUE(status && token && address && one_time_string && code_verifier && + activity_url && add_url && login_url && withdraw_url); + + ASSERT_TRUE( + (std::set{0 /* kNotConnected */, 2 /* kConnected */, 4 /* kLoggedOut */} + .count(*status))); + ASSERT_TRUE(static_cast(*status) == + std::get<2>(GetParam())); + + if (*status == 0 /* kNotConnected */ || *status == 4 /* kLoggedOut */) { + ASSERT_TRUE(token->empty()); + ASSERT_TRUE(address->empty()); + + ASSERT_TRUE(activity_url->empty()); + ASSERT_TRUE(add_url->empty()); + ASSERT_TRUE(withdraw_url->empty()); + } else { // *status == 2 /* kConnected */ + ASSERT_FALSE(token->empty()); + ASSERT_FALSE(address->empty()); + + ASSERT_FALSE(activity_url->empty()); + ASSERT_FALSE(add_url->empty()); + ASSERT_FALSE(withdraw_url->empty()); + } + + ASSERT_FALSE(one_time_string->empty()); + ASSERT_FALSE(code_verifier->empty()); + ASSERT_TRUE(base::Contains(*login_url, *one_time_string)); + + std::string code_challenge; + base::Base64UrlEncode(crypto::SHA256HashString(*code_verifier), + base::Base64UrlEncodePolicy::OMIT_PADDING, + &code_challenge); + base::ReplaceChars(code_challenge, "+", "-", &code_challenge); + base::ReplaceChars(code_challenge, "/", "_", &code_challenge); + ASSERT_TRUE(base::Contains(*login_url, code_challenge)); } } // namespace rewards_browsertest diff --git a/components/brave_rewards/resources/internals/actions/rewards_internals_actions.ts b/components/brave_rewards/resources/internals/actions/rewards_internals_actions.ts index ebde5f93842..7dad0690af8 100644 --- a/components/brave_rewards/resources/internals/actions/rewards_internals_actions.ts +++ b/components/brave_rewards/resources/internals/actions/rewards_internals_actions.ts @@ -55,8 +55,7 @@ export const downloadCompleted = () => action(types.DOWNLOAD_COMPLETED) export const getExternalWallet = () => action(types.GET_EXTERNAL_WALLET) -export const onExternalWallet = (result: number, wallet: RewardsInternals.ExternalWallet) => action(types.ON_EXTERNAL_WALLET, { - result, +export const onGetExternalWallet = (wallet: RewardsInternals.ExternalWallet) => action(types.ON_GET_EXTERNAL_WALLET, { wallet }) diff --git a/components/brave_rewards/resources/internals/brave_rewards_internals.tsx b/components/brave_rewards/resources/internals/brave_rewards_internals.tsx index 3b662129e89..f45aaa8b963 100644 --- a/components/brave_rewards/resources/internals/brave_rewards_internals.tsx +++ b/components/brave_rewards/resources/internals/brave_rewards_internals.tsx @@ -52,8 +52,8 @@ function fullLog (log: string) { getActions().onGetFullLog(log) } -function externalWallet (properties: {result: number, wallet: RewardsInternals.ExternalWallet}) { - getActions().onExternalWallet(properties.result, properties.wallet) +function onGetExternalWallet (wallet: RewardsInternals.ExternalWallet) { + getActions().onGetExternalWallet(wallet) } function eventLogs (logs: RewardsInternals.EventLog[]) { @@ -84,7 +84,7 @@ window.brave_rewards_internals = { promotions, partialLog, fullLog, - externalWallet, + onGetExternalWallet, eventLogs, adDiagnostics } diff --git a/components/brave_rewards/resources/internals/components/externalWallet.tsx b/components/brave_rewards/resources/internals/components/externalWallet.tsx index d4b1bee7089..3f348a08673 100644 --- a/components/brave_rewards/resources/internals/components/externalWallet.tsx +++ b/components/brave_rewards/resources/internals/components/externalWallet.tsx @@ -8,33 +8,23 @@ import * as React from 'react' import { getLocale } from '../../../../common/locale' import { lookupExternalWalletProviderName } from '../../shared/lib/external_wallet' +import * as mojom from '../../shared/lib/mojom' + interface Props { info: RewardsInternals.ExternalWallet } -const getWalletStatus = (status: RewardsInternals.WalletStatus) => { +const getWalletStatus = (status: mojom.WalletStatus) => { switch (status) { - case 0: { + case mojom.WalletStatus.kNotConnected: return getLocale('walletStatusNotConnected') - } - case 1: { - return getLocale('walletStatusConnected') - } - case 2: { + case mojom.WalletStatus.kConnected: return getLocale('walletStatusVerified') - } - case 3: { - return getLocale('walletStatusDisconnectedNotVerified') - } - case 4: { + case mojom.WalletStatus.kLoggedOut: return getLocale('walletStatusDisconnectedVerified') - } - case 5: { - return getLocale('walletStatusPending') - } } - return 'No wallet' + return getLocale('walletStatusNoWallet') } export const ExternalWallet = (props: Props) => { if (!props.info) { diff --git a/components/brave_rewards/resources/internals/constants/rewards_internals_types.ts b/components/brave_rewards/resources/internals/constants/rewards_internals_types.ts index 0503137d99c..42f954eba7e 100644 --- a/components/brave_rewards/resources/internals/constants/rewards_internals_types.ts +++ b/components/brave_rewards/resources/internals/constants/rewards_internals_types.ts @@ -18,7 +18,7 @@ export const enum types { CLEAR_LOG = '@@rewards_internals/CLEAR_LOG', DOWNLOAD_COMPLETED = '@@rewards_internals/DOWNLOAD_COMPLETED', GET_EXTERNAL_WALLET = '@@rewards_internals/GET_EXTERNAL_WALLET', - ON_EXTERNAL_WALLET = '@@rewards_internals/ON_EXTERNAL_WALLET', + ON_GET_EXTERNAL_WALLET = '@@rewards_internals/ON_GET_EXTERNAL_WALLET', GET_EVENT_LOGS = '@@rewards_internals/GET_EVENT_LOGS', ON_EVENT_LOGS = '@@rewards_internals/ON_EVENT_LOGS', GET_AD_DIAGNOSTICS = '@@rewards_internals/GET_AD_DIAGNOSTICS', diff --git a/components/brave_rewards/resources/internals/reducers/rewards_internals_reducer.ts b/components/brave_rewards/resources/internals/reducers/rewards_internals_reducer.ts index db9b54c3047..8a2fcc24906 100644 --- a/components/brave_rewards/resources/internals/reducers/rewards_internals_reducer.ts +++ b/components/brave_rewards/resources/internals/reducers/rewards_internals_reducer.ts @@ -67,7 +67,7 @@ const rewardsInternalsReducer: Reducer = (st case types.GET_EXTERNAL_WALLET: chrome.send('brave_rewards_internals.getExternalWallet') break - case types.ON_EXTERNAL_WALLET: + case types.ON_GET_EXTERNAL_WALLET: state = { ...state } state.externalWallet = action.payload.wallet break diff --git a/components/brave_rewards/resources/page/BUILD.gn b/components/brave_rewards/resources/page/BUILD.gn index f447eeea766..69c3ba0740d 100644 --- a/components/brave_rewards/resources/page/BUILD.gn +++ b/components/brave_rewards/resources/page/BUILD.gn @@ -2,9 +2,12 @@ import("//brave/components/common/typescript.gni") transpile_web_ui("page") { # what is the output bundle called and what is the entry point file - entry_points = [ - ["brave_rewards_page", rebase_path("brave_rewards_page.tsx")] - ] + entry_points = [ [ + "brave_rewards_page", + rebase_path("brave_rewards_page.tsx"), + ] ] + + deps = [ "//brave/vendor/bat-native-ledger/include/bat/ledger/public/interfaces:ledger_types_js" ] # what is the directory / pack name resource_name = "brave_rewards_page" diff --git a/components/brave_rewards/resources/page/actions/rewards_actions.ts b/components/brave_rewards/resources/page/actions/rewards_actions.ts index b0e1ca9ceec..aaed69b5de2 100644 --- a/components/brave_rewards/resources/page/actions/rewards_actions.ts +++ b/components/brave_rewards/resources/page/actions/rewards_actions.ts @@ -4,6 +4,7 @@ import { action } from 'typesafe-actions' import { types } from './rewards_types' +import * as mojom from '../../shared/lib/mojom' export const isInitialized = () => action(types.IS_INITIALIZED) @@ -230,22 +231,21 @@ export const onBalance = (status: number, balance: Rewards.Balance) => action(ty balance }) -export const getExternalWallet = () => action(types.GET_EXTERNAL_WALLET) - export const getExternalWalletProviders = () => action(types.GET_EXTERNAL_WALLET_PROVIDERS) -export const onExternalWallet = (result: number, wallet: Rewards.ExternalWallet) => action(types.ON_EXTERNAL_WALLET, { - result, - wallet +export const getExternalWallet = () => action(types.GET_EXTERNAL_WALLET) + +export const onGetExternalWallet = (result: mojom.GetExternalWalletResult) => action(types.ON_GET_EXTERNAL_WALLET, { + result }) -export const processRewardsPageUrl = (path: string, query: string) => action(types.PROCESS_REWARDS_PAGE_URL, { +export const connectExternalWallet = (path: string, query: string) => action(types.CONNECT_EXTERNAL_WALLET, { path, query }) -export const onProcessRewardsPageUrl = (data: Rewards.ProcessRewardsPageUrl) => action(types.ON_PROCESS_REWARDS_PAGE_URL, { - data +export const onConnectExternalWallet = (result: mojom.ConnectExternalWalletResult) => action(types.ON_CONNECT_EXTERNAL_WALLET, { + result }) export const hideRedirectModal = () => action(types.HIDE_REDIRECT_MODAL) diff --git a/components/brave_rewards/resources/page/actions/rewards_types.ts b/components/brave_rewards/resources/page/actions/rewards_types.ts index f05fa45e5bb..328104df5b7 100644 --- a/components/brave_rewards/resources/page/actions/rewards_types.ts +++ b/components/brave_rewards/resources/page/actions/rewards_types.ts @@ -66,11 +66,11 @@ export const enum types { GET_EXCLUDED_SITES = '@@rewards/GET_EXCLUDED_SITES', GET_BALANCE = '@@rewards/GET_BALANCE', ON_BALANCE = '@@rewards/ON_BALANCE', - GET_EXTERNAL_WALLET = '@@rewards/GET_EXTERNAL_WALLET', GET_EXTERNAL_WALLET_PROVIDERS = '@@rewards/GET_EXTERNAL_WALLET_PROVIDERS', - ON_EXTERNAL_WALLET = '@@rewards/ON_EXTERNAL_WALLET', - PROCESS_REWARDS_PAGE_URL = '@@rewards/PROCESS_REWARDS_PAGE_URL', - ON_PROCESS_REWARDS_PAGE_URL = '@@rewards/ON_PROCESS_REWARDS_PAGE_URL', + GET_EXTERNAL_WALLET = '@@rewards/GET_EXTERNAL_WALLET', + ON_GET_EXTERNAL_WALLET = '@@rewards/ON_GET_EXTERNAL_WALLET', + CONNECT_EXTERNAL_WALLET = '@@rewards/CONNECT_EXTERNAL_WALLET', + ON_CONNECT_EXTERNAL_WALLET = '@@rewards/ON_CONNECT_EXTERNAL_WALLET', HIDE_REDIRECT_MODAL = '@@rewards/HIDE_REDIRECT_MODAL', DISCONNECT_WALLET = '@@rewards/DISCONNECT_WALLET', GET_MONTHLY_REPORT = '@@rewards/GET_MONTHLY_REPORT', diff --git a/components/brave_rewards/resources/page/brave_rewards_page.tsx b/components/brave_rewards/resources/page/brave_rewards_page.tsx index e98dad988a3..20d7bb80bf8 100644 --- a/components/brave_rewards/resources/page/brave_rewards_page.tsx +++ b/components/brave_rewards/resources/page/brave_rewards_page.tsx @@ -19,6 +19,7 @@ import { getCurrentBalanceReport } from './reducers/utils' import * as rewardsActions from './actions/rewards_actions' import { App } from './components/app' +import * as mojom from '../shared/lib/mojom' const store = createStore(createReducer()) const actions = bindActionCreators(rewardsActions, store.dispatch.bind(store)) @@ -195,12 +196,12 @@ function reconcileComplete (properties: {type: number, result: number}) { } } -function externalWallet (properties: {result: number, wallet: Rewards.ExternalWallet}) { - actions.onExternalWallet(properties.result, properties.wallet) +function onGetExternalWallet (result: mojom.GetExternalWalletResult) { + actions.onGetExternalWallet(result) } -function processRewardsPageUrl (data: Rewards.ProcessRewardsPageUrl) { - actions.onProcessRewardsPageUrl(data) +function onConnectExternalWallet (result: mojom.ConnectExternalWalletResult) { + actions.onConnectExternalWallet(result) } function disconnectWallet (properties: {result: number}) { @@ -295,8 +296,8 @@ Object.defineProperty(window, 'brave_rewards', { excludedSiteChanged, balance, reconcileComplete, - externalWallet, - processRewardsPageUrl, + onGetExternalWallet, + onConnectExternalWallet, disconnectWallet, unblindedTokensReady, monthlyReport, diff --git a/components/brave_rewards/resources/page/components/pageWallet.tsx b/components/brave_rewards/resources/page/components/pageWallet.tsx index aca51c77598..789c899d9c8 100644 --- a/components/brave_rewards/resources/page/components/pageWallet.tsx +++ b/components/brave_rewards/resources/page/components/pageWallet.tsx @@ -16,7 +16,6 @@ import { LayoutKind } from '../lib/layout_context' import { ExternalWallet, ExternalWalletProvider, - ExternalWalletStatus, lookupExternalWalletProviderName } from '../../shared/lib/external_wallet' @@ -31,6 +30,8 @@ import { ConnectWalletModal } from './connect_wallet_modal' import { ManageWalletButton } from './manage_wallet_button' import { PendingContributionsModal } from './pending_contributions_modal' +import * as mojom from '../../shared/lib/mojom' + interface State { activeTabId: number modalActivity: boolean @@ -190,29 +191,13 @@ class PageWallet extends React.Component { this.handleExternalWalletLink() } - getExternalWalletStatus = (): ExternalWalletStatus | null => { + getExternalWalletStatus = (): mojom.WalletStatus | null => { const { externalWallet } = this.props.rewardsData - if (!externalWallet) { + if (!externalWallet || externalWallet.status === mojom.WalletStatus.kNotConnected) { return null } - switch (externalWallet.status) { - // ledger::mojom::WalletStatus::CONNECTED - case 1: - // WalletStatus::VERIFIED - case 2: - return 'verified' - // WalletStatus::DISCONNECTED_NOT_VERIFIED - case 3: - // WalletStatus::DISCONNECTED_VERIFIED - case 4: - return 'disconnected' - // ledger::mojom::WalletStatus::PENDING - case 5: - return 'pending' - default: - return null - } + return externalWallet.status } getExternalWalletProvider = (): ExternalWalletProvider | null => { diff --git a/components/brave_rewards/resources/page/components/provider_redirect_modal.tsx b/components/brave_rewards/resources/page/components/provider_redirect_modal.tsx index b41a51f7d22..1a46df653cf 100644 --- a/components/brave_rewards/resources/page/components/provider_redirect_modal.tsx +++ b/components/brave_rewards/resources/page/components/provider_redirect_modal.tsx @@ -8,6 +8,7 @@ import { useActions, useRewardsData } from '../lib/redux_hooks' import { lookupExternalWalletProviderName } from '../../shared/lib/external_wallet' import { LocaleContext } from '../../shared/lib/locale_context' import { ModalRedirect } from '../../ui/components' +import * as mojom from '../../shared/lib/mojom' export function ProviderRedirectModal () { const { getString } = React.useContext(LocaleContext) @@ -28,7 +29,17 @@ export function ProviderRedirectModal () { } switch (modalRedirect) { - case 'deviceLimitReachedModal': + case 'show': + return ( + + ) + case 'hide': + return null + case mojom.ConnectExternalWalletError.kDeviceLimitReached: return ( ) - case 'error': - return ( - - ) - case 'flaggedWalletModal': + case mojom.ConnectExternalWalletError.kFlaggedWallet: return ( ) - case 'kycRequiredModal': + case mojom.ConnectExternalWalletError.kKYCRequired: return ( ) - case 'mismatchedCountriesModal': + case mojom.ConnectExternalWalletError.kMismatchedCountries: return ( ) - case 'mismatchedProviderAccountsModal': + case mojom.ConnectExternalWalletError.kMismatchedProviderAccounts: return ( ) - case 'providerUnavailableModal': + case mojom.ConnectExternalWalletError.kProviderUnavailable: return ( ) - case 'regionNotSupportedModal': + case mojom.ConnectExternalWalletError.kRegionNotSupported: return ( ) - case 'show': + case mojom.ConnectExternalWalletError.kRequestSignatureVerificationFailure: return ( ) - case 'upholdBATNotAllowedModal': + case mojom.ConnectExternalWalletError.kUpholdBATNotAllowed: return ( ) - case 'upholdInsufficientCapabilitiesModal': + case mojom.ConnectExternalWalletError.kUpholdInsufficientCapabilities: return ( ) - case 'walletOwnershipVerificationFailureModal': + case mojom.ConnectExternalWalletError.kUpholdTransactionVerificationFailure: return ( ) default: - return null + // on modalRedirect === 'error', or on an unhandled mojom.ConnectExternalWalletError + return ( + + ) } } diff --git a/components/brave_rewards/resources/page/components/settings.tsx b/components/brave_rewards/resources/page/components/settings.tsx index b9f1a8b8a62..c9dd56ace69 100644 --- a/components/brave_rewards/resources/page/components/settings.tsx +++ b/components/brave_rewards/resources/page/components/settings.tsx @@ -47,9 +47,8 @@ export function Settings () { return true } - // Allow the browser to handle any URL that has 2 or more path components. - if (pathname.split('/').length > 2) { - actions.processRewardsPageUrl(pathname, location.search) + if (pathname.includes('authorization')) { + actions.connectExternalWallet(pathname, location.search) return true } diff --git a/components/brave_rewards/resources/page/reducers/rewards_reducer.ts b/components/brave_rewards/resources/page/reducers/rewards_reducer.ts index 274b852932d..8d6ecb90d74 100644 --- a/components/brave_rewards/resources/page/reducers/rewards_reducer.ts +++ b/components/brave_rewards/resources/page/reducers/rewards_reducer.ts @@ -290,100 +290,32 @@ const rewardsReducer: Reducer = (state: Rewards.State break } - case types.PROCESS_REWARDS_PAGE_URL: { + case types.CONNECT_EXTERNAL_WALLET: { const path = action.payload.path const query = action.payload.query const ui = state.ui - chrome.send('brave_rewards.processRewardsPageUrl', [path, query]) + chrome.send('brave_rewards.connectExternalWallet', [path, query]) ui.modalRedirect = 'show' - state = { - ...state, - ui - } + state = { ...state, ui } break } - case types.ON_PROCESS_REWARDS_PAGE_URL: { - const data = action.payload.data - const ui = state.ui - + case types.ON_CONNECT_EXTERNAL_WALLET: { chrome.send('brave_rewards.getExternalWallet') - if (data.result === 9) { // type::Result::NOT_FOUND - ui.modalRedirect = 'kycRequiredModal' - break - } + const ui = state.ui + const { value, error } = action.payload.result - if (data.result === 24) { // type::Result::EXPIRED_TOKEN - ui.modalRedirect = 'error' - break - } - - if (data.result === 25) { // type::Result::UPHOLD_BAT_NOT_ALLOWED - ui.modalRedirect = 'upholdBATNotAllowedModal' - break - } - - if (data.result === 36) { // type::Result::DEVICE_LIMIT_REACHED - ui.modalRedirect = 'deviceLimitReachedModal' - break - } - - if (data.result === 37) { // type::Result::MISMATCHED_PROVIDER_ACCOUNTS - ui.modalRedirect = 'mismatchedProviderAccountsModal' - break - } - - if (data.result === 42) { // type::Result::REQUEST_SIGNATURE_VERIFICATION_FAILURE - ui.modalRedirect = 'walletOwnershipVerificationFailureModal' - break - } - - if (data.result === 44) { // type::Result::FLAGGED_WALLET - ui.modalRedirect = 'flaggedWalletModal' - break - } - - if (data.result === 45) { // type::Result::REGION_NOT_SUPPORTED - ui.modalRedirect = 'regionNotSupportedModal' - break - } - - if (data.result === 46) { // type::Result::MISMATCHED_COUNTRIES - ui.modalRedirect = 'mismatchedCountriesModal' - break - } - - if (data.result === 47) { // type::Result::PROVIDER_UNAVAILABLE - ui.modalRedirect = 'providerUnavailableModal' - break - } - - if (data.result !== 0) { - ui.modalRedirect = 'error' - break - } - - if (data.walletType === 'uphold' || data.walletType === 'bitflyer' || data.walletType === 'gemini') { + if (value) { chrome.send('brave_rewards.fetchBalance') - - if (data.action === 'authorization') { - const url = data.args.redirect_url - if (url && url.length > 0) { - window.open(url, '_self') - } - ui.modalRedirect = 'hide' - break - } + ui.modalRedirect = 'hide' + } else { + ui.modalRedirect = error } - ui.modalRedirect = 'error' + state = { ...state, ui } - state = { - ...state, - ui - } break } case types.HIDE_REDIRECT_MODAL: { diff --git a/components/brave_rewards/resources/page/reducers/wallet_reducer.ts b/components/brave_rewards/resources/page/reducers/wallet_reducer.ts index e71a54f02cf..c73fb44b18f 100644 --- a/components/brave_rewards/resources/page/reducers/wallet_reducer.ts +++ b/components/brave_rewards/resources/page/reducers/wallet_reducer.ts @@ -4,6 +4,7 @@ import { Reducer } from 'redux' import { types } from '../actions/rewards_types' +import * as mojom from '../../shared/lib/mojom' const walletReducer: Reducer = (state: Rewards.State, action) => { if (!state) { @@ -98,10 +99,6 @@ const walletReducer: Reducer = (state: Rewards.State, } break } - case types.GET_EXTERNAL_WALLET: { - chrome.send('brave_rewards.getExternalWallet') - break - } case types.GET_EXTERNAL_WALLET_PROVIDERS: { chrome.send('brave_rewards.getExternalWalletProviders') break @@ -110,69 +107,24 @@ const walletReducer: Reducer = (state: Rewards.State, chrome.send('brave_rewards.setExternalWalletType', [action.payload.provider]) break } - case types.ON_EXTERNAL_WALLET: { - state = { ...state } + case types.GET_EXTERNAL_WALLET: { + chrome.send('brave_rewards.getExternalWallet') + break + } + case types.ON_GET_EXTERNAL_WALLET: { + const { value, error } = action.payload.result - if (action.payload.result === 24) { // type::Result::EXPIRED_TOKEN - chrome.send('brave_rewards.getExternalWallet') - break - } - - if (action.payload.result === 9) { // type::Result::NOT_FOUND - state.ui.modalRedirect = 'kycRequiredModal' - break - } - - if (action.payload.result === 25) { // type::Result::UPHOLD_BAT_NOT_ALLOWED - state.ui.modalRedirect = 'upholdBATNotAllowedModal' - break - } - - if (action.payload.result === 36) { // type::Result::DEVICE_LIMIT_REACHED - state.ui.modalRedirect = 'deviceLimitReachedModal' - break - } - - if (action.payload.result === 37) { // type::Result::MISMATCHED_PROVIDER_ACCOUNTS - state.ui.modalRedirect = 'mismatchedProviderAccountsModal' - break - } - - if (action.payload.result === 41) { // type::Result::UPHOLD_TRANSACTION_VERIFICATION_FAILURE - state.ui.modalRedirect = 'walletOwnershipVerificationFailureModal' - break - } - - if (action.payload.result === 43) { // type::Result::UPHOLD_INSUFFICIENT_CAPABILITIES - state.ui.modalRedirect = 'upholdInsufficientCapabilitiesModal' - break - } - - if (action.payload.result === 44) { // type::Result::FLAGGED_WALLET - state.ui.modalRedirect = 'flaggedWalletModal' - break - } - - if (action.payload.result === 45) { // type::Result::REGION_NOT_SUPPORTED - state.ui.modalRedirect = 'regionNotSupportedModal' - break - } - - if (action.payload.result === 46) { // type::Result::MISMATCHED_COUNTRIES - state.ui.modalRedirect = 'mismatchedCountriesModal' - break - } - - if (action.payload.result === 47) { // type::Result::PROVIDER_UNAVAILABLE - state.ui.modalRedirect = 'providerUnavailableModal' - break - } - - if (action.payload.result === 0) { // type::Result::LEDGER_OK + if (value) { + state = { ...state, externalWallet: value.wallet } chrome.send('brave_rewards.fetchBalance') + } else { + switch (error) { + case mojom.GetExternalWalletError.kAccessTokenExpired: + chrome.send('brave_rewards.getExternalWallet') + break + } } - state.externalWallet = action.payload.wallet break } case types.GET_MONTHLY_REPORT: { diff --git a/components/brave_rewards/resources/rewards_panel/lib/extension_api_adapter.ts b/components/brave_rewards/resources/rewards_panel/lib/extension_api_adapter.ts index ce9f463ee90..5a1e0a0f238 100644 --- a/components/brave_rewards/resources/rewards_panel/lib/extension_api_adapter.ts +++ b/components/brave_rewards/resources/rewards_panel/lib/extension_api_adapter.ts @@ -90,7 +90,7 @@ export function getExternalWalletProviders () { // The extension API currently does not support retrieving a list of // external wallet providers. Instead, use the `getExternalWallet` function // to retrieve the "currently selected" provider. - chrome.braveRewards.getExternalWallet((_, wallet) => { + chrome.braveRewards.getExternalWallet((wallet) => { const provider = wallet && externalWalletProviderFromString(wallet.type) resolve(provider ? [provider] : []) }) @@ -99,7 +99,7 @@ export function getExternalWalletProviders () { export function getExternalWallet () { return new Promise((resolve) => { - chrome.braveRewards.getExternalWallet((_, wallet) => { resolve(wallet) }) + chrome.braveRewards.getExternalWallet((wallet) => { resolve(wallet) }) }).then(externalWalletFromExtensionData) } diff --git a/components/brave_rewards/resources/rewards_panel/lib/notification_adapter.ts b/components/brave_rewards/resources/rewards_panel/lib/notification_adapter.ts index 51eeb103e17..a4eb595ac10 100644 --- a/components/brave_rewards/resources/rewards_panel/lib/notification_adapter.ts +++ b/components/brave_rewards/resources/rewards_panel/lib/notification_adapter.ts @@ -14,7 +14,9 @@ import { GrantAvailableNotification, PendingPublisherVerifiedNotification, PendingTipFailedNotification, - ExternalWalletDisconnectedNotification + ExternalWalletDisconnectedNotification, + UpholdBATNotAllowedNotification, + UpholdInsufficientCapabilitiesNotification } from '../../shared/components/notifications' function parseGrantId (id: string) { @@ -135,6 +137,18 @@ export function mapNotification ( // The provider is not currently recorded for this notification provider: mapProvider('') }) + case 'uphold_bat_not_allowed': + return create({ + ...baseProps, + type: 'uphold-bat-not-allowed', + provider: 'uphold' + }) + case 'uphold_insufficient_capabilities': + return create({ + ...baseProps, + type: 'uphold-insufficient-capabilities', + provider: 'uphold' + }) } break } diff --git a/components/brave_rewards/resources/rewards_panel/stories/index.tsx b/components/brave_rewards/resources/rewards_panel/stories/index.tsx index bf6677caddb..d50e65e66eb 100644 --- a/components/brave_rewards/resources/rewards_panel/stories/index.tsx +++ b/components/brave_rewards/resources/rewards_panel/stories/index.tsx @@ -17,6 +17,7 @@ import { NotificationCard } from '../components/notification_card' import { App } from '../components/app' import grantCaptchaImageURL from './grant_captcha_image.png' +import * as mojom from '../../shared/lib/mojom' export default { title: 'Rewards/Panel' @@ -96,7 +97,7 @@ function createHost (): Host { externalWallet: { provider: 'uphold', username: 'brave123', - status: 'verified', + status: mojom.WalletStatus.kConnected, links: {} }, summaryData: { diff --git a/components/brave_rewards/resources/rewards_panel/stories/locale_strings.ts b/components/brave_rewards/resources/rewards_panel/stories/locale_strings.ts index 87c8bafa8fa..6d9dfbcaf68 100644 --- a/components/brave_rewards/resources/rewards_panel/stories/locale_strings.ts +++ b/components/brave_rewards/resources/rewards_panel/stories/locale_strings.ts @@ -57,6 +57,10 @@ export const localeStrings = { notificationAutoContributeCompletedText: 'You\'ve contributed $1.', notificationWalletDisconnectedTitle: 'You are logged out', notificationWalletDisconnectedText: 'This can happen to keep your account secure. Click below to reconnect now.', + notificationUpholdBATNotAllowedTitle: 'Error: BAT unavailable', + notificationUpholdBATNotAllowedText: 'BAT is not yet supported in your region on Uphold.', + notificationUpholdInsufficientCapabilitiesTitle: 'Error: Limited Uphold account functionality', + notificationUpholdInsufficientCapabilitiesText: 'According to Uphold, there are currently some limitations on your Uphold account. Please log in to your Uphold account and check whether there are any notices or remaining account requirements to complete, then try again.', notificationWalletDisconnectedAction: 'Reconnect', notificationTokenGrantTitle: 'A token grant is available!', notificationAdGrantAmount: '$1 Rewards: $2', 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 6587ba7384e..1f504ebb85e 100644 --- a/components/brave_rewards/resources/shared/components/newtab/rewards_card.tsx +++ b/components/brave_rewards/resources/shared/components/newtab/rewards_card.tsx @@ -25,6 +25,8 @@ import * as urls from '../../lib/rewards_urls' import * as style from './rewards_card.style' +import * as mojom from '../../../shared/lib/mojom' + const nextPaymentDateFormatter = new Intl.DateTimeFormat(undefined, { day: 'numeric', month: 'short' @@ -99,7 +101,7 @@ export function RewardsCard (props: Props) { } const { externalWallet } = props - if (externalWallet && externalWallet.status === 'disconnected') { + if (externalWallet && externalWallet.status === mojom.WalletStatus.kLoggedOut) { const onClick = () => { if (externalWallet.links.reconnect) { window.open(externalWallet.links.reconnect, '_blank') 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 bb8b5dfa093..4196a9b6344 100644 --- a/components/brave_rewards/resources/shared/components/newtab/stories/index.tsx +++ b/components/brave_rewards/resources/shared/components/newtab/stories/index.tsx @@ -11,6 +11,7 @@ import { RewardsCard } from '../rewards_card' import { SponsoredImageTooltip } from '../sponsored_image_tooltip' import { localeStrings } from './locale_strings' +import * as mojom from '../../../../shared/lib/mojom' const localeContext = { getString (key: string) { @@ -57,7 +58,7 @@ export function Card () { } : null} externalWallet={disconnectedWallet ? { provider: 'uphold', - status: 'disconnected', + status: mojom.WalletStatus.kLoggedOut, username: '', links: { reconnect: 'https://brave.com' diff --git a/components/brave_rewards/resources/shared/components/notifications/index.ts b/components/brave_rewards/resources/shared/components/notifications/index.ts index f001cc14f35..2b068367570 100644 --- a/components/brave_rewards/resources/shared/components/notifications/index.ts +++ b/components/brave_rewards/resources/shared/components/notifications/index.ts @@ -13,6 +13,8 @@ import { GrantAvailable } from './grant_available' import { PendingPublisherVerified } from './pending_publisher_verified' import { PendingTipFailed } from './pending_tip_failed' import { ExternalWalletDisconnected } from './external_wallet_disconnected' +import { UpholdBATNotAllowed } from './uphold_bat_not_allowed' +import { UpholdInsufficientCapabilities } from './uphold_insufficient_capabilities' export * from './notification' export * from './notification_view' @@ -37,5 +39,9 @@ export function getNotificationView ( return PendingTipFailed case 'external-wallet-disconnected': return ExternalWalletDisconnected + case 'uphold-bat-not-allowed': + return UpholdBATNotAllowed + case 'uphold-insufficient-capabilities': + return UpholdInsufficientCapabilities } } diff --git a/components/brave_rewards/resources/shared/components/notifications/notification.ts b/components/brave_rewards/resources/shared/components/notifications/notification.ts index 54f9a2c73d6..5480d132779 100644 --- a/components/brave_rewards/resources/shared/components/notifications/notification.ts +++ b/components/brave_rewards/resources/shared/components/notifications/notification.ts @@ -13,7 +13,9 @@ export type NotificationType = 'grant-available' | 'pending-publisher-verified' | 'pending-tip-failed' | - 'external-wallet-disconnected' + 'external-wallet-disconnected' | + 'uphold-bat-not-allowed' | + 'uphold-insufficient-capabilities' export interface Notification { type: NotificationType @@ -51,6 +53,16 @@ export interface ExternalWalletDisconnectedNotification extends Notification { provider: ExternalWalletProvider } +export interface UpholdBATNotAllowedNotification extends Notification { + type: 'uphold-bat-not-allowed' + provider: ExternalWalletProvider +} + +export interface UpholdInsufficientCapabilitiesNotification extends Notification { + type: 'uphold-insufficient-capabilities' + provider: ExternalWalletProvider +} + export type NotificationActionType = 'open-link' | 'claim-grant' | diff --git a/components/brave_rewards/resources/shared/components/notifications/uphold_bat_not_allowed.tsx b/components/brave_rewards/resources/shared/components/notifications/uphold_bat_not_allowed.tsx new file mode 100644 index 00000000000..c4696a7d077 --- /dev/null +++ b/components/brave_rewards/resources/shared/components/notifications/uphold_bat_not_allowed.tsx @@ -0,0 +1,23 @@ +/* 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 https://mozilla.org/MPL/2.0/. */ + +import * as React from 'react' + +import { LocaleContext } from '../../lib/locale_context' +import { NotificationViewProps } from './notification_view' + +export function UpholdBATNotAllowed (props: NotificationViewProps) { + const { getString } = React.useContext(LocaleContext) + const { Title, Body, Action } = props + + return ( +
+ + {getString('notificationUpholdBATNotAllowedTitle')} + + {getString('notificationUpholdBATNotAllowedText')} + +
+ ) +} diff --git a/components/brave_rewards/resources/shared/components/notifications/uphold_insufficient_capabilities.tsx b/components/brave_rewards/resources/shared/components/notifications/uphold_insufficient_capabilities.tsx new file mode 100644 index 00000000000..5a53a0faea2 --- /dev/null +++ b/components/brave_rewards/resources/shared/components/notifications/uphold_insufficient_capabilities.tsx @@ -0,0 +1,23 @@ +/* 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 https://mozilla.org/MPL/2.0/. */ + +import * as React from 'react' + +import { LocaleContext } from '../../lib/locale_context' +import { NotificationViewProps } from './notification_view' + +export function UpholdInsufficientCapabilities (props: NotificationViewProps) { + const { getString } = React.useContext(LocaleContext) + const { Title, Body, Action } = props + + return ( +
+ + {getString('notificationUpholdInsufficientCapabilitiesTitle')} + + {getString('notificationUpholdInsufficientCapabilitiesText')} + +
+ ) +} diff --git a/components/brave_rewards/resources/shared/components/wallet_card/external_wallet_bubble.style.ts b/components/brave_rewards/resources/shared/components/wallet_card/external_wallet_bubble.style.ts index e037fdb841b..96249c74a62 100644 --- a/components/brave_rewards/resources/shared/components/wallet_card/external_wallet_bubble.style.ts +++ b/components/brave_rewards/resources/shared/components/wallet_card/external_wallet_bubble.style.ts @@ -64,7 +64,7 @@ export const status = styled.div` font-size: 14px; line-height: 20px; - &.verified { + &.connected { color: var(--brave-palette-teal600); } @@ -77,32 +77,6 @@ export const status = styled.div` } ` -export const pendingNotice = styled.div` - font-size: 12px; - line-height: 18px; - padding: 14px 0 9px; - border-bottom: solid 1px var(--brave-palette-neutral200); - display: flex; - - .icon { - flex: 0 0 auto; - height: 16px; - width: auto; - vertical-align: middle; - margin-right: 6px; - margin-bottom: 2px; - } - - .text { - flex: 1 1 auto; - margin-left: 9px; - } - - .brave-theme-dark & { - border-color: var(--brave-palette-grey700); - } -` - export const links = styled.div` margin: 11px 4px 0; ` diff --git a/components/brave_rewards/resources/shared/components/wallet_card/external_wallet_bubble.tsx b/components/brave_rewards/resources/shared/components/wallet_card/external_wallet_bubble.tsx index 97b6fbcca64..a2afbfb358b 100644 --- a/components/brave_rewards/resources/shared/components/wallet_card/external_wallet_bubble.tsx +++ b/components/brave_rewards/resources/shared/components/wallet_card/external_wallet_bubble.tsx @@ -11,10 +11,11 @@ import { LocaleContext, formatMessage } from '../../lib/locale_context' import { GeminiIcon } from '../icons/gemini_icon' import { BitflyerIcon } from '../icons/bitflyer_icon' import { UpholdIcon } from '../icons/uphold_icon' -import { PendingIcon } from './icons/pending_icon' import * as style from './external_wallet_bubble.style' +import * as mojom from '../../../shared/lib/mojom' + interface Props { externalWallet: ExternalWallet onExternalWalletAction: (action: ExternalWalletAction) => void @@ -40,15 +41,18 @@ export function ExternalWalletBubble (props: Props) { function getWalletStatus () { switch (externalWallet.status) { - case 'disconnected': return getString('walletDisconnected') - case 'pending': return getString('walletPending') - case 'verified': return getString('walletVerified') + case mojom.WalletStatus.kLoggedOut: + return getString('walletDisconnected') + case mojom.WalletStatus.kConnected: + return getString('walletVerified') } + + return '' } function renderAccountLink () { switch (externalWallet.status) { - case 'disconnected': + case mojom.WalletStatus.kLoggedOut: return ( ) - case 'pending': - return null - case 'verified': + case mojom.WalletStatus.kConnected: return ( ) } + + return null } return ( @@ -79,28 +83,15 @@ export function ExternalWalletBubble (props: Props) { {externalWallet.username} - - {externalWallet.status === 'pending' && } + {getWalletStatus()} - { - externalWallet.status === 'pending' && - - - - {formatMessage(getString('walletPendingText'), [providerName])} - - - } - { - externalWallet.status !== 'pending' && - - - {renderAccountLink()} - - } + + + {renderAccountLink()} +