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 24, 2023
1 parent 4c133d7 commit 1a17c39
Show file tree
Hide file tree
Showing 19 changed files with 156 additions and 62 deletions.
7 changes: 3 additions & 4 deletions lib/data/Repo/employee_repo.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class EmployeeRepo {

Future<void> reset() async {
if (_employeeStreamSubscription != null) {
_employeeStreamSubscription!.cancel();
await cancelEmpStreamSubscription();
}
_employeeStreamSubscription = _employeeService
.employees(_userStateNotifier.currentSpaceId!)
Expand All @@ -53,14 +53,13 @@ class EmployeeRepo {
});
}

Future<void> cancel() async {
Future<void> cancelEmpStreamSubscription() async {
await _employeeStreamSubscription?.cancel();
print(_employeeStreamSubscription?.isPaused);
}

@disposeMethod
Future<void> dispose() async {
await _employeeStreamSubscription?.cancel();
await cancelEmpStreamSubscription();
await _employeeController.close();
}
}
19 changes: 3 additions & 16 deletions lib/data/Repo/leave_repo.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class LeaveRepo {

Future<void> reset() async {
if (_leavesStreamSubscription != null) {
_leavesStreamSubscription!.cancel();
await cancelLeaveStreamSubscription();
}
DateTime dateTime = DateTime(2023, 7, 1);
_leavesStreamSubscription =
Expand All @@ -45,19 +45,6 @@ class LeaveRepo {
});
}

Future<void> loadMore(DateTime dateTime) async {
if (_leavesStreamSubscription != null) {
_leavesStreamSubscription!.cancel();
}
_leavesStreamSubscription =
_leaveService.leaves(dateTime.timeStampToInt).listen((value) {
_leavesController.add(value);
}, onError: (e, s) async {
_leavesController.addError(e);
await FirebaseCrashlytics.instance.recordError(e, s);
});
}

Stream<List<Leave>> userLeaveRequest(String uid) =>
_leavesController.stream.asyncMap((leaves) => leaves
.where((leave) =>
Expand All @@ -67,13 +54,13 @@ class LeaveRepo {
Stream<List<Leave>> userLeaves(String uid) => _leavesController.stream
.asyncMap((leaves) => leaves.where((leave) => leave.uid == uid).toList());

Future<void> cancel() async {
Future<void> cancelLeaveStreamSubscription() async {
await _leavesStreamSubscription?.cancel();
}

@disposeMethod
Future<void> dispose() async {
await _leavesStreamSubscription?.cancel();
await cancelLeaveStreamSubscription();
await _leavesController.close();
}
}
4 changes: 2 additions & 2 deletions lib/data/bloc/user_state/space_user_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ class SpaceUserBloc extends Bloc<SpaceUserEvent, SpaceUserState> {
}

Future<void> _cancelStreamSubscription() async {
await _leaveRepo.cancel();
await _employeeRepo.cancel();
await _leaveRepo.cancelLeaveStreamSubscription();
await _employeeRepo.cancelEmpStreamSubscription();
}

Future<void> _resetStreamSubscription() async {
Expand Down
86 changes: 59 additions & 27 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ 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:leak_detector/leak_detector.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';
Expand Down Expand Up @@ -35,16 +36,47 @@ Future<void> main() async {
FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
return true;
};
LeakDetector().init(maxRetainingPath: 300);

FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(!kDebugMode);
usePathUrlStrategy();
runApp(MyApp());
}

class MyApp extends StatelessWidget {
class MyApp extends StatefulWidget {
MyApp({Key? key}) : super(key: key);

@override
State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
final GoRouter _router = getIt<AppRouter>().router;
bool isChecking = false;

final _networkConnectionBloc = getIt<NetworkConnectionBloc>();

@override
void initState() {
super.initState();
LeakDetector().onLeakedStream.forEach((LeakedInfo info) {
info.retainingPath.forEach((node) {
print(node);
});
});
LeakDetector().onEventStream.listen((event) {
if (event.type == DetectorEventType.startAnalyze) {
setState(() {
isChecking = true;
});
} else if (event.type == DetectorEventType.endAnalyze) {
setState(() {
isChecking = false;
});
}
});
}

@override
Widget build(BuildContext context) {
return MultiBlocProvider(
Expand Down Expand Up @@ -74,32 +106,32 @@ class MyApp extends StatelessWidget {
supportedLocales: AppLocalizations.supportedLocales,
localizationsDelegates: AppLocalizations.localizationsDelegates,
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!,
)),
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
23 changes: 23 additions & 0 deletions lib/ui/navigation/app_router.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:flutter/cupertino.dart';
import 'package:go_router/go_router.dart';
import 'package:injectable/injectable.dart';
import 'package:leak_detector/leak_detector.dart';
import 'package:projectunity/ui/admin/dashboard/admin_dashboard.dart';
import 'package:projectunity/ui/admin/leaves/leave_screen/admin_leaves_screen.dart';
import 'package:projectunity/ui/shared/dashboard/dashboard_screen.dart';
Expand Down Expand Up @@ -31,6 +32,28 @@ import '../user/members/detail/user_employee_detail_screen.dart';
import '../user/members/members_screen/user_members_screen.dart';
import '../widget/error/page_not_found_screen.dart';

class GoRouterObserver extends NavigatorObserver {
@override
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
print('MyTest didPush: $route');
}

@override
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
print('MyTest didPop: $route');
}

@override
void didRemove(Route<dynamic> route, Route<dynamic>? previousRoute) {
print('MyTest didRemove: $route');
}

@override
void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) {
print('MyTest didReplace: $newRoute');
}
}

@Injectable()
class AppRouter {
final UserStateNotifier _userManager;
Expand Down
1 change: 1 addition & 0 deletions lib/ui/shared/appbar_drawer/drawer/app_drawer.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:leak_detector/leak_detector.dart';
import 'package:projectunity/data/bloc/user_state/space_user_bloc.dart';
import 'package:projectunity/data/core/extensions/string_extension.dart';
import 'package:projectunity/ui/navigation/app_router.dart';
Expand Down
9 changes: 9 additions & 0 deletions lib/ui/shared/dashboard/dashboard_screen.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:leak_detector/leak_detector.dart';
import 'package:projectunity/data/bloc/user_state/space_user_bloc.dart';
import 'package:projectunity/ui/navigation/app_router.dart';

import '../../../data/bloc/user_state/space_user_state.dart';
import '../../../data/bloc/user_state/space_user_event.dart';
Expand All @@ -24,6 +26,7 @@ class DashboardScreen extends StatefulWidget {

class _DashboardScreenState extends State<DashboardScreen> {
int get _currentIndex => locationToTabIndex(GoRouter.of(context).location);
final router = getIt<AppRouter>();

@override
Widget build(BuildContext context) {
Expand Down Expand Up @@ -71,6 +74,12 @@ class _DashboardScreenState extends State<DashboardScreen> {
}

void onItemTapped(int index) {
final ctx = router.router.routerDelegate.navigatorKey.currentContext;
getLeakedRecording().then((List<LeakedInfo> infoList) {
print('============================= ${infoList.length}');
// showLeakedInfoListPage(ctx!, infoList);
});

context.goNamed(widget.items[index].initialLocation);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ class WhoIsOutCardBloc extends Bloc<WhoIsOutEvent, WhoIsOutCardState> {
FutureOr<void> _fetchMoreLeavesEvent(
FetchMoreLeaves event, Emitter<WhoIsOutCardState> emit) async {
try {
_leaveRepo.loadMore(DateTime(2023, 6, 1));
return emit.forEach(
getLeaveApplicationStream(
leaveStream: _leaveRepo.absence(event.date),
Expand Down
16 changes: 16 additions & 0 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.6.2"
leak_detector:
dependency: "direct main"
description:
name: leak_detector
sha256: "079901dbe331c14bc3c45d391a3cf921b7876274812091e038caea2927b5c18e"
url: "https://pub.dev"
source: hosted
version: "1.0.1+4"
lints:
dependency: transitive
description:
Expand Down Expand Up @@ -1282,6 +1290,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.4"
vm_service:
dependency: transitive
description:
name: vm_service
sha256: e686ae49284939abc06972e25f634ccdb5007d5664c4dfa1995002e8b6aa27a9
url: "https://pub.dev"
source: hosted
version: "8.3.0"
watcher:
dependency: transitive
description:
Expand Down
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ dependencies:
injectable: ^2.1.1
image_picker: ^0.8.7+3
json_annotation: ^4.8.1
leak_detector:
oauth2: ^2.0.1
package_info_plus: ^3.1.2
simple_gesture_detector:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,15 +67,17 @@ class MockEmployeeRepo extends _i1.Mock implements _i2.EmployeeRepo {
returnValue: _i3.Future<void>.value(),
returnValueForMissingStub: _i3.Future<void>.value(),
) as _i3.Future<void>);

@override
_i3.Future<void> cancel() => (super.noSuchMethod(
_i3.Future<void> cancelEmpStreamSubscription() => (super.noSuchMethod(
Invocation.method(
#cancel,
[],
),
returnValue: _i3.Future<void>.value(),
returnValueForMissingStub: _i3.Future<void>.value(),
) as _i3.Future<void>);

@override
_i3.Future<void> dispose() => (super.noSuchMethod(
Invocation.method(
Expand Down Expand Up @@ -131,6 +133,7 @@ class MockLeaveRepo extends _i1.Mock implements _i5.LeaveRepo {
),
returnValue: _i3.Stream<List<_i6.Leave>>.empty(),
) as _i3.Stream<List<_i6.Leave>>);

@override
_i3.Stream<List<_i6.Leave>> userLeaves(String? uid) => (super.noSuchMethod(
Invocation.method(
Expand All @@ -139,15 +142,17 @@ class MockLeaveRepo extends _i1.Mock implements _i5.LeaveRepo {
),
returnValue: _i3.Stream<List<_i6.Leave>>.empty(),
) as _i3.Stream<List<_i6.Leave>>);

@override
_i3.Future<void> cancel() => (super.noSuchMethod(
_i3.Future<void> cancelLeaveStreamSubscription() => (super.noSuchMethod(
Invocation.method(
#cancel,
[],
),
returnValue: _i3.Future<void>.value(),
returnValueForMissingStub: _i3.Future<void>.value(),
) as _i3.Future<void>);

@override
_i3.Future<void> dispose() => (super.noSuchMethod(
Invocation.method(
Expand Down
Loading

0 comments on commit 1a17c39

Please sign in to comment.