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];