add pin login and add pin code
This commit is contained in:
@@ -12,6 +12,7 @@ import 'package:fcs/helpers/firebase_helper.dart';
|
||||
import 'package:firebase_auth/firebase_auth.dart' as fb;
|
||||
import 'package:logging/logging.dart';
|
||||
|
||||
import '../../helpers/shared_pref.dart';
|
||||
import '../services/services.dart';
|
||||
|
||||
class AuthFb {
|
||||
@@ -108,13 +109,15 @@ class AuthFb {
|
||||
Future<void> signoutStart() async {
|
||||
await userListener?.cancel();
|
||||
await userAuthListener?.cancel();
|
||||
await _pinUserListener?.cancel();
|
||||
}
|
||||
|
||||
Future<void> signoutEnd() async {
|
||||
await SharedPref.setPinLockOn(false);
|
||||
await _fb.signOut();
|
||||
}
|
||||
|
||||
Future<void> _addUserToStream({bool refreshIdToken = false}) async {
|
||||
Future<User?> _addUserToStream({bool refreshIdToken = false}) async {
|
||||
fb.User? firebaseUser = _fb.currentUser;
|
||||
if (firebaseUser == null) return null;
|
||||
Map<dynamic, dynamic>? claims =
|
||||
@@ -128,15 +131,20 @@ class AuthFb {
|
||||
user = await _getUserFromFirestore(cid);
|
||||
}
|
||||
if (user == null) {
|
||||
controller.add(null);
|
||||
return;
|
||||
_addUser(null);
|
||||
return null;
|
||||
}
|
||||
|
||||
loadUserClaim(claims, user);
|
||||
controller.add(user);
|
||||
_addUser(user);
|
||||
return user;
|
||||
}
|
||||
|
||||
loadUserClaim(Map claims, User user) {
|
||||
if (pinLoginUser != null) {
|
||||
user.fcsID = pinLoginUser?.fcsID;
|
||||
}
|
||||
|
||||
// add privileges
|
||||
String? privileges = claims["pr"];
|
||||
if (privileges != null && privileges != "") {
|
||||
@@ -252,9 +260,9 @@ class AuthFb {
|
||||
// get privilege from claim
|
||||
Map<dynamic, dynamic> claims = await getClaims(refreshIdToken: true);
|
||||
loadUserClaim(claims, user);
|
||||
controller.add(user);
|
||||
_addUser(user);
|
||||
} catch (e) {
|
||||
controller.add(null);
|
||||
_addUser(null);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -286,12 +294,23 @@ class AuthFb {
|
||||
|
||||
log.info("_startAuthListener: $user");
|
||||
if (_logIn) {
|
||||
controller.add(user);
|
||||
_addUser(user);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
_addUser(User? user) {
|
||||
if (user == null) {
|
||||
pinLoginUser = null;
|
||||
}
|
||||
if (pinLoginUser != null) {
|
||||
controller.add(pinLoginUser);
|
||||
} else {
|
||||
controller.add(user);
|
||||
}
|
||||
}
|
||||
|
||||
Stream<User?> user() {
|
||||
// ignore: close_sinks
|
||||
StreamSubscription<fb.User?>? authListener;
|
||||
@@ -301,7 +320,7 @@ class AuthFb {
|
||||
authListener = _fb.authStateChanges().listen((firebaseUser) async {
|
||||
_logIn = firebaseUser != null;
|
||||
if (firebaseUser == null) {
|
||||
controller.add(null);
|
||||
_addUser(null);
|
||||
} else {
|
||||
_addUserToStream(refreshIdToken: true);
|
||||
_startUserListener();
|
||||
@@ -319,4 +338,51 @@ class AuthFb {
|
||||
|
||||
return controller.stream;
|
||||
}
|
||||
|
||||
User? pinLoginUser;
|
||||
|
||||
StreamSubscription<DocumentSnapshot>? _pinUserListener;
|
||||
|
||||
Future<void> pinLogin(
|
||||
{required String currentUserId,
|
||||
required String fcsID,
|
||||
required String pin}) async {
|
||||
var data = await requestAPI("/pin/login", "POST",
|
||||
token: await getToken(), payload: {'fcs_id': fcsID, 'pin': pin});
|
||||
|
||||
var userId = data['user_id'] ?? '';
|
||||
if (userId == currentUserId) {
|
||||
//logout
|
||||
logoutPinAccount();
|
||||
await SharedPref.setPinLockOn(false);
|
||||
}
|
||||
|
||||
var pinToken = data['pin_token'] ?? '';
|
||||
|
||||
// Get user for pin login
|
||||
_listenPinUser(userId: userId, pinToken: pinToken);
|
||||
}
|
||||
|
||||
Future<void> _listenPinUser(
|
||||
{required String userId, required String pinToken}) async {
|
||||
Stream<DocumentSnapshot> snapshot = FirebaseFirestore.instance
|
||||
.collection(user_collection)
|
||||
.doc(userId)
|
||||
.snapshots();
|
||||
_pinUserListener?.cancel();
|
||||
_pinUserListener = snapshot.listen((snap) async {
|
||||
User user = User.fromMap(snap.data() as Map<String, dynamic>, snap.id);
|
||||
pinLoginUser = user;
|
||||
if (pinLoginUser != null) {
|
||||
pinLoginUser!.pinToken = pinToken;
|
||||
}
|
||||
await _addUserToStream(refreshIdToken: true);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> logoutPinAccount() async {
|
||||
_pinUserListener?.cancel();
|
||||
pinLoginUser = null;
|
||||
await _addUserToStream(refreshIdToken: true);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user