From b85422c1bc37f9e863b340776ca733d0612c4380 Mon Sep 17 00:00:00 2001 From: Booker Date: Mon, 25 May 2026 17:03:30 +0700 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=20homeUrl=20?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E4=BB=A5=E6=94=AF=E6=8C=81=E4=BC=A0=E9=80=92?= =?UTF-8?q?=E5=BA=94=E7=94=A8=20logo=EF=BC=8C=E5=A2=9E=E5=BC=BA=20URL=20?= =?UTF-8?q?=E7=94=9F=E6=88=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/config/app_config.dart | 19 +++++++++++++++++-- lib/main.dart | 1 + test/widget_test.dart | 15 +++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index f51703e..7cc4ef3 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -17,13 +17,14 @@ class AppConfig { return _environmentHosts[currentEnvironment] ?? const []; } - static String homeUrl({String? appName}) { + static String homeUrl({String? appName, String? appLogo}) { final host = environmentHosts.isNotEmpty ? environmentHosts.first : 'h5-im.imharry.work'; return _withShellBranding( _normalizeHomeUrl(host), appName: appName, + appLogo: appLogo, ); } @@ -38,17 +39,31 @@ class AppConfig { static String _withShellBranding( String url, { String? appName, + String? appLogo, }) { final uri = Uri.parse(url); final queryParameters = Map.from(uri.queryParameters) ..['flutter_shell'] = '1' ..['shell_cache_bust'] = DateTime.now().millisecondsSinceEpoch.toString(); + final fragmentParameters = Uri.splitQueryString(uri.fragment); final trimmedName = (appName ?? AppConfig.appName).trim(); if (trimmedName.isNotEmpty) { queryParameters['shell_app_name'] = trimmedName; } - return uri.replace(queryParameters: queryParameters).toString(); + final trimmedLogo = (appLogo ?? AppConfig.appLogo).trim(); + if (trimmedLogo.isNotEmpty) { + fragmentParameters['shell_app_logo'] = trimmedLogo; + } + + return uri + .replace( + queryParameters: queryParameters, + fragment: fragmentParameters.isEmpty + ? null + : Uri(queryParameters: fragmentParameters).query, + ) + .toString(); } } diff --git a/lib/main.dart b/lib/main.dart index 2959a2b..3b10fd7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -219,6 +219,7 @@ class _H5ShellPageState extends State with WidgetsBindingObserver { WidgetsBinding.instance.addObserver(this); _homeUrl = AppConfig.homeUrl( appName: widget.shellBranding.appName, + appLogo: widget.shellBranding.appLogo, ); _controller = _buildController()..loadRequest(Uri.parse(_homeUrl)); } diff --git a/test/widget_test.dart b/test/widget_test.dart index 5c00c39..5916b0f 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,5 +1,6 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:im_webview_app/config/app_config.dart'; import 'package:im_webview_app/main.dart'; void main() { @@ -9,4 +10,18 @@ void main() { isA(), ); }); + + test('passes shell branding name and logo to the H5 URL', () { + const logo = 'data:image/png;base64,abc+/='; + + final uri = Uri.parse( + AppConfig.homeUrl(appName: 'Shell Test', appLogo: logo), + ); + + expect(uri.queryParameters['flutter_shell'], '1'); + expect(uri.queryParameters['shell_app_name'], 'Shell Test'); + expect(uri.queryParameters.containsKey('shell_app_logo'), isFalse); + expect(uri.toString(), isNot(contains('%25'))); + expect(Uri.splitQueryString(uri.fragment)['shell_app_logo'], logo); + }); }