diff --git a/lib/bloc/initialize/initialize_bloc.dart b/lib/bloc/initialize/initialize_bloc.dart index ffff526..971aa6f 100644 --- a/lib/bloc/initialize/initialize_bloc.dart +++ b/lib/bloc/initialize/initialize_bloc.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:developer'; import 'package:bloc/bloc.dart'; +import 'package:iblock/bloc/settings/settings_bloc.dart'; import 'package:local_auth/local_auth.dart'; import 'package:meta/meta.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; @@ -99,5 +100,26 @@ class InitializeBloc extends Bloc { emit(NotRegistered()); } }); + + on((event, emit) async{ + emit(Loading()); + try { + var privateKey = await SecureStorageService.get("private-key") as String; + var contractAddress = await SecureStorageService.get("contract-address") as String; + var userInfo = await UserContractService().getAll( + contractAddress, privateKey).timeout(const Duration(seconds: 10), + onTimeout: (){ + throw TimeoutException("Unable to fetch data from blockchain!"); + }); + emit(Registered(userInfo)); + } + catch(e){ + emit(Failed(e.toString())); + } + }); + + on((event, emit){ + emit(Registered(event.userInfo)); + }); } } diff --git a/lib/bloc/initialize/initialize_event.dart b/lib/bloc/initialize/initialize_event.dart index 5b8bc5b..45ec442 100644 --- a/lib/bloc/initialize/initialize_event.dart +++ b/lib/bloc/initialize/initialize_event.dart @@ -9,4 +9,11 @@ class CheckInternetConnection extends InitializeEvent{} class AuthenticateEvent extends InitializeEvent{} -class CheckStatus extends InitializeEvent{} \ No newline at end of file +class CheckStatus extends InitializeEvent{} + +class LoadUserInfoEvent extends InitializeEvent{} + +class SetUserInfoEvent extends InitializeEvent{ + final Map userInfo; + SetUserInfoEvent(this.userInfo); +} \ No newline at end of file diff --git a/lib/bloc/initialize/initialize_state.dart b/lib/bloc/initialize/initialize_state.dart index 34469f2..11a79f6 100644 --- a/lib/bloc/initialize/initialize_state.dart +++ b/lib/bloc/initialize/initialize_state.dart @@ -13,6 +13,8 @@ class Authenticated extends InitializeState{} class NoInternetConnection extends InitializeState{} +class Loading extends InitializeState{} + class Registered extends InitializeState { final Map userInfo; Registered(this.userInfo); diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index cfc4da6..9434590 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,4 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../bloc/initialize/initialize_bloc.dart'; class HomePage extends StatefulWidget { HomePage({Key? key}) : super(key: key); @@ -8,49 +11,88 @@ class HomePage extends StatefulWidget { } class _HomePageState extends State { - Map data = {}; + final InitializeBloc _initializeBloc = InitializeBloc(); + + @override + void initState() { + try { + _initializeBloc.add(SetUserInfoEvent( + ModalRoute.of(context)!.settings.arguments as Map)); + } catch (e) { + _initializeBloc.add(LoadUserInfoEvent()); + } + super.initState(); + } @override Widget build(BuildContext context) { - data = ModalRoute.of(context)!.settings.arguments as Map; return Scaffold( - appBar: AppBar( - actions: [ - IconButton(onPressed: () => Navigator.pushNamed(context, '/history'), icon: const Icon(Icons.history_rounded)), - IconButton(onPressed: () => Navigator.pushNamed(context, '/settings'), icon: const Icon(Icons.settings)) - ] - ), - body: SafeArea( - child: SingleChildScrollView( - child: SizedBox( - width: double.infinity, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image( - image: Image.asset('assets/images/profile.png').image, - width: 100, - height: 100, + appBar: AppBar(actions: [ + IconButton( + onPressed: () => Navigator.pushNamed(context, '/history'), + icon: const Icon(Icons.history_rounded)), + IconButton( + onPressed: () => Navigator.pushNamed(context, '/settings'), + icon: const Icon(Icons.settings)) + ]), + body: SafeArea( + child: GestureDetector( + onPanStart: (details){ + _initializeBloc.add(LoadUserInfoEvent()); + }, + child: SingleChildScrollView( + child: SizedBox( + width: double.infinity, + child: BlocProvider( + create: (context) => _initializeBloc, + child: BlocBuilder( + builder: (context, state) { + if (state is Registered) { + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image( + image: + Image.asset('assets/images/profile.png').image, + width: 100, + height: 100, + ), + Padding( + padding: const EdgeInsets.all(10), + child: Text( + state.userInfo["Name"]!, + style: const TextStyle( + fontSize: 20, fontWeight: FontWeight.bold), + )), + Table( + children: state.userInfo.entries + .map((e) => TableRow(children: [ + Padding( + padding: const EdgeInsets.all(10), + child: Text(e.key, + style: const TextStyle( + fontWeight: + FontWeight.bold))), + Padding( + padding: const EdgeInsets.all(10), + child: Text(e.value)) + ])) + .toList()) + ], + ); + } else if (state is Loading) { + return const Center( + child: CircularProgressIndicator(), + ); + } else { + return const Center( + child: Text("Unexpected State"), + ); + } + }, + ), ), - Padding( - padding: const EdgeInsets.all(10), - child: Text( - data["Name"]!, - style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - )), - Table( - children: - data.entries.map((e) => TableRow(children: [ - Padding( - padding: const EdgeInsets.all(10), - child: Text(e.key, - style: const TextStyle(fontWeight: FontWeight.bold))), - Padding( - padding: const EdgeInsets.all(10), child: Text(e.value)) - ])).toList() - ) - ], - ), + ), ), ), ), @@ -63,10 +105,4 @@ class _HomePageState extends State { ) ); } - - void addNewProperty(String property, String value){ - setState(() { - data[property] = value; - }); - } }