Skip to content

Commit

Permalink
checking if the user is active from another device then signout other…
Browse files Browse the repository at this point in the history
… device if is it true
  • Loading branch information
najiibmohamed11 committed May 1, 2024
1 parent e4164b6 commit af61c75
Show file tree
Hide file tree
Showing 8 changed files with 294 additions and 180 deletions.
1 change: 1 addition & 0 deletions devtools_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
extensions:
23 changes: 14 additions & 9 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import 'package:debt_manager/pages/editprofilefirst.dart';
import 'package:debt_manager/pages/home.dart';
import 'package:debt_manager/pages/items.dart';
import 'package:debt_manager/pages/phonauth.dart';
import 'package:debt_manager/profider/profider.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:path_provider/path_provider.dart';
import 'package:debt_manager/utility/backups/backups.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:provider/provider.dart';

Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
Expand Down Expand Up @@ -38,15 +40,18 @@ class MyApp extends StatelessWidget {
backup.takebackup();
final String initialrot = currentUser != null ? Home.id : PhoneAuth.id;

return MaterialApp(
initialRoute: initialrot,

debugShowCheckedModeBanner: false, // Disable the debug banner
routes: {
Home.id: (context) => Home(key: homeStateKey),
PhoneAuth.id: (context) => PhoneAuth(),
EditProfileFirst.id: (context) => EditProfileFirst(),
},
return MultiProvider(
providers: [ChangeNotifierProvider(create: (context) => UseridGenerator())],
child: MaterialApp(
initialRoute: initialrot,

debugShowCheckedModeBanner: false, // Disable the debug banner
routes: {
Home.id: (context) => Home(key: homeStateKey),
PhoneAuth.id: (context) => PhoneAuth(),
EditProfileFirst.id: (context) => EditProfileFirst(),
},
),
);
}
}
176 changes: 97 additions & 79 deletions lib/pages/editprofilefirst.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import 'dart:io';
import 'dart:typed_data';
import 'package:debt_manager/pages/home.dart';
import 'package:debt_manager/pages/phonauth.dart';
import 'package:debt_manager/profider/profider.dart';
import 'package:debt_manager/utility/backups/restoringbackup.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:image_picker/image_picker.dart';
import 'package:path_provider/path_provider.dart'; // Required for file operations
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart'; // Required for file operations

class EditProfileFirst extends StatefulWidget {
const EditProfileFirst({Key? key}) : super(key: key);
Expand Down Expand Up @@ -67,92 +70,107 @@ class _EditProfileFirstState extends State<EditProfileFirst> {

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text("Edit profile", style: TextStyle(color: Colors.green)),
backgroundColor: Colors.white10,
),
body: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Center(
child: Text(
"Please enter your store name and the image is optional"),
),
SizedBox(height: 30.0),
GestureDetector(
onTap: () async {
await imagepicker(ImageSource.gallery);
},
child: Container(
width: 180,
height: 180,
child: imageFile != null
? ClipOval(child: Image.file(imageFile!))
: Icon(Icons.add_a_photo, size: 90),
decoration: BoxDecoration(
color: Colors.grey,
borderRadius: BorderRadius.circular(100)),
return Consumer<UseridGenerator>(builder: (context, value, child) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text("Edit profile", style: TextStyle(color: Colors.green)),
backgroundColor: Colors.white10,
),
body: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Center(
child: Text(
"Please enter your store name and the image is optional"),
),
),
SizedBox(height: 40.0),
Container(
width: 340,
child: TextFormField(
controller: _controller,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your name';
}
return null;
SizedBox(height: 30.0),
GestureDetector(
onTap: () async {
await imagepicker(ImageSource.gallery);
},
decoration: InputDecoration(
hintText: 'Enter your name',
hintStyle: TextStyle(color: Colors.green),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(width: 2.0, color: Colors.green),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(width: 2.0, color: Colors.green),
),
child: Container(
width: 180,
height: 180,
child: imageFile != null
? ClipOval(child: Image.file(imageFile!))
: Icon(Icons.add_a_photo, size: 90),
decoration: BoxDecoration(
color: Colors.grey,
borderRadius: BorderRadius.circular(100)),
),
),
),
Spacer(),
Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: ElevatedButton(
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.green),
foregroundColor: MaterialStateProperty.all(Colors.white),
textStyle: MaterialStateProperty.all(TextStyle(fontSize: 16)),
SizedBox(height: 40.0),
Container(
width: 340,
child: TextFormField(
controller: _controller,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your name';
}
return null;
},
decoration: InputDecoration(
hintText: 'Enter your name',
hintStyle: TextStyle(color: Colors.green),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(width: 2.0, color: Colors.green),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(width: 2.0, color: Colors.green),
),
),
),
onPressed: () {
if (_formKey.currentState!.validate()) {
// Update display name in Firebase Auth and check if currentUser is not null
currentUser?.updateDisplayName(_controller.text).then((_) {
print(currentUser?.displayName); // Print new display name
});
),
Spacer(),
Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: ElevatedButton(
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.green),
foregroundColor: MaterialStateProperty.all(Colors.white),
textStyle:
MaterialStateProperty.all(TextStyle(fontSize: 16)),
),
onPressed: () {
if (_formKey.currentState!.validate()) {
currentUser
?.updateDisplayName(_controller.text)
.then((_) {
print(
currentUser?.displayName); // Print new display name
}).catchError((e) {
print('Error updating display name: $e');
});

// Check if the image file is not null before attempting to save its path
if (imageFile != null) {
userbox.put("image", imageFile!.path); // Save image path
}
if (value.getSession() != null) {
userbox.put("sessionId", value.getSession());
} else {
// Handle case where session is not set
print("Session ID is null");
Navigator.pushReplacementNamed(context, PhoneAuth.id);
return; // Exit the function to avoid further processing
}

// Save display name in Hive
userbox.put("store name", _controller.text);
Navigator.pushReplacementNamed(context, Home.id);
}
},
child: Text("NEXT"),
if (imageFile != null) {
userbox.put("image",
imageFile!.path); // Ensure imageFile is not null
}

userbox.put("store name", _controller.text);
Navigator.pushReplacementNamed(context, Home.id);
}
},
child: Text("NEXT"),
),
),
),
],
],
),
),
),
);
);
});
}
}
31 changes: 31 additions & 0 deletions lib/pages/home.dart
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
import 'dart:async';
import 'dart:math';

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:debt_manager/components/debtorcard.dart';
import 'package:debt_manager/components/totalcard.dart';
import 'package:debt_manager/pages/items.dart';
import 'package:debt_manager/pages/phonauth.dart';
import 'package:debt_manager/utility/backups/backups.dart';
import 'package:debt_manager/utility/backups/restoringbackup.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:hive/hive.dart';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:uuid/uuid.dart';

GlobalKey<_HomeState> homeStateKey = GlobalKey();

Expand All @@ -32,6 +36,7 @@ double? total_amount_off_sos = 0.0;
String _searchQuery = '';
Backups backup = new Backups();
final debtorsBox = Hive.box("debtorsBox");
final userbox = Hive.box('usercridatial');

Future<void> addNewDebtor(String newDebtor, String selectedCategory) async {
var debtorsBox = Hive.box("debtorsBox");
Expand All @@ -44,11 +49,37 @@ Future<void> addNewDebtor(String newDebtor, String selectedCategory) async {
}

class _HomeState extends State<Home> {
final String sessionId = userbox.get("sessionId");
// Generate a new session ID for each login attempt

@override
void checkSession(User user) {
FirebaseFirestore.instance
.collection('user_sessions')
.doc(user.uid)
.snapshots()
.listen((snapshot) {
if (snapshot.data()?['sessionId'] != sessionId) {
FirebaseAuth.instance.signOut();
Navigator.pushReplacementNamed(context, PhoneAuth.id);
}
});
if (sessionId == null) {
Navigator.pushReplacementNamed(context, PhoneAuth.id);
}
print(sessionId);
}

void initState() {
// TODO: implement initState

super.initState();
FirebaseAuth.instance.authStateChanges().listen((User? user) {
if (user != null) {
checkSession(
user); // This ensures the listener is attached whenever the app starts and the user is already logged in
}
});
}

void totalamounts() {
Expand Down
Loading

0 comments on commit af61c75

Please sign in to comment.