diff --git a/lib/app_router.dart b/lib/app_router.dart index b8f7008..02c517f 100644 --- a/lib/app_router.dart +++ b/lib/app_router.dart @@ -30,7 +30,7 @@ import 'package:eatvio_app/presentation/registration/language_select_screen/lang import 'package:eatvio_app/presentation/registration/medicine_intake_screen/medicine_intake_screen.dart'; import 'package:eatvio_app/presentation/registration/name_screen/name_screen.dart'; import 'package:eatvio_app/presentation/registration/weight_screen/weight_screen.dart'; -import 'package:eatvio_app/widgets/bottom_navigation_bar_widget.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart'; import 'package:eatvio_app/features/chat/presentation/pages/photo_view_screen.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/core/initialization_cubit/initialization_cubit.dart b/lib/core/initialization_cubit/initialization_cubit.dart index 89b6794..a7034e2 100644 --- a/lib/core/initialization_cubit/initialization_cubit.dart +++ b/lib/core/initialization_cubit/initialization_cubit.dart @@ -2,7 +2,10 @@ import 'package:dart_pusher_channels/dart_pusher_channels.dart'; import 'package:eatvio_app/core/app_export.dart'; import 'package:eatvio_app/core/initialization_cubit/initialization_state.dart'; import 'package:eatvio_app/core/token_storage.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_cubit.dart'; import 'package:eatvio_app/features/chat/repositories/chat_repository.dart'; +import 'package:eatvio_app/locator_service.dart'; class InitializationCubit extends Cubit { final ChatRepository chatRepository; @@ -22,7 +25,9 @@ class InitializationCubit extends Cubit { privateNotificationChannel.subscribe(); - privateNotificationChannel.bindToAll().listen((event) {}); + privateNotificationChannel.bindToAll().listen((event) { + sl().incrementCounter(); + }); } Future subscribeChatMessages(int userId, PusherChannelsClient client) async { @@ -38,7 +43,9 @@ class InitializationCubit extends Cubit { privateMessagesChannel.subscribe(); - privateMessagesChannel.bindToAll().listen((event) {}); + privateMessagesChannel.bindToAll().listen((event) { + sl().incrementCounter(); + }); } Future runInitialization() async { diff --git a/lib/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart b/lib/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart new file mode 100644 index 0000000..8b2a0f5 --- /dev/null +++ b/lib/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart @@ -0,0 +1,13 @@ +import 'package:eatvio_app/core/app_export.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_state.dart'; + +class NewMessagesCubit extends Cubit { + int _messagesCount = 0; + + NewMessagesCubit() : super(const NewMessagesState.empty()); + + incrementCounter() { + _messagesCount++; + emit(NewMessagesState.loaded(messagesCount: _messagesCount)); + } +} diff --git a/lib/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_state.dart b/lib/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_state.dart new file mode 100644 index 0000000..4ed4856 --- /dev/null +++ b/lib/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_state.dart @@ -0,0 +1,18 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'new_messages_state.freezed.dart'; + +@freezed +abstract class NewMessagesState with _$NewMessagesState { + const factory NewMessagesState() = _NewMessagesState; + + const factory NewMessagesState.empty() = NewMessagesStateEmpty; + + const factory NewMessagesState.loaded({ + required int messagesCount, + }) = NewMessagesStateLoaded; + + const factory NewMessagesState.error({ + required String errorMessage, + }) = NewMessagesStateError; +} diff --git a/lib/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_state.freezed.dart b/lib/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_state.freezed.dart new file mode 100644 index 0000000..02a1c4b --- /dev/null +++ b/lib/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_state.freezed.dart @@ -0,0 +1,616 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'new_messages_state.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$NewMessagesState { + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() empty, + required TResult Function(int messagesCount) loaded, + required TResult Function(String errorMessage) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? empty, + TResult? Function(int messagesCount)? loaded, + TResult? Function(String errorMessage)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? empty, + TResult Function(int messagesCount)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map( + TResult Function(_NewMessagesState value) $default, { + required TResult Function(NewMessagesStateEmpty value) empty, + required TResult Function(NewMessagesStateLoaded value) loaded, + required TResult Function(NewMessagesStateError value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_NewMessagesState value)? $default, { + TResult? Function(NewMessagesStateEmpty value)? empty, + TResult? Function(NewMessagesStateLoaded value)? loaded, + TResult? Function(NewMessagesStateError value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap( + TResult Function(_NewMessagesState value)? $default, { + TResult Function(NewMessagesStateEmpty value)? empty, + TResult Function(NewMessagesStateLoaded value)? loaded, + TResult Function(NewMessagesStateError value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $NewMessagesStateCopyWith<$Res> { + factory $NewMessagesStateCopyWith( + NewMessagesState value, $Res Function(NewMessagesState) then) = + _$NewMessagesStateCopyWithImpl<$Res, NewMessagesState>; +} + +/// @nodoc +class _$NewMessagesStateCopyWithImpl<$Res, $Val extends NewMessagesState> + implements $NewMessagesStateCopyWith<$Res> { + _$NewMessagesStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$NewMessagesStateImplCopyWith<$Res> { + factory _$$NewMessagesStateImplCopyWith(_$NewMessagesStateImpl value, + $Res Function(_$NewMessagesStateImpl) then) = + __$$NewMessagesStateImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$NewMessagesStateImplCopyWithImpl<$Res> + extends _$NewMessagesStateCopyWithImpl<$Res, _$NewMessagesStateImpl> + implements _$$NewMessagesStateImplCopyWith<$Res> { + __$$NewMessagesStateImplCopyWithImpl(_$NewMessagesStateImpl _value, + $Res Function(_$NewMessagesStateImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$NewMessagesStateImpl implements _NewMessagesState { + const _$NewMessagesStateImpl(); + + @override + String toString() { + return 'NewMessagesState()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$NewMessagesStateImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() empty, + required TResult Function(int messagesCount) loaded, + required TResult Function(String errorMessage) error, + }) { + return $default(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? empty, + TResult? Function(int messagesCount)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return $default?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? empty, + TResult Function(int messagesCount)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if ($default != null) { + return $default(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_NewMessagesState value) $default, { + required TResult Function(NewMessagesStateEmpty value) empty, + required TResult Function(NewMessagesStateLoaded value) loaded, + required TResult Function(NewMessagesStateError value) error, + }) { + return $default(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_NewMessagesState value)? $default, { + TResult? Function(NewMessagesStateEmpty value)? empty, + TResult? Function(NewMessagesStateLoaded value)? loaded, + TResult? Function(NewMessagesStateError value)? error, + }) { + return $default?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_NewMessagesState value)? $default, { + TResult Function(NewMessagesStateEmpty value)? empty, + TResult Function(NewMessagesStateLoaded value)? loaded, + TResult Function(NewMessagesStateError value)? error, + required TResult orElse(), + }) { + if ($default != null) { + return $default(this); + } + return orElse(); + } +} + +abstract class _NewMessagesState implements NewMessagesState { + const factory _NewMessagesState() = _$NewMessagesStateImpl; +} + +/// @nodoc +abstract class _$$NewMessagesStateEmptyImplCopyWith<$Res> { + factory _$$NewMessagesStateEmptyImplCopyWith( + _$NewMessagesStateEmptyImpl value, + $Res Function(_$NewMessagesStateEmptyImpl) then) = + __$$NewMessagesStateEmptyImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$NewMessagesStateEmptyImplCopyWithImpl<$Res> + extends _$NewMessagesStateCopyWithImpl<$Res, _$NewMessagesStateEmptyImpl> + implements _$$NewMessagesStateEmptyImplCopyWith<$Res> { + __$$NewMessagesStateEmptyImplCopyWithImpl(_$NewMessagesStateEmptyImpl _value, + $Res Function(_$NewMessagesStateEmptyImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$NewMessagesStateEmptyImpl implements NewMessagesStateEmpty { + const _$NewMessagesStateEmptyImpl(); + + @override + String toString() { + return 'NewMessagesState.empty()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$NewMessagesStateEmptyImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() empty, + required TResult Function(int messagesCount) loaded, + required TResult Function(String errorMessage) error, + }) { + return empty(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? empty, + TResult? Function(int messagesCount)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return empty?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? empty, + TResult Function(int messagesCount)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (empty != null) { + return empty(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_NewMessagesState value) $default, { + required TResult Function(NewMessagesStateEmpty value) empty, + required TResult Function(NewMessagesStateLoaded value) loaded, + required TResult Function(NewMessagesStateError value) error, + }) { + return empty(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_NewMessagesState value)? $default, { + TResult? Function(NewMessagesStateEmpty value)? empty, + TResult? Function(NewMessagesStateLoaded value)? loaded, + TResult? Function(NewMessagesStateError value)? error, + }) { + return empty?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_NewMessagesState value)? $default, { + TResult Function(NewMessagesStateEmpty value)? empty, + TResult Function(NewMessagesStateLoaded value)? loaded, + TResult Function(NewMessagesStateError value)? error, + required TResult orElse(), + }) { + if (empty != null) { + return empty(this); + } + return orElse(); + } +} + +abstract class NewMessagesStateEmpty implements NewMessagesState { + const factory NewMessagesStateEmpty() = _$NewMessagesStateEmptyImpl; +} + +/// @nodoc +abstract class _$$NewMessagesStateLoadedImplCopyWith<$Res> { + factory _$$NewMessagesStateLoadedImplCopyWith( + _$NewMessagesStateLoadedImpl value, + $Res Function(_$NewMessagesStateLoadedImpl) then) = + __$$NewMessagesStateLoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({int messagesCount}); +} + +/// @nodoc +class __$$NewMessagesStateLoadedImplCopyWithImpl<$Res> + extends _$NewMessagesStateCopyWithImpl<$Res, _$NewMessagesStateLoadedImpl> + implements _$$NewMessagesStateLoadedImplCopyWith<$Res> { + __$$NewMessagesStateLoadedImplCopyWithImpl( + _$NewMessagesStateLoadedImpl _value, + $Res Function(_$NewMessagesStateLoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? messagesCount = null, + }) { + return _then(_$NewMessagesStateLoadedImpl( + messagesCount: null == messagesCount + ? _value.messagesCount + : messagesCount // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +class _$NewMessagesStateLoadedImpl implements NewMessagesStateLoaded { + const _$NewMessagesStateLoadedImpl({required this.messagesCount}); + + @override + final int messagesCount; + + @override + String toString() { + return 'NewMessagesState.loaded(messagesCount: $messagesCount)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$NewMessagesStateLoadedImpl && + (identical(other.messagesCount, messagesCount) || + other.messagesCount == messagesCount)); + } + + @override + int get hashCode => Object.hash(runtimeType, messagesCount); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$NewMessagesStateLoadedImplCopyWith<_$NewMessagesStateLoadedImpl> + get copyWith => __$$NewMessagesStateLoadedImplCopyWithImpl< + _$NewMessagesStateLoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() empty, + required TResult Function(int messagesCount) loaded, + required TResult Function(String errorMessage) error, + }) { + return loaded(messagesCount); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? empty, + TResult? Function(int messagesCount)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return loaded?.call(messagesCount); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? empty, + TResult Function(int messagesCount)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(messagesCount); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_NewMessagesState value) $default, { + required TResult Function(NewMessagesStateEmpty value) empty, + required TResult Function(NewMessagesStateLoaded value) loaded, + required TResult Function(NewMessagesStateError value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_NewMessagesState value)? $default, { + TResult? Function(NewMessagesStateEmpty value)? empty, + TResult? Function(NewMessagesStateLoaded value)? loaded, + TResult? Function(NewMessagesStateError value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_NewMessagesState value)? $default, { + TResult Function(NewMessagesStateEmpty value)? empty, + TResult Function(NewMessagesStateLoaded value)? loaded, + TResult Function(NewMessagesStateError value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class NewMessagesStateLoaded implements NewMessagesState { + const factory NewMessagesStateLoaded({required final int messagesCount}) = + _$NewMessagesStateLoadedImpl; + + int get messagesCount; + @JsonKey(ignore: true) + _$$NewMessagesStateLoadedImplCopyWith<_$NewMessagesStateLoadedImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$NewMessagesStateErrorImplCopyWith<$Res> { + factory _$$NewMessagesStateErrorImplCopyWith( + _$NewMessagesStateErrorImpl value, + $Res Function(_$NewMessagesStateErrorImpl) then) = + __$$NewMessagesStateErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String errorMessage}); +} + +/// @nodoc +class __$$NewMessagesStateErrorImplCopyWithImpl<$Res> + extends _$NewMessagesStateCopyWithImpl<$Res, _$NewMessagesStateErrorImpl> + implements _$$NewMessagesStateErrorImplCopyWith<$Res> { + __$$NewMessagesStateErrorImplCopyWithImpl(_$NewMessagesStateErrorImpl _value, + $Res Function(_$NewMessagesStateErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? errorMessage = null, + }) { + return _then(_$NewMessagesStateErrorImpl( + errorMessage: null == errorMessage + ? _value.errorMessage + : errorMessage // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$NewMessagesStateErrorImpl implements NewMessagesStateError { + const _$NewMessagesStateErrorImpl({required this.errorMessage}); + + @override + final String errorMessage; + + @override + String toString() { + return 'NewMessagesState.error(errorMessage: $errorMessage)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$NewMessagesStateErrorImpl && + (identical(other.errorMessage, errorMessage) || + other.errorMessage == errorMessage)); + } + + @override + int get hashCode => Object.hash(runtimeType, errorMessage); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$NewMessagesStateErrorImplCopyWith<_$NewMessagesStateErrorImpl> + get copyWith => __$$NewMessagesStateErrorImplCopyWithImpl< + _$NewMessagesStateErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() empty, + required TResult Function(int messagesCount) loaded, + required TResult Function(String errorMessage) error, + }) { + return error(errorMessage); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? empty, + TResult? Function(int messagesCount)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return error?.call(errorMessage); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? empty, + TResult Function(int messagesCount)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(errorMessage); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_NewMessagesState value) $default, { + required TResult Function(NewMessagesStateEmpty value) empty, + required TResult Function(NewMessagesStateLoaded value) loaded, + required TResult Function(NewMessagesStateError value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_NewMessagesState value)? $default, { + TResult? Function(NewMessagesStateEmpty value)? empty, + TResult? Function(NewMessagesStateLoaded value)? loaded, + TResult? Function(NewMessagesStateError value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_NewMessagesState value)? $default, { + TResult Function(NewMessagesStateEmpty value)? empty, + TResult Function(NewMessagesStateLoaded value)? loaded, + TResult Function(NewMessagesStateError value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class NewMessagesStateError implements NewMessagesState { + const factory NewMessagesStateError({required final String errorMessage}) = + _$NewMessagesStateErrorImpl; + + String get errorMessage; + @JsonKey(ignore: true) + _$$NewMessagesStateErrorImplCopyWith<_$NewMessagesStateErrorImpl> + get copyWith => throw _privateConstructorUsedError; +} diff --git a/lib/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_cubit.dart b/lib/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_cubit.dart new file mode 100644 index 0000000..ba5634c --- /dev/null +++ b/lib/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_cubit.dart @@ -0,0 +1,13 @@ +import 'package:eatvio_app/core/app_export.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_state.dart'; + +class NotificationsCubit extends Cubit { + int _notificationsCount = 0; + + NotificationsCubit() : super(const NotificationsState.empty()); + + incrementCounter() { + _notificationsCount++; + emit(NotificationsState.loaded(notificationsCount: _notificationsCount)); + } +} diff --git a/lib/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_state.dart b/lib/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_state.dart new file mode 100644 index 0000000..0f20a05 --- /dev/null +++ b/lib/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_state.dart @@ -0,0 +1,18 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'notifications_state.freezed.dart'; + +@freezed +abstract class NotificationsState with _$NotificationsState { + const factory NotificationsState() = _NotificationsState; + + const factory NotificationsState.empty() = NotificationsStateEmpty; + + const factory NotificationsState.loaded({ + required int notificationsCount, + }) = NotificationsStateLoaded; + + const factory NotificationsState.error({ + required String errorMessage, + }) = NotificationsStateError; +} diff --git a/lib/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_state.freezed.dart b/lib/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_state.freezed.dart new file mode 100644 index 0000000..0deeebb --- /dev/null +++ b/lib/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_state.freezed.dart @@ -0,0 +1,621 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'notifications_state.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$NotificationsState { + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() empty, + required TResult Function(int notificationsCount) loaded, + required TResult Function(String errorMessage) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? empty, + TResult? Function(int notificationsCount)? loaded, + TResult? Function(String errorMessage)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? empty, + TResult Function(int notificationsCount)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map( + TResult Function(_NotificationsState value) $default, { + required TResult Function(NotificationsStateEmpty value) empty, + required TResult Function(NotificationsStateLoaded value) loaded, + required TResult Function(NotificationsStateError value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_NotificationsState value)? $default, { + TResult? Function(NotificationsStateEmpty value)? empty, + TResult? Function(NotificationsStateLoaded value)? loaded, + TResult? Function(NotificationsStateError value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap( + TResult Function(_NotificationsState value)? $default, { + TResult Function(NotificationsStateEmpty value)? empty, + TResult Function(NotificationsStateLoaded value)? loaded, + TResult Function(NotificationsStateError value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $NotificationsStateCopyWith<$Res> { + factory $NotificationsStateCopyWith( + NotificationsState value, $Res Function(NotificationsState) then) = + _$NotificationsStateCopyWithImpl<$Res, NotificationsState>; +} + +/// @nodoc +class _$NotificationsStateCopyWithImpl<$Res, $Val extends NotificationsState> + implements $NotificationsStateCopyWith<$Res> { + _$NotificationsStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$NotificationsStateImplCopyWith<$Res> { + factory _$$NotificationsStateImplCopyWith(_$NotificationsStateImpl value, + $Res Function(_$NotificationsStateImpl) then) = + __$$NotificationsStateImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$NotificationsStateImplCopyWithImpl<$Res> + extends _$NotificationsStateCopyWithImpl<$Res, _$NotificationsStateImpl> + implements _$$NotificationsStateImplCopyWith<$Res> { + __$$NotificationsStateImplCopyWithImpl(_$NotificationsStateImpl _value, + $Res Function(_$NotificationsStateImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$NotificationsStateImpl implements _NotificationsState { + const _$NotificationsStateImpl(); + + @override + String toString() { + return 'NotificationsState()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$NotificationsStateImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() empty, + required TResult Function(int notificationsCount) loaded, + required TResult Function(String errorMessage) error, + }) { + return $default(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? empty, + TResult? Function(int notificationsCount)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return $default?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? empty, + TResult Function(int notificationsCount)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if ($default != null) { + return $default(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_NotificationsState value) $default, { + required TResult Function(NotificationsStateEmpty value) empty, + required TResult Function(NotificationsStateLoaded value) loaded, + required TResult Function(NotificationsStateError value) error, + }) { + return $default(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_NotificationsState value)? $default, { + TResult? Function(NotificationsStateEmpty value)? empty, + TResult? Function(NotificationsStateLoaded value)? loaded, + TResult? Function(NotificationsStateError value)? error, + }) { + return $default?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_NotificationsState value)? $default, { + TResult Function(NotificationsStateEmpty value)? empty, + TResult Function(NotificationsStateLoaded value)? loaded, + TResult Function(NotificationsStateError value)? error, + required TResult orElse(), + }) { + if ($default != null) { + return $default(this); + } + return orElse(); + } +} + +abstract class _NotificationsState implements NotificationsState { + const factory _NotificationsState() = _$NotificationsStateImpl; +} + +/// @nodoc +abstract class _$$NotificationsStateEmptyImplCopyWith<$Res> { + factory _$$NotificationsStateEmptyImplCopyWith( + _$NotificationsStateEmptyImpl value, + $Res Function(_$NotificationsStateEmptyImpl) then) = + __$$NotificationsStateEmptyImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$NotificationsStateEmptyImplCopyWithImpl<$Res> + extends _$NotificationsStateCopyWithImpl<$Res, + _$NotificationsStateEmptyImpl> + implements _$$NotificationsStateEmptyImplCopyWith<$Res> { + __$$NotificationsStateEmptyImplCopyWithImpl( + _$NotificationsStateEmptyImpl _value, + $Res Function(_$NotificationsStateEmptyImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$NotificationsStateEmptyImpl implements NotificationsStateEmpty { + const _$NotificationsStateEmptyImpl(); + + @override + String toString() { + return 'NotificationsState.empty()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$NotificationsStateEmptyImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() empty, + required TResult Function(int notificationsCount) loaded, + required TResult Function(String errorMessage) error, + }) { + return empty(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? empty, + TResult? Function(int notificationsCount)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return empty?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? empty, + TResult Function(int notificationsCount)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (empty != null) { + return empty(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_NotificationsState value) $default, { + required TResult Function(NotificationsStateEmpty value) empty, + required TResult Function(NotificationsStateLoaded value) loaded, + required TResult Function(NotificationsStateError value) error, + }) { + return empty(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_NotificationsState value)? $default, { + TResult? Function(NotificationsStateEmpty value)? empty, + TResult? Function(NotificationsStateLoaded value)? loaded, + TResult? Function(NotificationsStateError value)? error, + }) { + return empty?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_NotificationsState value)? $default, { + TResult Function(NotificationsStateEmpty value)? empty, + TResult Function(NotificationsStateLoaded value)? loaded, + TResult Function(NotificationsStateError value)? error, + required TResult orElse(), + }) { + if (empty != null) { + return empty(this); + } + return orElse(); + } +} + +abstract class NotificationsStateEmpty implements NotificationsState { + const factory NotificationsStateEmpty() = _$NotificationsStateEmptyImpl; +} + +/// @nodoc +abstract class _$$NotificationsStateLoadedImplCopyWith<$Res> { + factory _$$NotificationsStateLoadedImplCopyWith( + _$NotificationsStateLoadedImpl value, + $Res Function(_$NotificationsStateLoadedImpl) then) = + __$$NotificationsStateLoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({int notificationsCount}); +} + +/// @nodoc +class __$$NotificationsStateLoadedImplCopyWithImpl<$Res> + extends _$NotificationsStateCopyWithImpl<$Res, + _$NotificationsStateLoadedImpl> + implements _$$NotificationsStateLoadedImplCopyWith<$Res> { + __$$NotificationsStateLoadedImplCopyWithImpl( + _$NotificationsStateLoadedImpl _value, + $Res Function(_$NotificationsStateLoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? notificationsCount = null, + }) { + return _then(_$NotificationsStateLoadedImpl( + notificationsCount: null == notificationsCount + ? _value.notificationsCount + : notificationsCount // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +class _$NotificationsStateLoadedImpl implements NotificationsStateLoaded { + const _$NotificationsStateLoadedImpl({required this.notificationsCount}); + + @override + final int notificationsCount; + + @override + String toString() { + return 'NotificationsState.loaded(notificationsCount: $notificationsCount)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$NotificationsStateLoadedImpl && + (identical(other.notificationsCount, notificationsCount) || + other.notificationsCount == notificationsCount)); + } + + @override + int get hashCode => Object.hash(runtimeType, notificationsCount); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$NotificationsStateLoadedImplCopyWith<_$NotificationsStateLoadedImpl> + get copyWith => __$$NotificationsStateLoadedImplCopyWithImpl< + _$NotificationsStateLoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() empty, + required TResult Function(int notificationsCount) loaded, + required TResult Function(String errorMessage) error, + }) { + return loaded(notificationsCount); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? empty, + TResult? Function(int notificationsCount)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return loaded?.call(notificationsCount); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? empty, + TResult Function(int notificationsCount)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(notificationsCount); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_NotificationsState value) $default, { + required TResult Function(NotificationsStateEmpty value) empty, + required TResult Function(NotificationsStateLoaded value) loaded, + required TResult Function(NotificationsStateError value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_NotificationsState value)? $default, { + TResult? Function(NotificationsStateEmpty value)? empty, + TResult? Function(NotificationsStateLoaded value)? loaded, + TResult? Function(NotificationsStateError value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_NotificationsState value)? $default, { + TResult Function(NotificationsStateEmpty value)? empty, + TResult Function(NotificationsStateLoaded value)? loaded, + TResult Function(NotificationsStateError value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class NotificationsStateLoaded implements NotificationsState { + const factory NotificationsStateLoaded( + {required final int notificationsCount}) = _$NotificationsStateLoadedImpl; + + int get notificationsCount; + @JsonKey(ignore: true) + _$$NotificationsStateLoadedImplCopyWith<_$NotificationsStateLoadedImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$NotificationsStateErrorImplCopyWith<$Res> { + factory _$$NotificationsStateErrorImplCopyWith( + _$NotificationsStateErrorImpl value, + $Res Function(_$NotificationsStateErrorImpl) then) = + __$$NotificationsStateErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String errorMessage}); +} + +/// @nodoc +class __$$NotificationsStateErrorImplCopyWithImpl<$Res> + extends _$NotificationsStateCopyWithImpl<$Res, + _$NotificationsStateErrorImpl> + implements _$$NotificationsStateErrorImplCopyWith<$Res> { + __$$NotificationsStateErrorImplCopyWithImpl( + _$NotificationsStateErrorImpl _value, + $Res Function(_$NotificationsStateErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? errorMessage = null, + }) { + return _then(_$NotificationsStateErrorImpl( + errorMessage: null == errorMessage + ? _value.errorMessage + : errorMessage // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$NotificationsStateErrorImpl implements NotificationsStateError { + const _$NotificationsStateErrorImpl({required this.errorMessage}); + + @override + final String errorMessage; + + @override + String toString() { + return 'NotificationsState.error(errorMessage: $errorMessage)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$NotificationsStateErrorImpl && + (identical(other.errorMessage, errorMessage) || + other.errorMessage == errorMessage)); + } + + @override + int get hashCode => Object.hash(runtimeType, errorMessage); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$NotificationsStateErrorImplCopyWith<_$NotificationsStateErrorImpl> + get copyWith => __$$NotificationsStateErrorImplCopyWithImpl< + _$NotificationsStateErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() empty, + required TResult Function(int notificationsCount) loaded, + required TResult Function(String errorMessage) error, + }) { + return error(errorMessage); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? empty, + TResult? Function(int notificationsCount)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return error?.call(errorMessage); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? empty, + TResult Function(int notificationsCount)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(errorMessage); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_NotificationsState value) $default, { + required TResult Function(NotificationsStateEmpty value) empty, + required TResult Function(NotificationsStateLoaded value) loaded, + required TResult Function(NotificationsStateError value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_NotificationsState value)? $default, { + TResult? Function(NotificationsStateEmpty value)? empty, + TResult? Function(NotificationsStateLoaded value)? loaded, + TResult? Function(NotificationsStateError value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_NotificationsState value)? $default, { + TResult Function(NotificationsStateEmpty value)? empty, + TResult Function(NotificationsStateLoaded value)? loaded, + TResult Function(NotificationsStateError value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class NotificationsStateError implements NotificationsState { + const factory NotificationsStateError({required final String errorMessage}) = + _$NotificationsStateErrorImpl; + + String get errorMessage; + @JsonKey(ignore: true) + _$$NotificationsStateErrorImplCopyWith<_$NotificationsStateErrorImpl> + get copyWith => throw _privateConstructorUsedError; +} diff --git a/lib/widgets/bottom_navigation_bar_widget.dart b/lib/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart similarity index 60% rename from lib/widgets/bottom_navigation_bar_widget.dart rename to lib/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart index 51fd3e9..9865221 100644 --- a/lib/widgets/bottom_navigation_bar_widget.dart +++ b/lib/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart @@ -1,8 +1,13 @@ import 'package:eatvio_app/core/app_export.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_state.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_cubit.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_state.dart'; import 'package:flutter/material.dart'; import 'package:eatvio_app/widgets/custom_navigation_menu.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; +import 'package:badges/badges.dart' as badges; int currentBottomNavBarIndex = 0; @@ -113,36 +118,56 @@ class _BottomNavigationBarWidgetState extends State { ), BottomNavigationBarItem( label: "chat".tr, - icon: SvgPicture.asset( - ImageConstant.imgChat, - width: 24, - height: 24, - ), - activeIcon: SvgPicture.asset( - ImageConstant.imgChat, - width: 24, - height: 24, - colorFilter: ColorFilter.mode( - appTheme.blueA400, - BlendMode.srcIn, - ), + icon: BlocBuilder( + builder: (BuildContext context, NewMessagesState state) { + return badges.Badge( + position: badges.BadgePosition.topEnd(), + badgeContent: Text( + (state is NewMessagesStateLoaded) ? state.messagesCount.toString() : '0', + style: TextStyle( + color: Colors.white, + ), + ), + child: SvgPicture.asset( + ImageConstant.imgChat, + width: 24, + height: 24, + colorFilter: currentBottomNavBarIndex == 3 + ? ColorFilter.mode( + appTheme.blueA400, + BlendMode.srcIn, + ) + : null, + ), + ); + }, ), ), BottomNavigationBarItem( label: '', - icon: SvgPicture.asset( - ImageConstant.imgBell, - width: 24, - height: 24, - ), - activeIcon: SvgPicture.asset( - ImageConstant.imgBell, - width: 24, - height: 24, - colorFilter: ColorFilter.mode( - appTheme.blueA400, - BlendMode.srcIn, - ), + icon: BlocBuilder( + builder: (BuildContext context, NotificationsState state) { + return badges.Badge( + position: badges.BadgePosition.topEnd(), + badgeContent: Text( + (state is NotificationsStateLoaded) ? state.notificationsCount.toString() : '0', + style: TextStyle( + color: Colors.white, + ), + ), + child: SvgPicture.asset( + ImageConstant.imgBell, + colorFilter: currentBottomNavBarIndex == 4 + ? ColorFilter.mode( + appTheme.blueA400, + BlendMode.srcIn, + ) + : null, + width: 24, + height: 24, + ), + ); + }, ), ), BottomNavigationBarItem( diff --git a/lib/features/chat/presentation/pages/chat_screen.dart b/lib/features/chat/presentation/pages/chat_screen.dart index 258b731..d3ecef8 100644 --- a/lib/features/chat/presentation/pages/chat_screen.dart +++ b/lib/features/chat/presentation/pages/chat_screen.dart @@ -155,7 +155,9 @@ class _ChatScreenState extends State { children: [ SizedBox(width: 8), InkWell( - onTap: () {}, + onTap: () { + + }, borderRadius: BorderRadiusStyle.circleBorder17, child: Ink( height: 32, diff --git a/lib/locator_service.dart b/lib/locator_service.dart index 5a924d2..dfd6198 100644 --- a/lib/locator_service.dart +++ b/lib/locator_service.dart @@ -3,6 +3,8 @@ import 'package:eatvio_app/core/initialization_cubit/initialization_cubit.dart'; import 'package:eatvio_app/features/blog_post/presentation/bloc/blog_post_cubit.dart'; import 'package:eatvio_app/features/blog_post/repositories/blog_post_repository.dart'; import 'package:eatvio_app/features/blog_post/services/blog_post_service.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_cubit.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart'; import 'package:eatvio_app/features/chat/repositories/chat_repository.dart'; import 'package:eatvio_app/features/chat/services/chat_service.dart'; @@ -17,6 +19,8 @@ final sl = GetIt.instance; Future init() async { // BLoC / Cubit sl.registerLazySingleton(() => InitializationCubit(chatRepository: sl())); + sl.registerLazySingleton(() => NewMessagesCubit()); + sl.registerLazySingleton(() => NotificationsCubit()); sl.registerFactory(() => ChatRoomCubit(chatRepository: sl(), initializationCubit: sl())); sl.registerFactory(() => FeedCubit(feedRepository: sl())); diff --git a/lib/main.dart b/lib/main.dart index 3f285ad..e73bd42 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,8 @@ import 'package:eatvio_app/app_router.dart'; import 'package:eatvio_app/core/initialization_cubit/initialization_cubit.dart'; import 'package:eatvio_app/core/initialization_cubit/initialization_state.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_cubit.dart'; import 'package:eatvio_app/features/chat/presentation/pages/chat_select_screen/bloc/chat_select_bloc.dart'; import 'package:eatvio_app/features/chat/presentation/pages/chat_select_screen/models/chat_select_model.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_cubit.dart'; @@ -43,6 +45,9 @@ class MyApp extends StatelessWidget { return MultiBlocProvider( providers: [ BlocProvider(create: (context) => sl()), + BlocProvider(create: (context) => sl()), + BlocProvider(create: (context) => sl()), + BlocProvider(create: (context) => ThemeBloc(ThemeState(themeType: PrefUtils().getThemeData()))), BlocProvider(create: (context) => sl()..loadFeedBlogPostList()), BlocProvider(create: (context) => MyProfileBloc(MyProfileState(myProfileModelObj: MyProfileModel()))..add(MyProfileInitialEvent())),