Add optional image parameter to showInputDialog for captcha support. Close #422

This commit is contained in:
2025-07-22 17:51:40 +08:00
parent f2f5a4f573
commit 7035f11eb5
3 changed files with 26 additions and 11 deletions

View File

@@ -1322,13 +1322,15 @@ let UI = {
* Show an input dialog * Show an input dialog
* @param title {string} * @param title {string}
* @param validator {(string) => string | null | undefined} - A function that validates the input. If the function returns a string, the dialog will show the error message. * @param validator {(string) => string | null | undefined} - A function that validates the input. If the function returns a string, the dialog will show the error message.
* @param image {string?} - Available since 1.4.6. An optional image to show in the dialog. You can use this to show a captcha.
* @returns {Promise<string | null>} - The input value. If the dialog is canceled, return null. * @returns {Promise<string | null>} - The input value. If the dialog is canceled, return null.
*/ */
showInputDialog: (title, validator) => { showInputDialog: (title, validator, image) => {
return sendMessage({ return sendMessage({
method: 'UI', method: 'UI',
function: 'showInputDialog', function: 'showInputDialog',
title: title, title: title,
image: image,
validator: validator validator: validator
}) })
}, },

View File

@@ -37,9 +37,11 @@ mixin class JsUiApi {
case 'showInputDialog': case 'showInputDialog':
var title = message['title']; var title = message['title'];
var validator = message['validator']; var validator = message['validator'];
var image = message['image'];
if (title is! String) return; if (title is! String) return;
if (validator != null && validator is! JSInvokable) return; if (validator != null && validator is! JSInvokable) return;
return _showInputDialog(title, validator); if (image != null && image is! String) return;
return _showInputDialog(title, validator, image);
case 'showSelectDialog': case 'showSelectDialog':
var title = message['title']; var title = message['title'];
var options = message['options']; var options = message['options'];
@@ -124,12 +126,13 @@ mixin class JsUiApi {
controller?.close(); controller?.close();
} }
Future<String?> _showInputDialog(String title, JSInvokable? validator) async { Future<String?> _showInputDialog(String title, JSInvokable? validator, String? image) async {
String? result; String? result;
var func = validator == null ? null : JSAutoFreeFunction(validator); var func = validator == null ? null : JSAutoFreeFunction(validator);
await showInputDialog( await showInputDialog(
context: App.rootContext, context: App.rootContext,
title: title, title: title,
image: image,
onConfirm: (v) { onConfirm: (v) {
if (func != null) { if (func != null) {
var res = func.call([v]); var res = func.call([v]);

View File

@@ -359,6 +359,7 @@ Future<void> showInputDialog({
String confirmText = "Confirm", String confirmText = "Confirm",
String cancelText = "Cancel", String cancelText = "Cancel",
RegExp? inputValidator, RegExp? inputValidator,
String? image,
}) { }) {
var controller = TextEditingController(text: initialValue); var controller = TextEditingController(text: initialValue);
bool isLoading = false; bool isLoading = false;
@@ -371,7 +372,14 @@ Future<void> showInputDialog({
builder: (context, setState) { builder: (context, setState) {
return ContentDialog( return ContentDialog(
title: title, title: title,
content: TextField( content: Column(
children: [
if (image != null)
SizedBox(
height: 108,
child: Image.network(image, fit: BoxFit.none),
).paddingBottom(8),
TextField(
controller: controller, controller: controller,
decoration: InputDecoration( decoration: InputDecoration(
hintText: hintText, hintText: hintText,
@@ -379,6 +387,8 @@ Future<void> showInputDialog({
errorText: error, errorText: error,
), ),
).paddingHorizontal(12), ).paddingHorizontal(12),
],
),
actions: [ actions: [
Button.filled( Button.filled(
isLoading: isLoading, isLoading: isLoading,