From 6bcb658d4443148aa6d0a24d2178613e9620426b Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sun, 23 Mar 2025 16:47:06 +0800 Subject: [PATCH] :bug: Fix platform specific captcha solution cause build failed. --- lib/screens/auth/register.dart | 2 +- lib/screens/captcha/captcha.dart | 3 ++ lib/screens/captcha/captcha_native.dart | 37 +++++++++++++++++ .../captcha_web.dart} | 40 +++---------------- lib/screens/home.dart | 2 +- 5 files changed, 48 insertions(+), 36 deletions(-) create mode 100644 lib/screens/captcha/captcha.dart create mode 100644 lib/screens/captcha/captcha_native.dart rename lib/screens/{captcha.dart => captcha/captcha_web.dart} (54%) diff --git a/lib/screens/auth/register.dart b/lib/screens/auth/register.dart index aebabd8..eb18c37 100644 --- a/lib/screens/auth/register.dart +++ b/lib/screens/auth/register.dart @@ -7,7 +7,7 @@ import 'package:material_symbols_icons/symbols.dart'; import 'package:provider/provider.dart'; import 'package:styled_widget/styled_widget.dart'; import 'package:surface/providers/sn_network.dart'; -import 'package:surface/screens/captcha.dart'; +import 'package:surface/screens/captcha/captcha.dart'; import 'package:surface/widgets/dialog.dart'; import 'package:surface/widgets/navigation/app_scaffold.dart'; import 'package:url_launcher/url_launcher_string.dart'; diff --git a/lib/screens/captcha/captcha.dart b/lib/screens/captcha/captcha.dart new file mode 100644 index 0000000..81584fb --- /dev/null +++ b/lib/screens/captcha/captcha.dart @@ -0,0 +1,3 @@ +import 'package:flutter/foundation.dart' show kIsWeb; + +export 'captcha_native.dart' if (kIsWeb) 'captcha_web.dart'; diff --git a/lib/screens/captcha/captcha_native.dart b/lib/screens/captcha/captcha_native.dart new file mode 100644 index 0000000..4274a0d --- /dev/null +++ b/lib/screens/captcha/captcha_native.dart @@ -0,0 +1,37 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:provider/provider.dart'; +import 'package:surface/providers/config.dart'; +import 'package:surface/widgets/navigation/app_scaffold.dart'; + +class CaptchaScreen extends StatefulWidget { + const CaptchaScreen({super.key}); + + @override + State createState() => _CaptchaScreenState(); +} + +class _CaptchaScreenState extends State { + @override + Widget build(BuildContext context) { + final cfg = context.read(); + + return AppScaffold( + appBar: AppBar(title: Text("reCaptcha").tr()), + body: InAppWebView( + initialUrlRequest: URLRequest( + url: WebUri('${cfg.serverUrl}/captcha?redirect_uri=solink://captcha'), + ), + shouldOverrideUrlLoading: (controller, navigationAction) async { + Uri? url = navigationAction.request.url; + if (url != null && url.queryParameters.containsKey('captcha_tk')) { + Navigator.pop(context, url.queryParameters['captcha_tk']!); + return NavigationActionPolicy.CANCEL; + } + return NavigationActionPolicy.ALLOW; + }, + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/captcha.dart b/lib/screens/captcha/captcha_web.dart similarity index 54% rename from lib/screens/captcha.dart rename to lib/screens/captcha/captcha_web.dart index c1d70f9..8e89382 100644 --- a/lib/screens/captcha.dart +++ b/lib/screens/captcha/captcha_web.dart @@ -1,17 +1,13 @@ import 'dart:html' as html; import 'dart:ui_web' as ui; import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/material.dart'; -import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:provider/provider.dart'; import 'package:surface/providers/config.dart'; import 'package:surface/widgets/navigation/app_scaffold.dart'; class CaptchaScreen extends StatefulWidget { - const CaptchaScreen({ - super.key, - }); + const CaptchaScreen({super.key}); @override State createState() => _CaptchaScreenState(); @@ -21,9 +17,7 @@ class _CaptchaScreenState extends State { @override void initState() { super.initState(); - if (kIsWeb) { - _setupWebListener(); - } + _setupWebListener(); } void _setupWebListener() { @@ -37,9 +31,8 @@ class _CaptchaScreenState extends State { } }); - // Create an iframe for the captcha page final iframe = html.IFrameElement() - ..src = '${context.read().serverUrl}/captcha?redirect_uri=solink://captcha' + ..src = '${context.read().serverUrl}/captcha?redirect_uri=web' ..style.border = 'none' ..width = '100%' ..height = '100%'; @@ -47,36 +40,15 @@ class _CaptchaScreenState extends State { html.document.body!.append(iframe); ui.platformViewRegistry.registerViewFactory( 'captcha-iframe', - (int viewId) => iframe, + (int viewId) => iframe, ); } @override Widget build(BuildContext context) { - final cfg = context.read(); - - if (kIsWeb) { - return AppScaffold( - appBar: AppBar(title: Text("reCaptcha").tr()), - body: HtmlElementView(viewType: 'captcha-iframe'), - ); - } - return AppScaffold( appBar: AppBar(title: Text("reCaptcha").tr()), - body: InAppWebView( - initialUrlRequest: URLRequest( - url: WebUri('${cfg.serverUrl}/captcha?redirect_uri=solink://captcha'), - ), - shouldOverrideUrlLoading: (controller, navigationAction) async { - Uri? url = navigationAction.request.url; - if (url != null && url.queryParameters.containsKey('captcha_tk')) { - Navigator.pop(context, url.queryParameters['captcha_tk']!); - return NavigationActionPolicy.CANCEL; - } - return NavigationActionPolicy.ALLOW; - }, - ), + body: HtmlElementView(viewType: 'captcha-iframe'), ); } -} +} \ No newline at end of file diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 77865a7..886b69c 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -18,7 +18,7 @@ import 'package:surface/providers/sn_network.dart'; import 'package:surface/providers/special_day.dart'; import 'package:surface/providers/userinfo.dart'; import 'package:surface/providers/widget.dart'; -import 'package:surface/screens/captcha.dart'; +import 'package:surface/screens/captcha/captcha.dart'; import 'package:surface/types/check_in.dart'; import 'package:surface/types/post.dart'; import 'package:surface/widgets/app_bar_leading.dart';