Skip to content

Instantly share code, notes, and snippets.

@brasizza
Created January 30, 2024 17:34
Show Gist options
  • Save brasizza/a5df128e101ac3a7a7e572586d657962 to your computer and use it in GitHub Desktop.
Save brasizza/a5df128e101ac3a7a7e572586d657962 to your computer and use it in GitHub Desktop.
import 'package:cinema_stub/app/core/socket/socket_base.dart';
import 'package:cinema_stub/app/data/models/seat.dart';
import 'package:cinema_stub/app/data/repositories/seats_repository.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
part 'cinema_state.dart';
class CinemaCubit extends Cubit<CinemaState> {
final SeatsRepository _repository;
final SocketBase _socket;
CinemaCubit({required SeatsRepository repository, required SocketBase socket})
: _repository = repository,
_socket = socket,
super(CinemaInitial()) {
// getSeats();
}
Future<void> getSeats() async {
emit(CinemaLoading());
try {
final seats = await _repository.getSeats();
if (seats == null || seats.isEmpty) {
emit(CinemaEmpty());
} else {
listenSeats(seats);
emit(CinemaLoaded(seats: seats));
}
} catch (e) {
emit(CinemaError(errorMessage: e.toString()));
}
}
int? _indexSeatBySeat(List<Seat>? seats, Seat seat) {
return seats?.indexWhere((s) => s.id == seat.id);
}
int? _indexSeatById(List<Seat>? seats, int id) {
return seats?.indexWhere((s) => s.id == id);
}
Future<bool> holdSeat({required Seat seat, required List<Seat>? seats, bool hold = false}) async {
final indexSeat = _indexSeatBySeat(seats, seat);
if (indexSeat != null) {
seats?[indexSeat] = seat.copyWith(hold: hold);
final holded = await _repository.holdSeat(id: seat.id, hold: hold);
if (holded) {
emit(CinemaLoaded(seats: seats));
}
return true;
}
return false;
}
void setOccupied({required Seat seat, required List<Seat>? seats}) async {
final indexSeat = _indexSeatBySeat(seats, seat);
if (indexSeat != null) {
final canBuy = await _repository.buyTicket(id: seat.id);
if (canBuy) {
seats?[indexSeat] = seat.copyWith(hold: false, occupied: true);
emit(OcuppySeat());
emit(CinemaLoaded(seats: seats));
}
}
}
void listenSeats(List<Seat> seats) {
for (var seat in seats) {
_socket.addChannel('/seats/${seat.id}', (data) => updateSeat(data, seats));
}
}
updateSeat(Map<String, dynamic> data, List<Seat>? seats) async {
if (seats != null) {
final id = (data['payload']['id']);
final hold = (data['payload']['hold'] ?? false);
final occupied = (data['payload']['occupied'] ?? false);
if (id != null) {
final indexSeat = _indexSeatById(seats, id);
if (indexSeat != null) {
final seat = seats[indexSeat];
seats[indexSeat] = seat.copyWith(hold: hold, occupied: occupied);
emit(CinemaLoaded(seats: seats));
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment