From 60e3b2d7e7d51f81ef13af20b4ff847c78cc01e1 Mon Sep 17 00:00:00 2001
From: Prochmi99 <152851523+MiroslavProchazka@users.noreply.github.com>
Date: Wed, 26 Feb 2025 15:27:16 +0100
Subject: [PATCH] feat(message-system): add context banner to solana staking
tab
---
.../AccountBanners/AccountBanners.tsx | 8 ++-
.../AccountBanners/ContextMessage.tsx | 55 ++++++++++++++--
.../message-system/config/config.v1.json | 64 ++++++++++++++++++-
.../message-system/src/messageSystemTypes.ts | 1 +
4 files changed, 118 insertions(+), 10 deletions(-)
diff --git a/packages/suite/src/components/wallet/WalletLayout/AccountBanners/AccountBanners.tsx b/packages/suite/src/components/wallet/WalletLayout/AccountBanners/AccountBanners.tsx
index 2ce765b6ccd..5c80b70aad0 100644
--- a/packages/suite/src/components/wallet/WalletLayout/AccountBanners/AccountBanners.tsx
+++ b/packages/suite/src/components/wallet/WalletLayout/AccountBanners/AccountBanners.tsx
@@ -1,5 +1,8 @@
import { Context } from '@suite-common/message-system';
-import { isSupportedEthStakingNetworkSymbol } from '@suite-common/wallet-utils';
+import {
+ isSupportedEthStakingNetworkSymbol,
+ isSupportedSolStakingNetworkSymbol,
+} from '@suite-common/wallet-utils';
import { Column } from '@trezor/components';
import { spacings } from '@trezor/theme';
@@ -31,6 +34,9 @@ export const AccountBanners = ({ account }: AccountBannersProps) => {
{account?.symbol &&
isSupportedEthStakingNetworkSymbol(account.symbol) &&
route?.name === 'wallet-staking' && }
+ {account?.symbol &&
+ isSupportedSolStakingNetworkSymbol(account.symbol) &&
+ route?.name === 'wallet-staking' && }
diff --git a/packages/suite/src/components/wallet/WalletLayout/AccountBanners/ContextMessage.tsx b/packages/suite/src/components/wallet/WalletLayout/AccountBanners/ContextMessage.tsx
index 77dbf85b126..3f68a06e590 100644
--- a/packages/suite/src/components/wallet/WalletLayout/AccountBanners/ContextMessage.tsx
+++ b/packages/suite/src/components/wallet/WalletLayout/AccountBanners/ContextMessage.tsx
@@ -1,8 +1,12 @@
+import { useMemo } from 'react';
+
import { Context, selectContextMessageContent } from '@suite-common/message-system';
-import { Banner } from '@trezor/components';
+import { Banner, Row } from '@trezor/components';
-import { useSelector } from 'src/hooks/suite';
-import { selectLanguage } from 'src/reducers/suite/suiteReducer';
+import { goto } from 'src/actions/suite/routerActions';
+import { useDispatch, useSelector } from 'src/hooks/suite';
+import { selectLanguage, selectTorState } from 'src/reducers/suite/suiteReducer';
+import { getTorUrlIfAvailable } from 'src/utils/suite/tor';
type ContextMessageProps = {
context: (typeof Context)[keyof typeof Context];
@@ -11,14 +15,51 @@ type ContextMessageProps = {
export const ContextMessage = ({ context }: ContextMessageProps) => {
const language = useSelector(selectLanguage);
const message = useSelector(state => selectContextMessageContent(state, context, language));
+ const { isTorEnabled } = useSelector(selectTorState);
+ const torOnionLinks = useSelector(state => state.suite.settings.torOnionLinks);
+ const dispatch = useDispatch();
+
+ // Removed unused destructuring of message properties.
+
+ const actionConfig = useMemo(() => {
+ if (!message?.cta) return undefined;
+
+ const { action, link, anchor } = message.cta;
+ let onClick: () => Window | Promise | null;
+
+ if (action === 'internal-link') {
+ // @ts-expect-error: impossible to add all href options to the message system config json schema
+ onClick = () => dispatch(goto(link, { anchor, preserveParams: true }));
+ } else if (action === 'external-link') {
+ onClick = () =>
+ window.open(
+ isTorEnabled && torOnionLinks ? getTorUrlIfAvailable(link) : link,
+ '_blank',
+ );
+ } else {
+ return undefined;
+ }
+
+ return {
+ onClick: onClick!,
+ 'data-testid': `@context-message/${context}/cta`,
+ };
+ }, [message, dispatch, isTorEnabled, torOnionLinks, context]);
- return message ? (
+ return message?.cta ? (
{message.cta.label}
- ) : undefined
+
+ {actionConfig && (
+
+ {message.cta.label}
+
+ )}
+
}
>
{message.content}
diff --git a/suite-common/message-system/config/config.v1.json b/suite-common/message-system/config/config.v1.json
index 916981e8a99..d7eec96c18d 100644
--- a/suite-common/message-system/config/config.v1.json
+++ b/suite-common/message-system/config/config.v1.json
@@ -1,7 +1,7 @@
{
"version": 1,
"timestamp": "2025-02-24T00:00:00+00:00",
- "sequence": 81,
+ "sequence": 82,
"actions": [
{
"conditions": [
@@ -294,6 +294,66 @@
}
}
},
+ {
+ "conditions": [
+ {
+ "settings": [
+ {
+ "sol": true
+ }
+ ],
+ "environment": {
+ "desktop": ">25.3.0",
+ "mobile": "!",
+ "web": ">25.3.0"
+ }
+ }
+ ],
+ "message": {
+ "id": "ccd7b443-1e0e-449e-b58f-affa0459a29d",
+ "priority": 93,
+ "dismissible": true,
+ "variant": "info",
+ "category": ["context"],
+ "content": {
+ "content": {
+ "en-GB": "For the best Solana staking experience, update your Trezor firmware to the latest version.",
+ "en": "For the best Solana staking experience, update your Trezor firmware to the latest version.",
+ "es": "Para la mejor experiencia de staking en Solana, actualiza el firmware de tu Trezor a la última versión.",
+ "cs": "Aby byl váš staking na Solaně co nejefektivnější, aktualizujte firmware vašeho Trezoru na nejnovější verzi.",
+ "ru": "Для наилучшего опыта стейкинга Solana обновите прошивку вашего Trezor до последней версии.",
+ "ja": "最高のSolanaステーキング体験を得るために、Trezorのファームウェアを最新バージョンに更新してください。",
+ "hu": "A legjobb Solana staking élményért frissítsd a Trezor firmware-ét a legújabb verzióra.",
+ "it": "Per la migliore esperienza di staking su Solana, aggiorna il firmware del tuo Trezor all'ultima versione.",
+ "fr": "Pour la meilleure expérience de staking sur Solana, mettez à jour le firmware de votre Trezor vers la dernière version.",
+ "de": "Für das beste Solana-Staking-Erlebnis, aktualisiere die Firmware deines Trezor auf die neueste Version.",
+ "tr": "En iyi Solana staking deneyimi için Trezor cihazınızın yazılımını en son sürüme güncelleyin.",
+ "pt": "Para a melhor experiência de staking em Solana, atualize o firmware do seu Trezor para a versão mais recente.",
+ "uk": "Для найкращого досвіду стейкінгу Solana оновіть прошивку свого Trezor до останньої версії."
+ }
+ },
+ "cta": {
+ "action": "internal-link",
+ "link": "firmware-index",
+ "label": {
+ "en-GB": "Update now",
+ "en": "Update now",
+ "es": "Actualizar ahora",
+ "cs": "Aktualizujte nyní",
+ "ru": "Обновить сейчас",
+ "ja": "今すぐアップデート",
+ "hu": "Frissítés most",
+ "it": "Aggiorna ora",
+ "fr": "Mettre à jour maintenant",
+ "de": "Jetzt aktualisieren",
+ "tr": "Şimdi güncelle",
+ "pt": "Atualizar agora",
+ "uk": "Оновити зараз"
+ }
+ },
+ "context": { "domain": "accounts.sol.staking" }
+ }
+ },
{
"conditions": [
{
@@ -1239,7 +1299,7 @@
"priority": 96,
"dismissible": true,
"variant": "critical",
- "category": "banner",
+ "category": ["banner"],
"content": {
"en-GB": "Updating the firmware may wipe your Trezor. Verify your backup now to ensure you can recover your assets.",
"en": "Updating the firmware may wipe your Trezor. Verify your backup now to ensure you can recover your assets.",
diff --git a/suite-common/message-system/src/messageSystemTypes.ts b/suite-common/message-system/src/messageSystemTypes.ts
index cb03bb7c068..6fb16c6b265 100644
--- a/suite-common/message-system/src/messageSystemTypes.ts
+++ b/suite-common/message-system/src/messageSystemTypes.ts
@@ -36,6 +36,7 @@ export type FeatureDomain = (typeof Feature)[keyof typeof Feature];
export const Context = {
coinjoin: 'accounts.coinjoin',
ethStaking: 'accounts.eth.staking',
+ solStaking: 'accounts.sol.staking',
} as const;
export type ContextDomain = (typeof Context)[keyof typeof Context];