diff --git a/lib/src/features/user_job_post/data/firestore_repo.dart b/lib/src/features/user_job_post/data/firestore_repo.dart index dee27b0..acbef19 100644 --- a/lib/src/features/user_job_post/data/firestore_repo.dart +++ b/lib/src/features/user_job_post/data/firestore_repo.dart @@ -1,28 +1,48 @@ // lib/data/repositories/firestore_repository.dart import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_auth/firebase_auth.dart'; import 'package:home_front_pk/src/features/user_job_post/domain/job_post_model.dart'; class FirestoreRepository { final FirebaseFirestore _firestore = FirebaseFirestore.instance; + final FirebaseAuth _auth = FirebaseAuth.instance; - Future createJobPost(JobPost jobPost) async { + String? get currentUserId => _auth.currentUser?.uid; + + Future createJobPost(JobPost jobPost) async { try { - final docRef = await _firestore.collection('jobs').add(jobPost.toJson()); - return docRef.id; + if (currentUserId == null) { + throw Exception('No user logged in'); + } + + // Create a new document reference + final docRef = _firestore.collection('jobs').doc(); + + // Update the job post with the document ID and current user ID + final updatedJobPost = jobPost.copyWith( + id: docRef.id, + userId: currentUserId, + ); + + // Set the document data + await docRef.set(updatedJobPost.toJson()); } catch (e) { throw Exception('Failed to create job post: $e'); } } - // Add this new method to get user's jobs Stream> getUserJobs(String userId) { return _firestore .collection('jobs') .where('userId', isEqualTo: userId) .orderBy('createdAt', descending: true) .snapshots() - .map((snapshot) => - snapshot.docs.map((doc) => JobPost.fromJson(doc.data())).toList()); + .map((snapshot) => snapshot.docs + .map((doc) => JobPost.fromJson({ + ...doc.data(), + 'id': doc.id, // Include the document ID + })) + .toList()); } Stream> getJobPosts(String category) { @@ -31,7 +51,11 @@ class FirestoreRepository { .where('category', isEqualTo: category) .orderBy('createdAt', descending: true) .snapshots() - .map((snapshot) => - snapshot.docs.map((doc) => JobPost.fromJson(doc.data())).toList()); + .map((snapshot) => snapshot.docs + .map((doc) => JobPost.fromJson({ + ...doc.data(), + 'id': doc.id, // Include the document ID + })) + .toList()); } } diff --git a/lib/src/features/user_job_post/presentation/job_post_screen.dart b/lib/src/features/user_job_post/presentation/job_post_screen.dart index d3f300a..5cbf81b 100644 --- a/lib/src/features/user_job_post/presentation/job_post_screen.dart +++ b/lib/src/features/user_job_post/presentation/job_post_screen.dart @@ -168,9 +168,9 @@ class _CreateJobPostScreenState extends ConsumerState { estimatedCost: _estimatedCost, budget: _budget, ); - if (mounted && !jobPostState.hasError) { - context.goNamed(AppRoute.userJobs.name); - } + + // ignore: use_build_context_synchronously + context.goNamed(AppRoute.userJobs.name); } }, child: jobPostState.isLoading diff --git a/lib/src/features/user_job_post/presentation/user_jobs_controller.dart b/lib/src/features/user_job_post/presentation/user_jobs_controller.dart index c153760..f108f14 100644 --- a/lib/src/features/user_job_post/presentation/user_jobs_controller.dart +++ b/lib/src/features/user_job_post/presentation/user_jobs_controller.dart @@ -13,13 +13,25 @@ final userJobsControllerProvider = class UserJobsController extends StateNotifier>> { final Ref _ref; StreamSubscription>? _subscription; + StreamSubscription? _authSubscription; UserJobsController(this._ref) : super(const AsyncValue.loading()) { - loadUserJobs(); + // Listen to auth state changes + _authSubscription = FirebaseAuth.instance.authStateChanges().listen((user) { + if (user != null) { + loadUserJobs(); + } else { + state = const AsyncValue.data([]); + } + }); } void loadUserJobs() { - final userId = FirebaseAuth.instance.currentUser!.uid; + final userId = FirebaseAuth.instance.currentUser?.uid; + if (userId == null) { + state = const AsyncValue.error('No user logged in', StackTrace.empty); + return; + } state = const AsyncValue.loading(); _subscription?.cancel(); @@ -34,6 +46,7 @@ class UserJobsController extends StateNotifier>> { @override void dispose() { _subscription?.cancel(); + _authSubscription?.cancel(); super.dispose(); } }