diff --git a/recipients_app/lib/core/cubits/auth/auth_cubit.dart b/recipients_app/lib/core/cubits/auth/auth_cubit.dart index 2894c2a65..553f90bf4 100644 --- a/recipients_app/lib/core/cubits/auth/auth_cubit.dart +++ b/recipients_app/lib/core/cubits/auth/auth_cubit.dart @@ -23,12 +23,18 @@ class AuthCubit extends Cubit { if (user != null) { try { final recipient = await userRepository.fetchRecipient(user); + Organization? organization; + + if (recipient?.organizationRef != null) { + organization = await organizationRepository.fetchOrganization(recipient!.organizationRef!); + } emit( AuthState( status: AuthStatus.authenticated, firebaseUser: user, recipient: recipient, + organization: organization, ), ); } on Exception catch (ex, stackTrace) { @@ -59,8 +65,7 @@ class AuthCubit extends Cubit { Organization? organization; if (recipient?.organizationRef != null) { - organization = await organizationRepository - .fetchOrganization(recipient!.organizationRef!); + organization = await organizationRepository.fetchOrganization(recipient!.organizationRef!); } emit( diff --git a/recipients_app/lib/core/cubits/auth/auth_state.dart b/recipients_app/lib/core/cubits/auth/auth_state.dart index ae3db5a60..04e1e570f 100644 --- a/recipients_app/lib/core/cubits/auth/auth_state.dart +++ b/recipients_app/lib/core/cubits/auth/auth_state.dart @@ -26,19 +26,21 @@ class AuthState extends Equatable { }); @override - List get props => [status, firebaseUser, recipient, exception]; + List get props => [status, firebaseUser, recipient, exception, organization]; AuthState copyWith({ AuthStatus? status, User? firebaseUser, Recipient? recipient, Exception? exception, + Organization? organization, }) { return AuthState( status: status ?? this.status, firebaseUser: firebaseUser ?? this.firebaseUser, recipient: recipient ?? this.recipient, exception: exception ?? this.exception, + organization: organization ?? this.organization, ); } } diff --git a/recipients_app/lib/data/datasource/demo/no_op_document_reference.dart b/recipients_app/lib/data/datasource/demo/no_op_document_reference.dart new file mode 100644 index 000000000..9e3548e92 --- /dev/null +++ b/recipients_app/lib/data/datasource/demo/no_op_document_reference.dart @@ -0,0 +1,66 @@ +import "package:cloud_firestore/cloud_firestore.dart"; + +// ignore: subtype_of_sealed_class +class NoOpDocumentReference implements DocumentReference> { + const NoOpDocumentReference(); + + @override + CollectionReference> collection(String collectionPath) { + // TODO: implement collection + throw UnimplementedError(); + } + + @override + Future delete() { + // TODO: implement delete + throw UnimplementedError(); + } + + @override + // TODO: implement firestore + FirebaseFirestore get firestore => throw UnimplementedError(); + + @override + Future>> get([GetOptions? options]) { + // TODO: implement get + throw UnimplementedError(); + } + + @override + // TODO: implement id + String get id => throw UnimplementedError(); + + @override + // TODO: implement parent + CollectionReference> get parent => throw UnimplementedError(); + + @override + // TODO: implement path + String get path => throw UnimplementedError(); + + @override + Future set(Map data, [SetOptions? options]) { + // TODO: implement set + throw UnimplementedError(); + } + + @override + Stream>> snapshots( + {bool includeMetadataChanges = false, ListenSource source = ListenSource.defaultSource,}) { + // TODO: implement snapshots + throw UnimplementedError(); + } + + @override + Future update(Map data) { + // TODO: implement update + throw UnimplementedError(); + } + + @override + DocumentReference withConverter( + {required FromFirestore fromFirestore, required ToFirestore toFirestore,}) { + // TODO: implement withConverter + throw UnimplementedError(); + } +} diff --git a/recipients_app/lib/data/datasource/demo/organization_demo_data_source.dart b/recipients_app/lib/data/datasource/demo/organization_demo_data_source.dart new file mode 100644 index 000000000..0ba0d6b0a --- /dev/null +++ b/recipients_app/lib/data/datasource/demo/organization_demo_data_source.dart @@ -0,0 +1,16 @@ +import "package:app/data/datasource/organization_data_source.dart"; +import "package:app/data/models/models.dart"; +import "package:cloud_firestore/cloud_firestore.dart"; + +class OrganizationDemoDataSource implements OrganizationDataSource { + final Organization _organization = _generateOrganization(); + + static Organization _generateOrganization() { + return const Organization(name: "Demo organization", contactName: "Demo manager", contactNumber: "+232 123456789"); + } + + @override + Future fetchOrganization(DocumentReference organizationRef) async { + return _organization; + } +} diff --git a/recipients_app/lib/data/datasource/demo/user_demo_data_source.dart b/recipients_app/lib/data/datasource/demo/user_demo_data_source.dart index d0377a60f..e4468a4f7 100644 --- a/recipients_app/lib/data/datasource/demo/user_demo_data_source.dart +++ b/recipients_app/lib/data/datasource/demo/user_demo_data_source.dart @@ -1,6 +1,7 @@ import "dart:async"; import "package:app/data/datasource/demo/demo_user.dart"; +import "package:app/data/datasource/demo/no_op_document_reference.dart"; import "package:app/data/datasource/user_data_source.dart"; import "package:app/data/models/models.dart"; import "package:firebase_auth/firebase_auth.dart"; @@ -12,6 +13,7 @@ class UserDemoDataSource implements UserDataSource { lastName: "SocialIncome", mobileMoneyPhone: Phone(23271118897), communicationMobilePhone: Phone(23271118897), + organizationRef: NoOpDocumentReference(), ); final _userStreamController = StreamController(); late final _userBroadcastStreamController = _getBroadcastStream(); diff --git a/recipients_app/lib/data/datasource/organization_data_source.dart b/recipients_app/lib/data/datasource/organization_data_source.dart new file mode 100644 index 000000000..cfbb715ae --- /dev/null +++ b/recipients_app/lib/data/datasource/organization_data_source.dart @@ -0,0 +1,8 @@ +import "package:app/data/models/organization.dart"; +import "package:cloud_firestore/cloud_firestore.dart"; + +abstract class OrganizationDataSource { + Future fetchOrganization( + DocumentReference organizationRef, + ); +} diff --git a/recipients_app/lib/data/datasource/remote/organization_remote_data_source.dart b/recipients_app/lib/data/datasource/remote/organization_remote_data_source.dart new file mode 100644 index 000000000..fd2d0c5b6 --- /dev/null +++ b/recipients_app/lib/data/datasource/remote/organization_remote_data_source.dart @@ -0,0 +1,28 @@ +import "package:app/data/datasource/organization_data_source.dart"; +import "package:app/data/models/organization.dart"; +import "package:cloud_firestore/cloud_firestore.dart"; + +const String surveyCollection = "surveys"; + +class OrganizationRemoteDataSource implements OrganizationDataSource { + final FirebaseFirestore firestore; + + const OrganizationRemoteDataSource({ + required this.firestore, + }); + + @override + Future fetchOrganization( + DocumentReference organizationRef, + ) async { + final organization = organizationRef.withConverter( + fromFirestore: (snapshot, _) { + final data = snapshot.data()!; + return Organization.fromJson(data); + }, + toFirestore: (organization, _) => organization.toJson(), + ); + + return (await organization.get()).data(); + } +} diff --git a/recipients_app/lib/data/repositories/organization_repository.dart b/recipients_app/lib/data/repositories/organization_repository.dart index d1aad7833..b95b94655 100644 --- a/recipients_app/lib/data/repositories/organization_repository.dart +++ b/recipients_app/lib/data/repositories/organization_repository.dart @@ -1,24 +1,27 @@ +import "package:app/data/datasource/demo/organization_demo_data_source.dart"; +import "package:app/data/datasource/organization_data_source.dart"; +import "package:app/data/datasource/remote/organization_remote_data_source.dart"; import "package:app/data/models/organization.dart"; +import "package:app/demo_manager.dart"; import "package:cloud_firestore/cloud_firestore.dart"; class OrganizationRepository { + late OrganizationDataSource remoteDataSource = OrganizationRemoteDataSource(firestore: firestore); + late OrganizationDataSource demoDataSource = OrganizationDemoDataSource(); + + final DemoManager demoManager; final FirebaseFirestore firestore; - const OrganizationRepository({ + OrganizationRepository({ required this.firestore, + required this.demoManager, }); + OrganizationDataSource get _activeDataSource => demoManager.isDemoEnabled ? demoDataSource : remoteDataSource; + Future fetchOrganization( DocumentReference organizationRef, ) async { - final organization = organizationRef.withConverter( - fromFirestore: (snapshot, _) { - final data = snapshot.data()!; - return Organization.fromJson(data); - }, - toFirestore: (organization, _) => organization.toJson(), - ); - - return (await organization.get()).data(); + return _activeDataSource.fetchOrganization(organizationRef); } } diff --git a/recipients_app/lib/data/repositories/survey_repository.dart b/recipients_app/lib/data/repositories/survey_repository.dart index be76d780b..5c6e73fbd 100644 --- a/recipients_app/lib/data/repositories/survey_repository.dart +++ b/recipients_app/lib/data/repositories/survey_repository.dart @@ -8,7 +8,7 @@ import "package:cloud_firestore/cloud_firestore.dart"; class SurveyRepository { late SurveyDataSource remoteDataSource = SurveyRemoteDataSource(firestore: firestore); - late SurveyDataSource demoDataSource = SurveyDemoDataSource(); // Assuming you have a demo source + late SurveyDataSource demoDataSource = SurveyDemoDataSource(); final DemoManager demoManager; final FirebaseFirestore firestore; diff --git a/recipients_app/lib/my_app.dart b/recipients_app/lib/my_app.dart index 11d4b17f5..b40a5c3f9 100644 --- a/recipients_app/lib/my_app.dart +++ b/recipients_app/lib/my_app.dart @@ -65,6 +65,7 @@ class MyApp extends StatelessWidget { RepositoryProvider( create: (context) => OrganizationRepository( firestore: firestore, + demoManager: demoManager, ), ), ],