From d826cf442e99e2698aecfdc87ce03beba3bcf366 Mon Sep 17 00:00:00 2001 From: YannMarti <100758384+YannMarti@users.noreply.github.com> Date: Thu, 12 May 2022 11:38:40 +0200 Subject: [PATCH] added sending and recieving tokens function --- vidaia/android/app/build.gradle | 2 +- .../pages/exchange/exchange_page_loader.dart | 67 ++++++++++ .../pages/exchange/exchange_page_stack.dart | 119 ++++++++++++++++++ .../pages/exchange/receive/recieve_page.dart | 46 +++++++ vidaia/lib/pages/exchange/scan_page.dart | 27 ++++ vidaia/lib/pages/exchange/send/send_page.dart | 88 +++++++++++++ vidaia/lib/utils/globals.dart | 1 + vidaia/lib/widgets/vidaia_drawer.dart | 20 +++ vidaia/pubspec.lock | 21 ++++ vidaia/pubspec.yaml | 2 + 10 files changed, 392 insertions(+), 1 deletion(-) create mode 100644 vidaia/lib/pages/exchange/exchange_page_loader.dart create mode 100644 vidaia/lib/pages/exchange/exchange_page_stack.dart create mode 100644 vidaia/lib/pages/exchange/receive/recieve_page.dart create mode 100644 vidaia/lib/pages/exchange/scan_page.dart create mode 100644 vidaia/lib/pages/exchange/send/send_page.dart diff --git a/vidaia/android/app/build.gradle b/vidaia/android/app/build.gradle index 840bc8c..e5201aa 100644 --- a/vidaia/android/app/build.gradle +++ b/vidaia/android/app/build.gradle @@ -44,7 +44,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.vidaia" - minSdkVersion 18 + minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/vidaia/lib/pages/exchange/exchange_page_loader.dart b/vidaia/lib/pages/exchange/exchange_page_loader.dart new file mode 100644 index 0000000..998eb9f --- /dev/null +++ b/vidaia/lib/pages/exchange/exchange_page_loader.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:vidaia/main.dart'; +import 'package:vidaia/pages/exchange/exchange_page_stack.dart'; +import 'package:vidaia/pages/exchange/receive/recieve_page.dart'; +import 'package:vidaia/pages/exchange/send/send_page.dart'; +import 'package:vidaia/pages/home/history/buy_history_page.dart'; +import 'package:vidaia/pages/home/home/home_page.dart'; +import 'package:vidaia/pages/home/redeem/redeem_page.dart'; +import 'package:vidaia/repositories/dataRepository.dart'; + +class ExchangePage extends StatefulWidget { + ExchangePage({Key? key}) : super(key: key); + + @override + State createState() => _ExchangePageState(); +} + +class _ExchangePageState extends State { + late Future isDataLoaded; + + DataRepository dataRepository = getIt.get(); + + @override + void initState() { + super.initState(); + isDataLoaded = dataRepository.init(); + } + + final _pages = [SendPage(), RecievePage()]; + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: isDataLoaded, + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.done && snapshot.data == true) { + return ExchangePageStack(_pages); + } else if (snapshot.connectionState == ConnectionState.done && snapshot.hasError) { + return Padding( + padding: const EdgeInsets.only(top: 30), + child: Text( + 'Error: ${snapshot.error}', + style: TextStyle(fontSize: 20), + ), + ); + } else { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Center( + child: CircularProgressIndicator(), + ), + SizedBox( + height: 20, + ), + Text( + "Loading data", + style: TextStyle(color: Colors.black38, fontSize: 15, fontWeight: FontWeight.w400), + ), + ], + ), + ); + } + }); + } +} diff --git a/vidaia/lib/pages/exchange/exchange_page_stack.dart b/vidaia/lib/pages/exchange/exchange_page_stack.dart new file mode 100644 index 0000000..46d851f --- /dev/null +++ b/vidaia/lib/pages/exchange/exchange_page_stack.dart @@ -0,0 +1,119 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:vidaia/utils/constants.dart'; +import 'package:vidaia/utils/wallet.dart'; + +import '../../widgets/vidaia_drawer.dart'; + +class ExchangePageStack extends StatefulWidget { + final List list; + + ExchangePageStack(this.list); + + @override + State createState() => _ExchangePageStackState(); +} + +class _ExchangePageStackState extends State { + int _selectedIndex = 0; + + @override + void initState() { + super.initState(); + } + + void _onItemTapped(int index) { + setState(() { + _selectedIndex = index; + }); + } + + var scaffoldKey = GlobalKey(); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: BACKGROUND, + key: scaffoldKey, + drawerEnableOpenDragGesture: false, + appBar: AppBar( + automaticallyImplyLeading: false, + elevation: 0, + backgroundColor: BACKGROUND, + toolbarHeight: 90, + title: Stack(alignment: AlignmentDirectional.centerEnd, children: [ + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Row( + children: [ + Container( + padding: EdgeInsets.only( + left: 5, + ), + child: Image( + image: AssetImage("assets/images/vidar.png"), + height: 25, + ), + ), + Container( + padding: EdgeInsets.only( + left: 5, + ), + child: Text( + 'VID', + style: TextStyle(color: Colors.black), + ), + ), + ], + ), + StreamBuilder( + //initialData: 0.0, + stream: checkBalance(), + builder: (context, snapshot) { + switch (snapshot.connectionState) { + case ConnectionState.waiting: + return Container( + width: 20, + height: 20, + child: CircularProgressIndicator( + strokeWidth: 2, + color: PRIMARY_LIGHT, + )); + default: + if (snapshot.hasError) { + return Text(snapshot.error.toString()); + } else { + final balance = snapshot.data.toString(); + + return Text(balance, + style: TextStyle(color: PRIMARY_DARK, fontSize: 16)); + } + } + }, + ), + ]), + ]), + centerTitle: true, + ), + bottomNavigationBar: BottomNavigationBar( + selectedItemColor: PRIMARY, + unselectedItemColor: SECONDARY, + items: [ + BottomNavigationBarItem( + icon: Container(), + label: 'Send', + ), + BottomNavigationBarItem( + icon: Container(), + label: 'Recieve'.tr() + ), + ], + currentIndex: _selectedIndex, + onTap: _onItemTapped, + ), + body: IndexedStack( + index: _selectedIndex, + children: widget.list, + ), + ); + } +} diff --git a/vidaia/lib/pages/exchange/receive/recieve_page.dart b/vidaia/lib/pages/exchange/receive/recieve_page.dart new file mode 100644 index 0000000..b47cc20 --- /dev/null +++ b/vidaia/lib/pages/exchange/receive/recieve_page.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:vidaia/main.dart'; +import 'package:vidaia/repositories/dataRepository.dart'; +import 'package:qr_flutter/qr_flutter.dart'; +import 'package:vidaia/utils/globals.dart'; + +class RecievePage extends StatefulWidget { + const RecievePage({Key? key}) : super(key: key); + + @override + State createState() => _RecievePageState(); +} + +class _RecievePageState extends State { + DataRepository dataRepository = getIt.get(); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: Container(), + ), + Column( + children: [ + Container(child: Text('Recieve')), + QrImage( + data: address!, + size: 250, + ), + Text(address!), + TextButton( + onPressed: () { + Clipboard.setData(ClipboardData(text: address)); + }, + child: Text('Copy Address')), + ], + ), + Expanded( + child: Container(), + ), + ], + ); + } +} diff --git a/vidaia/lib/pages/exchange/scan_page.dart b/vidaia/lib/pages/exchange/scan_page.dart new file mode 100644 index 0000000..a9cf4b9 --- /dev/null +++ b/vidaia/lib/pages/exchange/scan_page.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'package:mobile_scanner/mobile_scanner.dart'; +import 'package:vidaia/utils/globals.dart' as global; + +class ScanPage extends StatefulWidget { + const ScanPage({Key? key}) : super(key: key); + + @override + State createState() => _ScanPageState(); +} + +class _ScanPageState extends State { + + @override + Widget build(BuildContext context) { + return MobileScanner( + allowDuplicates: false, + controller: MobileScannerController( + facing: CameraFacing.back, torchEnabled: false), + onDetect: (barcode, args) { + final String code = barcode.rawValue!; + global.qrCode = code; + debugPrint('Barcode found! $code'); + Navigator.pop(context); + }); + } +} diff --git a/vidaia/lib/pages/exchange/send/send_page.dart b/vidaia/lib/pages/exchange/send/send_page.dart new file mode 100644 index 0000000..cf099ea --- /dev/null +++ b/vidaia/lib/pages/exchange/send/send_page.dart @@ -0,0 +1,88 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:vidaia/main.dart'; +import 'package:vidaia/pages/exchange/scan_page.dart'; +import 'package:vidaia/repositories/dataRepository.dart'; +import 'package:mobile_scanner/mobile_scanner.dart'; +import 'package:vidaia/utils/globals.dart' as global; +import 'package:vidaia/utils/wallet.dart'; + +import '../../../utils/constants.dart'; + +class SendPage extends StatefulWidget { + const SendPage({Key? key}) : super(key: key); + + @override + State createState() => _SendPageState(); +} + +class _SendPageState extends State { + final addressController = TextEditingController(); + final valueController = TextEditingController(); + + @override + void dispose() { + valueController.dispose(); + addressController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Material( + type: MaterialType.transparency, + child: ListTile( + leading: const Icon( + Icons.qr_code, + color: PRIMARY_LIGHT, + ), + title: Text( + 'Scan QRCode'.tr(), + style: Theme.of(context).textTheme.subtitle1, + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => ScanPage()), + ); + }, + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + + decoration: InputDecoration( + border: OutlineInputBorder(), + hintText: "Receiver's Address", + ), + controller: addressController, + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + decoration: InputDecoration( + border: OutlineInputBorder(), + hintText: 'Amount', + ), + controller: valueController, + ), + ), + ElevatedButton( + onPressed: () { + addressController.text = '0x00bab3d8de4ebbefb07d53b1ff8c0f2434bd616d'; + }, + child: Text('set address')), + ElevatedButton( + onPressed: () { + transferVidar(int.parse(valueController.text), + addressController.text, 'https://testnet.veblocks.net'); + }, + child: Text('Send')), + ], + ); + } +} diff --git a/vidaia/lib/utils/globals.dart b/vidaia/lib/utils/globals.dart index 8bac05e..cc812ca 100644 --- a/vidaia/lib/utils/globals.dart +++ b/vidaia/lib/utils/globals.dart @@ -12,6 +12,7 @@ bool loginStatus = false; List? mnemonicPhrase; Uint8List? privateKey; Wallet? wallet; +String? qrCode; bool mnemonicNoted = false; diff --git a/vidaia/lib/widgets/vidaia_drawer.dart b/vidaia/lib/widgets/vidaia_drawer.dart index dab8f1e..12c8433 100644 --- a/vidaia/lib/widgets/vidaia_drawer.dart +++ b/vidaia/lib/widgets/vidaia_drawer.dart @@ -1,6 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:vidaia/main.dart'; +import 'package:vidaia/pages/exchange/exchange_page_loader.dart'; import 'package:vidaia/pages/home/home_page_loader.dart'; import 'package:vidaia/pages/login_page.dart'; import 'package:vidaia/pages/settings_page.dart'; @@ -82,6 +83,25 @@ class VidaiaDrawer extends StatelessWidget { }, ), ), + Material( + type: MaterialType.transparency, + child: ListTile( + leading: const Icon( + Icons.currency_exchange, + color: PRIMARY_LIGHT, + ), + title: Text( + 'Send and Receive'.tr(), + style: Theme.of(context).textTheme.subtitle1, + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => ExchangePage()), + ); + }, + ), + ), Material( type: MaterialType.transparency, child: ListTile( diff --git a/vidaia/pubspec.lock b/vidaia/pubspec.lock index fc80683..467f69f 100644 --- a/vidaia/pubspec.lock +++ b/vidaia/pubspec.lock @@ -539,6 +539,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" + mobile_scanner: + dependency: "direct main" + description: + name: mobile_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" nested: dependency: transitive description: @@ -679,6 +686,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0" + qr: + dependency: transitive + description: + name: qr + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + qr_flutter: + dependency: "direct main" + description: + name: qr_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" quiver: dependency: transitive description: diff --git a/vidaia/pubspec.yaml b/vidaia/pubspec.yaml index 137d18f..5daa126 100644 --- a/vidaia/pubspec.yaml +++ b/vidaia/pubspec.yaml @@ -41,6 +41,7 @@ dependencies: cupertino_icons: ^1.0.2 auto_route: ^3.2.4 google_fonts: ^2.3.1 + qr_flutter: ^4.0.0 # Change this once the devkit is public @@ -53,6 +54,7 @@ dependencies: get_it: ^7.2.0 url_launcher: ^6.1.0 contained_tab_bar_view: ^0.8.0 + mobile_scanner: ^1.0.0 dev_dependencies: flutter_test: