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:
commit
6020310805
|
@ -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"
|
||||||
}
|
}
|
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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('/'),
|
||||||
|
|
|
@ -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'
|
||||||
|
|
Loading…
Reference in New Issue