Merge branch 'dev' into 'master'

UX: search: action button is paste address if an address is present in clipboard

See merge request clients/gecko!51
This commit is contained in:
pokapow 2022-12-08 08:20:36 +01:00
commit 6020310805
7 changed files with 81 additions and 14 deletions

View File

@ -202,5 +202,6 @@
"received": "Received", "received": "Received",
"sent": "Sent", "sent": "Sent",
"createIdentity": "Create a new \nidentity", "createIdentity": "Create a new \nidentity",
"memberAccountOf": "Account of {}" "memberAccountOf": "Account of {}",
"pasteAddress": "Paste address from\nclipboard"
} }

View File

@ -203,5 +203,6 @@
"received": "Received", "received": "Received",
"sent": "Sent", "sent": "Sent",
"createIdentity": "Create a new \nidentity", "createIdentity": "Create a new \nidentity",
"memberAccountOf": "Account of {}" "memberAccountOf": "Account of {}",
"pasteAddress": "Paste address from\nclipboard"
} }

View File

@ -203,5 +203,6 @@
"received": "Reçus", "received": "Reçus",
"sent": "Envoyés", "sent": "Envoyés",
"createIdentity": "Créer sa nouvelle\nidentité", "createIdentity": "Créer sa nouvelle\nidentité",
"memberAccountOf": "Compte de {}" "memberAccountOf": "Compte de {}",
"pasteAddress": "Coller l'adresse depuis\nle presse-papier"
} }

View File

@ -402,6 +402,24 @@ Future<void> infoPopup(BuildContext context, String title) async {
); );
} }
bool isAddress(address) {
final RegExp regExp = RegExp(
r'^[a-zA-Z0-9]+$',
caseSensitive: false,
multiLine: false,
);
if (regExp.hasMatch(address) == true &&
address.length > 45 &&
address.length < 52) {
log.d("C'est une adresse !");
return true;
} else {
return false;
}
}
// Widget geckoAppBar() { // Widget geckoAppBar() {
// return AppBar( // return AppBar(
// toolbarHeight: 60 * ratio, // toolbarHeight: 60 * ratio,

View File

@ -1,24 +1,49 @@
import 'package:easy_localization/easy_localization.dart'; // ignore_for_file: use_build_context_synchronously
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
// import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/search.dart'; import 'package:gecko/providers/search.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/search_result.dart'; import 'package:gecko/screens/search_result.dart';
import 'package:gecko/screens/wallet_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
// import 'package:gecko/models/home.dart';
// import 'package:provider/provider.dart';
class SearchScreen extends StatelessWidget { class SearchScreen extends StatefulWidget {
const SearchScreen({Key? key}) : super(key: key); const SearchScreen({Key? key}) : super(key: key);
@override
State<SearchScreen> createState() => _SearchScreenState();
}
class _SearchScreenState extends State<SearchScreen> {
bool canPasteAddress = false;
String pastedAddress = '';
Future getClipBoard() async {
final clipboard = await Clipboard.getData('text/plain');
pastedAddress = clipboard?.text ?? '';
canPasteAddress = isAddress(pastedAddress);
}
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) async {
await getClipBoard();
});
super.initState();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final searchProvider = Provider.of<SearchProvider>(context); final searchProvider = Provider.of<SearchProvider>(context);
final screenHeight = MediaQuery.of(context).size.height; final screenHeight = MediaQuery.of(context).size.height;
final canValidate = searchProvider.searchController.text.length >= 2;
// final canPasteAddress = false;
return WillPopScope( return WillPopScope(
onWillPop: () { onWillPop: () {
searchProvider.searchController.text = ''; searchProvider.searchController.text = '';
@ -63,7 +88,11 @@ class SearchScreen extends StatelessWidget {
autofocus: true, autofocus: true,
maxLines: 1, maxLines: 1,
textAlign: TextAlign.left, textAlign: TextAlign.left,
onChanged: (v) => searchProvider.reload(), onChanged: (v) async => {
await getClipBoard(),
setState(() {}),
searchProvider.reload()
},
decoration: InputDecoration( decoration: InputDecoration(
filled: true, filled: true,
fillColor: Colors.white, fillColor: Colors.white,
@ -104,7 +133,7 @@ class SearchScreen extends StatelessWidget {
foregroundColor: Colors.white, elevation: 4, foregroundColor: Colors.white, elevation: 4,
backgroundColor: orangeC, // foreground backgroundColor: orangeC, // foreground
), ),
onPressed: searchProvider.searchController.text.length >= 2 onPressed: canValidate
? () { ? () {
Navigator.push( Navigator.push(
context, context,
@ -113,9 +142,23 @@ class SearchScreen extends StatelessWidget {
}), }),
); );
} }
: null, : canPasteAddress
? () async {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return WalletViewScreen(
address: pastedAddress, username: '');
}),
);
}
: null,
child: Text( child: Text(
'search'.tr(), canValidate
? 'search'.tr()
: canPasteAddress
? 'pasteAddress'.tr()
: 'search'.tr(),
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: const TextStyle( style: const TextStyle(
fontSize: 21, fontWeight: FontWeight.w600), fontSize: 21, fontWeight: FontWeight.w600),

View File

@ -5,6 +5,7 @@ import 'package:gecko/globals.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/search.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart'; import 'package:gecko/screens/myWallets/wallets_home.dart';
@ -19,8 +20,9 @@ class GeckoBottomAppBar extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final myWalletProvider = final myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
WalletsProfilesProvider historyProvider = final historyProvider =
Provider.of<WalletsProfilesProvider>(context, listen: false); Provider.of<WalletsProfilesProvider>(context, listen: false);
final searchProvider = Provider.of<SearchProvider>(context, listen: false);
final size = MediaQuery.of(context).size; final size = MediaQuery.of(context).size;
const bool showBottomBar = true; const bool showBottomBar = true;
@ -40,6 +42,7 @@ class GeckoBottomAppBar extends StatelessWidget {
iconSize: 40, iconSize: 40,
icon: const Image(image: AssetImage('assets/loupe-noire.png')), icon: const Image(image: AssetImage('assets/loupe-noire.png')),
onPressed: () { onPressed: () {
searchProvider.reload();
Navigator.popUntil( Navigator.popUntil(
context, context,
ModalRoute.withName('/'), ModalRoute.withName('/'),

View File

@ -5,7 +5,7 @@ description: Pay with G1.
# pub.dev using `pub publish`. This is preferred for private packages. # pub.dev using `pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 0.0.15+47 version: 0.0.15+48
environment: environment:
sdk: '>=2.12.0 <3.0.0' sdk: '>=2.12.0 <3.0.0'