Wallet wip

This commit is contained in:
Sewmina Dilshan 2023-02-09 14:56:47 +05:30
parent e0ce08fa69
commit 9307681225
9 changed files with 317 additions and 35 deletions

View File

@ -1,6 +1,27 @@
import 'package:faucethub/Backend/DebugHelper.dart';
import 'package:faucethub/Backend/hoarder.dart';
class Brain{ class Brain{
static const String API_ENDPOINT = "http://vps.playpoolstudios.com/faucet/api/"; static const String API_ENDPOINT = "http://vps.playpoolstudios.com/faucet/api/";
static dynamic UserJson; static dynamic UserJson;
static List<dynamic> LinkedGamesJson = [];
static List<dynamic> NonLinkedGamesJson = [];
static void InitUserData(){
LinkedGamesJson = [];
NonLinkedGamesJson = [];
List<String> linkedGames = UserJson['linkedGames'].toString().split(',');
Debug.Log("Going to filter linked games from ${Hoarder.GamesJson.length} games\nmy linked game ids : ${UserJson['linkedGames']}");
Hoarder.GamesJson.forEach((game) {
if(linkedGames.contains(game['id'])){
LinkedGamesJson.add(game);
}else{
NonLinkedGamesJson.add(game);
}
});
}
} }

38
lib/Backend/helpers.dart Normal file
View File

@ -0,0 +1,38 @@
import 'package:crypto_font_icons/crypto_font_icons.dart';
import 'package:faucethub/Backend/hoarder.dart';
import 'package:flutter/material.dart';
class Helpers{
static IconData GetIconForCrypto(String val){
switch(val){
case "BTC":
return CryptoFontIcons.BTC;
break;
case "ETH":
return CryptoFontIcons.ETH;
break;
case "XRP":
return CryptoFontIcons.XRP;
break;
case "DOGE":
return CryptoFontIcons.DOGE;
break;
case "LTC":
return CryptoFontIcons.LTC;
break;
}
return CryptoFontIcons.BTC;
}
static String GetIconForGame(String name){
Hoarder.GamesJson.forEach((element) {
if(element['name'] == name){
return element['thumbnail'];
}
});
return "";
}
}

View File

@ -7,6 +7,7 @@ import 'package:http/http.dart' as http;
class Hoarder{ class Hoarder{
static List<dynamic> GamesJson = []; static List<dynamic> GamesJson = [];
static Map<String,String> Settings = {}; static Map<String,String> Settings = {};
static List<dynamic> FeaturedGames = []; static List<dynamic> FeaturedGames = [];

View File

@ -75,6 +75,7 @@ class LoginManager {
try{ try{
Brain.UserJson = jsonDecode(loginResponse.body.toString()); Brain.UserJson = jsonDecode(loginResponse.body.toString());
Brain.InitUserData();
Debug.LogResponse(Brain.UserJson); Debug.LogResponse(Brain.UserJson);
prefs.setString("username", username); prefs.setString("username", username);
prefs.setString("password", password); prefs.setString("password", password);

View File

@ -1,9 +1,13 @@
// import 'package:crypto_font_icons/crypto_font_icons.dart';
import 'package:crypto_font_icons/crypto_font_icons.dart';
import 'package:faucethub/Backend/DebugHelper.dart'; import 'package:faucethub/Backend/DebugHelper.dart';
import 'package:faucethub/Backend/brains.dart'; import 'package:faucethub/Backend/brains.dart';
import 'package:faucethub/Backend/hoarder.dart'; import 'package:faucethub/Backend/hoarder.dart';
import 'package:faucethub/Backend/login_mgr.dart'; import 'package:faucethub/Backend/login_mgr.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'Backend/helpers.dart';
class HomePage extends StatefulWidget { class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key); const HomePage({Key? key}) : super(key: key);
@ -15,29 +19,37 @@ class HomePage extends StatefulWidget {
int selectedBotNavIndex = 0; int selectedBotNavIndex = 0;
class _HomePageState extends State<HomePage> { class _HomePageState extends State<HomePage> {
static List<Widget> bodyOptions = <Widget>[
HomeWidget(),
GamesWidget(),
Text("Money!")
];
static Widget HomeWidget() { @override
void initState() {
// TODO: implement initState
super.initState();
}
Widget HomeWidget() {
final ScrollController _firstController = ScrollController(); final ScrollController _firstController = ScrollController();
return SingleChildScrollView( return SingleChildScrollView(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
Container( Container(
padding: EdgeInsets.all(10), padding: EdgeInsets.all(20),
child: Text("Welcome ${Brain.UserJson['name']},", child: Text("Welcome ${Brain.UserJson['name']},",
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)), style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
), ),
SizedBox( HomeCard(
height: 20, child: Container(
padding: EdgeInsets.symmetric(vertical: 50),
child: Text(
"\$6.90",
style: TextStyle(fontSize: 50),
), ),
HomeCard(child: Container(padding:EdgeInsets.symmetric(vertical: 50),child: Text("\$6.90", style: TextStyle(fontSize: 50),),), title: "Earnings"), ),
HomeCard(title:"Featured Games",child: title: "Earnings"),
SizedBox( HomeCard(
title: "Featured Games",
child: SizedBox(
height: 110, height: 110,
child: Scrollbar( child: Scrollbar(
thumbVisibility: true, thumbVisibility: true,
@ -49,12 +61,14 @@ class _HomePageState extends State<HomePage> {
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
Debug.Log(Hoarder.FeaturedGames[index]); Debug.Log(Hoarder.FeaturedGames[index]);
return InkWell( return InkWell(
onTap: (){}, onTap: () {},
child: Card( child: Card(
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
child: Image.network(Hoarder.FeaturedGames[index]['icon'], child: Image.network(
width: 100, height: 100), Hoarder.FeaturedGames[index]['icon'],
width: 100,
height: 100),
), ),
), ),
); );
@ -62,34 +76,93 @@ class _HomePageState extends State<HomePage> {
), ),
), ),
), ),
HomeCard(child: SizedBox(height: 250,), title: "Top Players"), HomeCard(
child: SizedBox(
height: 250,
),
title: "Top Players"),
], ],
), ),
); );
} }
static Widget GamesWidget(){ Widget GamesWidget() {
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
return Container( return Container(
padding: EdgeInsets.fromLTRB(20, 20, 0, 20),
child: SingleChildScrollView( child: SingleChildScrollView(
physics: ScrollPhysics(), physics: ScrollPhysics(),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
Text("Linked", style: TextStyle(fontSize: 20,fontWeight: FontWeight.bold),), Text(
"Linked",
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
SizedBox(
height: 5,
),
ListView.builder( ListView.builder(
physics: NeverScrollableScrollPhysics(), physics: NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
controller: scrollController, controller: scrollController,
itemCount: Hoarder.GamesJson.length, itemCount: Brain.LinkedGamesJson.length,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
Debug.Log(Hoarder.GamesJson[index]); // Debug.Log(Hoarder.LinkedGamesJson[index]);
return InkWell( return InkWell(
onTap: (){}, onTap: () {},
child: ListTile( child: ListTile(
leading: Image.network(Hoarder.GamesJson[index]['icon'], leading: ClipRRect(
width: 25, height: 25), borderRadius: BorderRadius.circular(12),
title: Text(Hoarder.GamesJson[index]['name']), child: Image.network(Brain.LinkedGamesJson[index]['icon'],
width: 50, height: 50),
),
title: Text(Brain.LinkedGamesJson[index]['name']),
subtitle: Text(Brain.LinkedGamesJson[index]['description']),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Helpers.GetIconForCrypto(
Brain.LinkedGamesJson[index]['coin']),
size: 17,
),
SizedBox(
width: 2,
),
Text("0.00004000"),
],
),
),
);
}),
SizedBox(
height: 20,
),
Text(
"Not Linked",
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
SizedBox(
height: 5,
),
ListView.builder(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
controller: scrollController,
itemCount: Brain.NonLinkedGamesJson.length,
itemBuilder: (BuildContext context, int index) {
// Debug.Log(Hoarder.NonLinkedGamesJson[index]);
return InkWell(
onTap: () {},
child: ListTile(
leading: ClipRRect(
borderRadius: BorderRadius.circular(12),
child: Image.network(Brain.NonLinkedGamesJson[index]['icon'],
width: 50, height: 50),
),
title: Text(Brain.NonLinkedGamesJson[index]['name']),
subtitle: Text(Brain.NonLinkedGamesJson[index]['description']),
), ),
); );
}) })
@ -99,20 +172,109 @@ class _HomePageState extends State<HomePage> {
); );
} }
Widget WalletWidget() {
final ScrollController scrollController = ScrollController();
return Container(
padding: EdgeInsets.all(10),
child:
Container( child: Column(children: [
HomeCard(child: Container(
child: ListTile(
leading: FaIcon(FontAwesomeIcons.solidCircleUser,size: 60,),
title: Text(Brain.UserJson['name']),
subtitle: Text("Total Earnings : \$42.69"),
trailing: IconButton(icon: Icon(Icons.settings), onPressed: () { selectedBotNavIndex=3;setState(() {
}); },),
)
), title: "Your Account", showMore: false),
Row(mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.max,children: [
Expanded(child: MaterialButton(onPressed: (){}, child: Text("Withdraw"),color: Colors.green, ))
],),
SizedBox(height: 30,),
Text("Sort by",style: TextStyle(fontSize: 12),),
DefaultTabController(length: 2, child: Column(
mainAxisSize: MainAxisSize.min,
children: [
TabBar(
tabs:[Tab(text: "Currency",),Tab(text: "Games",)]
),
Container(
padding: EdgeInsets.all(10),
//Add this to give height
constraints: BoxConstraints.expand(height: 250),
child: TabBarView(children: [
Container(
child: Column(
children: [
CurrencyListItem("BTC", "0.0004000 = \$1.20"),
CurrencyListItem("ETH", "0.0004000 = \$0.50"),
CurrencyListItem("XRP", "0.0004000 = \$0.20"),
CurrencyListItem("DOGE", "0.0004000 = \$0.020")
],
)
),
Container(
child: Column(
children: [
GameListItem(Hoarder.GamesJson[0], "0.0004000 = \$1.20"),
GameListItem(Hoarder.GamesJson[1], "0.0004000 = \$1.20"),
GameListItem(Hoarder.GamesJson[2], "0.0004000 = \$1.20"),
],
)
),
]),
),
],
))
],)));
}
Widget SettingsWidget() {
final ScrollController scrollController = ScrollController();
return Container(
padding: EdgeInsets.symmetric(vertical: 20,horizontal: 10),
child:
SingleChildScrollView(physics: ScrollPhysics(), child: Column(children: [
Text("Settings", style: TextStyle(fontSize: 25,fontWeight: FontWeight.bold),),
SizedBox(height: 20,),
ListTile()
],)));
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<Widget> bodyOptions = [
HomeWidget(),
GamesWidget(),
WalletWidget(),
SettingsWidget()
];
return SafeArea( return SafeArea(
child: Scaffold( child: Scaffold(
// appBar: AppBar(title: Text('Faucet Hub'),), // appBar: AppBar(title: Text('Faucet Hub'),),
body: bodyOptions.elementAt(selectedBotNavIndex), body: bodyOptions.elementAt(selectedBotNavIndex),
bottomNavigationBar: BottomNavigationBar( bottomNavigationBar: BottomNavigationBar(
enableFeedback: true,
selectedItemColor: Colors.green,
unselectedItemColor: Colors.grey,
elevation: 20,
items: const <BottomNavigationBarItem>[ items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(icon: Icon(Icons.home), label: "Home"), BottomNavigationBarItem(icon: Icon(Icons.home), label: "Home"),
BottomNavigationBarItem( BottomNavigationBarItem(
icon: Icon(Icons.videogame_asset), label: "Games"), icon: Icon(Icons.videogame_asset), label: "Games"),
BottomNavigationBarItem( BottomNavigationBarItem(
icon: Icon(Icons.account_balance_wallet), label: "Wallet"), icon: Icon(Icons.account_balance_wallet), label: "Wallet"),
BottomNavigationBarItem(
icon: Icon(Icons.settings), label: "Settings"),
], ],
currentIndex: selectedBotNavIndex, currentIndex: selectedBotNavIndex,
onTap: onBotNavTapped, onTap: onBotNavTapped,
@ -120,7 +282,8 @@ class _HomePageState extends State<HomePage> {
); );
} }
static Widget HomeCard({required Widget child, required String title}) { static Widget HomeCard(
{bool showMore = false, required Widget child, required String title}) {
return Padding( return Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Card( child: Card(
@ -135,11 +298,13 @@ class _HomePageState extends State<HomePage> {
children: [ children: [
Text( Text(
title, title,
style: TextStyle(fontSize: 17,fontWeight: FontWeight.bold), style: TextStyle(
fontSize: 17, fontWeight: FontWeight.bold),
), ),
InkWell(child: Icon(Icons.arrow_right_alt), onTap: (){ (showMore) ? InkWell(
child: Icon(Icons.arrow_right_alt),
},) onTap: () {},
) : Container()
], ],
), ),
), ),
@ -147,6 +312,26 @@ class _HomePageState extends State<HomePage> {
])))); ]))));
} }
Widget CurrencyListItem(String currencyName, String value){
return Container(padding: EdgeInsets.all(5),
child: Row(mainAxisSize: MainAxisSize.max,mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(mainAxisSize: MainAxisSize.min, children: [Icon(Helpers.GetIconForCrypto(currencyName)),SizedBox(width: 10,), Text(currencyName)],),
Text(value)
],),
);
}
Widget GameListItem(dynamic Game, String value){
return Container(padding: EdgeInsets.all(5),
child: Row(mainAxisSize: MainAxisSize.max,mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(mainAxisSize: MainAxisSize.min, children: [ Icon(Helpers.GetIconForCrypto(Game['coin'])),SizedBox(width: 10,), Text(Game['name'])],),
Text(value)
],),
);
}
void onBotNavTapped(int value) { void onBotNavTapped(int value) {
selectedBotNavIndex = value; selectedBotNavIndex = value;
setState(() {}); setState(() {});

View File

@ -26,9 +26,9 @@ class MyApp extends StatelessWidget {
), ),
initialRoute: '/splash', initialRoute: '/splash',
routes: { routes: {
'/login': (context)=> const LoginPage(), '/login': (context)=> LoginPage(),
'/splash': (context)=> const SplashScreen(), '/splash': (context)=> SplashScreen(),
'/home': (context)=> const HomePage(), '/home': (context)=> HomePage(),
}, },
); );

View File

@ -22,8 +22,9 @@ class _SplashScreenState extends State<SplashScreen> {
} }
void init () async{ void init () async{
int result = await LoginManager.AutoLogin();
await Hoarder.GrabInitData(); await Hoarder.GrabInitData();
int result = await LoginManager.AutoLogin();
if(result == 0){ if(result == 0){
Navigator.of(context).pushReplacementNamed('/home'); Navigator.of(context).pushReplacementNamed('/home');
}else{ }else{

View File

@ -49,6 +49,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.17.0" version: "1.17.0"
crypto_font_icons:
dependency: "direct main"
description:
name: crypto_font_icons
sha256: "682bfc120599c04ced0c3a8120aaaac1bfd0a7c2109d23a62bf6c832d1932452"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
@ -160,6 +168,14 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
font_awesome_flutter:
dependency: "direct main"
description:
name: font_awesome_flutter
sha256: "875dbb9ec1ad30d68102019ceb682760d06c72747c1c5b7885781b95f88569cc"
url: "https://pub.dev"
source: hosted
version: "10.3.0"
google_sign_in: google_sign_in:
dependency: "direct main" dependency: "direct main"
description: description:
@ -437,6 +453,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
syncfusion_flutter_charts:
dependency: "direct main"
description:
name: syncfusion_flutter_charts
sha256: "400fa4c57a22f17b78fac6d086e39ecc7b7ece760fdf2041f235951f05640976"
url: "https://pub.dev"
source: hosted
version: "20.4.49"
syncfusion_flutter_core:
dependency: transitive
description:
name: syncfusion_flutter_core
sha256: b5cb2525beb38fae36a363f72f8a2db92ed3995d6f0695968412cc6836e3a7b7
url: "https://pub.dev"
source: hosted
version: "20.4.49"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:

View File

@ -18,6 +18,9 @@ dependencies:
http: ^0.13.5 http: ^0.13.5
shared_preferences: ^2.0.17 shared_preferences: ^2.0.17
flutter_spinkit: ^5.1.0 flutter_spinkit: ^5.1.0
font_awesome_flutter: ^10.3.0
crypto_font_icons: ^1.0.1
syncfusion_flutter_charts: ^20.4.49
# The following adds the Cupertino Icons font to your application. # The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons. # Use with the CupertinoIcons class for iOS style icons.