add pin login and add pin code

This commit is contained in:
tzw
2024-10-04 13:55:59 +06:30
parent b5023a4171
commit 81dfeb037d
18 changed files with 340 additions and 68 deletions

View File

@@ -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);
}
}

View File

@@ -74,4 +74,23 @@ class AuthServiceImp implements AuthService {
Future<void> deleteAccount() {
return authFb.deleteAccount();
}
@override
Future<void> pinLogin(
{required String currentUserId,
required String fcsID,
required String pin}) {
return authFb.pinLogin(
currentUserId: currentUserId, fcsID: fcsID, pin: pin);
}
@override
User? getPinLoginUser() {
return authFb.pinLoginUser;
}
@override
Future<void> logoutPinAccount() {
return authFb.logoutPinAccount();
}
}

View File

@@ -15,4 +15,10 @@ abstract class AuthService {
Stream<User?> getUserStream();
Stream<Setting> getSetting();
Future<void> deleteAccount();
Future<void> pinLogin(
{required String currentUserId,
required String fcsID,
required String pin});
User? getPinLoginUser();
Future<void> logoutPinAccount();
}