Skip to content

Commit

Permalink
WIP- Implement real time updates for User- Refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
cp-sneha-s committed Jul 13, 2023
1 parent 28faac4 commit 7927583
Show file tree
Hide file tree
Showing 42 changed files with 360 additions and 960 deletions.
6 changes: 3 additions & 3 deletions lib/data/Repo/employee_repo.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ class EmployeeRepo {
.map((members) => members.firstWhereOrNull((e) => e.uid == uid));
}

Stream<Employee?> getCurrentUser({required String uid}) {
return _employeeService.getCurrentUser(
spaceId: _userStateNotifier.currentSpaceId!, id: uid);
Stream<Employee?> getCurrentUser(
{required String spaceID, required String uid}) {
return _employeeService.getCurrentUser(spaceId: spaceID, id: uid);
}

Stream<List<Employee>> get employees =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,41 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:injectable/injectable.dart';
import 'package:projectunity/data/Repo/employee_repo.dart';
import 'package:projectunity/data/Repo/leave_repo.dart';
import 'package:projectunity/data/bloc/user_state/user_state_controller_event.dart';
import 'package:projectunity/data/bloc/user_state/user_controller_state.dart';
import 'package:projectunity/data/bloc/user_state/space_user_event.dart';
import 'package:projectunity/data/bloc/user_state/space_user_state.dart';
import 'package:projectunity/data/core/exception/error_const.dart';
import 'package:projectunity/data/model/space/space.dart';
import '../../model/employee/employee.dart';
import '../../pref/user_preference.dart';
import '../../provider/space_manager.dart';
import '../../provider/user_state.dart';
import '../../services/employee_service.dart';
import '../../services/space_service.dart';

@Injectable()
class UserStateControllerBloc
extends Bloc<UserStateControllerEvent, UserControllerState> {
class SpaceUserBloc extends Bloc<SpaceUserEvent, SpaceUserState> {
final UserStateNotifier _userStateNotifier;
final SpaceService _spaceService;
final EmployeeRepo _employeeRepo;
final LeaveRepo _leaveRepo;
final SpaceManager _spaceManager;
StreamSubscription<Employee?>? streamSubscription;

UserStateControllerBloc(this._employeeRepo, this._leaveRepo,
this._userStateNotifier, this._spaceService, this._spaceManager)
: super(UserControllerInitialState()) {
on<CheckUserStatus>(_checkUserStatus);
on<UpdateUserDataEvent>(_updateUserData);
SpaceUserBloc(this._employeeRepo, this._leaveRepo, this._userStateNotifier,
this._spaceService, this._spaceManager)
: super(SpaceUserInitialState()) {
on<CheckSpaceEvent>(_checkUserStatus);
on<CheckUserEvent>(_updateUserData);
on<DeactivateUserEvent>(_deactivateUser);
if (_userStateNotifier.state == UserState.spaceJoined) {
add(CheckUserStatus());
add(CheckSpaceEvent());
print('check status');
}
_spaceManager.addListener(() {
add(CheckUserStatus());
add(CheckSpaceEvent());
print('space changed');
});
}

Future<void> _checkUserStatus(
CheckUserStatus status, Emitter<UserControllerState> emit) async {
CheckSpaceEvent status, Emitter<SpaceUserState> emit) async {
if (_spaceManager.currentSpaceId == '') {
if (_userStateNotifier.employee != null ||
_userStateNotifier.currentSpace != null) {
Expand All @@ -54,41 +52,45 @@ class UserStateControllerBloc
return;
}
_userStateNotifier.updateSpace(space);
add(UpdateUserDataEvent());
add(CheckUserEvent());
}
}

Future<void> _updateUserData(
UpdateUserDataEvent event, Emitter<UserControllerState> emit) async {
CheckUserEvent event, Emitter<SpaceUserState> emit) async {
try {
await _resetStreamSubscription();
await emit.onEach(
_employeeRepo.getCurrentUser(uid: _userStateNotifier.userUID!),
_employeeRepo.getCurrentUser(
spaceID: _userStateNotifier.currentSpaceId!,
uid: _userStateNotifier.userUID!),
onData: (Employee? user) async {
print('======================= ${user!.toJson()}');
if (user == null) {
emit(UserControllerErrorState(error: firestoreFetchDataError));
emit(SpaceUserErrorState(error: firestoreFetchDataError));
} else {
if (user.status == EmployeeStatus.inactive) {
emit(RevokeAccessState());
print(user.status);
emit(SpaceUserRevokeAccessState());
} else {
_userStateNotifier.updateCurrentUser(user);
}
}
}, onError: (error, stackTrace) {
emit(UserControllerErrorState(error: firestoreFetchDataError));
emit(SpaceUserErrorState(error: firestoreFetchDataError));
FirebaseCrashlytics.instance.recordError(error, stackTrace,
reason: 'ERROR WHILE LISTENING THE CURRENT USER STRAEM');
});
} on Exception catch (error, stacktrace) {
emit(UserControllerErrorState(error: firestoreFetchDataError));
emit(SpaceUserErrorState(error: firestoreFetchDataError));
FirebaseCrashlytics.instance.recordError(error, stacktrace,
reason:
'EXCEPTION == GET CURRENT USER INFO WHEN THE USER STATUS IS ${_userStateNotifier.state}');
}
}

Future<void> _deactivateUser(
DeactivateUserEvent event, Emitter<UserControllerState> emit) async {
DeactivateUserEvent event, Emitter<SpaceUserState> emit) async {
await _userStateNotifier.removeEmployeeWithSpace();
_userStateNotifier.removeListener(() {});
}
Expand Down
7 changes: 7 additions & 0 deletions lib/data/bloc/user_state/space_user_event.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
abstract class SpaceUserEvent {}

class CheckSpaceEvent extends SpaceUserEvent {}

class CheckUserEvent extends SpaceUserEvent {}

class DeactivateUserEvent extends SpaceUserEvent {}
22 changes: 22 additions & 0 deletions lib/data/bloc/user_state/space_user_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import 'package:equatable/equatable.dart';

abstract class SpaceUserState extends Equatable {}

class SpaceUserErrorState extends SpaceUserState {
final String error;

SpaceUserErrorState({required this.error});

@override
List<Object?> get props => [error];
}

class SpaceUserInitialState extends SpaceUserState {
@override
List<Object?> get props => [];
}

class SpaceUserRevokeAccessState extends SpaceUserState {
@override
List<Object?> get props => [];
}
17 changes: 0 additions & 17 deletions lib/data/bloc/user_state/user_controller_state.dart

This file was deleted.

10 changes: 0 additions & 10 deletions lib/data/bloc/user_state/user_state_controller_event.dart

This file was deleted.

7 changes: 2 additions & 5 deletions lib/data/di/service_locator.config.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 1 addition & 4 deletions lib/data/provider/space_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,14 @@ class SpaceManager extends ChangeNotifier{
late String _currentSpaceId='';
SpaceManager(this._userPreference) {
_currentSpaceId = _userPreference.getSpace()?.id ?? '';
print('CURRENT SPACE ID: ======================= $currentSpaceId');
}

String get currentSpaceId=>_currentSpaceId;

Future<void> setCurrentSpaceId(String spaceId) async {
if (currentSpaceId == spaceId) {
print('${spaceId == currentSpaceId} in SPACE ẓMANAGER');
//return;
return;
}
print('$spaceId in SPACE ẓMANAGER');
_currentSpaceId = spaceId;
notifyListeners();
}
Expand Down
4 changes: 1 addition & 3 deletions lib/data/provider/user_state.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import 'package:flutter/foundation.dart';
import 'package:injectable/injectable.dart';
import 'package:projectunity/data/Repo/employee_repo.dart';
import 'package:projectunity/data/Repo/leave_repo.dart';
import '../di/service_locator.dart';

import '../model/account/account.dart';
import '../model/employee/employee.dart';
import '../model/space/space.dart';
Expand Down
47 changes: 29 additions & 18 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
import 'dart:async';
import 'dart:ui';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localization.dart';
import 'package:go_router/go_router.dart';
import 'package:projectunity/data/bloc/user_state/user_state_controller_event.dart';
import 'package:projectunity/data/bloc/user_state/space_user_state.dart';
import 'package:projectunity/ui/widget/error/error_screen.dart';
import 'package:projectunity/ui/widget/error_snack_bar.dart';
import 'data/bloc/user_state/user_state_controller_bloc.dart';
import 'data/bloc/user_state/space_user_bloc.dart';
import 'data/configs/app_const.dart';
import 'data/configs/scroll_behavior.dart';
import 'data/configs/theme.dart';
Expand Down Expand Up @@ -48,15 +47,14 @@ class MyApp extends StatelessWidget {

@override
Widget build(BuildContext context) {
print('==================build');
return MultiBlocProvider(
providers: [
BlocProvider(
create: (_) =>
_networkConnectionBloc..add(NetworkConnectionObserveEvent()),
),
BlocProvider(
create: (_) => getIt<UserStateControllerBloc>(),
create: (_) => getIt<SpaceUserBloc>(),
lazy: false,
)
],
Expand All @@ -75,19 +73,32 @@ class MyApp extends StatelessWidget {
routerConfig: _router,
supportedLocales: AppLocalizations.supportedLocales,
localizationsDelegates: AppLocalizations.localizationsDelegates,
builder: (context, widget) =>
BlocListener<NetworkConnectionBloc, NetworkConnectionState>(
listenWhen: (previous, current) =>
current is NetworkConnectionFailureState,
listener: (context, state) {
if (state is NetworkConnectionFailureState) {
String connectionErrorMessage =
AppLocalizations.of(context).network_connection_error;
showSnackBar(
context: context, msg: connectionErrorMessage);
}
},
child: widget,
builder: (_, widget) => MultiBlocListener(
listeners: [
BlocListener<NetworkConnectionBloc, NetworkConnectionState>(
listenWhen: (previous, current) =>
current is NetworkConnectionFailureState,
listener: (context, state) {
if (state is NetworkConnectionFailureState) {
String connectionErrorMessage =
AppLocalizations.of(context)
.network_connection_error;
showSnackBar(
context: context, msg: connectionErrorMessage);
}
},
),
BlocListener<SpaceUserBloc, SpaceUserState>(
listenWhen: (previous, current) =>
current is SpaceUserErrorState,
listener: (context, state) {
if (state is SpaceUserErrorState) {
showSnackBar(context: context, error: state.error);
}
},
),
],
child: widget!,
)),
),
);
Expand Down
10 changes: 2 additions & 8 deletions lib/ui/admin/dashboard/admin_dashboard.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:projectunity/data/bloc/user_state/user_state_controller_bloc.dart';
import 'package:projectunity/data/di/service_locator.dart';
import 'package:projectunity/ui/shared/appbar_drawer/drawer/app_drawer.dart';
import 'package:projectunity/ui/shared/appbar_drawer/drawer/bloc/app_drawer_bloc.dart';

import 'navigation_item.dart';
import '../../shared/dashboard/navigation_item.dart';

class AdminDashBoardScreen extends StatefulWidget {
const AdminDashBoardScreen({Key? key, required this.child}) : super(key: key);
Expand All @@ -21,13 +20,8 @@ class _AdminDashBoardScreenState extends State<AdminDashBoardScreen> {

@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider(
return BlocProvider(
create: (BuildContext context) => getIt<DrawerBloc>(),

),
],
child: Scaffold(
drawer: const AppDrawer(),
body: SafeArea(child: widget.child),
Expand Down
Loading

0 comments on commit 7927583

Please sign in to comment.