From 65a671470d1be2157ac2670e9eb1933cda90581f Mon Sep 17 00:00:00 2001 From: c0mrade Date: Thu, 5 Feb 2026 11:27:03 +0300 Subject: [PATCH] feat: use app-level svgIconKey for app logos and improve tile contrast - Add svgIconKey field to RemnawaveAppClient and RemnawaveApp types - Render app logos from svgLibrary via app.svgIconKey on connection page chips with fallback to getAppIcon() by name - Use app.svgIconKey for app icons on admin apps settings page - Show featured indicator as amber dot matching original RemnaWave UI - Increase inner tile background opacity from 30% to 50% on subscription page for better text readability --- src/api/adminApps.ts | 1 + src/pages/AdminApps.tsx | 19 +++---------------- src/pages/Connection.tsx | 20 +++++++++++++++----- src/pages/Subscription.tsx | 32 ++++++++++++++++---------------- src/types/index.ts | 1 + 5 files changed, 36 insertions(+), 37 deletions(-) diff --git a/src/api/adminApps.ts b/src/api/adminApps.ts index 8a8e16f..e0ee75d 100644 --- a/src/api/adminApps.ts +++ b/src/api/adminApps.ts @@ -113,6 +113,7 @@ export interface RemnawaveApp { featured?: boolean; urlScheme?: string; isNeedBase64Encoding?: boolean; + svgIconKey?: string; blocks: RemnawaveBlock[]; } diff --git a/src/pages/AdminApps.tsx b/src/pages/AdminApps.tsx index 4efb2fb..fbdbdf0 100644 --- a/src/pages/AdminApps.tsx +++ b/src/pages/AdminApps.tsx @@ -221,7 +221,6 @@ function AppCard({ lang: string; }) { const [expanded, setExpanded] = useState(false); - const firstBlock = app.blocks?.[0]; return (
@@ -229,21 +228,9 @@ function AppCard({ onClick={() => setExpanded(!expanded)} className="flex w-full items-center gap-4 p-4 text-left" > - {/* Icon from first block */} -
- {renderSvgIcon(svgLibrary, firstBlock?.svgIconKey, firstBlock?.svgIconColor) || ( - - )} + {/* App icon from svgLibrary */} +
+ {renderSvgIcon(svgLibrary, app.svgIconKey) || }
{/* Name + badges */} diff --git a/src/pages/Connection.tsx b/src/pages/Connection.tsx index 6fabed7..791fb87 100644 --- a/src/pages/Connection.tsx +++ b/src/pages/Connection.tsx @@ -482,6 +482,7 @@ export default function Connection() {
{currentPlatformApps.map((app, idx) => { const isSelected = currentApp?.name === app.name; + const appIconSvg = getSvgHtml(app.svgIconKey); return ( @@ -553,7 +560,10 @@ export default function Connection() { : ''); return ( -
+
{/* SVG icon */} {svgHtml && ( diff --git a/src/pages/Subscription.tsx b/src/pages/Subscription.tsx index 8ba8244..bb0311f 100644 --- a/src/pages/Subscription.tsx +++ b/src/pages/Subscription.tsx @@ -1117,7 +1117,7 @@ export default function Subscription() { {!showDeviceTopup ? ( ) : ( -
+

{t('subscription.buyDevices')}

) : ( -
+

{t('subscription.additionalOptions.reduceDevicesTitle')} @@ -1444,7 +1444,7 @@ export default function Subscription() { {!showTrafficTopup ? ( ) : ( -
+

{t('subscription.additionalOptions.buyTrafficTitle')} @@ -1504,7 +1504,7 @@ export default function Subscription() { className={`rounded-xl border p-4 text-center transition-all ${ selectedTrafficPackage === pkg.gb ? 'border-accent-500 bg-accent-500/10' - : 'border-dark-700/50 bg-dark-800/30 hover:border-dark-600' + : 'border-dark-700/50 bg-dark-800/50 hover:border-dark-600' }`} >
@@ -1584,7 +1584,7 @@ export default function Subscription() { {!showServerManagement ? ( ) : ( -
+

{t('subscription.additionalOptions.manageServersTitle')} @@ -1671,7 +1671,7 @@ export default function Subscription() { : 'border-accent-500 bg-accent-500/10' : willBeRemoved ? 'border-error-500/50 bg-error-500/5' - : 'border-dark-700/50 bg-dark-800/30 hover:border-dark-600' + : 'border-dark-700/50 bg-dark-800/50 hover:border-dark-600' } ${!country.is_available && !isCurrentlyConnected ? 'cursor-not-allowed opacity-50' : ''}`} >
@@ -1884,7 +1884,7 @@ export default function Subscription() { {devicesData.devices.map((device) => (
@@ -2484,7 +2484,7 @@ export default function Subscription() {
{/* Tariff Info */} -
+
{t('subscription.traffic')}: @@ -2648,7 +2648,7 @@ export default function Subscription() { className={`relative rounded-xl border p-4 text-left transition-all ${ selectedTariffPeriod?.days === period.days && !useCustomDays ? 'border-accent-500 bg-accent-500/10' - : 'border-dark-700/50 bg-dark-800/30 hover:border-dark-600' + : 'border-dark-700/50 bg-dark-800/50 hover:border-dark-600' }`} > {displayDiscount && displayDiscount > 0 && ( @@ -2685,7 +2685,7 @@ export default function Subscription() { {/* Custom days option */} {selectedTariff.custom_days_enabled && (selectedTariff.price_per_day_kopeks ?? 0) > 0 && ( -
+
{t('subscription.customDays.title')} @@ -2785,7 +2785,7 @@ export default function Subscription() {
{t('subscription.customTraffic.label')}
-
+
{t('subscription.customTraffic.selectVolume')} @@ -3256,7 +3256,7 @@ export default function Subscription() { selectedServers.includes(server.uuid) ? 'border-accent-500 bg-accent-500/10' : server.is_available - ? 'border-dark-700/50 bg-dark-800/30 hover:border-dark-600' + ? 'border-dark-700/50 bg-dark-800/50 hover:border-dark-600' : 'cursor-not-allowed border-dark-800/30 bg-dark-900/30 opacity-50' }`} > diff --git a/src/types/index.ts b/src/types/index.ts index bed39f7..858546e 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -524,6 +524,7 @@ export interface RemnawaveAppClient { name: string; featured?: boolean; deepLink?: string | null; + svgIconKey?: string; blocks: RemnawaveBlockClient[]; }