diff --git a/android/settings.gradle b/android/settings.gradle index c07940c..98c2d4f 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -18,7 +18,7 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "7.4.2" apply false + id "com.android.application" version "8.1.0" apply false id "org.jetbrains.kotlin.android" version "1.7.10" apply false id "com.google.gms.google-services" version "4.4.0" apply false } diff --git a/firebase.json b/firebase.json new file mode 100644 index 0000000..99c7b53 --- /dev/null +++ b/firebase.json @@ -0,0 +1 @@ +{"flutter":{"platforms":{"android":{"default":{"projectId":"fireship-lessons","appId":"1:758773997881:android:743b0bba6de867fcd1c8e8","fileOutput":"android/app/google-services.json"}},"dart":{"lib/firebase_options.dart":{"projectId":"fireship-lessons","configurations":{"android":"1:758773997881:android:743b0bba6de867fcd1c8e8","ios":"1:758773997881:ios:82656735bc074188d1c8e8"}}}}}} \ No newline at end of file diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart new file mode 100644 index 0000000..ea98b35 --- /dev/null +++ b/lib/firebase_options.dart @@ -0,0 +1,74 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: type=lint +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for web - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyBCCNqoW8gtIn2DYeqlC-dWP8SmiOvRD8Y', + appId: '1:758773997881:android:743b0bba6de867fcd1c8e8', + messagingSenderId: '758773997881', + projectId: 'fireship-lessons', + databaseURL: 'https://fireship-lessons.firebaseio.com', + storageBucket: 'fireship-lessons.appspot.com', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyCHpFJY54w_YiXjCOfbVbsefn91FFUJ9PE', + appId: '1:758773997881:ios:82656735bc074188d1c8e8', + messagingSenderId: '758773997881', + projectId: 'fireship-lessons', + databaseURL: 'https://fireship-lessons.firebaseio.com', + storageBucket: 'fireship-lessons.appspot.com', + androidClientId: + '758773997881-b4g2gerk1isv5ehq4h9s63hgnn433rjc.apps.googleusercontent.com', + iosClientId: + '758773997881-sk4tfalbk1oqh5f2vv4gbcjqdlm7lq5f.apps.googleusercontent.com', + iosBundleId: 'io.fireship.quizapp', + ); +} diff --git a/lib/login/view/login_page.dart b/lib/login/view/login_page.dart index a8575d2..8ca803b 100644 --- a/lib/login/view/login_page.dart +++ b/lib/login/view/login_page.dart @@ -187,7 +187,7 @@ class SignInButton extends StatelessWidget { style: style, icon: Icon(icon), onPressed: onPressed, - label: Expanded(child: child), + label: child, ); } return TextButton( diff --git a/lib/main_development.dart b/lib/main_development.dart index ca5f821..22ce954 100644 --- a/lib/main_development.dart +++ b/lib/main_development.dart @@ -1,10 +1,12 @@ import 'package:api_client/api_client.dart'; import 'package:quizapp/app/app.dart'; +import 'package:quizapp/firebase_options.dart'; import 'package:user_repository/user_repository.dart'; Future main() async { await bootstrap( - init: Firebase.initializeApp, + init: () => + Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform), builder: () async { // ? initialize development dependencies final userRepository = UserRepository(); diff --git a/lib/main_production.dart b/lib/main_production.dart index cfaada0..7e55de6 100644 --- a/lib/main_production.dart +++ b/lib/main_production.dart @@ -1,10 +1,12 @@ import 'package:api_client/api_client.dart'; import 'package:quizapp/app/app.dart'; +import 'package:quizapp/firebase_options.dart'; import 'package:user_repository/user_repository.dart'; Future main() async { await bootstrap( - init: Firebase.initializeApp, + init: () => + Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform), builder: () async { // ? initialize production dependencies final userRepository = UserRepository(); diff --git a/lib/quiz/view/quiz_page.dart b/lib/quiz/view/quiz_page.dart index e44257c..bda9024 100644 --- a/lib/quiz/view/quiz_page.dart +++ b/lib/quiz/view/quiz_page.dart @@ -118,7 +118,11 @@ class _QuizBodyState extends State { child: const QuizAnswerDetails(), ); }, - ).whenComplete(() => context.read().unselectOption()); + ).whenComplete(() { + if (context.mounted) { + context.read().unselectOption(); + } + }); } else { context.popUntil((route) => route.settings.name == QuizPage.name); } diff --git a/lib/topics/view/topic_page.dart b/lib/topics/view/topic_page.dart index 6c7bc16..26b9b7f 100644 --- a/lib/topics/view/topic_page.dart +++ b/lib/topics/view/topic_page.dart @@ -23,8 +23,8 @@ class TopicPage extends StatelessWidget { Widget build(BuildContext context) { return PopScope( canPop: false, - onPopInvoked: (didPop) { - if (!didPop) { + onPopInvokedWithResult: (canPop, __) { + if (!canPop) { context.flow().deselectTopic(); } }, diff --git a/packages/api_client/lib/api_client.dart b/packages/api_client/lib/api_client.dart index 68dfef2..aa9cef8 100644 --- a/packages/api_client/lib/api_client.dart +++ b/packages/api_client/lib/api_client.dart @@ -1,5 +1,5 @@ /// API Client -library api_client; +library; export 'package:cloud_firestore/cloud_firestore.dart'; export 'package:firebase_auth/firebase_auth.dart'; diff --git a/packages/api_client/pubspec.yaml b/packages/api_client/pubspec.yaml index e0c465a..fdecf0a 100644 --- a/packages/api_client/pubspec.yaml +++ b/packages/api_client/pubspec.yaml @@ -9,14 +9,14 @@ environment: dependencies: app_core: path: ../app_core - cloud_firestore: ^4.15.10 - firebase_auth: ^4.18.0 - firebase_core: ^2.27.2 + cloud_firestore: ^5.6.0 + firebase_auth: ^5.3.4 + firebase_core: ^3.9.0 flutter: sdk: flutter - google_sign_in: ^6.2.1 - sign_in_with_apple: ^6.0.0 + google_sign_in: ^6.2.2 + sign_in_with_apple: ^6.1.4 dev_dependencies: - very_good_analysis: ^5.1.0 + very_good_analysis: ^7.0.0 diff --git a/packages/app_core/lib/app_core.dart b/packages/app_core/lib/app_core.dart index 8cfe6c2..1b5e2d6 100644 --- a/packages/app_core/lib/app_core.dart +++ b/packages/app_core/lib/app_core.dart @@ -1,5 +1,5 @@ /// App core -library app_core; +library; export 'dart:async'; diff --git a/packages/app_core/pubspec.yaml b/packages/app_core/pubspec.yaml index c5726e2..884ba96 100644 --- a/packages/app_core/pubspec.yaml +++ b/packages/app_core/pubspec.yaml @@ -1,6 +1,6 @@ name: app_core description: App core package. -version: 1.0.0 +version: 1.0.0+1 publish_to: none environment: @@ -8,13 +8,13 @@ environment: dependencies: bloc: ^8.1.4 - crypto: ^3.0.3 - equatable: ^2.0.5 + crypto: ^3.0.6 + equatable: ^2.0.7 flutter: sdk: flutter - json_annotation: ^4.8.1 + json_annotation: ^4.9.0 provider: ^6.1.2 - rxdart: ^0.27.7 + rxdart: ^0.28.0 dev_dependencies: - very_good_analysis: ^5.1.0 + very_good_analysis: ^7.0.0 diff --git a/packages/app_ui/lib/app_ui.dart b/packages/app_ui/lib/app_ui.dart index 02a84a0..7cf19df 100644 --- a/packages/app_ui/lib/app_ui.dart +++ b/packages/app_ui/lib/app_ui.dart @@ -1,5 +1,5 @@ /// App UI -library app_ui; +library; export 'package:flutter_spinkit/flutter_spinkit.dart'; export 'package:font_awesome_flutter/font_awesome_flutter.dart'; diff --git a/packages/app_ui/lib/src/widgets.dart b/packages/app_ui/lib/src/widgets.dart index a6b9afc..0f6cdc0 100644 --- a/packages/app_ui/lib/src/widgets.dart +++ b/packages/app_ui/lib/src/widgets.dart @@ -92,7 +92,7 @@ class AnimatedProgressBar extends StatelessWidget { Container( height: height, decoration: BoxDecoration( - color: context.theme.colorScheme.background, + color: context.theme.colorScheme.surface, borderRadius: BorderRadius.all( Radius.circular(height), ), @@ -154,7 +154,7 @@ class ActionButton extends StatelessWidget { minimumSize: Size.zero, padding: const EdgeInsets.all(10), ); - return ButtonBar( + return OverflowBar( alignment: MainAxisAlignment.center, children: [ if (_icon != null) diff --git a/packages/app_ui/pubspec.yaml b/packages/app_ui/pubspec.yaml index 47435a3..f41f5b6 100644 --- a/packages/app_ui/pubspec.yaml +++ b/packages/app_ui/pubspec.yaml @@ -1,6 +1,6 @@ name: app_ui description: App UI package. -version: 1.0.0 +version: 1.0.0+1 publish_to: none environment: @@ -10,9 +10,9 @@ dependencies: flutter: sdk: flutter flutter_spinkit: ^5.2.1 - font_awesome_flutter: ^10.7.0 + font_awesome_flutter: ^10.8.0 google_fonts: ^6.2.1 transparent_image: ^2.0.1 dev_dependencies: - very_good_analysis: ^5.1.0 + very_good_analysis: ^7.0.0 diff --git a/packages/quizzes_repository/lib/quizzes_repository.dart b/packages/quizzes_repository/lib/quizzes_repository.dart index ed0b98c..d2cbd49 100644 --- a/packages/quizzes_repository/lib/quizzes_repository.dart +++ b/packages/quizzes_repository/lib/quizzes_repository.dart @@ -1,5 +1,5 @@ /// Quizzes repository -library quizzes_repository; +library; export 'src/failures.dart'; export 'src/models/models.dart'; diff --git a/packages/quizzes_repository/lib/src/models/models.dart b/packages/quizzes_repository/lib/src/models/models.dart index bbbc818..4f2ed65 100644 --- a/packages/quizzes_repository/lib/src/models/models.dart +++ b/packages/quizzes_repository/lib/src/models/models.dart @@ -2,8 +2,6 @@ import 'package:app_core/app_core.dart'; part 'models.g.dart'; -// ignore_for_file: sort_constructors_first - @JsonSerializable(createToJson: false) class Option extends Equatable { const Option({ @@ -12,6 +10,8 @@ class Option extends Equatable { required this.correct, }); + factory Option.fromJson(Map json) => _$OptionFromJson(json); + final String value; @JsonKey(defaultValue: '') final String detail; @@ -21,8 +21,6 @@ class Option extends Equatable { @override List get props => [value, detail, correct]; - - factory Option.fromJson(Map json) => _$OptionFromJson(json); } extension OptionExtensions on Option { @@ -36,6 +34,9 @@ class Question extends Equatable { required this.options, }); + factory Question.fromJson(Map json) => + _$QuestionFromJson(json); + final String text; @JsonKey(defaultValue: