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",
"sent": "Sent",
"createIdentity": "Create a new \nidentity",
"memberAccountOf": "Account of {}"
"memberAccountOf": "Account of {}",
"pasteAddress": "Paste address from\nclipboard"
}

View File

@ -203,5 +203,6 @@
"received": "Received",
"sent": "Sent",
"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",
"sent": "Envoyés",
"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() {
// return AppBar(
// 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:flutter/material.dart';
import 'package:gecko/models/widgets_keys.dart';
// import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/search.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/search_result.dart';
import 'package:gecko/screens/wallet_view.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);
@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
Widget build(BuildContext context) {
final searchProvider = Provider.of<SearchProvider>(context);
final screenHeight = MediaQuery.of(context).size.height;
final canValidate = searchProvider.searchController.text.length >= 2;
// final canPasteAddress = false;
return WillPopScope(
onWillPop: () {
searchProvider.searchController.text = '';
@ -63,7 +88,11 @@ class SearchScreen extends StatelessWidget {
autofocus: true,
maxLines: 1,
textAlign: TextAlign.left,
onChanged: (v) => searchProvider.reload(),
onChanged: (v) async => {
await getClipBoard(),
setState(() {}),
searchProvider.reload()
},
decoration: InputDecoration(
filled: true,
fillColor: Colors.white,
@ -104,7 +133,7 @@ class SearchScreen extends StatelessWidget {
foregroundColor: Colors.white, elevation: 4,
backgroundColor: orangeC, // foreground
),
onPressed: searchProvider.searchController.text.length >= 2
onPressed: canValidate
? () {
Navigator.push(
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(
'search'.tr(),
canValidate
? 'search'.tr()
: canPasteAddress
? 'pasteAddress'.tr()
: 'search'.tr(),
textAlign: TextAlign.center,
style: const TextStyle(
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/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/search.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart';
@ -19,8 +20,9 @@ class GeckoBottomAppBar extends StatelessWidget {
Widget build(BuildContext context) {
final myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
WalletsProfilesProvider historyProvider =
final historyProvider =
Provider.of<WalletsProfilesProvider>(context, listen: false);
final searchProvider = Provider.of<SearchProvider>(context, listen: false);
final size = MediaQuery.of(context).size;
const bool showBottomBar = true;
@ -40,6 +42,7 @@ class GeckoBottomAppBar extends StatelessWidget {
iconSize: 40,
icon: const Image(image: AssetImage('assets/loupe-noire.png')),
onPressed: () {
searchProvider.reload();
Navigator.popUntil(
context,
ModalRoute.withName('/'),

View File

@ -5,7 +5,7 @@ description: Pay with G1.
# 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
version: 0.0.15+47
version: 0.0.15+48
environment:
sdk: '>=2.12.0 <3.0.0'