From c0338c3d8ebfcf955ca0f30d52737ea4fd925036 Mon Sep 17 00:00:00 2001 From: Levi Date: Sun, 8 Oct 2023 15:29:19 +0800 Subject: [PATCH] feat: auto recognize magnet uri (#230) --- .../create/controllers/create_controller.dart | 1 + .../app/modules/create/views/create_view.dart | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/ui/flutter/lib/app/modules/create/controllers/create_controller.dart b/ui/flutter/lib/app/modules/create/controllers/create_controller.dart index 4c4ddc42..b1206624 100644 --- a/ui/flutter/lib/app/modules/create/controllers/create_controller.dart +++ b/ui/flutter/lib/app/modules/create/controllers/create_controller.dart @@ -13,6 +13,7 @@ class CreateController extends GetxController final isResolving = false.obs; final showAdvanced = false.obs; late TabController advancedTabController; + final oldUrl = "".obs; final fileDataUri = "".obs; @override diff --git a/ui/flutter/lib/app/modules/create/views/create_view.dart b/ui/flutter/lib/app/modules/create/views/create_view.dart index ac804aa9..febf5eee 100644 --- a/ui/flutter/lib/app/modules/create/views/create_view.dart +++ b/ui/flutter/lib/app/modules/create/views/create_view.dart @@ -55,7 +55,10 @@ class CreateView extends GetView { _urlController.text = value!.text!; _urlController.selection = TextSelection.fromPosition( TextPosition(offset: _urlController.text.length)); + return; } + + recognizeMagnetUri(value!.text!); } }); } @@ -117,6 +120,10 @@ class CreateView extends GetView { }, onChanged: (v) async { controller.clearFileDataUri(); + if (controller.oldUrl.value.isEmpty) { + recognizeMagnetUri(v); + } + controller.oldUrl.value = v; }, ), ), @@ -237,6 +244,20 @@ class CreateView extends GetView { ); } + // recognize magnet uri, if length == 40, auto add magnet prefix + recognizeMagnetUri(String text) { + if (text.length != 40) { + return; + } + final exp = RegExp(r"[0-9a-fA-F]+"); + if (exp.hasMatch(text)) { + final uri = "magnet:?xt=urn:btih:$text"; + _urlController.text = uri; + _urlController.selection = TextSelection.fromPosition( + TextPosition(offset: _urlController.text.length)); + } + } + Future _doResolve() async { if (controller.isResolving.value) { return;