From b69308e1efc53d55860923f9a908ecc939fe3941 Mon Sep 17 00:00:00 2001 From: mark-cachy Date: Sat, 30 May 2026 16:45:12 +0200 Subject: [PATCH] refactor dashboard note list --- lib/core/routes/app_router.dart | 7 ++ .../blocs/dashboard_note_list_cubit.dart | 73 +++++++++++++++++++ .../blocs/dashboard_note_list_state.dart | 30 ++++++++ .../ui/dashboard_note_list_card.dart} | 12 +-- ...ard.dart => dashboard_task_list_card.dart} | 4 +- lib/features/home/ui/home_screen.dart | 11 ++- 6 files changed, 125 insertions(+), 12 deletions(-) create mode 100644 lib/features/home/dashboard_note_list/blocs/dashboard_note_list_cubit.dart create mode 100644 lib/features/home/dashboard_note_list/blocs/dashboard_note_list_state.dart rename lib/features/{notes/ui/dashboard_notes_widget.dart => home/dashboard_note_list/ui/dashboard_note_list_card.dart} (93%) rename lib/features/home/dashboard_task_list/ui/{dashboard_tasks_card.dart => dashboard_task_list_card.dart} (98%) diff --git a/lib/core/routes/app_router.dart b/lib/core/routes/app_router.dart index 09e1076..04d097f 100644 --- a/lib/core/routes/app_router.dart +++ b/lib/core/routes/app_router.dart @@ -18,6 +18,7 @@ import 'package:flux/features/customers/models/customer_model.dart'; import 'package:flux/features/customers/ui/customer_detail_screen.dart'; import 'package:flux/features/customers/ui/customer_form_screen.dart'; import 'package:flux/features/customers/ui/customers_list_screen.dart'; +import 'package:flux/features/home/dashboard_note_list/blocs/dashboard_note_list_cubit.dart'; import 'package:flux/features/home/dashboard_store_operation_list/bloc/dashboard_store_operation_list_cubit.dart'; import 'package:flux/features/home/dashboard_store_ticket_list/blocs/dashboard_store_ticket_list_cubit.dart'; import 'package:flux/features/home/dashboard_task_list/blocs/dashboard_task_list_cubit.dart'; @@ -165,6 +166,12 @@ class AppRouter { storeId: sessionCubit.state.currentStore?.id, ), ), + BlocProvider( + create: (context) => DashboardNoteListCubit( + companyId: sessionCubit.state.company?.id, + staffId: sessionCubit.state.currentStaffMember?.id, + ), + ), ], child: const HomeScreen(), ); diff --git a/lib/features/home/dashboard_note_list/blocs/dashboard_note_list_cubit.dart b/lib/features/home/dashboard_note_list/blocs/dashboard_note_list_cubit.dart new file mode 100644 index 0000000..cfce3fd --- /dev/null +++ b/lib/features/home/dashboard_note_list/blocs/dashboard_note_list_cubit.dart @@ -0,0 +1,73 @@ +import 'dart:async'; + +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_bloc/flutter_bloc.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 'dashboard_note_list_state.dart'; + +class DashboardNoteListCubit extends Cubit { + final NotesRepository _repository = GetIt.I.get(); + final String? companyId; + final String? staffId; + StreamSubscription? _subscription; + + DashboardNoteListCubit({required this.companyId, required this.staffId}) + : super(DashboardNoteListState(status: DashboardNoteListStatus.initial)); + + void stopListening() { + _subscription?.cancel(); + _subscription = null; + } + + void startListening() { + stopListening(); + + emit(state.copyWith(status: DashboardNoteListStatus.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: DashboardNoteListStatus.success, + notes: notes, + errorMessage: null, + ), + ); + } catch (e) { + emit( + state.copyWith( + status: DashboardNoteListStatus.failure, + errorMessage: e.toString(), + ), + ); + } + } + + @override + Future close() { + stopListening(); + return super.close(); + } +} diff --git a/lib/features/home/dashboard_note_list/blocs/dashboard_note_list_state.dart b/lib/features/home/dashboard_note_list/blocs/dashboard_note_list_state.dart new file mode 100644 index 0000000..b70767a --- /dev/null +++ b/lib/features/home/dashboard_note_list/blocs/dashboard_note_list_state.dart @@ -0,0 +1,30 @@ +part of 'dashboard_note_list_cubit.dart'; + +enum DashboardNoteListStatus { initial, loading, success, failure } + +class DashboardNoteListState extends Equatable { + final DashboardNoteListStatus status; + final List notes; + final String? errorMessage; + + const DashboardNoteListState({ + this.status = DashboardNoteListStatus.initial, + this.notes = const [], + this.errorMessage, + }); + + DashboardNoteListState copyWith({ + DashboardNoteListStatus? status, + List? notes, + String? errorMessage, + }) { + return DashboardNoteListState( + status: status ?? this.status, + notes: notes ?? this.notes, + errorMessage: errorMessage ?? this.errorMessage, + ); + } + + @override + List get props => [status, notes, errorMessage]; +} diff --git a/lib/features/notes/ui/dashboard_notes_widget.dart b/lib/features/home/dashboard_note_list/ui/dashboard_note_list_card.dart similarity index 93% rename from lib/features/notes/ui/dashboard_notes_widget.dart rename to lib/features/home/dashboard_note_list/ui/dashboard_note_list_card.dart index 788b592..8bdcc1b 100644 --- a/lib/features/notes/ui/dashboard_notes_widget.dart +++ b/lib/features/home/dashboard_note_list/ui/dashboard_note_list_card.dart @@ -2,12 +2,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flux/core/routes/routes.dart'; import 'package:flux/core/theme/theme.dart'; -import 'package:flux/features/notes/blocs/notes_bloc.dart'; +import 'package:flux/features/home/dashboard_note_list/blocs/dashboard_note_list_cubit.dart'; import 'package:flux/features/notes/models/note_model.dart'; import 'package:go_router/go_router.dart'; // Supponendo tu usi GoRouter per la navigazione -class DashboardNotesWidget extends StatelessWidget { - const DashboardNotesWidget({super.key}); +class DashboardNoteListCard extends StatelessWidget { + const DashboardNoteListCard({super.key}); @override Widget build(BuildContext context) { @@ -59,14 +59,14 @@ class DashboardNotesWidget extends StatelessWidget { const SizedBox(height: 12), // Il corpo del widget collegato al Bloc - BlocBuilder( + BlocBuilder( builder: (context, state) { - if (state.status == NotesStatus.loading && + if (state.status == DashboardNoteListStatus.loading && state.notes.isEmpty) { return const Center(child: CircularProgressIndicator()); } - if (state.status == NotesStatus.failure) { + if (state.status == DashboardNoteListStatus.failure) { return const Center( child: Text( 'Errore nel caricamento delle note.', diff --git a/lib/features/home/dashboard_task_list/ui/dashboard_tasks_card.dart b/lib/features/home/dashboard_task_list/ui/dashboard_task_list_card.dart similarity index 98% rename from lib/features/home/dashboard_task_list/ui/dashboard_tasks_card.dart rename to lib/features/home/dashboard_task_list/ui/dashboard_task_list_card.dart index b653fe2..d3577e2 100644 --- a/lib/features/home/dashboard_task_list/ui/dashboard_tasks_card.dart +++ b/lib/features/home/dashboard_task_list/ui/dashboard_task_list_card.dart @@ -6,8 +6,8 @@ import 'package:flux/features/home/dashboard_task_list/blocs/dashboard_task_list import 'package:go_router/go_router.dart'; import 'package:flux/features/tasks/models/task_status.dart'; -class DashboardTasksCard extends StatelessWidget { - const DashboardTasksCard({super.key}); +class DashboardTaskListCard extends StatelessWidget { + const DashboardTaskListCard({super.key}); @override Widget build(BuildContext context) { diff --git a/lib/features/home/ui/home_screen.dart b/lib/features/home/ui/home_screen.dart index fb3b91f..f62347f 100644 --- a/lib/features/home/ui/home_screen.dart +++ b/lib/features/home/ui/home_screen.dart @@ -5,18 +5,19 @@ import 'package:flux/core/routes/routes.dart'; import 'package:flux/core/theme/theme.dart'; import 'package:flux/core/utils/extensions.dart'; import 'package:flux/core/widgets/staff_selector_modal.dart'; +import 'package:flux/features/home/dashboard_note_list/blocs/dashboard_note_list_cubit.dart'; import 'package:flux/features/home/dashboard_store_operation_list/bloc/dashboard_store_operation_list_cubit.dart'; import 'package:flux/features/home/dashboard_store_ticket_list/blocs/dashboard_store_ticket_list_cubit.dart'; import 'package:flux/features/home/dashboard_store_ticket_list/ui/dashboard_store_ticket_list_card.dart'; import 'package:flux/features/home/dashboard_task_list/blocs/dashboard_task_list_cubit.dart'; -import 'package:flux/features/home/dashboard_task_list/ui/dashboard_tasks_card.dart'; +import 'package:flux/features/home/dashboard_task_list/ui/dashboard_task_list_card.dart'; import 'package:flux/features/home/dashboard_store_operation_list/ui/latest_store_operations_card.dart'; import 'package:flux/features/home/ui/quick_actions_widget.dart'; import 'package:flux/features/master_data/staff/blocs/staff_cubit.dart'; import 'package:flux/features/master_data/staff/models/staff_member_model.dart'; import 'package:flux/features/notes/data/notes_repository.dart'; import 'package:flux/features/notes/models/note_model.dart'; -import 'package:flux/features/notes/ui/dashboard_notes_widget.dart'; +import 'package:flux/features/home/dashboard_note_list/ui/dashboard_note_list_card.dart'; import 'package:get_it/get_it.dart'; import 'package:go_router/go_router.dart'; @@ -58,12 +59,14 @@ class _HomeScreenState extends State { context.read().stopListening(); context.read().stopListening(); context.read().stopListening(); + context.read().stopListening(); } void _startListeners() { context.read().startListening(); context.read().startListening(); context.read().startListening(); + context.read().startListening(); } @override @@ -128,8 +131,8 @@ class _HomeScreenState extends State { color: Colors.orange, context: context, ), - DashboardNotesWidget(), - DashboardTasksCard(), + DashboardNoteListCard(), + DashboardTaskListCard(), ]), ), ),