Skip to content

Instantly share code, notes, and snippets.

@mrasityilmaz
Last active January 24, 2024 10:11
Show Gist options
  • Save mrasityilmaz/a98453308f255e11bd466362e10cc09c to your computer and use it in GitHub Desktop.
Save mrasityilmaz/a98453308f255e11bd466362e10cc09c to your computer and use it in GitHub Desktop.
import 'package:bloc/bloc.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:hotel_reservation_app/core/data/models/filter_model.dart';
import 'package:hotel_reservation_app/core/data/models/hotel_model.dart';
import 'dart:convert';
import 'home_screen_event.dart';
import 'home_screen_state.dart';
class HomeScreenBloc extends Bloc<HomeScreenEvent, HomeScreenState> {
HomeScreenBloc() : super(HomeScreenLoading()) {
on<HomeScreenEvent>((event, emit) async {
if (event is FetchDataEvent) {
await _fetchData(emit);
}
});
}
Future<void> _fetchData(Emitter<HomeScreenState> emit)async{
try {
await readJson();
emit(DataLoadedState(filteredHotelList()));
} catch (error) {
emit(ErrorState(error.toString()));
}
}
List<Hotel> items = List<Hotel>.empty(growable: true);
Future<void> readJson() async {
final String response =
await rootBundle.loadString("assets/json/hotel.json");
final data = await json.decode(response);
items = (data["items"] as List).map((data) =>
Hotel.fromJson(data as Map<String, dynamic>)).toList();
}
List<Hotel> filteredHotelList({Filter? filter}) {
if (filter != null &&
(filter.categoryFilters.any((element) => element.value) ||
filter.personNumberFilters.any((element) => element.value))) {
final categoryFilter =
filter.categoryFilters.where((element) => element.value == true);
final personFilter =
filter.personNumberFilters.where((element) => element.value == true);
return items.where((hotel) {
final bool eachOtherOK = (categoryFilter.isEmpty
? true
: categoryFilter.any(
(cf) => cf.category.roomType == hotel.roomType)) &&
(personFilter.isEmpty
? true
: personFilter.any(
(pf) => pf.personNumber.personNumberEnum ==
hotel.personNumber));
if (eachOtherOK) {
return true;
} else {
return categoryFilter.isNotEmpty &&
(personFilter.isEmpty
? false
: personFilter.any((pf) =>
pf.personNumber.personNumberEnum == hotel.personNumber));
}
}).toList();
} else {
return items;
}
}
}
---------------
import 'package:equatable/equatable.dart';
abstract class HomeScreenEvent extends Equatable {
@override
List<Object?> get props => [];
}
class FetchDataEvent extends HomeScreenEvent {}
--------------
import 'package:equatable/equatable.dart';
import 'package:hotel_reservation_app/core/data/models/hotel_model.dart';
abstract class HomeScreenState extends Equatable {
@override
List<Object?> get props => [];
}
class HomeScreenLoading extends HomeScreenState {}
class HomeScreenLoaded extends HomeScreenState {
final List<Hotel> items;
HomeScreenLoaded(this.items);
@override
List<Object?> get props => [items];
}
class HomeScreenError extends HomeScreenState {
final String error;
HomeScreenError(this.error);
@override
List<Object?> get props => [error];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment