Merge pull request 'authentication/feature/google_signin' (#105) from authentication/feature/google_signin into master
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #105 Reviewed-by: Malo Léon <malo.leon@wyattapp.io>
This commit is contained in:
commit
f22ba300cb
@ -1,4 +1 @@
|
||||
include: package:wyatt_analysis/analysis_options.flutter.yaml
|
||||
|
||||
analyzer:
|
||||
exclude: "!example/**"
|
||||
include: package:wyatt_analysis/analysis_options.flutter.yaml
|
@ -44,6 +44,4 @@ app.*.map.json
|
||||
# Android Studio will place build artifacts here
|
||||
/android/app/debug
|
||||
/android/app/profile
|
||||
/android/app/release
|
||||
|
||||
firebase_options.dart
|
||||
/android/app/release
|
@ -4,7 +4,7 @@
|
||||
* -----
|
||||
* File: launch.json
|
||||
* Created Date: 19/08/2022 15:12:25
|
||||
* Last Modified: 19/08/2022 15:22:02
|
||||
* Last Modified: Tue Dec 13 2022
|
||||
* -----
|
||||
* Copyright (c) 2022
|
||||
*/
|
||||
@ -15,11 +15,18 @@
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "example_router",
|
||||
"name": "Mock",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "lib/main.dart",
|
||||
"flutterMode": "debug"
|
||||
},
|
||||
{
|
||||
"name": "Firebase",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "lib/main_firebase.dart",
|
||||
"flutterMode": "debug"
|
||||
}
|
||||
]
|
||||
}
|
@ -5,41 +5,30 @@ PODS:
|
||||
- AppAuth/Core (1.6.0)
|
||||
- AppAuth/ExternalUserAgent (1.6.0):
|
||||
- AppAuth/Core
|
||||
- FBAEMKit (14.1.0):
|
||||
- FBSDKCoreKit_Basics (= 14.1.0)
|
||||
- FBSDKCoreKit (14.1.0):
|
||||
- FBAEMKit (= 14.1.0)
|
||||
- FBSDKCoreKit_Basics (= 14.1.0)
|
||||
- FBSDKCoreKit_Basics (14.1.0)
|
||||
- FBSDKLoginKit (14.1.0):
|
||||
- FBSDKCoreKit (= 14.1.0)
|
||||
- Firebase/Auth (10.0.0):
|
||||
- Firebase/Auth (10.3.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseAuth (~> 10.0.0)
|
||||
- Firebase/CoreOnly (10.0.0):
|
||||
- FirebaseCore (= 10.0.0)
|
||||
- firebase_auth (4.1.1):
|
||||
- Firebase/Auth (= 10.0.0)
|
||||
- FirebaseAuth (~> 10.3.0)
|
||||
- Firebase/CoreOnly (10.3.0):
|
||||
- FirebaseCore (= 10.3.0)
|
||||
- firebase_auth (4.2.0):
|
||||
- Firebase/Auth (= 10.3.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- firebase_core (2.1.1):
|
||||
- Firebase/CoreOnly (= 10.0.0)
|
||||
- firebase_core (2.4.0):
|
||||
- Firebase/CoreOnly (= 10.3.0)
|
||||
- Flutter
|
||||
- FirebaseAuth (10.0.0):
|
||||
- FirebaseAuth (10.3.0):
|
||||
- FirebaseCore (~> 10.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 7.8)
|
||||
- GoogleUtilities/Environment (~> 7.8)
|
||||
- GTMSessionFetcher/Core (~> 2.1)
|
||||
- FirebaseCore (10.0.0):
|
||||
- GTMSessionFetcher/Core (< 4.0, >= 2.1)
|
||||
- FirebaseCore (10.3.0):
|
||||
- FirebaseCoreInternal (~> 10.0)
|
||||
- GoogleUtilities/Environment (~> 7.8)
|
||||
- GoogleUtilities/Logger (~> 7.8)
|
||||
- FirebaseCoreInternal (10.1.0):
|
||||
- FirebaseCoreInternal (10.3.0):
|
||||
- "GoogleUtilities/NSData+zlib (~> 7.8)"
|
||||
- Flutter (1.0.0)
|
||||
- flutter_facebook_auth (4.4.1):
|
||||
- FBSDKLoginKit (= 14.1.0)
|
||||
- Flutter
|
||||
- google_sign_in_ios (0.0.1):
|
||||
- Flutter
|
||||
- GoogleSignIn (~> 6.2)
|
||||
@ -47,47 +36,36 @@ PODS:
|
||||
- AppAuth (~> 1.5)
|
||||
- GTMAppAuth (~> 1.3)
|
||||
- GTMSessionFetcher/Core (< 3.0, >= 1.1)
|
||||
- GoogleUtilities/AppDelegateSwizzler (7.8.0):
|
||||
- GoogleUtilities/AppDelegateSwizzler (7.10.0):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Network
|
||||
- GoogleUtilities/Environment (7.8.0):
|
||||
- GoogleUtilities/Environment (7.10.0):
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- GoogleUtilities/Logger (7.8.0):
|
||||
- GoogleUtilities/Logger (7.10.0):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Network (7.8.0):
|
||||
- GoogleUtilities/Network (7.10.0):
|
||||
- GoogleUtilities/Logger
|
||||
- "GoogleUtilities/NSData+zlib"
|
||||
- GoogleUtilities/Reachability
|
||||
- "GoogleUtilities/NSData+zlib (7.8.0)"
|
||||
- GoogleUtilities/Reachability (7.8.0):
|
||||
- "GoogleUtilities/NSData+zlib (7.10.0)"
|
||||
- GoogleUtilities/Reachability (7.10.0):
|
||||
- GoogleUtilities/Logger
|
||||
- GTMAppAuth (1.3.1):
|
||||
- AppAuth/Core (~> 1.6)
|
||||
- GTMSessionFetcher/Core (< 3.0, >= 1.5)
|
||||
- GTMSessionFetcher/Core (2.1.0)
|
||||
- GTMSessionFetcher/Core (2.3.0)
|
||||
- PromisesObjC (2.1.1)
|
||||
- sign_in_with_apple (0.0.1):
|
||||
- Flutter
|
||||
- twitter_login (0.0.1):
|
||||
- Flutter
|
||||
|
||||
DEPENDENCIES:
|
||||
- firebase_auth (from `.symlinks/plugins/firebase_auth/ios`)
|
||||
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
|
||||
- Flutter (from `Flutter`)
|
||||
- flutter_facebook_auth (from `.symlinks/plugins/flutter_facebook_auth/ios`)
|
||||
- google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/ios`)
|
||||
- sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`)
|
||||
- twitter_login (from `.symlinks/plugins/twitter_login/ios`)
|
||||
|
||||
SPEC REPOS:
|
||||
trunk:
|
||||
- AppAuth
|
||||
- FBAEMKit
|
||||
- FBSDKCoreKit
|
||||
- FBSDKCoreKit_Basics
|
||||
- FBSDKLoginKit
|
||||
- Firebase
|
||||
- FirebaseAuth
|
||||
- FirebaseCore
|
||||
@ -105,37 +83,24 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/plugins/firebase_core/ios"
|
||||
Flutter:
|
||||
:path: Flutter
|
||||
flutter_facebook_auth:
|
||||
:path: ".symlinks/plugins/flutter_facebook_auth/ios"
|
||||
google_sign_in_ios:
|
||||
:path: ".symlinks/plugins/google_sign_in_ios/ios"
|
||||
sign_in_with_apple:
|
||||
:path: ".symlinks/plugins/sign_in_with_apple/ios"
|
||||
twitter_login:
|
||||
:path: ".symlinks/plugins/twitter_login/ios"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
AppAuth: 8fca6b5563a5baef2c04bee27538025e4ceb2add
|
||||
FBAEMKit: a899515e45476027f73aef377b5cffadcd56ca3a
|
||||
FBSDKCoreKit: 24f8bc8d3b5b2a8c5c656a1329492a12e8efa792
|
||||
FBSDKCoreKit_Basics: 6e578c9bdc7aa1365dbbbde633c9ebb536bcaa98
|
||||
FBSDKLoginKit: 787de205d524c3a4b17d527916f1d066e4361660
|
||||
Firebase: 1b810f3d0c0532e27a48f1961f8c0400a668a2cf
|
||||
firebase_auth: dd33e93fce72a1c72040f7380dacf06e89db5705
|
||||
firebase_core: 5c0bb0ca7d0e70480a68a6e9ad9bf55d1edd5305
|
||||
FirebaseAuth: 493382cf533cc45e2862b00e9aa4cfe4c98daf71
|
||||
FirebaseCore: 97f48a3a567a72b8d4daa0f03c3aadb78df4e995
|
||||
FirebaseCoreInternal: 96d75228e10fd369564da51bd898414eb0f54df5
|
||||
Firebase: f92fc551ead69c94168d36c2b26188263860acd9
|
||||
firebase_auth: 579a0dc15451491cc83fccaa5102296635f24938
|
||||
firebase_core: 6f2f753e316765799d88568232ed59e300ff53db
|
||||
FirebaseAuth: 0e415d29d846c1dce2fb641e46f35e9888d9bec6
|
||||
FirebaseCore: 988754646ab3bd4bdcb740f1bfe26b9f6c0d5f2a
|
||||
FirebaseCoreInternal: 29b76f784d607df8b2a1259d73c3f04f1210137b
|
||||
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
|
||||
flutter_facebook_auth: 361ac7a57263ebf327f26089507ead0d66558ee8
|
||||
google_sign_in_ios: 4f85eb9f937450765c8573bb85fd8cd6a5af675c
|
||||
GoogleSignIn: 5651ce3a61e56ca864160e79b484cd9ed3f49b7a
|
||||
GoogleUtilities: 1d20a6ad97ef46f67bbdec158ce00563a671ebb7
|
||||
GoogleUtilities: bad72cb363809015b1f7f19beb1f1cd23c589f95
|
||||
GTMAppAuth: 0ff230db599948a9ad7470ca667337803b3fc4dd
|
||||
GTMSessionFetcher: ffbb25ec00ebcb5201adab0a56d808f6f1902d9f
|
||||
GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2
|
||||
PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb
|
||||
sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440
|
||||
twitter_login: 2794db69b7640681171b17b3c2c84ad9dfb4a57f
|
||||
|
||||
PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3
|
||||
|
||||
|
@ -28,6 +28,17 @@
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Editor</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>com.googleusercontent.apps.405351917235-2jv4ff02kovoim58f8d6d0rsa14apgkj</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"file_generated_by": "FlutterFire CLI",
|
||||
"purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
|
||||
"GOOGLE_APP_ID": "1:136771801992:ios:bcdca68d2b7d227097203d",
|
||||
"FIREBASE_PROJECT_ID": "tchat-beta",
|
||||
"GCM_SENDER_ID": "136771801992"
|
||||
"GOOGLE_APP_ID": "1:405351917235:ios:869f0ad8ace08db899f2c6",
|
||||
"FIREBASE_PROJECT_ID": "meerabel-dev",
|
||||
"GCM_SENDER_ID": "405351917235"
|
||||
}
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
@ -18,9 +18,47 @@ import 'dart:async';
|
||||
|
||||
import 'package:example_router/core/dependency_injection/get_it.dart';
|
||||
import 'package:example_router/core/utils/app_bloc_observer.dart';
|
||||
import 'package:example_router/firebase_options.dart';
|
||||
import 'package:firebase_core/firebase_core.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
|
||||
class MockSettings {
|
||||
static MockSettings? _instance;
|
||||
|
||||
/// Data source mode
|
||||
late bool enable = false;
|
||||
|
||||
MockSettings._(this.enable);
|
||||
|
||||
factory MockSettings.enable() {
|
||||
_instance ??= MockSettings._(true);
|
||||
if (_instance!.enable != true) {
|
||||
throw Exception('Mock already initialized in: ${_instance!.enable}');
|
||||
}
|
||||
return _instance!;
|
||||
}
|
||||
|
||||
factory MockSettings.disable() {
|
||||
_instance ??= MockSettings._(false);
|
||||
if (_instance!.enable != false) {
|
||||
throw Exception('Mock already initialized in: ${_instance!.enable}');
|
||||
}
|
||||
return _instance!;
|
||||
}
|
||||
|
||||
static bool isEnable() {
|
||||
if (_instance == null) {
|
||||
throw Exception('MockSettings not initialized!');
|
||||
}
|
||||
return _instance!.enable == true;
|
||||
}
|
||||
|
||||
static bool isDisable() {
|
||||
return !isEnable();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> bootstrap(FutureOr<Widget> Function() builder) async {
|
||||
await runZonedGuarded(
|
||||
() async {
|
||||
@ -30,6 +68,12 @@ Future<void> bootstrap(FutureOr<Widget> Function() builder) async {
|
||||
FlutterError.onError = (details) {
|
||||
debugPrint(details.toString());
|
||||
};
|
||||
|
||||
if (MockSettings.isDisable()) {
|
||||
await Firebase.initializeApp(
|
||||
options: DefaultFirebaseOptions.currentPlatform,
|
||||
);
|
||||
}
|
||||
await GetItInitializer.init();
|
||||
|
||||
runApp(await builder());
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -14,6 +14,8 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import 'package:example_router/bootstrap.dart';
|
||||
import 'package:example_router/firebase_options.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart';
|
||||
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||
@ -24,28 +26,32 @@ abstract class GetItInitializer {
|
||||
static Future<void> init() async {
|
||||
getIt
|
||||
..registerLazySingleton<AuthenticationRemoteDataSource>(
|
||||
() => AuthenticationMockDataSourceImpl(registeredAccounts: [
|
||||
Pair(
|
||||
AccountModel(
|
||||
uid: '1',
|
||||
emailVerified: true,
|
||||
isAnonymous: false,
|
||||
providerId: 'wyatt',
|
||||
email: 'toto@test.fr',
|
||||
),
|
||||
'toto1234',
|
||||
),
|
||||
Pair(
|
||||
AccountModel(
|
||||
uid: '2',
|
||||
emailVerified: false,
|
||||
isAnonymous: false,
|
||||
providerId: 'wyatt',
|
||||
email: 'tata@test.fr',
|
||||
),
|
||||
'tata1234',
|
||||
),
|
||||
]),
|
||||
MockSettings.isEnable()
|
||||
? () => AuthenticationMockDataSourceImpl(registeredAccounts: [
|
||||
Pair(
|
||||
AccountModel(
|
||||
uid: '1',
|
||||
emailVerified: true,
|
||||
isAnonymous: false,
|
||||
providerId: 'wyatt',
|
||||
email: 'toto@test.fr',
|
||||
),
|
||||
'toto1234',
|
||||
),
|
||||
Pair(
|
||||
AccountModel(
|
||||
uid: '2',
|
||||
emailVerified: false,
|
||||
isAnonymous: false,
|
||||
providerId: 'wyatt',
|
||||
email: 'tata@test.fr',
|
||||
),
|
||||
'tata1234',
|
||||
),
|
||||
])
|
||||
: () => AuthenticationFirebaseDataSourceImpl(
|
||||
googleSignIn: GoogleSignIn(
|
||||
clientId: DefaultFirebaseOptions.ios.iosClientId)),
|
||||
)
|
||||
..registerLazySingleton<AuthenticationCacheDataSource<int>>(
|
||||
() => AuthenticationCacheDataSourceImpl<int>(),
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -0,0 +1,67 @@
|
||||
// File generated by FlutterFire CLI.
|
||||
// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members
|
||||
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:
|
||||
throw UnsupportedError(
|
||||
'DefaultFirebaseOptions have not been configured for android - '
|
||||
'you can reconfigure this by running the FlutterFire CLI again.',
|
||||
);
|
||||
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 ios = FirebaseOptions(
|
||||
apiKey: 'AIzaSyDDmtf0KN7Xw12_pqUsxoBfAxMuvCMmMmk',
|
||||
appId: '1:405351917235:ios:869f0ad8ace08db899f2c6',
|
||||
messagingSenderId: '405351917235',
|
||||
projectId: 'meerabel-dev',
|
||||
storageBucket: 'meerabel-dev.appspot.com',
|
||||
androidClientId:
|
||||
'405351917235-4g1dh3475tq6t1sa2qoh7ol60nf4ta05.apps.googleusercontent.com',
|
||||
iosClientId:
|
||||
'405351917235-2jv4ff02kovoim58f8d6d0rsa14apgkj.apps.googleusercontent.com',
|
||||
iosBundleId: 'com.example.exampleRouter',
|
||||
);
|
||||
}
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
@ -18,5 +18,6 @@ import 'package:example_router/bootstrap.dart';
|
||||
import 'package:example_router/presentation/features/app/app.dart';
|
||||
|
||||
void main() {
|
||||
MockSettings.enable();
|
||||
bootstrap(App.new);
|
||||
}
|
||||
|
@ -1,17 +1,23 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
export 'cryptography.dart';
|
||||
import 'package:example_router/bootstrap.dart';
|
||||
import 'package:example_router/presentation/features/app/app.dart';
|
||||
|
||||
void main() {
|
||||
MockSettings.disable();
|
||||
bootstrap(App.new);
|
||||
}
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
@ -71,4 +71,4 @@ class EditProfileCubit extends FormDataCubitImpl {
|
||||
}
|
||||
emit(state.copyWith(status: FormStatus.submissionSuccess));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
@ -94,6 +94,22 @@ class _SignInAnonymouslyButton extends StatelessWidget {
|
||||
}
|
||||
}
|
||||
|
||||
class _SignInWithGoogleButton extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SubmitBuilder<SignInCubit<int>>(
|
||||
builder: ((context, cubit, status) {
|
||||
return status.isSubmissionInProgress
|
||||
? const CircularProgressIndicator()
|
||||
: ElevatedButton(
|
||||
onPressed: () => cubit.signInWithGoogle(),
|
||||
child: const Text('Sign in Google'),
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class SignInForm extends StatelessWidget {
|
||||
const SignInForm({Key? key}) : super(key: key);
|
||||
|
||||
@ -116,6 +132,8 @@ class SignInForm extends StatelessWidget {
|
||||
_SignInButton(),
|
||||
const SizedBox(height: 16),
|
||||
_SignInAnonymouslyButton(),
|
||||
const SizedBox(height: 16),
|
||||
_SignInWithGoogleButton(),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
@ -30,10 +30,12 @@ class SubPage extends StatelessWidget {
|
||||
title: const Text('Sub'),
|
||||
actions: [
|
||||
IconButton(
|
||||
onPressed: () => context.read<AuthenticationCubit<int>>().signOut(),
|
||||
onPressed: () =>
|
||||
context.read<AuthenticationCubit<int>>().signOut(),
|
||||
icon: const Icon(Icons.logout_rounded)),
|
||||
IconButton(
|
||||
onPressed: () => context.read<AuthenticationRepository<int>>().refresh(),
|
||||
onPressed: () =>
|
||||
context.read<AuthenticationRepository<int>>().refresh(),
|
||||
icon: const Icon(Icons.refresh))
|
||||
],
|
||||
),
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -18,4 +18,3 @@ export 'constants/form_field.dart';
|
||||
export 'constants/form_name.dart';
|
||||
export 'enums/enums.dart';
|
||||
export 'exceptions/exceptions.dart';
|
||||
export 'utils/utils.dart';
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -20,7 +20,6 @@ part 'exceptions_firebase.dart';
|
||||
|
||||
abstract class AuthenticationFailureInterface extends AppException
|
||||
implements Exception {
|
||||
|
||||
AuthenticationFailureInterface(this.code, this.msg);
|
||||
AuthenticationFailureInterface.fromCode(this.code)
|
||||
: msg = 'An unknown error occurred.';
|
||||
@ -277,3 +276,10 @@ abstract class UpdatePasswordFailureInterface
|
||||
|
||||
UpdatePasswordFailureInterface.fromCode(super.code) : super.fromCode();
|
||||
}
|
||||
|
||||
abstract class ModelParsingFailureInterface
|
||||
extends AuthenticationFailureInterface {
|
||||
ModelParsingFailureInterface(super.code, super.msg);
|
||||
|
||||
ModelParsingFailureInterface.fromCode(super.code) : super.fromCode();
|
||||
}
|
||||
|
@ -349,3 +349,10 @@ class UpdatePasswordFailureFirebase extends UpdatePasswordFailureInterface {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ModelParsingFailureFirebase extends ModelParsingFailureInterface {
|
||||
ModelParsingFailureFirebase([String? code, String? msg])
|
||||
: super(code ?? 'unknown', msg ?? 'An unknown error occurred.');
|
||||
|
||||
ModelParsingFailureFirebase.fromCode(super.code) : super.fromCode();
|
||||
}
|
||||
|
@ -1,39 +0,0 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import 'dart:convert';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:crypto/crypto.dart';
|
||||
|
||||
class Cryptography {
|
||||
/// Generates a cryptographically secure random nonce, to be included in a
|
||||
/// credential request.
|
||||
static String generateNonce([int length = 32]) {
|
||||
const charset =
|
||||
'0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._';
|
||||
final random = Random.secure();
|
||||
return List.generate(length, (_) => charset[random.nextInt(charset.length)])
|
||||
.join();
|
||||
}
|
||||
|
||||
/// Returns the sha256 hash of [input] in hex notation.
|
||||
static String sha256ofString(String input) {
|
||||
final bytes = utf8.encode(input);
|
||||
final digest = sha256.convert(bytes);
|
||||
return digest.toString();
|
||||
}
|
||||
}
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -20,7 +20,6 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||
|
||||
class AuthenticationCacheDataSourceImpl<T extends Object>
|
||||
extends AuthenticationCacheDataSource<T> {
|
||||
|
||||
AuthenticationCacheDataSourceImpl();
|
||||
Account? _account;
|
||||
T? _data;
|
||||
|
@ -14,34 +14,22 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import 'package:firebase_auth/firebase_auth.dart';
|
||||
import 'package:wyatt_authentication_bloc/src/data/models/account_model_firebase.dart';
|
||||
import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart';
|
||||
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||
|
||||
class AuthenticationFirebaseDataSourceImpl
|
||||
extends AuthenticationRemoteDataSource {
|
||||
AuthenticationFirebaseDataSourceImpl({
|
||||
FirebaseAuth? firebaseAuth,
|
||||
GoogleSignIn? googleSignIn,
|
||||
}) : _firebaseAuth = firebaseAuth ?? FirebaseAuth.instance,
|
||||
_googleSignIn = googleSignIn ?? GoogleSignIn();
|
||||
|
||||
AuthenticationFirebaseDataSourceImpl({FirebaseAuth? firebaseAuth})
|
||||
: _firebaseAuth = firebaseAuth ?? FirebaseAuth.instance;
|
||||
final FirebaseAuth _firebaseAuth;
|
||||
final GoogleSignIn _googleSignIn;
|
||||
UserCredential? _latestCreds;
|
||||
|
||||
Account _mapper(User user) => AccountModel(
|
||||
uid: user.uid,
|
||||
emailVerified: user.emailVerified,
|
||||
isAnonymous: user.isAnonymous,
|
||||
providerId: user.providerData.first.providerId,
|
||||
creationTime: user.metadata.creationTime,
|
||||
lastSignInTime: user.metadata.lastSignInTime,
|
||||
isNewUser: (user.metadata.creationTime != null &&
|
||||
user.metadata.lastSignInTime != null)
|
||||
? user.metadata.lastSignInTime! == user.metadata.creationTime!
|
||||
: null,
|
||||
email: user.email,
|
||||
phoneNumber: user.phoneNumber,
|
||||
photoURL: user.photoURL,
|
||||
);
|
||||
|
||||
@override
|
||||
Future<Account> signInWithEmailAndPassword({
|
||||
required String email,
|
||||
@ -54,11 +42,7 @@ class AuthenticationFirebaseDataSourceImpl
|
||||
);
|
||||
_latestCreds = userCredential;
|
||||
final user = userCredential.user;
|
||||
if (user.isNotNull) {
|
||||
return _mapper(user!);
|
||||
} else {
|
||||
throw Exception(); // Get caught just after.
|
||||
}
|
||||
return AccountModelFirebase.fromFirebaseUser(user);
|
||||
} on FirebaseAuthException catch (e) {
|
||||
throw SignInWithEmailAndPasswordFailureFirebase.fromCode(e.code);
|
||||
} catch (_) {
|
||||
@ -80,11 +64,7 @@ class AuthenticationFirebaseDataSourceImpl
|
||||
);
|
||||
_latestCreds = userCredential;
|
||||
final user = userCredential.user;
|
||||
if (user.isNotNull) {
|
||||
return _mapper(user!);
|
||||
} else {
|
||||
throw Exception(); // Get caught just after.
|
||||
}
|
||||
return AccountModelFirebase.fromFirebaseUser(user);
|
||||
} on FirebaseAuthException catch (e) {
|
||||
throw SignUpWithEmailAndPasswordFailureFirebase.fromCode(e.code);
|
||||
} catch (_) {
|
||||
@ -121,8 +101,11 @@ class AuthenticationFirebaseDataSourceImpl
|
||||
@override
|
||||
Stream<Account?> streamAccount() =>
|
||||
_firebaseAuth.userChanges().map<Account?>((user) {
|
||||
final Account? account = (user.isNotNull) ? _mapper(user!) : null;
|
||||
return account;
|
||||
try {
|
||||
return AccountModelFirebase.fromFirebaseUser(user);
|
||||
} on FirebaseAuthException {
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
@override
|
||||
@ -170,11 +153,7 @@ class AuthenticationFirebaseDataSourceImpl
|
||||
final userCredential = await _firebaseAuth.signInAnonymously();
|
||||
_latestCreds = userCredential;
|
||||
final user = userCredential.user;
|
||||
if (user.isNotNull) {
|
||||
return _mapper(user!);
|
||||
} else {
|
||||
throw Exception(); // Get caught just after.
|
||||
}
|
||||
return AccountModelFirebase.fromFirebaseUser(user);
|
||||
} on FirebaseAuthException catch (e) {
|
||||
throw SignInAnonymouslyFailureFirebase.fromCode(e.code);
|
||||
} catch (_) {
|
||||
@ -182,6 +161,35 @@ class AuthenticationFirebaseDataSourceImpl
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Account> signInWithGoogle() async {
|
||||
try {
|
||||
// Trigger the authentication flow
|
||||
final GoogleSignInAccount? googleUser = await _googleSignIn.signIn();
|
||||
|
||||
// Obtain the auth details from the request
|
||||
final GoogleSignInAuthentication? googleAuth =
|
||||
await googleUser?.authentication;
|
||||
|
||||
// Create a new credential
|
||||
final credential = GoogleAuthProvider.credential(
|
||||
accessToken: googleAuth?.accessToken,
|
||||
idToken: googleAuth?.idToken,
|
||||
);
|
||||
|
||||
final userCredential =
|
||||
await _firebaseAuth.signInWithCredential(credential);
|
||||
|
||||
_latestCreds = userCredential;
|
||||
final user = userCredential.user;
|
||||
return AccountModelFirebase.fromFirebaseUser(user);
|
||||
} on FirebaseAuthException catch (e) {
|
||||
throw SignInWithGoogleFailureFirebase.fromCode(e.code);
|
||||
} catch (_) {
|
||||
throw SignInWithGoogleFailureFirebase();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<bool> verifyPasswordResetCode({required String code}) async {
|
||||
try {
|
||||
@ -215,11 +223,7 @@ class AuthenticationFirebaseDataSourceImpl
|
||||
throw Exception(); // Get caught just after.
|
||||
}
|
||||
final user = _firebaseAuth.currentUser;
|
||||
if (user.isNotNull) {
|
||||
return _mapper(user!);
|
||||
} else {
|
||||
throw Exception(); // Get caught just after.
|
||||
}
|
||||
return AccountModelFirebase.fromFirebaseUser(user);
|
||||
} on FirebaseAuthException catch (e) {
|
||||
throw ReauthenticateFailureFirebase.fromCode(e.code);
|
||||
} catch (_) {
|
||||
@ -232,11 +236,7 @@ class AuthenticationFirebaseDataSourceImpl
|
||||
try {
|
||||
await _firebaseAuth.currentUser!.updateEmail(email);
|
||||
final user = _firebaseAuth.currentUser;
|
||||
if (user.isNotNull) {
|
||||
return _mapper(user!);
|
||||
} else {
|
||||
throw Exception(); // Get caught just after.
|
||||
}
|
||||
return AccountModelFirebase.fromFirebaseUser(user);
|
||||
} on FirebaseAuthException catch (e) {
|
||||
throw UpdateEmailFailureFirebase.fromCode(e.code);
|
||||
} catch (_) {
|
||||
@ -249,11 +249,7 @@ class AuthenticationFirebaseDataSourceImpl
|
||||
try {
|
||||
await _firebaseAuth.currentUser!.updatePassword(password);
|
||||
final user = _firebaseAuth.currentUser;
|
||||
if (user.isNotNull) {
|
||||
return _mapper(user!);
|
||||
} else {
|
||||
throw Exception(); // Get caught just after.
|
||||
}
|
||||
return AccountModelFirebase.fromFirebaseUser(user);
|
||||
} on FirebaseAuthException catch (e) {
|
||||
throw UpdatePasswordFailureFirebase.fromCode(e.code);
|
||||
} catch (_) {
|
||||
|
@ -21,7 +21,6 @@ import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart';
|
||||
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||
|
||||
class AuthenticationMockDataSourceImpl extends AuthenticationRemoteDataSource {
|
||||
|
||||
AuthenticationMockDataSourceImpl({
|
||||
this.idToken = 'fake-id-token',
|
||||
this.registeredAccounts,
|
||||
@ -112,7 +111,26 @@ class AuthenticationMockDataSourceImpl extends AuthenticationRemoteDataSource {
|
||||
uid: 'mock-id-anom',
|
||||
emailVerified: false,
|
||||
isAnonymous: true,
|
||||
providerId: 'wyatt',
|
||||
providerId: 'wyatt-studio.fr',
|
||||
creationTime: creation,
|
||||
lastSignInTime: creation,
|
||||
isNewUser: creation == creation,
|
||||
);
|
||||
_streamAccount.add(mock);
|
||||
_connectedMock = _connectedMock?.copyWith(left: mock);
|
||||
_lastSignInTime = DateTime.now();
|
||||
return Future.value(mock);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Account> signInWithGoogle() async {
|
||||
await _randomDelay();
|
||||
final creation = DateTime.now();
|
||||
final mock = AccountModel(
|
||||
uid: 'mock-id-google',
|
||||
emailVerified: true,
|
||||
isAnonymous: false,
|
||||
providerId: 'google.com',
|
||||
creationTime: creation,
|
||||
lastSignInTime: creation,
|
||||
isNewUser: creation == creation,
|
||||
|
@ -72,16 +72,17 @@ class AccountModel extends Account {
|
||||
String? phoneNumber,
|
||||
String? photoURL,
|
||||
String? providerId,
|
||||
}) => AccountModel(
|
||||
uid: uid ?? this.uid,
|
||||
email: email ?? this.email,
|
||||
creationTime: creationTime ?? this.creationTime,
|
||||
emailVerified: emailVerified ?? this.emailVerified,
|
||||
isAnonymous: isAnonymous ?? this.isAnonymous,
|
||||
isNewUser: isNewUser ?? this.isNewUser,
|
||||
lastSignInTime: lastSignInTime ?? this.lastSignInTime,
|
||||
phoneNumber: phoneNumber ?? this.phoneNumber,
|
||||
photoURL: photoURL ?? this.photoURL,
|
||||
providerId: providerId ?? this.providerId,
|
||||
);
|
||||
}) =>
|
||||
AccountModel(
|
||||
uid: uid ?? this.uid,
|
||||
email: email ?? this.email,
|
||||
creationTime: creationTime ?? this.creationTime,
|
||||
emailVerified: emailVerified ?? this.emailVerified,
|
||||
isAnonymous: isAnonymous ?? this.isAnonymous,
|
||||
isNewUser: isNewUser ?? this.isNewUser,
|
||||
lastSignInTime: lastSignInTime ?? this.lastSignInTime,
|
||||
phoneNumber: phoneNumber ?? this.phoneNumber,
|
||||
photoURL: photoURL ?? this.photoURL,
|
||||
providerId: providerId ?? this.providerId,
|
||||
);
|
||||
}
|
||||
|
@ -0,0 +1,55 @@
|
||||
// ignore_for_file: public_member_api_docs, sort_constructors_first
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart';
|
||||
|
||||
class AccountModelFirebase extends AccountModel {
|
||||
AccountModelFirebase._({
|
||||
required super.uid,
|
||||
required super.emailVerified,
|
||||
required super.isAnonymous,
|
||||
required super.providerId,
|
||||
super.lastSignInTime,
|
||||
super.creationTime,
|
||||
super.isNewUser,
|
||||
super.email,
|
||||
super.phoneNumber,
|
||||
super.photoURL,
|
||||
});
|
||||
|
||||
factory AccountModelFirebase.fromFirebaseUser(User? user) {
|
||||
if (user != null) {
|
||||
return AccountModelFirebase._(
|
||||
uid: user.uid,
|
||||
emailVerified: user.emailVerified,
|
||||
isAnonymous: user.isAnonymous,
|
||||
providerId: user.providerData.first.providerId,
|
||||
creationTime: user.metadata.creationTime,
|
||||
lastSignInTime: user.metadata.lastSignInTime,
|
||||
isNewUser: (user.metadata.creationTime != null &&
|
||||
user.metadata.lastSignInTime != null)
|
||||
? user.metadata.lastSignInTime! == user.metadata.creationTime!
|
||||
: null,
|
||||
email: user.email,
|
||||
phoneNumber: user.phoneNumber,
|
||||
photoURL: user.photoURL,
|
||||
);
|
||||
} else {
|
||||
throw ModelParsingFailureFirebase('null-user', 'User cannot be null!');
|
||||
}
|
||||
}
|
||||
}
|
@ -29,8 +29,9 @@ class AccountWrapperModel<T> extends AccountWrapper<T> {
|
||||
AccountWrapperModel<T> copyWith({
|
||||
Account? account,
|
||||
T? data,
|
||||
}) => AccountWrapperModel<T>(
|
||||
account ?? this.account,
|
||||
data ?? this.data,
|
||||
);
|
||||
}) =>
|
||||
AccountWrapperModel<T>(
|
||||
account ?? this.account,
|
||||
data ?? this.data,
|
||||
);
|
||||
}
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -41,8 +41,7 @@ typedef OnAuthChange<T> = FutureOrResult<T?> Function(
|
||||
);
|
||||
|
||||
class AuthenticationRepositoryImpl<T extends Object>
|
||||
extends AuthenticationRepository<T> { // Semaphore
|
||||
|
||||
extends AuthenticationRepository<T> {
|
||||
AuthenticationRepositoryImpl({
|
||||
required AuthenticationCacheDataSource<T> authenticationCacheDataSource,
|
||||
required AuthenticationRemoteDataSource authenticationRemoteDataSource,
|
||||
@ -295,6 +294,17 @@ class AuthenticationRepositoryImpl<T extends Object>
|
||||
(error) => error,
|
||||
);
|
||||
|
||||
@override
|
||||
FutureOrResult<Account> signInWithGoogle() =>
|
||||
Result.tryCatchAsync<Account, AppException, AppException>(
|
||||
() async {
|
||||
final account =
|
||||
await _authenticationRemoteDataSource.signInWithGoogle();
|
||||
return account;
|
||||
},
|
||||
(error) => error,
|
||||
);
|
||||
|
||||
@override
|
||||
FutureOrResult<bool> verifyPasswordResetCode({required String code}) =>
|
||||
Result.tryCatchAsync<bool, AppException, AppException>(
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -49,6 +49,8 @@ abstract class AuthenticationRemoteDataSource extends BaseRemoteDataSource {
|
||||
|
||||
Future<Account> signInAnonymously();
|
||||
|
||||
Future<Account> signInWithGoogle();
|
||||
|
||||
Future<Account> updateEmail({required String email});
|
||||
|
||||
Future<Account> updatePassword({required String password});
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -73,6 +73,13 @@ abstract class AuthenticationRepository<T> extends BaseRepository {
|
||||
/// {@endtemplate}
|
||||
FutureOrResult<Account> signInAnonymously();
|
||||
|
||||
/// {@template signin_google}
|
||||
/// Starts the Sign In with Google Flow.
|
||||
///
|
||||
/// Throws a SignInWithGoogleFailureInterface if an exception occurs.
|
||||
/// {@endtemplate}
|
||||
FutureOrResult<Account> signInWithGoogle();
|
||||
|
||||
/// {@template signin_pwd}
|
||||
/// Signs in with the provided [email] and [password].
|
||||
///
|
||||
@ -105,8 +112,8 @@ abstract class AuthenticationRepository<T> extends BaseRepository {
|
||||
});
|
||||
|
||||
/// {@template reauthenticate}
|
||||
/// Some security-sensitive actions—such as deleting an account,
|
||||
/// setting a primary email address, and changing a password—require that
|
||||
/// Some security-sensitive actions—such as deleting an account,
|
||||
/// setting a primary email address, and changing a password—require that
|
||||
/// the user has recently signed in.
|
||||
///
|
||||
/// Throws a ReauthenticateFailureInterface if
|
||||
@ -129,7 +136,7 @@ abstract class AuthenticationRepository<T> extends BaseRepository {
|
||||
/// Stream of [AccountWrapper] which will emit the current account when
|
||||
/// the authentication state changes.
|
||||
///
|
||||
/// Emits [AccountWrapper] with null [Account] if the user is not
|
||||
/// Emits [AccountWrapper] with null [Account] if the user is not
|
||||
/// authenticated.
|
||||
/// {@endtemplate}
|
||||
Stream<FutureOrResult<AccountWrapper<T>>> streamAccount();
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -26,7 +26,6 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||
part 'authentication_state.dart';
|
||||
|
||||
class AuthenticationCubit<Extra> extends Cubit<AuthenticationState<Extra>> {
|
||||
|
||||
AuthenticationCubit({
|
||||
required AuthenticationRepository<Extra> authenticationRepository,
|
||||
}) : _authenticationRepository = authenticationRepository,
|
||||
|
@ -17,11 +17,8 @@
|
||||
part of 'authentication_cubit.dart';
|
||||
|
||||
class AuthenticationState<Extra> extends Equatable {
|
||||
|
||||
const AuthenticationState._({required this.status, this.accountWrapper});
|
||||
|
||||
const AuthenticationState.unknown()
|
||||
: this._(status: AuthenticationStatus.unknown);
|
||||
const AuthenticationState.unauthenticated()
|
||||
: this._(status: AuthenticationStatus.unauthenticated);
|
||||
|
||||
const AuthenticationState.authenticated(AccountWrapper<Extra> accountWrapper)
|
||||
: this._(
|
||||
@ -29,8 +26,10 @@ class AuthenticationState<Extra> extends Equatable {
|
||||
accountWrapper: accountWrapper,
|
||||
);
|
||||
|
||||
const AuthenticationState.unauthenticated()
|
||||
: this._(status: AuthenticationStatus.unauthenticated);
|
||||
const AuthenticationState.unknown()
|
||||
: this._(status: AuthenticationStatus.unknown);
|
||||
|
||||
const AuthenticationState._({required this.status, this.accountWrapper});
|
||||
final AuthenticationStatus status;
|
||||
final AccountWrapper<Extra>? accountWrapper;
|
||||
|
||||
|
@ -24,7 +24,6 @@ import 'package:wyatt_form_bloc/wyatt_form_bloc.dart';
|
||||
part 'email_verification_state.dart';
|
||||
|
||||
class EmailVerificationCubit<Extra> extends Cubit<EmailVerificationState> {
|
||||
|
||||
EmailVerificationCubit({
|
||||
required AuthenticationRepository<Extra> authenticationRepository,
|
||||
}) : _authenticationRepository = authenticationRepository,
|
||||
|
@ -25,7 +25,6 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||
part 'password_reset_state.dart';
|
||||
|
||||
class PasswordResetCubit<Extra> extends FormDataCubit<PasswordResetState> {
|
||||
|
||||
PasswordResetCubit({
|
||||
required AuthenticationRepository<Extra> authenticationRepository,
|
||||
}) : _authenticationRepository = authenticationRepository,
|
||||
|
@ -17,7 +17,6 @@
|
||||
part of 'password_reset_cubit.dart';
|
||||
|
||||
class PasswordResetState extends FormDataState {
|
||||
|
||||
const PasswordResetState({
|
||||
required super.form,
|
||||
super.status = FormStatus.pure,
|
||||
|
@ -23,7 +23,6 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||
part 'sign_in_state.dart';
|
||||
|
||||
class SignInCubit<Extra> extends FormDataCubit<SignInState> {
|
||||
|
||||
SignInCubit({
|
||||
required AuthenticationRepository<Extra> authenticationRepository,
|
||||
}) : _authenticationRepository = authenticationRepository,
|
||||
@ -206,4 +205,24 @@ class SignInCubit<Extra> extends FormDataCubit<SignInState> {
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
FutureOr<void> signInWithGoogle() async {
|
||||
if (state.status.isSubmissionInProgress) {
|
||||
return;
|
||||
}
|
||||
// TODO(wyatt): maybe emit new state (to not carry an old errorMessage)
|
||||
emit(state.copyWith(status: FormStatus.submissionInProgress));
|
||||
|
||||
final uid = await _authenticationRepository.signInWithGoogle();
|
||||
|
||||
emit(
|
||||
uid.fold(
|
||||
(value) => state.copyWith(status: FormStatus.submissionSuccess),
|
||||
(error) => state.copyWith(
|
||||
errorMessage: error.message,
|
||||
status: FormStatus.submissionFailure,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -17,7 +17,6 @@
|
||||
part of 'sign_in_cubit.dart';
|
||||
|
||||
class SignInState extends FormDataState {
|
||||
|
||||
const SignInState({
|
||||
required super.form,
|
||||
super.status = FormStatus.pure,
|
||||
|
@ -25,7 +25,6 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||
part 'sign_up_state.dart';
|
||||
|
||||
class SignUpCubit<Extra> extends FormDataCubit<SignUpState> {
|
||||
|
||||
SignUpCubit({
|
||||
required AuthenticationRepository<Extra> authenticationRepository,
|
||||
}) : _authenticationRepository = authenticationRepository,
|
||||
|
@ -17,7 +17,6 @@
|
||||
part of 'sign_up_cubit.dart';
|
||||
|
||||
class SignUpState extends FormDataState {
|
||||
|
||||
const SignUpState({
|
||||
required super.form,
|
||||
super.status = FormStatus.pure,
|
||||
|
@ -1,16 +1,16 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
@ -17,4 +17,7 @@
|
||||
/// An authentication library for BLoC.
|
||||
library wyatt_authentication_bloc;
|
||||
|
||||
export 'package:firebase_auth/firebase_auth.dart';
|
||||
export 'package:google_sign_in/google_sign_in.dart';
|
||||
|
||||
export 'src/src.dart';
|
||||
|
@ -10,17 +10,12 @@ environment:
|
||||
flutter: ">=1.17.0"
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
|
||||
flutter: { sdk: flutter }
|
||||
crypto: ^3.0.2
|
||||
flutter_bloc: ^8.1.1
|
||||
equatable: ^2.0.5
|
||||
firebase_auth: ^4.1.1
|
||||
google_sign_in: ^5.3.0
|
||||
flutter_facebook_auth: ^4.3.0
|
||||
sign_in_with_apple: ^3.3.0
|
||||
twitter_login: ^4.2.3
|
||||
firebase_auth: ^4.2.0
|
||||
google_sign_in: ^5.4.2
|
||||
rxdart: ^0.27.7
|
||||
|
||||
wyatt_form_bloc:
|
||||
@ -36,8 +31,7 @@ dependencies:
|
||||
version: ^0.0.4
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
flutter_test: { sdk: flutter }
|
||||
bloc_test: ^9.1.0
|
||||
mocktail: ^0.3.0
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user