๐Ÿ“ฆ Abbondanzo / Journey

๐Ÿ“„ entries_bloc.dart ยท 66 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';

import '../models/entry.dart';
import '../repositories/entry_repository.dart';

part 'entries_event.dart';
part 'entries_state.dart';

class EntriesBloc extends Bloc<EntriesEvent, EntriesState> {
  final EntryRepository entryRepository;

  EntriesBloc({required this.entryRepository}) : super(EntriesLoading()) {
    on<LoadEntries>(_onLoadEntries);
    on<AddEntry>(_onAddEntry);
    on<UpdateEntry>(_onUpdateEntry);
    on<DeleteEntry>(_onDeleteEntry);
  }

  void _onLoadEntries(LoadEntries event, Emitter<EntriesState> emit) async {
    try {
      final entries = await entryRepository.getEntries();
      emit(EntriesLoaded(entries));
    } catch (e) {
      if (e is Exception) {
        emit(EntriesNotLoaded(e));
      } else if (e is TypeError) {
        emit(EntriesNotLoaded(Exception(e.toString())));
      } else {
        emit(EntriesNotLoaded(
            Exception('Something went wrong while loading entries')));
      }
    }
  }

  void _onAddEntry(AddEntry event, Emitter<EntriesState> emit) async {
    if (state is EntriesLoaded) {
      final updatedEntries = List<Entry>.from((state as EntriesLoaded).entries)
        ..add(event.entry);
      emit(EntriesLoaded(updatedEntries));
      await entryRepository.insert(event.entry);
    }
  }

  void _onUpdateEntry(UpdateEntry event, Emitter<EntriesState> emit) async {
    if (state is EntriesLoaded) {
      final updatedEntries = (state as EntriesLoaded).entries.map((entry) {
        return entry.id == event.updatedEntry.id ? event.updatedEntry : entry;
      }).toList();
      emit(EntriesLoaded(updatedEntries));
      await entryRepository.update(event.updatedEntry);
    }
  }

  void _onDeleteEntry(DeleteEntry event, Emitter<EntriesState> emit) async {
    if (state is EntriesLoaded) {
      final updatedEntries = (state as EntriesLoaded)
          .entries
          .where((entry) => entry.id != event.entry.id)
          .toList();
      emit(EntriesLoaded(updatedEntries));
      await entryRepository.delete(event.entry.id);
    }
  }
}