forked from eatvio/eatvio_app
135 lines
4.8 KiB
Dart
135 lines
4.8 KiB
Dart
import 'dart:async';
|
|
import 'dart:developer';
|
|
|
|
import 'package:easy_debounce/easy_debounce.dart';
|
|
import 'package:eatvio_app/core/data/diet/repositories/diet_repository.dart';
|
|
import 'package:eatvio_app/features/diets/presentation/bloc/about_diet_state.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
|
|
class AboutDietCubit extends Cubit<AboutDietState> {
|
|
AboutDietCubit({required this.dietsRepository}) : super(AboutDietState.initial());
|
|
final DietRepository dietsRepository;
|
|
|
|
Future<void> getDiet(int id, {int? index}) async {
|
|
try {
|
|
final diet = await dietsRepository.getDiet(id);
|
|
if (index != null) {
|
|
dietsRepository.emitCommentsStateToFeed(DietCommentsState(index: index, totalComments: diet.totalComments));
|
|
}
|
|
emit(AboutDietState.loaded(diet));
|
|
} catch (e) {
|
|
log(e.toString());
|
|
}
|
|
}
|
|
|
|
Future<void> getDietWithLoading(int id) async {
|
|
try {
|
|
emit(AboutDietState.loading());
|
|
final diet = await dietsRepository.getDiet(id);
|
|
emit(AboutDietState.loaded(diet));
|
|
} catch (e) {
|
|
log(e.toString());
|
|
}
|
|
}
|
|
|
|
Future<void> likeDiet(int id, int dietIndexInFeed) async {
|
|
if (state is! DietStateLoaded) return;
|
|
|
|
final currentDiet = (state as DietStateLoaded).diet;
|
|
|
|
if (currentDiet.wasLikedByMe) {
|
|
final updatedDiet = currentDiet.copyWith(
|
|
totalLikes: currentDiet.totalLikes - 1,
|
|
wasLikedByMe: false,
|
|
);
|
|
dietsRepository.emitLikesStateToFeed(DietLikesState(wasLikedByMe: updatedDiet.wasLikedByMe, totalLikes: updatedDiet.totalLikes, index: dietIndexInFeed));
|
|
emit(AboutDietState.loaded(updatedDiet));
|
|
} else {
|
|
final updatedDiet = currentDiet.copyWith(
|
|
totalLikes: currentDiet.totalLikes + 1,
|
|
wasLikedByMe: true,
|
|
);
|
|
|
|
dietsRepository.emitLikesStateToFeed(DietLikesState(wasLikedByMe: updatedDiet.wasLikedByMe, totalLikes: updatedDiet.totalLikes, index: dietIndexInFeed));
|
|
emit(AboutDietState.loaded(updatedDiet));
|
|
}
|
|
|
|
EasyDebounce.debounce(
|
|
'like_diet',
|
|
Duration(seconds: 1),
|
|
() async {
|
|
try {
|
|
final dietLikeStateData = await dietsRepository.likeDiet(id);
|
|
final actualDiet = currentDiet.copyWith(
|
|
wasLikedByMe: dietLikeStateData.isLiked,
|
|
totalLikes: dietLikeStateData.totalLikes,
|
|
);
|
|
emit(AboutDietState.loaded(actualDiet));
|
|
dietsRepository.emitLikesStateToFeed(DietLikesState(wasLikedByMe: actualDiet.wasLikedByMe, totalLikes: actualDiet.totalLikes, index: dietIndexInFeed));
|
|
} catch (e) {
|
|
log(e.toString());
|
|
dietsRepository
|
|
.emitLikesStateToFeed(DietLikesState(wasLikedByMe: currentDiet.wasLikedByMe, totalLikes: currentDiet.totalLikes, index: dietIndexInFeed));
|
|
emit(AboutDietState.loaded(currentDiet));
|
|
}
|
|
},
|
|
);
|
|
}
|
|
|
|
Future<void> addToFavorite(int id, int dietIndexInFeed) async {
|
|
if (state is! DietStateLoaded) return;
|
|
|
|
final currentDiet = (state as DietStateLoaded).diet;
|
|
|
|
final updatedDiet = currentDiet.copyWith(
|
|
isFavorite: true,
|
|
);
|
|
dietsRepository.emitFavoriteStateToFeed(DietFavoriteState(isFavorite: updatedDiet.isFavorite, index: dietIndexInFeed));
|
|
emit(AboutDietState.loaded(updatedDiet));
|
|
|
|
EasyDebounce.debounce(
|
|
'add_diet_to_favorites',
|
|
Duration(seconds: 1),
|
|
() async {
|
|
try {
|
|
final diet = await dietsRepository.addToFavorite(id);
|
|
emit(AboutDietState.loaded(diet));
|
|
dietsRepository.emitFavoriteStateToFeed(DietFavoriteState(isFavorite: diet.isFavorite, index: dietIndexInFeed));
|
|
} catch (e) {
|
|
log(e.toString());
|
|
dietsRepository.emitFavoriteStateToFeed(DietFavoriteState(isFavorite: currentDiet.isFavorite, index: dietIndexInFeed));
|
|
emit(AboutDietState.loaded(currentDiet));
|
|
}
|
|
},
|
|
);
|
|
}
|
|
|
|
Future<void> removeFromFavorite(int id, int dietIndexInFeed) async {
|
|
if (state is! DietStateLoaded) return;
|
|
|
|
final currentDiet = (state as DietStateLoaded).diet;
|
|
|
|
final updatedDiet = currentDiet.copyWith(
|
|
isFavorite: false,
|
|
);
|
|
dietsRepository.emitFavoriteStateToFeed(DietFavoriteState(isFavorite: updatedDiet.isFavorite, index: dietIndexInFeed));
|
|
emit(AboutDietState.loaded(updatedDiet));
|
|
|
|
EasyDebounce.debounce(
|
|
'remove_diet_from_favorites',
|
|
Duration(seconds: 1),
|
|
() async {
|
|
try {
|
|
final diet = await dietsRepository.removeFromFavorite(id);
|
|
emit(AboutDietState.loaded(diet));
|
|
dietsRepository.emitFavoriteStateToFeed(DietFavoriteState(isFavorite: diet.isFavorite, index: dietIndexInFeed));
|
|
} catch (e) {
|
|
log(e.toString());
|
|
dietsRepository.emitFavoriteStateToFeed(DietFavoriteState(isFavorite: currentDiet.isFavorite, index: dietIndexInFeed));
|
|
emit(AboutDietState.loaded(currentDiet));
|
|
}
|
|
},
|
|
);
|
|
}
|
|
}
|