Skip to content

Commit

Permalink
Adds token model.
Browse files Browse the repository at this point in the history
  • Loading branch information
yolcura1@gmail.com authored and yolcura1@gmail.com committed Apr 13, 2020
1 parent dcbe4f3 commit 5516c2d
Show file tree
Hide file tree
Showing 8 changed files with 79 additions and 22 deletions.
9 changes: 8 additions & 1 deletion lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,25 @@ import 'package:flutter/material.dart';
import 'package:firebase_analytics/observer.dart';
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:in_app_purchase/in_app_purchase.dart';
import 'services/services.dart';
import 'screens/screens.dart';
import 'package:provider/provider.dart';

void main() => runApp(MyApp());

void main() {
///Include this in main() so purchases are enabled
InAppPurchaseConnection.enablePendingPurchases();

runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
StreamProvider<Report>.value(value: Global.reportRef.documentStream),
StreamProvider<Token>.value(value: Global.tokenRef.documentStream),
StreamProvider<FirebaseUser>.value(value: AuthService().user),
],
child: MaterialApp(
Expand Down
42 changes: 30 additions & 12 deletions lib/screens/purchase.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import 'dart:async';
import 'dart:io';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:define9/services/globals.dart';
import 'package:define9/services/models.dart';
import 'package:flutter/material.dart';
import 'package:in_app_purchase/in_app_purchase.dart';
import 'package:provider/provider.dart';

final String testID = 'gems_test';

Token token;
class MarketScreen extends StatefulWidget {
createState() => MarketScreenState();
}
Expand Down Expand Up @@ -79,9 +83,11 @@ class MarketScreenState extends State<MarketScreen> {

/// Gets past purchases
Future<void> _getPastPurchases() async {
QueryPurchaseDetailsResponse response =
await _iap.queryPastPurchases();

QueryPurchaseDetailsResponse response = await _iap.queryPastPurchases();
if (response.error != null) {
print('Error querying past purchases: ${response.error.message}');
return;
}
for (PurchaseDetails purchase in response.pastPurchases) {
if (Platform.isIOS) {
InAppPurchaseConnection.instance.completePurchase(purchase);
Expand All @@ -105,9 +111,24 @@ class MarketScreenState extends State<MarketScreen> {
// TODO serverside verification & record consumable in the database

if (purchase != null && purchase.status == PurchaseStatus.purchased) {
_credits = 10;
_updateUserTokenPurchase();
}
}
/// Database write to update token after purchase
Future<void> _updateUserTokenPurchase() {
return Global.tokenRef.upsert(
({
'total': FieldValue.increment(9)
}),
);
}
Future<void> _updateUserTokenConsume() {
return Global.tokenRef.upsert(
({
'total': FieldValue.increment(-1)
}),
);
}
/// Purchase a product
void _buyProduct(ProductDetails prod) {
final PurchaseParam purchaseParam = PurchaseParam(productDetails: prod);
Expand All @@ -117,21 +138,18 @@ class MarketScreenState extends State<MarketScreen> {
/// Spend credits and consume purchase when they run pit
void _spendCredits(PurchaseDetails purchase) async {

/// Decrement credits
setState(() { _credits--; });

/// TODO update the state of the consumable to a backend database
_updateUserTokenConsume();

// Mark consumed when credits run out
if (_credits == 0) {
if (token.total == 0) {
var res = await _iap.consumePurchase(purchase);
await _getPastPurchases();
}

}
@override
Widget build(BuildContext context) {

token = Provider.of<Token>(context);
return Scaffold(
appBar: AppBar(
title: Text(_available ? 'Open for Business' : 'Not Available'),
Expand All @@ -146,7 +164,7 @@ class MarketScreenState extends State<MarketScreen> {
// UI if already purchased
if (_hasPurchased(prod.id) != null)
...[
Text('💎 $_credits', style: TextStyle(fontSize: 60)),
Text('💎 $token.total', style: TextStyle(fontSize: 60)),
FlatButton(
child: Text('Consume'),
color: Colors.green,
Expand Down
16 changes: 16 additions & 0 deletions lib/screens/quiz.dart
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,24 @@ class CongratsPage extends StatelessWidget {
}),
);
}
/// Database write to update token after purchase
Future<void> _updateUserTokenPurchase() {
return Global.tokenRef.upsert(
({
'total': FieldValue.increment(9)
}),
);
}
Future<void> _updateUserTokenConsume() {
return Global.tokenRef.upsert(
({
'total': FieldValue.increment(-1)
}),
);
}
}


class QuestionPage extends StatelessWidget {
final Question question;
QuestionPage({this.question});
Expand Down
7 changes: 4 additions & 3 deletions lib/services/globals.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:firebase_analytics/firebase_analytics.dart';
/// Static global state. Immutable services that do not care about build context.
class Global {
// App Data
static final String title = 'Fireship';
static final String title = 'Define9';

// Services
static final FirebaseAnalytics analytics = FirebaseAnalytics();
Expand All @@ -15,11 +15,12 @@ class Global {
Topic: (data) => Topic.fromMap(data),
Quiz: (data) => Quiz.fromMap(data),
Report: (data) => Report.fromMap(data),
Token: (data) => Token.fromMap(data),
};

// Firestore References for Writes
static final Collection<Topic> topicsRef = Collection<Topic>(path: 'topics');
static final UserData<Report> reportRef = UserData<Report>(collection: 'reports');
static final UserData<Report> reportRef = UserData<Report>(collection: 'reports');
static final UserData<Token> tokenRef = UserData<Token>(collection: 'tokens');


}
15 changes: 15 additions & 0 deletions lib/services/models.dart
Original file line number Diff line number Diff line change
Expand Up @@ -91,3 +91,18 @@ class Report {

}

class Token {
String uid;
int total;

Token({ this.uid, this.total });

factory Token.fromMap(Map data) {
if(data!=null)
return Token(
uid: data['uid'],
total: data['total'] ?? 0
);
}

}
4 changes: 2 additions & 2 deletions lib/shared/bottom_nav.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ class AppBottomNav extends StatelessWidget {
icon: Icon(FontAwesomeIcons.userCircle, size: 20),
title: Text('Profile')),
BottomNavigationBarItem(
icon: Icon(FontAwesomeIcons.bolt, size: 20),
icon: Icon(FontAwesomeIcons.book, size: 20),
title: Text('Öyküleri Oku')),
BottomNavigationBarItem(
icon: Icon(FontAwesomeIcons.bolt, size: 20),
icon: Icon(FontAwesomeIcons.coins, size: 20),
title: Text('Jeton')),
].toList(),
fixedColor: Colors.deepPurple[200],
Expand Down
6 changes: 3 additions & 3 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -129,14 +129,14 @@ packages:
name: in_app_purchase
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0+1"
version: "0.3.1+2"
json_annotation:
dependency: transitive
description:
name: json_annotation
url: "https://pub.dartlang.org"
source: hosted
version: "2.4.0"
version: "3.0.1"
matcher:
dependency: transitive
description:
Expand Down Expand Up @@ -269,5 +269,5 @@ packages:
source: hosted
version: "3.5.0"
sdks:
dart: ">=2.4.0 <3.0.0"
dart: ">=2.6.0 <3.0.0"
flutter: ">=1.12.13+hotfix.5 <2.0.0"
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ dependencies:
provider: 3.1.0
font_awesome_flutter: 8.4.0
webview_flutter: ^0.3.14+1
in_app_purchase: 0.2.0+1
in_app_purchase: 0.3.1+2
dev_dependencies:
flutter_test:
sdk: flutter
Expand Down

0 comments on commit 5516c2d

Please sign in to comment.