♻️ Refactored the captcha

This commit is contained in:
2025-11-09 14:21:33 +08:00
parent 4927795260
commit f254cfa81e
6 changed files with 28 additions and 20 deletions

View File

@@ -84,9 +84,7 @@ class AccountSettingsScreen extends HookConsumerWidget {
'accountPasswordChange'.tr(), 'accountPasswordChange'.tr(),
); );
if (!confirm || !context.mounted) return; if (!confirm || !context.mounted) return;
final captchaTk = await Navigator.of( final captchaTk = await CaptchaScreen.show(context);
context,
).push(MaterialPageRoute(builder: (context) => CaptchaScreen()));
if (captchaTk == null) return; if (captchaTk == null) return;
try { try {
if (context.mounted) showLoadingModal(context); if (context.mounted) showLoadingModal(context);

View File

@@ -2,9 +2,17 @@ import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:island/screens/auth/captcha.config.dart'; import 'package:island/screens/auth/captcha.config.dart';
import 'package:island/widgets/app_scaffold.dart'; import 'package:island/widgets/content/sheet.dart';
class CaptchaScreen extends ConsumerWidget { class CaptchaScreen extends ConsumerWidget {
static Future<String?> show(BuildContext context) {
return showModalBottomSheet<String>(
context: context,
isScrollControlled: true,
builder: (context) => const CaptchaScreen(),
);
}
const CaptchaScreen({super.key}); const CaptchaScreen({super.key});
@override @override
@@ -13,9 +21,9 @@ class CaptchaScreen extends ConsumerWidget {
if (!captchaUrl.hasValue) return Center(child: CircularProgressIndicator()); if (!captchaUrl.hasValue) return Center(child: CircularProgressIndicator());
return AppScaffold( return SheetScaffold(
appBar: AppBar(title: Text("Anti-Robot")), titleText: "Anti-Robot",
body: InAppWebView( child: InAppWebView(
initialUrlRequest: URLRequest( initialUrlRequest: URLRequest(
url: WebUri('${captchaUrl.value}?redirect_uri=solian://captcha'), url: WebUri('${captchaUrl.value}?redirect_uri=solian://captcha'),
), ),

View File

@@ -4,11 +4,19 @@ import 'dart:ui_web' as ui;
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/pods/config.dart'; import 'package:island/pods/config.dart';
import 'package:island/screens/auth/captcha.config.dart'; import 'package:island/screens/auth/captcha.config.dart';
import 'package:island/widgets/app_scaffold.dart'; import 'package:island/widgets/content/sheet.dart';
import 'package:web/web.dart' as web; import 'package:web/web.dart' as web;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class CaptchaScreen extends ConsumerStatefulWidget { class CaptchaScreen extends ConsumerStatefulWidget {
static Future<String?> show(BuildContext context) {
return showModalBottomSheet<String>(
context: context,
isScrollControlled: true,
builder: (context) => const CaptchaScreen(),
);
}
const CaptchaScreen({super.key}); const CaptchaScreen({super.key});
@override @override
@@ -61,9 +69,9 @@ class _CaptchaScreenState extends ConsumerState<CaptchaScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AppScaffold( return SheetScaffold(
appBar: AppBar(title: Text("Anti-Robot")), titleText: "Anti-Robot",
body: child:
_isInitialized _isInitialized
? HtmlElementView(viewType: 'captcha-iframe') ? HtmlElementView(viewType: 'captcha-iframe')
: Center(child: CircularProgressIndicator()), : Center(child: CircularProgressIndicator()),

View File

@@ -38,9 +38,7 @@ class CreateAccountScreen extends HookConsumerWidget {
void performAction() async { void performAction() async {
if (!formKey.currentState!.validate()) return; if (!formKey.currentState!.validate()) return;
final captchaTk = await Navigator.of( final captchaTk = await CaptchaScreen.show(context);
context,
).push(MaterialPageRoute(builder: (context) => CaptchaScreen()));
if (captchaTk == null) return; if (captchaTk == null) return;
if (!context.mounted) return; if (!context.mounted) return;

View File

@@ -523,9 +523,7 @@ class _LoginLookupScreen extends HookConsumerWidget {
showErrorAlert('loginResetPasswordHint'.tr()); showErrorAlert('loginResetPasswordHint'.tr());
return; return;
} }
final captchaTk = await Navigator.of( final captchaTk = await CaptchaScreen.show(context);
context,
).push(MaterialPageRoute(builder: (context) => CaptchaScreen()));
if (captchaTk == null) return; if (captchaTk == null) return;
isBusy.value = true; isBusy.value = true;
try { try {

View File

@@ -104,9 +104,7 @@ class CheckInWidget extends HookConsumerWidget {
} catch (err) { } catch (err) {
if (err is DioException) { if (err is DioException) {
if (err.response?.statusCode == 423 && context.mounted) { if (err.response?.statusCode == 423 && context.mounted) {
final captchaTk = await Navigator.of( final captchaTk = await CaptchaScreen.show(context);
context,
).push(MaterialPageRoute(builder: (context) => CaptchaScreen()));
if (captchaTk == null) return; if (captchaTk == null) return;
return await checkIn(captchatTk: captchaTk); return await checkIn(captchatTk: captchaTk);
} }