chore: connect app to firebase (#55)

* docs: changes missed in last PR

* chore: connect to firebase

* chore: hide firebase setup

* refactor: revert ios changes

* chore: update gitignore
pull/56/head
Allison Ryan 4 years ago committed by GitHub
parent c0175b0d30
commit bc5a2f343e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

2
.gitignore vendored

@ -126,4 +126,6 @@ app.*.map.json
!.idea/dictionaries/
!.idea/runConfigurations/
# Firebase related
.firebase
web/__/firebase/init.js

@ -8,29 +8,38 @@
// ignore_for_file: public_member_api_docs
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:leaderboard_repository/leaderboard_repository.dart';
import 'package:pinball/l10n/l10n.dart';
import 'package:pinball/landing/landing.dart';
class App extends StatelessWidget {
const App({Key? key}) : super(key: key);
const App({Key? key, required LeaderboardRepository leaderboardRepository})
: _leaderboardRepository = leaderboardRepository,
super(key: key);
final LeaderboardRepository _leaderboardRepository;
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'I/O Pinball',
theme: ThemeData(
appBarTheme: const AppBarTheme(color: Color(0xFF13B9FF)),
colorScheme: ColorScheme.fromSwatch(
accentColor: const Color(0xFF13B9FF),
return RepositoryProvider.value(
value: _leaderboardRepository,
child: MaterialApp(
title: 'I/O Pinball',
theme: ThemeData(
appBarTheme: const AppBarTheme(color: Color(0xFF13B9FF)),
colorScheme: ColorScheme.fromSwatch(
accentColor: const Color(0xFF13B9FF),
),
),
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
],
supportedLocales: AppLocalizations.supportedLocales,
home: const LandingPage(),
),
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
],
supportedLocales: AppLocalizations.supportedLocales,
home: const LandingPage(),
);
}
}

@ -11,6 +11,7 @@ import 'dart:async';
import 'dart:developer';
import 'package:bloc/bloc.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/widgets.dart';
class AppBlocObserver extends BlocObserver {
@ -27,7 +28,10 @@ class AppBlocObserver extends BlocObserver {
}
}
Future<void> bootstrap(FutureOr<Widget> Function() builder) async {
Future<void> bootstrap(
Future<Widget> Function(FirebaseFirestore firestore) builder,
) async {
WidgetsFlutterBinding.ensureInitialized();
FlutterError.onError = (details) {
log(details.exceptionAsString(), stackTrace: details.stack);
};
@ -35,7 +39,7 @@ Future<void> bootstrap(FutureOr<Widget> Function() builder) async {
await runZonedGuarded(
() async {
await BlocOverrides.runZoned(
() async => runApp(await builder()),
() async => runApp(await builder(FirebaseFirestore.instance)),
blocObserver: AppBlocObserver(),
);
},

@ -5,9 +5,13 @@
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT.
import 'package:leaderboard_repository/leaderboard_repository.dart';
import 'package:pinball/app/app.dart';
import 'package:pinball/bootstrap.dart';
void main() {
bootstrap(() => const App());
bootstrap((firestore) async {
final leaderboardRepository = LeaderboardRepository(firestore);
return App(leaderboardRepository: leaderboardRepository);
});
}

@ -5,9 +5,13 @@
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT.
import 'package:leaderboard_repository/leaderboard_repository.dart';
import 'package:pinball/app/app.dart';
import 'package:pinball/bootstrap.dart';
void main() {
bootstrap(() => const App());
bootstrap((firestore) async {
final leaderboardRepository = LeaderboardRepository(firestore);
return App(leaderboardRepository: leaderboardRepository);
});
}

@ -5,9 +5,13 @@
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT.
import 'package:leaderboard_repository/leaderboard_repository.dart';
import 'package:pinball/app/app.dart';
import 'package:pinball/bootstrap.dart';
void main() {
bootstrap(() => const App());
bootstrap((firestore) async {
final leaderboardRepository = LeaderboardRepository(firestore);
return App(leaderboardRepository: leaderboardRepository);
});
}

@ -131,6 +131,7 @@ class LeaderboardRepository {
.orderBy('score')
.get();
// TODO(allisonryan0002): see if we can find a more performant solution.
final documents = querySnapshot.docs;
final ranking = documents.indexWhere(
(document) => document.id == entryReference.id,

@ -9,15 +9,12 @@ enum CharacterType {
dash,
/// Sparky character.
sparky,
/// Android character.
android,
/// Dino character.
dino,
}

@ -79,7 +79,7 @@ packages:
source: hosted
version: "1.1.0"
cloud_firestore:
dependency: transitive
dependency: "direct main"
description:
name: cloud_firestore
url: "https://pub.dartlang.org"

@ -8,6 +8,7 @@ environment:
dependencies:
bloc: ^8.0.2
cloud_firestore: ^3.1.10
equatable: ^2.0.3
flame: ^1.1.0-releasecandidate.5
flame_bloc: ^1.2.0-releasecandidate.5

@ -6,13 +6,25 @@
// https://opensource.org/licenses/MIT.
import 'package:flutter_test/flutter_test.dart';
import 'package:leaderboard_repository/leaderboard_repository.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball/app/app.dart';
import 'package:pinball/landing/landing.dart';
class MockLeaderboardRepository extends Mock implements LeaderboardRepository {}
void main() {
group('App', () {
late LeaderboardRepository leaderboardRepository;
setUp(() {
leaderboardRepository = MockLeaderboardRepository();
});
testWidgets('renders LandingPage', (tester) async {
await tester.pumpWidget(const App());
await tester.pumpWidget(
App(leaderboardRepository: leaderboardRepository),
);
expect(find.byType(LandingPage), findsOneWidget);
});
});

File diff suppressed because one or more lines are too long

@ -0,0 +1,11 @@
if (typeof firebase === 'undefined') throw new Error('hosting/init-error: Firebase SDK not detected. You must include it before /__/firebase/init.js');
firebase.initializeApp({
"apiKey": "API_KEY",
"appId": "APP_ID",
"authDomain": "AUTH_DOMAIN",
"databaseURL": "",
"measurementId": "MEASUREMENT_ID",
"messagingSenderId": "MEASUREMENT_SENDER_ID",
"projectId": "PROJECT_ID",
"storageBucket": "STORAGE_BUCKET"
});

@ -32,6 +32,8 @@
<title>Pinball</title>
<link rel="manifest" href="manifest.json">
<script src="/__/firebase/8.9.1/firebase-app.js"></script>
<script src="/__/firebase/init.js"></script>
</head>
<body>

Loading…
Cancel
Save