import 'dart:convert'; import 'package:bloc/bloc.dart'; import 'package:loggy/loggy.dart'; import 'package:veilid_support/veilid_support.dart'; import 'loggy.dart'; const Map _blocChangeLogLevels = { 'RouterCubit': LogLevel.debug, 'PerAccountCollectionBlocMapCubit': LogLevel.debug, 'PerAccountCollectionCubit': LogLevel.debug, 'ActiveChatCubit': LogLevel.debug, 'AccountRecordCubit': LogLevel.debug, 'ContactListCubit': LogLevel.debug, 'ContactInvitationListCubit': LogLevel.debug, 'ChatListCubit': LogLevel.debug, 'PreferencesCubit': LogLevel.debug, 'ConversationCubit': LogLevel.debug, 'DefaultDHTRecordCubit': LogLevel.debug, }; const Map _blocCreateCloseLogLevels = {}; const Map _blocErrorLogLevels = {}; /// [BlocObserver] for the VeilidChat application that /// observes all state changes. class StateLogger extends BlocObserver { /// {@macro counter_observer} const StateLogger(); void _checkLogLevel( Map blocLogLevels, LogLevel defaultLogLevel, BlocBase bloc, void Function(LogLevel) closure) { final logLevel = blocLogLevels[bloc.runtimeType.toString()] ?? defaultLogLevel; if (logLevel != LogLevel.off) { closure(logLevel); } } @override void onChange(BlocBase bloc, Change change) { super.onChange(bloc, change); _checkLogLevel(_blocChangeLogLevels, LogLevel.off, bloc, (logLevel) { const encoder = JsonEncoder.withIndent(' ', DynamicDebug.toDebug); log.log( logLevel, 'Change: ${bloc.runtimeType}\n' 'currentState: ${encoder.convert(change.currentState)}\n' 'nextState: ${encoder.convert(change.nextState)}\n'); }); } @override void onCreate(BlocBase bloc) { super.onCreate(bloc); _checkLogLevel(_blocCreateCloseLogLevels, LogLevel.debug, bloc, (logLevel) { log.log(logLevel, 'Create: ${bloc.runtimeType}'); }); } @override void onClose(BlocBase bloc) { super.onClose(bloc); _checkLogLevel(_blocCreateCloseLogLevels, LogLevel.debug, bloc, (logLevel) { log.log(logLevel, 'Close: ${bloc.runtimeType}'); }); } @override void onError(BlocBase bloc, Object error, StackTrace stackTrace) { super.onError(bloc, error, stackTrace); _checkLogLevel(_blocErrorLogLevels, LogLevel.error, bloc, (logLevel) { log.log(logLevel, 'Error: ${bloc.runtimeType} $error\n$stackTrace'); }); } }