import 'dart:async'; import 'package:equatable/equatable.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flux/core/blocs/session/session_cubit.dart'; import 'package:flux/features/notes/data/notes_repository.dart'; import 'package:flux/features/notes/models/note_model.dart'; import 'package:get_it/get_it.dart'; part 'notes_state.dart'; class NotesCubit extends Cubit { final NotesRepository _repository = GetIt.I.get(); String? get companyId => GetIt.I.get().state.company?.id; String? get staffId => GetIt.I.get().state.currentStaffMember?.id; StreamSubscription? _subscription; NotesCubit() : super(NotesState(status: NotesStatus.initial)); void stopListening() { _subscription?.cancel(); _subscription = null; } void startListening() { stopListening(); emit(state.copyWith(status: NotesStatus.loading)); // Primo caricamento _loadNotesSilently(); // Inizio ascolto campanello try { _subscription = _repository .notesStream(companyId: companyId!, currentStaffId: staffId!) .listen((_) { // Quando il campanello suona (qualcosa รจ cambiato a DB), ricarichiamo! _loadNotesSilently(); }); } on Exception catch (e) { debugPrint(e.toString()); } } Future _loadNotesSilently() async { try { final notes = await _repository.getNotes(); emit( state.copyWith( status: NotesStatus.success, notes: notes, errorMessage: null, ), ); } catch (e) { emit( state.copyWith(status: NotesStatus.failure, errorMessage: e.toString()), ); } } Future saveNote(NoteModel note) async { try { await _repository.saveNote(note); // Non serve fare l'emit! Ci pensa lo stream a far rimbalzare i dati aggiornati } catch (e) { emit( state.copyWith(status: NotesStatus.failure, errorMessage: e.toString()), ); } } Future deleteNote(String noteId) async { try { await _repository.deleteNote(noteId); // Non serve fare l'emit } catch (e) { emit( state.copyWith(status: NotesStatus.failure, errorMessage: e.toString()), ); } } @override Future close() { stopListening(); return super.close(); } }