diff --git a/README.md b/README.md index b3474dfa1..e5d834950 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,7 @@ Follow these steps to the coolest experience in error handling ### Add dependency ```yaml dependencies: - talker: ^4.9.3 + talker: ^5.0.0-dev.8 ``` ### Easy to use @@ -336,7 +336,7 @@ Talker Flutter is an extension for the Dart Talker package that adds extra funct ### Add dependency ```yaml dependencies: - talker_flutter: ^4.9.3 + talker_flutter: ^5.0.0-dev.8 ``` ### Setup @@ -580,7 +580,7 @@ Follow these steps to use this package ### Add dependency ```yaml dependencies: - talker_dio_logger: ^4.9.3 + talker_dio_logger: ^5.0.0-dev.8 ``` ### Usage @@ -676,7 +676,7 @@ Follow these steps to use this package ### Add dependency ```yaml dependencies: - talker_bloc_logger: ^4.9.3 + talker_bloc_logger: ^5.0.0-dev.8 ``` ### Usage @@ -764,7 +764,7 @@ Follow these steps to use this package ### Add dependency ```yaml dependencies: - talker_riverpod_logger: ^4.9.3 + talker_riverpod_logger: ^5.0.0-dev.8 ``` ### Usage diff --git a/examples/shop_app_example/.gitignore b/examples/shop_app_example/.gitignore index d4848c1ec..ec1e67004 100644 --- a/examples/shop_app_example/.gitignore +++ b/examples/shop_app_example/.gitignore @@ -5,9 +5,11 @@ *.swp .DS_Store .atom/ +.build/ .buildlog/ .history .svn/ +.swiftpm/ migrate_working_dir/ # IntelliJ related diff --git a/examples/shop_app_example/ios/Podfile.lock b/examples/shop_app_example/ios/Podfile.lock index ff7596b0f..765efb565 100644 --- a/examples/shop_app_example/ios/Podfile.lock +++ b/examples/shop_app_example/ios/Podfile.lock @@ -158,4 +158,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: c4c93c5f6502fe2754f48404d3594bf779584011 -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/examples/shop_app_example/lib/main.dart b/examples/shop_app_example/lib/main.dart index d4e4f7dea..ddabd3775 100644 --- a/examples/shop_app_example/lib/main.dart +++ b/examples/shop_app_example/lib/main.dart @@ -33,7 +33,7 @@ void _initDependencies() { final talker = TalkerFlutter.init( settings: TalkerSettings( colors: { - TalkerLogType.verbose.key: AnsiPen()..yellow(), + TalkerKey.verbose: AnsiPen()..yellow(), GoodLog.getKey: GoodLog.getPen, }, ), diff --git a/examples/shop_app_example/lib/ui/router.dart b/examples/shop_app_example/lib/ui/router.dart index ee6409147..bdbfcbaff 100644 --- a/examples/shop_app_example/lib/ui/router.dart +++ b/examples/shop_app_example/lib/ui/router.dart @@ -17,19 +17,19 @@ final appRoutes = { Routes.talker: (context) => TalkerScreen( talker: DI(), theme: talkerTheme, - customSettings: [ - CustomSettingsGroup( - title: 'Website settings', - enabled: true, - onToggleEnabled: (_) {}, - items: [ - CustomSettingsItemBool( - name: 'Disable remote logs', - value: false, - onChanged: (_) {}, - ), - ], - ), - ], + // customSettings: [ + // CustomSettingsGroup( + // title: 'Website settings', + // enabled: true, + // onToggleEnabled: (_) {}, + // items: [ + // CustomSettingsItemBool( + // name: 'Disable remote logs', + // value: false, + // onChanged: (_) {}, + // ), + // ], + // ), + // ], ), }; diff --git a/examples/shop_app_example/pubspec.yaml b/examples/shop_app_example/pubspec.yaml index 85351a021..f2e9fa75b 100644 --- a/examples/shop_app_example/pubspec.yaml +++ b/examples/shop_app_example/pubspec.yaml @@ -9,9 +9,9 @@ dependencies: flutter: sdk: flutter - talker_flutter: ^4.9.3 - talker_dio_logger: ^4.9.3 - talker_bloc_logger: ^4.9.3 + talker_flutter: ^5.0.0-dev.8 + talker_dio_logger: ^5.0.0-dev.8 + talker_bloc_logger: ^5.0.0-dev.8 get_it: ^7.6.7 flutter_bloc: ^9.0.0 diff --git a/packages/talker/CHANGELOG.md b/packages/talker/CHANGELOG.md index f9425bcef..a66f9fc98 100644 --- a/packages/talker/CHANGELOG.md +++ b/packages/talker/CHANGELOG.md @@ -1,3 +1,50 @@ +# 5.0.0-dev.8 +- - [talker] Sync release and prerelease versions + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.7 +- - [talker_dio_logger] Fix ``FormData``s ``contentType`` field + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.6 +- - [talker_dio_logger] Add ``FormData`` parser for request logs data + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.5 +- [talker] Add ``registeredKeys`` field into ``TalkerSettings`` for third-party packages +- [talker] Remove deprecated ``titles`` and ``types`` from ``TalkerFilter`` +- [talker] Add ``enabledKeys`` and ``disabledKeys`` fields into ``TalkerFilter`` to replace old filtering logic +- [talker_flutter] Add ``TalkerFilter`` configuration on ``TalkerScreen`` +- [talker_dio_logger] Add ``TalkerKey``s registration +- [talker_http_logger] Add ``TalkerKey``s registration +- [talker_bloc_logger] Add ``TalkerKey``s registration +- [talker_riverpod_logger] Add ``TalkerKey``s registration + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.4 +- [talker_dio_logger] Remove unused addonId field from dio_logger + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.3 +- [talker] Upgrade **BaseTalkerFilter** class - add new filtering way by **List keys** field +- [talker] Deprecate **titles** and **types** fields from **BaseTalkerFilter** + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.2 +- [talker] Fix errors and exceptions filtering for observer + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.1 +- [talker] Brand new simplified TalkerKeys API (String Log key) + +Thanks to [Frezyx](https://github.com/Frezyx) # 4.9.3 - [talker] chore(deps): update dependency gradle to v8.14.3 [talker] chore(deps): update plugin com.android.application to v8.11.1 @@ -434,7 +481,7 @@ Thanks to [wcoder](https://github.com/wcoder) Thanks to [IlyaZadyabin](https://github.com/IlyaZadyabin) # 3.0.4 -- - Add topics in pubspec.yaml +-Add topics in pubspec.yaml # 3.0.3 - Update **talker_logger** version to 3.0.4 diff --git a/packages/talker/example/talker_example.dart b/packages/talker/example/talker_example.dart index 541a35e21..b545fd93a 100644 --- a/packages/talker/example/talker_example.dart +++ b/packages/talker/example/talker_example.dart @@ -4,14 +4,14 @@ Future main() async { final talker = Talker( settings: TalkerSettings( colors: { - TalkerLogType.info.key: AnsiPen()..magenta(), - YourCustomLog.logKey: AnsiPen()..green(), + TalkerKey.info: AnsiPen()..magenta(), + YourCustomKey.logKey: AnsiPen()..green(), }, titles: { - TalkerLogType.exception.key: 'Whatever you want', - TalkerLogType.error.key: 'E', - TalkerLogType.info.key: 'i', - YourCustomLog.logKey: 'Custom', + TalkerKey.exception: 'Whatever you want', + TalkerKey.error: 'E', + TalkerKey.info: 'i', + YourCustomKey.logKey: 'Custom', }, ), ); @@ -32,11 +32,11 @@ Future main() async { } /// Custom logs - talker.logCustom(YourCustomLog('Something like your own service message')); + talker.logCustom(YourCustomKey('Something like your own service message')); } -class YourCustomLog extends TalkerLog { - YourCustomLog(String message) : super(message); +class YourCustomKey extends TalkerLog { + YourCustomKey(String message) : super(message); /// Your own log key (for color customization in settings) static const logKey = 'custom_log_key'; diff --git a/packages/talker/lib/src/filter.dart b/packages/talker/lib/src/filter.dart index 7f05ea39c..14f77026d 100644 --- a/packages/talker/lib/src/filter.dart +++ b/packages/talker/lib/src/filter.dart @@ -1,64 +1,58 @@ import 'package:talker/talker.dart'; -typedef TalkerFilter = _Filter; - -class BaseTalkerFilter implements TalkerFilter { - BaseTalkerFilter({ - this.titles = const [], - this.types = const [], +class TalkerFilter implements _Filter { + TalkerFilter({ + this.enabledKeys = const [], + this.disabledKeys = const [], this.searchQuery, }); - /// List of enabled for filter titles [exception], [error], [verbose] - final List titles; + /// List of enabled for filter keys + /// This is a new way to filter logs by their keys. + /// Keys are unique identifiers for logs, which can be set when creating a log. + /// All original talker keys here [TalkerKey] + final List enabledKeys; - /// List of enabled for filter types - subclasses of [TalkerData] - /// Like [TalkerError], [TalkerException], [TalkerLog], etc. - final List types; + /// List of disabled for filter keys + /// This is a new way to filter logs by their keys. + /// Keys are unique identifiers for logs, which can be set when creating a log. + /// All original talker keys here [TalkerKey] + final List disabledKeys; /// String query for filtering logs final String? searchQuery; @override bool filter(TalkerData item) { - if (titles.isEmpty && types.isEmpty && (searchQuery?.isEmpty ?? true)) { - return true; - } else { - var match = false; - - if (searchQuery?.isNotEmpty ?? false) { - final fullMsg = item.generateTextMessage(); - final fullUpperMsg = fullMsg.toUpperCase(); - final fullLowerMsg = fullMsg.toLowerCase(); - match = fullUpperMsg.contains(searchQuery!) || - fullLowerMsg.contains(searchQuery!); - } + var searchMatch = true; + var enabledKeysMatch = true; + var disabledKeysMatch = true; + + final query = searchQuery?.toLowerCase(); + if (query != null && query.isNotEmpty) { + final message = item.generateTextMessage().toLowerCase(); + searchMatch = message.contains(query); + } - return (titles.contains(item.title) || titles.isEmpty) && - (_checkTypeMatch(item) || types.isEmpty) && - (match || (searchQuery?.isEmpty ?? true)); + if (enabledKeys.isNotEmpty) { + enabledKeysMatch = enabledKeys.contains(item.key); } - } - bool _checkTypeMatch(TalkerData item) { - var match = false; - for (final type in types) { - if (item.runtimeType == type) { - match = true; - break; - } + if (disabledKeys.isNotEmpty) { + disabledKeysMatch = !disabledKeys.contains(item.key); } - return match; + + return searchMatch && enabledKeysMatch && disabledKeysMatch; } - BaseTalkerFilter copyWith({ - List? titles, - List? types, + TalkerFilter copyWith({ + List? enabledKeys, + List? disabledKeys, String? searchQuery, }) { - return BaseTalkerFilter( - titles: titles ?? this.titles, - types: types ?? this.types, + return TalkerFilter( + enabledKeys: enabledKeys ?? this.enabledKeys, + disabledKeys: disabledKeys ?? this.disabledKeys, searchQuery: searchQuery ?? this.searchQuery, ); } diff --git a/packages/talker/lib/src/models/talker_error.dart b/packages/talker/lib/src/models/talker_error.dart index 6b40e68f9..32a66864e 100644 --- a/packages/talker/lib/src/models/talker_error.dart +++ b/packages/talker/lib/src/models/talker_error.dart @@ -11,7 +11,7 @@ class TalkerError extends TalkerData { super.title, LogLevel? logLevel, }) : super(message, error: error) { - _key = key ?? TalkerLogType.error.key; + _key = key ?? TalkerKey.error; _logLevel = logLevel ?? LogLevel.error; } diff --git a/packages/talker/lib/src/models/talker_exception.dart b/packages/talker/lib/src/models/talker_exception.dart index fb6d50a64..29983f31d 100644 --- a/packages/talker/lib/src/models/talker_exception.dart +++ b/packages/talker/lib/src/models/talker_exception.dart @@ -11,7 +11,7 @@ class TalkerException extends TalkerData { super.title, LogLevel? logLevel, }) : super(message, exception: exception) { - _key = key ?? TalkerLogType.exception.key; + _key = key ?? TalkerKey.exception; _logLevel = logLevel ?? LogLevel.error; } diff --git a/packages/talker/lib/src/settings.dart b/packages/talker/lib/src/settings.dart index ab669f83c..3a4dbaa20 100644 --- a/packages/talker/lib/src/settings.dart +++ b/packages/talker/lib/src/settings.dart @@ -2,64 +2,64 @@ import 'package:talker/talker.dart'; final _defaultTitles = { /// Base logs section - TalkerLogType.critical.key: 'critical', - TalkerLogType.warning.key: 'warning', - TalkerLogType.verbose.key: 'verbose', - TalkerLogType.info.key: 'info', - TalkerLogType.debug.key: 'debug', - TalkerLogType.error.key: 'error', - TalkerLogType.exception.key: 'exception', + TalkerKey.critical: 'critical', + TalkerKey.warning: 'warning', + TalkerKey.verbose: 'verbose', + TalkerKey.info: 'info', + TalkerKey.debug: 'debug', + TalkerKey.error: 'error', + TalkerKey.exception: 'exception', /// Http section - TalkerLogType.httpError.key: 'http-error', - TalkerLogType.httpRequest.key: 'http-request', - TalkerLogType.httpResponse.key: 'http-response', + TalkerKey.httpError: 'http-error', + TalkerKey.httpRequest: 'http-request', + TalkerKey.httpResponse: 'http-response', /// Bloc section - TalkerLogType.blocEvent.key: 'bloc-event', - TalkerLogType.blocTransition.key: 'bloc-transition', - TalkerLogType.blocCreate.key: 'bloc-create', - TalkerLogType.blocClose.key: 'bloc-close', + TalkerKey.blocEvent: 'bloc-event', + TalkerKey.blocTransition: 'bloc-transition', + TalkerKey.blocCreate: 'bloc-create', + TalkerKey.blocClose: 'bloc-close', /// Riverpod section - TalkerLogType.riverpodAdd.key: 'riverpod-add', - TalkerLogType.riverpodUpdate.key: 'riverpod-update', - TalkerLogType.riverpodDispose.key: 'riverpod-dispose', - TalkerLogType.riverpodFail.key: 'riverpod-fail', + TalkerKey.riverpodAdd: 'riverpod-add', + TalkerKey.riverpodUpdate: 'riverpod-update', + TalkerKey.riverpodDispose: 'riverpod-dispose', + TalkerKey.riverpodFail: 'riverpod-fail', /// Flutter section - TalkerLogType.route.key: 'route', + TalkerKey.route: 'route', }; final _defaultColors = { /// Base logs section - TalkerLogType.critical.key: AnsiPen()..red(), - TalkerLogType.warning.key: AnsiPen()..yellow(), - TalkerLogType.verbose.key: AnsiPen()..gray(), - TalkerLogType.info.key: AnsiPen()..blue(), - TalkerLogType.debug.key: AnsiPen()..gray(), - TalkerLogType.error.key: AnsiPen()..red(), - TalkerLogType.exception.key: AnsiPen()..red(), + TalkerKey.critical: AnsiPen()..red(), + TalkerKey.warning: AnsiPen()..yellow(), + TalkerKey.verbose: AnsiPen()..gray(), + TalkerKey.info: AnsiPen()..blue(), + TalkerKey.debug: AnsiPen()..gray(), + TalkerKey.error: AnsiPen()..red(), + TalkerKey.exception: AnsiPen()..red(), /// Http section - TalkerLogType.httpError.key: AnsiPen()..red(), - TalkerLogType.httpRequest.key: AnsiPen()..xterm(219), - TalkerLogType.httpResponse.key: AnsiPen()..xterm(46), + TalkerKey.httpError: AnsiPen()..red(), + TalkerKey.httpRequest: AnsiPen()..xterm(219), + TalkerKey.httpResponse: AnsiPen()..xterm(46), /// Bloc section - TalkerLogType.blocEvent.key: AnsiPen()..xterm(51), - TalkerLogType.blocTransition.key: AnsiPen()..xterm(49), - TalkerLogType.blocCreate.key: AnsiPen()..xterm(35), - TalkerLogType.blocClose.key: AnsiPen()..xterm(198), + TalkerKey.blocEvent: AnsiPen()..xterm(51), + TalkerKey.blocTransition: AnsiPen()..xterm(49), + TalkerKey.blocCreate: AnsiPen()..xterm(35), + TalkerKey.blocClose: AnsiPen()..xterm(198), /// Riverpod section - TalkerLogType.riverpodAdd.key: AnsiPen()..xterm(51), - TalkerLogType.riverpodUpdate.key: AnsiPen()..xterm(49), - TalkerLogType.riverpodDispose.key: AnsiPen()..xterm(198), - TalkerLogType.riverpodFail.key: AnsiPen()..red(), + TalkerKey.riverpodAdd: AnsiPen()..xterm(51), + TalkerKey.riverpodUpdate: AnsiPen()..xterm(49), + TalkerKey.riverpodDispose: AnsiPen()..xterm(198), + TalkerKey.riverpodFail: AnsiPen()..red(), /// Flutter section - TalkerLogType.route.key: AnsiPen()..xterm(135), + TalkerKey.route: AnsiPen()..xterm(135), }; final _fallbackPen = AnsiPen()..gray(); @@ -130,9 +130,9 @@ class TalkerSettings { /// /// ```dart /// final customTitles = { - /// TalkerTitle.info.key: "Information", - /// TalkerTitle.error.key: "Error", - /// TalkerTitle.warning.key: "Warning", + /// TalkerKey.info: "Information", + /// TalkerKey.error: "Error", + /// TalkerKey.warning: "Warning", /// }; /// /// final logger = Talker( @@ -153,9 +153,9 @@ class TalkerSettings { /// /// ```dart /// final customColors = { - /// TalkerKey.info.key: AnsiPen()..white(bold: true), - /// TalkerKey.error.key: AnsiPen()..red(bold: true), - /// TalkerKey.warning.key: AnsiPen()..yellow(bold: true), + /// TalkerKey.info: AnsiPen()..white(bold: true), + /// TalkerKey.error: AnsiPen()..red(bold: true), + /// TalkerKey.warning: AnsiPen()..yellow(bold: true), /// }; /// /// final logger = Talker( @@ -168,14 +168,27 @@ class TalkerSettings { /// By using the `colors` field, you can customize the text colors for specific log keys in the console. final Map colors = _defaultColors; - String getTitleByLogKey(String key) { - return titles[key] ?? key; + /// A list of [TalkerKey]s that can be included in filter by [TalkerScreen] settings + /// This allows you to register custom keys that can be used for filtering logs in the Talker UI. + final List registeredKeys = []; + + /// Registers multiple custom keys for filtering logs in the Talker UI + void registerKeys(List keys) { + for (final key in keys) { + _registerKey(key); + } + } + + /// Registers a custom key for filtering logs in the Talker UI + void _registerKey(String key) { + if (!registeredKeys.contains(key)) { + registeredKeys.add(key); + } } - AnsiPen getAnsiPenByLogType(TalkerLogType type, {TalkerData? logData}) => - getPenByLogKey(type.key, fallbackPen: logData?.pen); + String getTitleByKey(String key) => titles[key] ?? key; - AnsiPen getPenByLogKey(String key, {AnsiPen? fallbackPen}) { + AnsiPen getPenByKey(String key, {AnsiPen? fallbackPen}) { return colors[key] ?? fallbackPen ?? _fallbackPen; } diff --git a/packages/talker/lib/src/talker.dart b/packages/talker/lib/src/talker.dart index aa97f9e8d..f9fe38780 100644 --- a/packages/talker/lib/src/talker.dart +++ b/packages/talker/lib/src/talker.dart @@ -66,13 +66,12 @@ class Talker { _logger = _logger.copyWith( settings: _logger.settings.copyWith( colors: { - LogLevel.critical: - settings.getAnsiPenByLogType(TalkerLogType.critical), - LogLevel.error: settings.getAnsiPenByLogType(TalkerLogType.error), - LogLevel.warning: settings.getAnsiPenByLogType(TalkerLogType.warning), - LogLevel.verbose: settings.getAnsiPenByLogType(TalkerLogType.verbose), - LogLevel.info: settings.getAnsiPenByLogType(TalkerLogType.info), - LogLevel.debug: settings.getAnsiPenByLogType(TalkerLogType.debug), + LogLevel.critical: settings.getPenByKey(TalkerKey.critical), + LogLevel.error: settings.getPenByKey(TalkerKey.error), + LogLevel.warning: settings.getPenByKey(TalkerKey.warning), + LogLevel.verbose: settings.getPenByKey(TalkerKey.verbose), + LogLevel.info: settings.getPenByKey(TalkerKey.info), + LogLevel.debug: settings.getPenByKey(TalkerKey.debug), }, ), ); @@ -153,6 +152,12 @@ class Talker { List get history => _history.history; + /// [TalkerFilter] [filter] - filter for selecting specific logs and errors + /// by their keys [TalkerData.key] and by string query [TalkerFilter.searchQuery] + /// You can set it in [configure] method + /// or change it later + TalkerFilter get filter => _filter; + /// Handle common exceptions in your code /// [Object] [exception] - exception /// [String?] [msg] - message describes what happened @@ -174,12 +179,10 @@ class Talker { ]) { final data = _errorHandler.handle(exception, stackTrace, msg?.toString()); if (data is TalkerError) { - _observer.onError(data); _handleErrorData(data); return; } if (data is TalkerException) { - _observer.onException(data); _handleErrorData(data); return; } @@ -370,11 +373,11 @@ class Talker { LogLevel logLevel, { AnsiPen? pen, }) { - final type = TalkerLogType.fromLogLevel(logLevel); - final penByLogKey = settings.getPenByLogKey(type.key); - final title = settings.getTitleByLogKey(type.key); + final key = TalkerKey.fromLogLevel(logLevel); + final penByLogKey = settings.getPenByKey(key); + final title = settings.getTitleByKey(key); final data = TalkerLog( - key: type.key, + key: key, message?.toString() ?? '', title: title, exception: exception, @@ -386,13 +389,16 @@ class Talker { } void _handleErrorData(TalkerData data) { - if (!settings.enabled) { - return; - } + // If the Talker is disabled by settings + if (!settings.enabled) return; + + // If the log is not approved by the filter final isApproved = _isApprovedByFilter(data); - if (!isApproved) { - return; - } + if (!isApproved) return; + + if (data is TalkerError) _observer.onError(data); + if (data is TalkerException) _observer.onException(data); + _talkerStreamController.add(data); _handleForOutputs(data); if (settings.useConsoleLogs) { @@ -408,19 +414,19 @@ class Talker { TalkerLog data, { LogLevel? logLevel, }) { - /// If the Talker is disabled by settings + // If the Talker is disabled by settings if (!settings.enabled) return; - /// If the log is not approved by the filter + // If the log is not approved by the filter final isApproved = _isApprovedByFilter(data); if (!isApproved) return; + // Log customization setup and configuration var pen = data.pen; - - final logTypeKey = data.key; - if (logTypeKey != null) { - data.title = settings.getTitleByLogKey(logTypeKey); - pen = settings.getPenByLogKey(logTypeKey, fallbackPen: data.pen); + final key = data.key; + if (key != null) { + data.title = settings.getTitleByKey(key); + pen = settings.getPenByKey(key, fallbackPen: data.pen); data.pen = pen; } diff --git a/packages/talker/lib/src/talker_key.dart b/packages/talker/lib/src/talker_key.dart index 96433836d..9f41e9e09 100644 --- a/packages/talker/lib/src/talker_key.dart +++ b/packages/talker/lib/src/talker_key.dart @@ -1,65 +1,48 @@ import 'package:talker/talker.dart'; -enum TalkerLogType { +/// TalkerKey - String key of log type (After 5.0.0) +/// TalkerLogType (Before 5.0.0) +abstract class TalkerKey { + TalkerKey._(); + /// Base logs section - error('error'), - critical('critical'), - info('info'), - debug('debug'), - verbose('verbose'), - warning('warning'), - exception('exception'), + static const error = 'error'; + static const critical = 'critical'; + static const info = 'info'; + static const debug = 'debug'; + static const verbose = 'verbose'; + static const warning = 'warning'; + static const exception = 'exception'; /// Http section - httpError('http-error'), - httpRequest('http-request'), - httpResponse('http-response'), + static const httpError = 'http-error'; + static const httpRequest = 'http-request'; + static const httpResponse = 'http-response'; /// Bloc section - blocEvent('bloc-event'), - blocTransition('bloc-transition'), - blocClose('bloc-close'), - blocCreate('bloc-create'), + static const blocEvent = 'bloc-event'; + static const blocTransition = 'bloc-transition'; + static const blocClose = 'bloc-close'; + static const blocCreate = 'bloc-create'; /// Riverpod section - riverpodAdd('riverpod-add'), - riverpodUpdate('riverpod-update'), - riverpodDispose('riverpod-dispose'), - riverpodFail('riverpod-fail'), + static const riverpodAdd = 'riverpod-add'; + static const riverpodUpdate = 'riverpod-update'; + static const riverpodDispose = 'riverpod-dispose'; + static const riverpodFail = 'riverpod-fail'; /// Flutter section - route('route'); - - const TalkerLogType(this.key); - final String key; - - static TalkerLogType fromLogLevel(LogLevel logLevel) { - return TalkerLogType.values.firstWhere((e) => e.logLevel == logLevel); - } - - static TalkerLogType? fromKey(String key) { - return TalkerLogType.values.firstWhereLogTypeOrNull((e) => e.key == key); - } -} - -extension TalkerLogTypeExt on TalkerLogType { - /// Mapping [TalkerLogType] into [LogLevel] - LogLevel get logLevel { - switch (this) { - case TalkerLogType.error: - return LogLevel.error; - case TalkerLogType.critical: - return LogLevel.critical; - case TalkerLogType.info: - return LogLevel.info; - case TalkerLogType.debug: - return LogLevel.debug; - case TalkerLogType.verbose: - return LogLevel.verbose; - case TalkerLogType.warning: - return LogLevel.warning; - default: - return LogLevel.debug; - } - } + static const route = 'route'; + + static String fromLogLevel(LogLevel logLevel) => + _logLevels[logLevel] ?? TalkerKey.debug; + + static const _logLevels = { + LogLevel.error: TalkerKey.error, + LogLevel.critical: TalkerKey.critical, + LogLevel.info: TalkerKey.info, + LogLevel.debug: TalkerKey.debug, + LogLevel.verbose: TalkerKey.verbose, + LogLevel.warning: TalkerKey.warning, + }; } diff --git a/packages/talker/lib/src/utils/error_handler.dart b/packages/talker/lib/src/utils/error_handler.dart index b73c7c760..7de8242e6 100644 --- a/packages/talker/lib/src/utils/error_handler.dart +++ b/packages/talker/lib/src/utils/error_handler.dart @@ -16,31 +16,34 @@ class TalkerErrorHandler { if (exception is TalkerException) { return exception; } + + final errKey = TalkerKey.error; + final exceptionKey = TalkerKey.exception; + if (exception is Error) { - final errType = TalkerLogType.error; return TalkerError( exception, - key: errType.key, - title: settings.getTitleByLogKey(errType.key), + key: errKey, + title: settings.getTitleByKey(errKey), message: msg, stackTrace: stackTrace, ); } + if (exception is Exception) { - final exceptionType = TalkerLogType.exception; return TalkerException( exception, - key: exceptionType.key, - title: settings.getTitleByLogKey(exceptionType.key), + key: exceptionKey, + title: settings.getTitleByKey(exceptionKey), message: msg, stackTrace: stackTrace, ); } - final errType = TalkerLogType.error; + return TalkerLog( exception.toString(), - key: errType.key, - title: settings.getTitleByLogKey(errType.key), + key: errKey, + title: settings.getTitleByKey(errKey), logLevel: LogLevel.error, stackTrace: stackTrace, ); diff --git a/packages/talker/pubspec.yaml b/packages/talker/pubspec.yaml index dc0bb740e..b9a706f56 100644 --- a/packages/talker/pubspec.yaml +++ b/packages/talker/pubspec.yaml @@ -1,6 +1,6 @@ name: talker description: Advanced error handler and logger package for flutter and dart. App monitoring, logs history, report sharing, custom logs, and etc. -version: 4.9.3 +version: 5.0.0-dev.8 homepage: https://github.com/Frezyx/talker repository: https://github.com/Frezyx/talker issue_tracker: https://github.com/Frezyx/talker/issues @@ -16,7 +16,7 @@ environment: sdk: ">=2.17.0 <4.0.0" dependencies: - talker_logger: ^4.9.3 + talker_logger: ^5.0.0-dev.8 dev_dependencies: lints: ^2.0.0 diff --git a/packages/talker/test/filter_test.dart b/packages/talker/test/filter_test.dart index 6065114f0..159c1de98 100644 --- a/packages/talker/test/filter_test.dart +++ b/packages/talker/test/filter_test.dart @@ -3,30 +3,11 @@ import 'package:test/test.dart'; void main() { group('TalkerFilter', () { - _testFilterByTitles(useTalkerFilter: false); - _testFilterByTitles(useTalkerFilter: true); - - _testFilterByTypes(useTalkerFilter: false); - _testFilterByTypes(useTalkerFilter: true); + _testFilterByKeys(useTalkerFilter: false); + _testFilterByKeys(useTalkerFilter: true); _testFilterBySearchText(useTalkerFilter: false); _testFilterBySearchText(useTalkerFilter: true); - - test('copyWith', () { - final filter = BaseTalkerFilter( - titles: ['Error'], - types: [Exception], - ); - final newFilter = filter.copyWith(titles: ['LOG']); - expect(filter == newFilter, false); - expect(filter.titles == newFilter.titles, false); - expect(filter.titles.first == newFilter.titles.first, false); - - final typesChangesFilter = filter.copyWith(types: [Error]); - expect(filter == typesChangesFilter, false); - expect(filter.types == typesChangesFilter.types, false); - expect(filter.types.first == typesChangesFilter.types.first, false); - }); }); } @@ -50,49 +31,24 @@ void _testFilterBySearchText({ }); } -void _testFilterByTypes({ - required bool useTalkerFilter, -}) { - group('By type', () { - _testFilterFoundByType( - useTalkerFilter: useTalkerFilter, - types: [TalkerLog], - countFound: 1, - logCallback: (talker) { - talker.error('Test log'); - }, - ); - _testFilterFoundByType( - useTalkerFilter: useTalkerFilter, - types: [TalkerError], - countFound: 2, - logCallback: (talker) { - talker.info('Test log'); - talker.handle(ArgumentError()); - talker.handle(ArgumentError()); - }, - ); - }); -} - -void _testFilterByTitles({ +void _testFilterByKeys({ required bool useTalkerFilter, }) { return group( 'By title', () { - _testFilterFoundByTitle( + _testFilterFoundByKey( useTalkerFilter: useTalkerFilter, - titles: ['error'], + keys: ['error'], countFound: 1, logCallback: (talker) { talker.error('Test log'); }, ); - _testFilterFoundByTitle( + _testFilterFoundByKey( useTalkerFilter: useTalkerFilter, - titles: ['error', 'exception'], + keys: ['error', 'exception'], countFound: 2, logCallback: (talker) { talker.error('Test log'); @@ -100,9 +56,9 @@ void _testFilterByTitles({ }, ); - _testFilterFoundByTitle( + _testFilterFoundByKey( useTalkerFilter: useTalkerFilter, - titles: ['error', 'verbose'], + keys: ['error', 'verbose'], countFound: 2, logCallback: (talker) { talker.error('Test log'); @@ -111,9 +67,9 @@ void _testFilterByTitles({ }, ); - _testFilterFoundByTitle( + _testFilterFoundByKey( useTalkerFilter: useTalkerFilter, - titles: ['verbose'], + keys: ['verbose'], countFound: 5, logCallback: (talker) { talker.verbose('Test log'); @@ -137,8 +93,7 @@ void _testFilterFoundBySearchText({ required int countFound, required bool useTalkerFilter, }) { - final filter = - BaseTalkerFilter(types: [], titles: [], searchQuery: searchQuery); + final filter = TalkerFilter(enabledKeys: [], searchQuery: searchQuery); final talker = useTalkerFilter ? Talker(filter: filter) : Talker(); @@ -154,37 +109,16 @@ void _testFilterFoundBySearchText({ }); } -void _testFilterFoundByType({ - required List types, - required Function(Talker talker) logCallback, - required int countFound, - required bool useTalkerFilter, -}) { - final filter = BaseTalkerFilter(types: types); - final talker = useTalkerFilter ? Talker(filter: filter) : Talker(); - - test( - 'Found $countFound ${useTalkerFilter ? 'By Talker' : 'By Filter'} in ${types.join(',')}', - () { - logCallback.call(talker); - final foundRecords = useTalkerFilter - ? talker.history - : talker.history.where((e) => filter.filter(e)).toList(); - expect(foundRecords, isNotEmpty); - expect(foundRecords.length, countFound); - }); -} - -void _testFilterFoundByTitle( - {required List titles, +void _testFilterFoundByKey( + {required List keys, required Function(Talker) logCallback, required int countFound, required bool useTalkerFilter}) { - final filter = BaseTalkerFilter(titles: titles); + final filter = TalkerFilter(enabledKeys: keys); final talker = useTalkerFilter ? Talker(filter: filter) : Talker(); test( - 'Found $countFound ${useTalkerFilter ? 'By Talker' : 'By Filter'} in ${titles.join(',')}', + 'Found $countFound ${useTalkerFilter ? 'By Talker' : 'By Filter'} in ${keys.join(',')}', () { logCallback.call(talker); @@ -195,4 +129,62 @@ void _testFilterFoundByTitle( expect(foundRecords, isNotEmpty); expect(foundRecords.length, countFound); }); + + group('BaseTalkerFilter - keys filtering', () { + final matchingKey = 'test_key'; + final nonMatchingKey = 'other_key'; + + TalkerData createData(String key, String msg) { + return TalkerLog(msg, key: key); + } + + test('should allow item with matching key', () { + final filter = TalkerFilter(enabledKeys: [matchingKey]); + + final item = createData(matchingKey, 'Log message'); + + expect(filter.filter(item), isTrue); + }); + + test('should reject item with non-matching key', () { + final filter = TalkerFilter(enabledKeys: [matchingKey]); + + final item = createData(nonMatchingKey, 'Another log'); + + expect(filter.filter(item), isFalse); + }); + + test('should allow item with matching key and matching search query', () { + final filter = TalkerFilter( + enabledKeys: [matchingKey], + searchQuery: 'important', + ); + + final item = createData(matchingKey, 'Important log happened'); + + expect(filter.filter(item), isTrue); + }); + + test('should reject item with matching key but not matching search query', + () { + final filter = TalkerFilter( + enabledKeys: [matchingKey], + searchQuery: 'missing', + ); + + final item = createData(matchingKey, 'Some other log'); + + expect(filter.filter(item), isFalse); + }); + + test('should ignore key filtering if keys list is empty', () { + final filter = TalkerFilter(enabledKeys: []); + + final item = createData(nonMatchingKey, 'Anything goes'); + + // Falls back to deprecated _oldFilterLogic, which might return true or false depending on other fields. + // But since all deprecated fields are empty here, the logic returns true. + expect(filter.filter(item), isTrue); + }); + }); } diff --git a/packages/talker/test/talker_key.dart b/packages/talker/test/talker_key.dart index d2a9ac991..d195c6749 100644 --- a/packages/talker/test/talker_key.dart +++ b/packages/talker/test/talker_key.dart @@ -4,99 +4,33 @@ import 'package:test/test.dart'; void main() { group('TalkerKey', () { test('returns correct key for each enum value', () { - expect(TalkerLogType.error.key, equals('error')); - expect(TalkerLogType.critical.key, equals('critical')); - expect(TalkerLogType.info.key, equals('info')); - expect(TalkerLogType.debug.key, equals('debug')); - expect(TalkerLogType.verbose.key, equals('verbose')); - expect(TalkerLogType.warning.key, equals('warning')); - expect(TalkerLogType.exception.key, equals('exception')); - expect(TalkerLogType.httpError.key, equals('http-error')); - expect(TalkerLogType.httpRequest.key, equals('http-request')); - expect(TalkerLogType.httpResponse.key, equals('http-response')); - expect(TalkerLogType.blocEvent.key, equals('bloc-event')); - expect(TalkerLogType.blocTransition.key, equals('bloc-transition')); - expect(TalkerLogType.blocClose.key, equals('bloc-close')); - expect(TalkerLogType.blocCreate.key, equals('bloc-create')); - expect(TalkerLogType.route.key, equals('route')); + expect(TalkerKey.error, equals('error')); + expect(TalkerKey.critical, equals('critical')); + expect(TalkerKey.info, equals('info')); + expect(TalkerKey.debug, equals('debug')); + expect(TalkerKey.verbose, equals('verbose')); + expect(TalkerKey.warning, equals('warning')); + expect(TalkerKey.exception, equals('exception')); + expect(TalkerKey.httpError, equals('http-error')); + expect(TalkerKey.httpRequest, equals('http-request')); + expect(TalkerKey.httpResponse, equals('http-response')); + expect(TalkerKey.blocEvent, equals('bloc-event')); + expect(TalkerKey.blocTransition, equals('bloc-transition')); + expect(TalkerKey.blocClose, equals('bloc-close')); + expect(TalkerKey.blocCreate, equals('bloc-create')); + expect(TalkerKey.route, equals('route')); }); test('fromLogLevel returns correct TalkerLogType', () { - expect(TalkerLogType.fromLogLevel(LogLevel.error), - equals(TalkerLogType.error)); - expect(TalkerLogType.fromLogLevel(LogLevel.critical), - equals(TalkerLogType.critical)); - expect(TalkerLogType.fromLogLevel(LogLevel.info), - equals(TalkerLogType.info)); - expect(TalkerLogType.fromLogLevel(LogLevel.debug), - equals(TalkerLogType.debug)); - expect(TalkerLogType.fromLogLevel(LogLevel.verbose), - equals(TalkerLogType.verbose)); - expect(TalkerLogType.fromLogLevel(LogLevel.warning), - equals(TalkerLogType.warning)); - }); - - test('fromKey returns correct TalkerLogType', () { - expect( - TalkerLogType.fromKey('error'), - equals(TalkerLogType.error), - ); - expect( - TalkerLogType.fromKey('critical'), - equals(TalkerLogType.critical), - ); - expect( - TalkerLogType.fromKey('info'), - equals(TalkerLogType.info), - ); - expect( - TalkerLogType.fromKey('debug'), - equals(TalkerLogType.debug), - ); - expect( - TalkerLogType.fromKey('verbose'), - equals(TalkerLogType.verbose), - ); - expect( - TalkerLogType.fromKey('warning'), - equals(TalkerLogType.warning), - ); - expect( - TalkerLogType.fromKey('exception'), - equals(TalkerLogType.exception), - ); - expect( - TalkerLogType.fromKey('http-error'), - equals(TalkerLogType.httpError), - ); - expect( - TalkerLogType.fromKey('http-request'), - equals(TalkerLogType.httpRequest), - ); - expect( - TalkerLogType.fromKey('http-response'), - equals(TalkerLogType.httpResponse), - ); - expect( - TalkerLogType.fromKey('bloc-event'), - equals(TalkerLogType.blocEvent), - ); - expect( - TalkerLogType.fromKey('bloc-transition'), - equals(TalkerLogType.blocTransition), - ); - expect( - TalkerLogType.fromKey('bloc-close'), - equals(TalkerLogType.blocClose), - ); + expect(TalkerKey.fromLogLevel(LogLevel.error), equals(TalkerKey.error)); + expect(TalkerKey.fromLogLevel(LogLevel.critical), + equals(TalkerKey.critical)); + expect(TalkerKey.fromLogLevel(LogLevel.info), equals(TalkerKey.info)); + expect(TalkerKey.fromLogLevel(LogLevel.debug), equals(TalkerKey.debug)); expect( - TalkerLogType.fromKey('bloc-create'), - equals(TalkerLogType.blocCreate), - ); + TalkerKey.fromLogLevel(LogLevel.verbose), equals(TalkerKey.verbose)); expect( - TalkerLogType.fromKey('route'), - equals(TalkerLogType.route), - ); + TalkerKey.fromLogLevel(LogLevel.warning), equals(TalkerKey.warning)); }); }); } diff --git a/packages/talker/test/talker_settings_test.dart b/packages/talker/test/talker_settings_test.dart index 8b16d5546..80bf714b4 100644 --- a/packages/talker/test/talker_settings_test.dart +++ b/packages/talker/test/talker_settings_test.dart @@ -58,17 +58,17 @@ void main() { final settings = TalkerSettings( useConsoleLogs: false, colors: { - YourCustomLog.logKey: pen, + YourCustomKey.logKey: pen, }, ); final talker = Talker(settings: settings); - final customLog = YourCustomLog('Custom log message'); + final customLog = YourCustomKey('Custom log message'); talker.logCustom(customLog); expect( - settings.colors[YourCustomLog.logKey], + settings.colors[YourCustomKey.logKey], pen, ); }); @@ -77,17 +77,17 @@ void main() { final settings = TalkerSettings( useConsoleLogs: false, titles: { - YourCustomLog.logKey: 'Custom title', + YourCustomKey.logKey: 'Custom title', }, ); final talker = Talker(settings: settings); - final customLog = YourCustomLog('Custom log message'); + final customLog = YourCustomKey('Custom log message'); talker.logCustom(customLog); expect( - settings.titles[YourCustomLog.logKey], + settings.titles[YourCustomKey.logKey], 'Custom title', ); }); diff --git a/packages/talker_bloc_logger/CHANGELOG.md b/packages/talker_bloc_logger/CHANGELOG.md index 0431e8f26..a00fe994d 100644 --- a/packages/talker_bloc_logger/CHANGELOG.md +++ b/packages/talker_bloc_logger/CHANGELOG.md @@ -1,3 +1,50 @@ +# 5.0.0-dev.8 +- - [talker] Sync release and prerelease versions + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.7 +- - [talker_dio_logger] Fix ``FormData``s ``contentType`` field + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.6 +- - [talker_dio_logger] Add ``FormData`` parser for request logs data + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.5 +- [talker] Add ``registeredKeys`` field into ``TalkerSettings`` for third-party packages +- [talker] Remove deprecated ``titles`` and ``types`` from ``TalkerFilter`` +- [talker] Add ``enabledKeys`` and ``disabledKeys`` fields into ``TalkerFilter`` to replace old filtering logic +- [talker_flutter] Add ``TalkerFilter`` configuration on ``TalkerScreen`` +- [talker_dio_logger] Add ``TalkerKey``s registration +- [talker_http_logger] Add ``TalkerKey``s registration +- [talker_bloc_logger] Add ``TalkerKey``s registration +- [talker_riverpod_logger] Add ``TalkerKey``s registration + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.4 +- [talker_dio_logger] Remove unused addonId field from dio_logger + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.3 +- [talker] Upgrade **BaseTalkerFilter** class - add new filtering way by **List keys** field +- [talker] Deprecate **titles** and **types** fields from **BaseTalkerFilter** + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.2 +- [talker] Fix errors and exceptions filtering for observer + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.1 +- [talker] Brand new simplified TalkerKeys API (String Log key) + +Thanks to [Frezyx](https://github.com/Frezyx) # 4.9.3 - [talker] chore(deps): update dependency gradle to v8.14.3 [talker] chore(deps): update plugin com.android.application to v8.11.1 diff --git a/packages/talker_bloc_logger/README.md b/packages/talker_bloc_logger/README.md index c854cb8f6..304ffe610 100644 --- a/packages/talker_bloc_logger/README.md +++ b/packages/talker_bloc_logger/README.md @@ -31,7 +31,7 @@ Follow these steps to use this package ### Add dependency ```yaml dependencies: - talker_bloc_logger: ^4.9.3 + talker_bloc_logger: ^5.0.0-dev.8 ``` ### Usage diff --git a/packages/talker_bloc_logger/lib/bloc_logs.dart b/packages/talker_bloc_logger/lib/bloc_logs.dart index 785b2ba26..6438f58ce 100644 --- a/packages/talker_bloc_logger/lib/bloc_logs.dart +++ b/packages/talker_bloc_logger/lib/bloc_logs.dart @@ -17,7 +17,7 @@ class BlocEventLog extends TalkerLog { final TalkerBlocLoggerSettings settings; @override - String get key => TalkerLogType.blocEvent.key; + String get key => TalkerKey.blocEvent; @override String generateTextMessage({ @@ -45,7 +45,7 @@ class BlocStateLog extends TalkerLog { final TalkerBlocLoggerSettings settings; @override - String get key => TalkerLogType.blocTransition.key; + String get key => TalkerKey.blocTransition; @override String generateTextMessage({ @@ -73,7 +73,7 @@ class BlocChangeLog extends TalkerLog { final TalkerBlocLoggerSettings settings; @override - String get key => TalkerLogType.blocTransition.key; + String get key => TalkerKey.blocTransition; @override String generateTextMessage({ @@ -113,7 +113,7 @@ class BlocCreateLog extends TalkerLog { final BlocBase bloc; @override - String? get key => TalkerLogType.blocCreate.key; + String? get key => TalkerKey.blocCreate; @override String generateTextMessage({ @@ -135,7 +135,7 @@ class BlocCloseLog extends TalkerLog { final BlocBase bloc; @override - String? get key => TalkerLogType.blocClose.key; + String? get key => TalkerKey.blocClose; @override String generateTextMessage({ diff --git a/packages/talker_bloc_logger/lib/talker_bloc_logger_observer.dart b/packages/talker_bloc_logger/lib/talker_bloc_logger_observer.dart index e9f8bafcf..ff13a12e7 100644 --- a/packages/talker_bloc_logger/lib/talker_bloc_logger_observer.dart +++ b/packages/talker_bloc_logger/lib/talker_bloc_logger_observer.dart @@ -14,6 +14,14 @@ class TalkerBlocObserver extends BlocObserver { this.settings = const TalkerBlocLoggerSettings(), }) { _talker = talker ?? Talker(); + _talker.settings.registerKeys( + [ + TalkerKey.blocEvent, + TalkerKey.blocTransition, + TalkerKey.blocCreate, + TalkerKey.blocClose, + ], + ); } late Talker _talker; diff --git a/packages/talker_bloc_logger/pubspec.yaml b/packages/talker_bloc_logger/pubspec.yaml index 0b52bacd3..aa157c77e 100644 --- a/packages/talker_bloc_logger/pubspec.yaml +++ b/packages/talker_bloc_logger/pubspec.yaml @@ -1,6 +1,6 @@ name: talker_bloc_logger description: Lightweight and customizable BLoC state management library logger on talker base. -version: 4.9.3 +version: 5.0.0-dev.8 homepage: https://github.com/Frezyx/talker repository: https://github.com/Frezyx/talker issue_tracker: https://github.com/Frezyx/talker/issues @@ -16,7 +16,7 @@ environment: sdk: '>=2.15.0 <4.0.0' dependencies: - talker: ^4.9.3 + talker: ^5.0.0-dev.8 bloc: ^9.0.0 meta: ^1.8.0 diff --git a/packages/talker_bloc_logger/test/logs_test.dart b/packages/talker_bloc_logger/test/logs_test.dart index 7602ba568..6bb6185dd 100644 --- a/packages/talker_bloc_logger/test/logs_test.dart +++ b/packages/talker_bloc_logger/test/logs_test.dart @@ -30,7 +30,7 @@ void main() { expect(log.bloc, fakeBloc); expect(log.event, fakeEvent); expect(log.settings, fakeSettings); - expect(log.key, TalkerLogType.blocEvent.key); + expect(log.key, TalkerKey.blocEvent); }); }); @@ -50,7 +50,7 @@ void main() { expect(log.bloc, fakeBloc); expect(log.transition, fakeTransition); expect(log.settings, fakeSettings); - expect(log.key, TalkerLogType.blocTransition.key); + expect(log.key, TalkerKey.blocTransition); }); }); @@ -69,7 +69,7 @@ void main() { expect(log.bloc, fakeBloc); expect(log.change, fakeChange); expect(log.settings, fakeSettings); - expect(log.key, TalkerLogType.blocTransition.key); + expect(log.key, TalkerKey.blocTransition); final message = log.generateTextMessage(); expect(message, isA()); @@ -85,7 +85,7 @@ void main() { final log = BlocCreateLog(bloc: fakeBloc); expect(log.bloc, fakeBloc); - expect(log.key, TalkerLogType.blocCreate.key); + expect(log.key, TalkerKey.blocCreate); final message = log.generateTextMessage(); expect(message, isA()); @@ -101,7 +101,7 @@ void main() { final log = BlocCloseLog(bloc: fakeBloc); expect(log.bloc, fakeBloc); - expect(log.key, TalkerLogType.blocClose.key); + expect(log.key, TalkerKey.blocClose); final message = log.generateTextMessage(); expect(message, isA()); diff --git a/packages/talker_dio_logger/CHANGELOG.md b/packages/talker_dio_logger/CHANGELOG.md index ed07d7ce7..24a4028a4 100644 --- a/packages/talker_dio_logger/CHANGELOG.md +++ b/packages/talker_dio_logger/CHANGELOG.md @@ -1,3 +1,50 @@ +# 5.0.0-dev.8 +- - [talker] Sync release and prerelease versions + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.7 +- - [talker_dio_logger] Fix ``FormData``s ``contentType`` field + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.6 +- - [talker_dio_logger] Add ``FormData`` parser for request logs data + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.5 +- [talker] Add ``registeredKeys`` field into ``TalkerSettings`` for third-party packages +- [talker] Remove deprecated ``titles`` and ``types`` from ``TalkerFilter`` +- [talker] Add ``enabledKeys`` and ``disabledKeys`` fields into ``TalkerFilter`` to replace old filtering logic +- [talker_flutter] Add ``TalkerFilter`` configuration on ``TalkerScreen`` +- [talker_dio_logger] Add ``TalkerKey``s registration +- [talker_http_logger] Add ``TalkerKey``s registration +- [talker_bloc_logger] Add ``TalkerKey``s registration +- [talker_riverpod_logger] Add ``TalkerKey``s registration + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.4 +- [talker_dio_logger] Remove unused addonId field from dio_logger + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.3 +- [talker] Upgrade **BaseTalkerFilter** class - add new filtering way by **List keys** field +- [talker] Deprecate **titles** and **types** fields from **BaseTalkerFilter** + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.2 +- [talker] Fix errors and exceptions filtering for observer + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.1 +- [talker] Brand new simplified TalkerKeys API (String Log key) + +Thanks to [Frezyx](https://github.com/Frezyx) # 4.9.3 - [talker] chore(deps): update dependency gradle to v8.14.3 [talker] chore(deps): update plugin com.android.application to v8.11.1 diff --git a/packages/talker_dio_logger/README.md b/packages/talker_dio_logger/README.md index a6c786d73..ccc720bd3 100644 --- a/packages/talker_dio_logger/README.md +++ b/packages/talker_dio_logger/README.md @@ -31,7 +31,7 @@ Follow these steps to use this package ### Add dependency ```yaml dependencies: - talker_dio_logger: ^4.9.3 + talker_dio_logger: ^5.0.0-dev.8 ``` ### Usage diff --git a/packages/talker_dio_logger/example/pubspec.yaml b/packages/talker_dio_logger/example/pubspec.yaml index f140201fc..1b058879e 100644 --- a/packages/talker_dio_logger/example/pubspec.yaml +++ b/packages/talker_dio_logger/example/pubspec.yaml @@ -10,8 +10,8 @@ dependencies: flutter: sdk: flutter dio: ^5.0.0 - talker_dio_logger: ^4.9.3 - talker_flutter: ^4.9.3 + talker_dio_logger: ^5.0.0-dev.8 + talker_flutter: ^5.0.0-dev.8 dev_dependencies: flutter_test: diff --git a/packages/talker_dio_logger/lib/dio_logs.dart b/packages/talker_dio_logger/lib/dio_logs.dart index de73c4595..c831c1afd 100644 --- a/packages/talker_dio_logger/lib/dio_logs.dart +++ b/packages/talker_dio_logger/lib/dio_logs.dart @@ -21,7 +21,7 @@ class DioRequestLog extends TalkerLog { AnsiPen get pen => settings.requestPen ?? (AnsiPen()..xterm(219)); @override - String get key => TalkerLogType.httpRequest.key; + String get key => TalkerKey.httpRequest; @override LogLevel get logLevel => settings.logLevel; @@ -37,8 +37,25 @@ class DioRequestLog extends TalkerLog { try { if (settings.printRequestData && data != null) { - final prettyData = _encoder.convert(data); - msg += '\nData: $prettyData'; + // If data is FormData, convert it to a map for better readability + if (data is FormData) { + final formDataMap = {}; + for (var field in data.fields) { + formDataMap[field.key] = field.value; + } + for (var file in data.files) { + formDataMap[file.key] = { + 'filename': file.value.filename, + 'contentType': file.value.contentType.toString(), + 'bytes': file.value.length, + }; + } + + msg += '\nData: ${_encoder.convert(formDataMap)}'; + } else { + final prettyData = _encoder.convert(data); + msg += '\nData: $prettyData'; + } } if (settings.printRequestHeaders && headers.isNotEmpty) { @@ -91,7 +108,7 @@ class DioResponseLog extends TalkerLog { AnsiPen get pen => settings.responsePen ?? (AnsiPen()..xterm(46)); @override - String get key => TalkerLogType.httpResponse.key; + String get key => TalkerKey.httpResponse; @override LogLevel get logLevel => settings.logLevel; @@ -159,7 +176,7 @@ class DioErrorLog extends TalkerLog { AnsiPen get pen => settings.errorPen ?? (AnsiPen()..red()); @override - String get key => TalkerLogType.httpError.key; + String get key => TalkerKey.httpError; @override LogLevel get logLevel => LogLevel.error; diff --git a/packages/talker_dio_logger/lib/talker_dio_logger_interceptor.dart b/packages/talker_dio_logger/lib/talker_dio_logger_interceptor.dart index 5568fcfbb..f7e1e554d 100644 --- a/packages/talker_dio_logger/lib/talker_dio_logger_interceptor.dart +++ b/packages/talker_dio_logger/lib/talker_dio_logger_interceptor.dart @@ -12,9 +12,15 @@ class TalkerDioLogger extends Interceptor { TalkerDioLogger({ Talker? talker, this.settings = const TalkerDioLoggerSettings(), - this.addonId, }) { _talker = talker ?? Talker(); + _talker.settings.registerKeys( + [ + TalkerKey.httpRequest, + TalkerKey.httpResponse, + TalkerKey.httpError, + ], + ); } static const kDioLogsTimeStampKey = '_talker_dio_logger_ts_'; @@ -24,11 +30,10 @@ class TalkerDioLogger extends Interceptor { /// [TalkerDioLogger] settings and customization TalkerDioLoggerSettings settings; - /// Talker addon functionality - /// addon id for create a lot of addons - final String? addonId; - /// Method to update [settings] of [TalkerDioLogger] + @Deprecated( + 'Will be removed in 5.0.0 version. Setup settings in constructor', + ) void configure({ bool? printResponseData, bool? printResponseHeaders, diff --git a/packages/talker_dio_logger/pubspec.yaml b/packages/talker_dio_logger/pubspec.yaml index 06d450ac1..040a5cb1e 100644 --- a/packages/talker_dio_logger/pubspec.yaml +++ b/packages/talker_dio_logger/pubspec.yaml @@ -1,6 +1,6 @@ name: talker_dio_logger description: Lightweight and customizable dio http client logger on talker base -version: 4.9.3 +version: 5.0.0-dev.8 homepage: https://github.com/Frezyx/talker repository: https://github.com/Frezyx/talker @@ -18,7 +18,7 @@ environment: dependencies: dio: ^5.4.0 - talker: ^4.9.3 + talker: ^5.0.0-dev.8 dev_dependencies: lints: ^2.0.0 diff --git a/packages/talker_flutter/CHANGELOG.md b/packages/talker_flutter/CHANGELOG.md index cc6aac24f..b662bdc54 100644 --- a/packages/talker_flutter/CHANGELOG.md +++ b/packages/talker_flutter/CHANGELOG.md @@ -1,3 +1,50 @@ +# 5.0.0-dev.8 +- - [talker] Sync release and prerelease versions + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.7 +- - [talker_dio_logger] Fix ``FormData``s ``contentType`` field + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.6 +- - [talker_dio_logger] Add ``FormData`` parser for request logs data + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.5 +- [talker] Add ``registeredKeys`` field into ``TalkerSettings`` for third-party packages +- [talker] Remove deprecated ``titles`` and ``types`` from ``TalkerFilter`` +- [talker] Add ``enabledKeys`` and ``disabledKeys`` fields into ``TalkerFilter`` to replace old filtering logic +- [talker_flutter] Add ``TalkerFilter`` configuration on ``TalkerScreen`` +- [talker_dio_logger] Add ``TalkerKey``s registration +- [talker_http_logger] Add ``TalkerKey``s registration +- [talker_bloc_logger] Add ``TalkerKey``s registration +- [talker_riverpod_logger] Add ``TalkerKey``s registration + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.4 +- [talker_dio_logger] Remove unused addonId field from dio_logger + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.3 +- [talker] Upgrade **BaseTalkerFilter** class - add new filtering way by **List keys** field +- [talker] Deprecate **titles** and **types** fields from **BaseTalkerFilter** + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.2 +- [talker] Fix errors and exceptions filtering for observer + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.1 +- [talker] Brand new simplified TalkerKeys API (String Log key) + +Thanks to [Frezyx](https://github.com/Frezyx) # 4.9.3 - [talker] chore(deps): update dependency gradle to v8.14.3 [talker] chore(deps): update plugin com.android.application to v8.11.1 @@ -423,8 +470,8 @@ Thanks to [Kabak-Siarhei](https://github.com/Kabak-Siarhei) # 3.5.0 - Update internal packages versions -- - Bump share_plus package to 8.0.0 -- - Bump path_provider package to 2.1.1 +-Bump share_plus package to 8.0.0 +-Bump path_provider package to 2.1.1 # 3.4.0 - Bump share_plus package to 7.1.0 @@ -559,7 +606,7 @@ Thanks to [zezo357](https://github.com/zezo357) # 3.0.0-dev.9 -- Update TalkerFlutter extension (Remove deprecated fileds) +- Update TalkerFlutter extension (Remove deprecated fields) - Update talker version to 3.0.0-dev.10 # 3.0.0-dev.8 @@ -706,7 +753,7 @@ Now you can extend your flutter app logs. ## 1.6.0 - **FIX**: Logs cutting by flutter via print method. -Now Talker constructor have output filed to provide callback. +Now Talker constructor have output field to provide callback. For flutter applications, you need to pass debugPrint as output method See more in talker_flutter initialization on project README.md - **INFO**: Update talker to 1.3.0 version diff --git a/packages/talker_flutter/lib/src/controller/talker_view_controller.dart b/packages/talker_flutter/lib/src/controller/talker_view_controller.dart index 30953e501..9b43f686e 100644 --- a/packages/talker_flutter/lib/src/controller/talker_view_controller.dart +++ b/packages/talker_flutter/lib/src/controller/talker_view_controller.dart @@ -4,20 +4,25 @@ import 'package:talker_flutter/talker_flutter.dart'; /// Controller to work with [TalkerScreen] class TalkerViewController extends ChangeNotifier { - TalkerViewController({bool expandedLogs = true, isLogOrderReversed = true}) { - _expandedLogs = expandedLogs; - _isLogOrderReversed = isLogOrderReversed; - } + TalkerViewController({ + required Talker talker, + bool expandedLogs = true, + isLogOrderReversed = true, + }) : _expandedLogs = expandedLogs, + _isLogOrderReversed = isLogOrderReversed; - BaseTalkerFilter _filter = BaseTalkerFilter(); + /// Filter for selecting specific logs and errors on [TalkerScreen] and [TalkerView] + /// by their keys [TalkerData.key] and by string query [TalkerFilter.searchQuery] + /// Works only on screen (don't affect [Talker.filter]) + TalkerFilter _uiFilter = TalkerFilter(); - late bool _expandedLogs; - late bool _isLogOrderReversed; + bool _expandedLogs; + bool _isLogOrderReversed; /// Filter for selecting specific logs and errors - BaseTalkerFilter get filter => _filter; - set filter(BaseTalkerFilter val) { - _filter = val; + TalkerFilter get filter => _uiFilter; + set filter(TalkerFilter val) { + _uiFilter = val; notifyListeners(); } @@ -38,33 +43,23 @@ class TalkerViewController extends ChangeNotifier { /// Method for updating a search query based on errors and logs void updateFilterSearchQuery(String query) { - _filter = _filter.copyWith(searchQuery: query); - notifyListeners(); - } - - /// Method adds an type to the filter - void addFilterType(Type type) { - _filter = _filter.copyWith(types: [..._filter.types, type]); - notifyListeners(); - } - - /// Method removes an type from the filter - void removeFilterType(Type type) { - _filter = - _filter.copyWith(types: _filter.types.where((t) => t != type).toList()); + _uiFilter = _uiFilter.copyWith(searchQuery: query); notifyListeners(); } - /// Method adds an title to the filter - void addFilterTitle(String title) { - _filter = _filter.copyWith(titles: [..._filter.titles, title]); + /// Method adds an key to the filter + void addFilterKey(String key) { + _uiFilter = _uiFilter.copyWith( + enabledKeys: [..._uiFilter.enabledKeys, key], + ); notifyListeners(); } - /// Method removes an title from the filter - void removeFilterTitle(String title) { - _filter = _filter.copyWith( - titles: _filter.titles.where((t) => t != title).toList()); + /// Method removes an key from the filter + void removeFilterKey(String key) { + _uiFilter = _uiFilter.copyWith( + enabledKeys: _uiFilter.enabledKeys.where((t) => t != key).toList(), + ); notifyListeners(); } diff --git a/packages/talker_flutter/lib/src/extensions/talker_data.dart b/packages/talker_flutter/lib/src/extensions/talker_data.dart index a6dbf9826..854b1f755 100644 --- a/packages/talker_flutter/lib/src/extensions/talker_data.dart +++ b/packages/talker_flutter/lib/src/extensions/talker_data.dart @@ -15,8 +15,8 @@ extension TalkerDataFlutterExt on TalkerData { Color? _getColorByLogLevel(TalkerScreenTheme theme) { final logLevel = this.logLevel; if (logLevel != null) { - final type = TalkerLogType.fromLogLevel(logLevel); - return theme.logColors[type.key] ?? Colors.grey; + final key = TalkerKey.fromLogLevel(logLevel); + return theme.logColors[key] ?? Colors.grey; } return null; } diff --git a/packages/talker_flutter/lib/src/observers/router_observer.dart b/packages/talker_flutter/lib/src/observers/router_observer.dart index 4494343e0..9e8e6865e 100644 --- a/packages/talker_flutter/lib/src/observers/router_observer.dart +++ b/packages/talker_flutter/lib/src/observers/router_observer.dart @@ -37,7 +37,7 @@ class TalkerRouteLog extends TalkerLog { AnsiPen get pen => AnsiPen()..xterm(135); @override - String get key => TalkerLogType.route.key; + String get key => TalkerKey.route; static String _createMessage( Route route, diff --git a/packages/talker_flutter/lib/src/ui/talker_monitor/talker_monitor.dart b/packages/talker_flutter/lib/src/ui/talker_monitor/talker_monitor.dart index 58df43928..7e81cd0a4 100644 --- a/packages/talker_flutter/lib/src/ui/talker_monitor/talker_monitor.dart +++ b/packages/talker_flutter/lib/src/ui/talker_monitor/talker_monitor.dart @@ -42,14 +42,12 @@ class TalkerMonitor extends StatelessWidget { e.logLevel == LogLevel.debug) .toList(); - final httpRequests = data - .where((e) => e.key == TalkerLogType.httpRequest.key) - .toList(); + final httpRequests = + data.where((e) => e.key == TalkerKey.httpRequest).toList(); final httpErrors = - data.where((e) => e.key == TalkerLogType.httpError.key).toList(); - final httpResponses = data - .where((e) => e.key == TalkerLogType.httpResponse.key) - .toList(); + data.where((e) => e.key == TalkerKey.httpError).toList(); + final httpResponses = + data.where((e) => e.key == TalkerKey.httpResponse).toList(); return CustomScrollView( slivers: [ @@ -110,7 +108,7 @@ class TalkerMonitor extends StatelessWidget { theme: theme, logs: errors, title: 'Errors', - color: theme.logColors.getByType(TalkerLogType.error), + color: theme.logColors.getByKey(TalkerKey.error), icon: Icons.error_outline_rounded, subtitle: 'Application has ${errors.length} unresolved errors', @@ -126,7 +124,7 @@ class TalkerMonitor extends StatelessWidget { theme: theme, logs: exceptions, title: 'Exceptions', - color: theme.logColors.getByType(TalkerLogType.exception), + color: theme.logColors.getByKey(TalkerKey.exception), icon: Icons.error_outline_rounded, subtitle: 'Application has ${exceptions.length} unresolved exceptions', @@ -142,7 +140,7 @@ class TalkerMonitor extends StatelessWidget { theme: theme, logs: warnings, title: 'Warnings', - color: theme.logColors.getByType(TalkerLogType.warning), + color: theme.logColors.getByKey(TalkerKey.warning), icon: Icons.warning_amber_rounded, subtitle: 'Application has ${warnings.length} warnings', onTap: () => @@ -157,7 +155,7 @@ class TalkerMonitor extends StatelessWidget { theme: theme, logs: infos, title: 'Infos', - color: theme.logColors.getByType(TalkerLogType.info), + color: theme.logColors.getByKey(TalkerKey.info), icon: Icons.info_outline_rounded, subtitle: 'Info logs count: ${infos.length}', onTap: () => _openTypedLogsScreen(context, infos, 'Infos'), @@ -171,7 +169,7 @@ class TalkerMonitor extends StatelessWidget { theme: theme, logs: verboseDebug, title: 'Verbose & debug', - color: theme.logColors.getByType(TalkerLogType.verbose), + color: theme.logColors.getByKey(TalkerKey.verbose), icon: Icons.remove_red_eye_outlined, subtitle: 'Verbose and debug logs count: ${verboseDebug.length}', diff --git a/packages/talker_flutter/lib/src/ui/talker_settings/talker_settings_bottom_sheet.dart b/packages/talker_flutter/lib/src/ui/talker_settings/talker_settings_bottom_sheet.dart index db523326c..2212ada19 100644 --- a/packages/talker_flutter/lib/src/ui/talker_settings/talker_settings_bottom_sheet.dart +++ b/packages/talker_flutter/lib/src/ui/talker_settings/talker_settings_bottom_sheet.dart @@ -38,36 +38,36 @@ class _TalkerSettingsBottomSheetState extends State { @override Widget build(BuildContext context) { + final talker = widget.talker.value; final theme = Theme.of(context); final settings = [ Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), child: Text( - 'Basic settings', + 'Talker settings', style: theme.textTheme.titleLarge?.copyWith( color: widget.talkerScreenTheme.textColor, - fontWeight: FontWeight.w700, + fontWeight: FontWeight.w500, ), ), ), TalkerSettingsCard( talkerScreenTheme: widget.talkerScreenTheme, title: 'Enabled', - enabled: widget.talker.value.settings.enabled, + enabled: talker.settings.enabled, onChanged: (enabled) { - (enabled ? widget.talker.value.enable : widget.talker.value.disable) - .call(); + (enabled ? talker.enable : talker.disable).call(); widget.talker.notifyListeners(); }, ), TalkerSettingsCard( - canEdit: widget.talker.value.settings.enabled, + canEdit: talker.settings.enabled, talkerScreenTheme: widget.talkerScreenTheme, title: 'Use console logs', - enabled: widget.talker.value.settings.useConsoleLogs, + enabled: talker.settings.useConsoleLogs, onChanged: (enabled) { - widget.talker.value.configure( - settings: widget.talker.value.settings.copyWith( + talker.configure( + settings: talker.settings.copyWith( useConsoleLogs: enabled, ), ); @@ -75,19 +75,40 @@ class _TalkerSettingsBottomSheetState extends State { }, ), TalkerSettingsCard( - canEdit: widget.talker.value.settings.enabled, + canEdit: talker.settings.enabled, talkerScreenTheme: widget.talkerScreenTheme, title: 'Use history', - enabled: widget.talker.value.settings.useHistory, + enabled: talker.settings.useHistory, onChanged: (enabled) { - widget.talker.value.configure( - settings: widget.talker.value.settings.copyWith( + talker.configure( + settings: talker.settings.copyWith( useHistory: enabled, ), ); widget.talker.notifyListeners(); }, ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + child: Text( + 'Packages settings', + style: theme.textTheme.titleLarge?.copyWith( + color: widget.talkerScreenTheme.textColor, + fontWeight: FontWeight.w500, + ), + ), + ), + ...widget.talker.value.settings.registeredKeys + .map( + (key) => TalkerSettingsCard( + talkerScreenTheme: widget.talkerScreenTheme, + title: key, + enabled: talker.filter.disabledKeys.isEmpty || + !talker.filter.disabledKeys.contains(key), + onChanged: (enabled) => _toggleKeySelected(enabled, key), + ), + ) + .toList(), ...listenableCustomSettings.value.map( (CustomSettingsGroup group) { return Column( @@ -198,7 +219,7 @@ class _TalkerSettingsBottomSheetState extends State { ]; return BaseBottomSheet( - title: 'Talker Settings', + title: 'Settings', talkerScreenTheme: widget.talkerScreenTheme, child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -209,6 +230,18 @@ class _TalkerSettingsBottomSheetState extends State { ), ); } + + void _toggleKeySelected(bool enabled, String e) { + final talker = widget.talker.value; + final keys = talker.filter.disabledKeys.toList(); + if (!enabled) { + keys.add(e); + } else { + keys.remove(e); + } + talker.configure(filter: talker.filter.copyWith(disabledKeys: keys)); + widget.talker.notifyListeners(); + } } // class _TalkerDioLoggerNotSetup extends StatelessWidget { diff --git a/packages/talker_flutter/lib/src/ui/talker_settings/widgets/talker_setting_card.dart b/packages/talker_flutter/lib/src/ui/talker_settings/widgets/talker_setting_card.dart index de642710f..df3544f9d 100644 --- a/packages/talker_flutter/lib/src/ui/talker_settings/widgets/talker_setting_card.dart +++ b/packages/talker_flutter/lib/src/ui/talker_settings/widgets/talker_setting_card.dart @@ -29,11 +29,11 @@ class TalkerSettingsCard extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 8.0), child: TalkerBaseCard( - padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8) - .copyWith(right: 0), + padding: const EdgeInsets.only(left: 8), color: talkerScreenTheme.textColor, backgroundColor: talkerScreenTheme.cardColor, child: ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 8), title: Text( title, style: TextStyle( diff --git a/packages/talker_flutter/lib/src/ui/talker_view.dart b/packages/talker_flutter/lib/src/ui/talker_view.dart index 534da1488..3545bcd67 100644 --- a/packages/talker_flutter/lib/src/ui/talker_view.dart +++ b/packages/talker_flutter/lib/src/ui/talker_view.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:group_button/group_button.dart'; import 'package:talker_flutter/src/controller/controller.dart'; import 'package:talker_flutter/src/ui/talker_monitor/talker_monitor.dart'; import 'package:talker_flutter/src/ui/widgets/talker_view_appbar.dart'; @@ -61,9 +60,9 @@ class TalkerView extends StatefulWidget { } class _TalkerViewState extends State { - final _titlesController = GroupButtonController(); late final _controller = widget.controller ?? TalkerViewController( + talker: widget.talker, expandedLogs: widget.isLogsExpanded, isLogOrderReversed: widget.isLogOrderReversed, ); @@ -79,28 +78,26 @@ class _TalkerViewState extends State { return TalkerBuilder( talker: widget.talker, builder: (context, data) { - final filteredElements = filteredLogs(data); - final titles = data.map((e) => e.title).toList(); - final uniqTitles = titles.toSet().toList(); + final filteredElements = _getFilteredLogs(data); + final keys = data.map((e) => e.key).toList(); + final uniqKeys = keys.toSet().toList(); return CustomScrollView( controller: widget.scrollController, physics: const BouncingScrollPhysics(), slivers: [ TalkerViewAppBar( + keys: keys, + uniqKeys: uniqKeys, title: widget.appBarTitle, leading: widget.appBarLeading, talker: widget.talker, talkerTheme: talkerTheme, - titlesController: _titlesController, - titles: titles, - uniqTitles: uniqTitles, controller: _controller, onMonitorTap: () => _openTalkerMonitor(context), - onActionsTap: () => _showActionsBottomSheet(context), - onSettingsTap: () => - _openTalkerSettings(context, talkerTheme), - onToggleTitle: _onToggleTitle, + onActionsTap: () => _openActions(context), + onSettingsTap: () => _openSettings(context, talkerTheme), + onToggleKey: _onToggleKey, ), const SliverToBoxAdapter(child: SizedBox(height: 8)), SliverList( @@ -130,15 +127,13 @@ class _TalkerViewState extends State { ); } - List filteredLogs(List data) => + List _getFilteredLogs(List data) => data.where((e) => _controller.filter.filter(e)).toList(); - void _onToggleTitle(String title, bool selected) { - if (selected) { - _controller.addFilterTitle(title); - } else { - _controller.removeFilterTitle(title); - } + void _onToggleKey(String key, bool selected) { + final action = + selected ? _controller.addFilterKey : _controller.removeFilterKey; + action(key); } TalkerData _getListItem( @@ -150,7 +145,7 @@ class _TalkerViewState extends State { return data; } - void _openTalkerSettings(BuildContext context, TalkerScreenTheme theme) { + void _openSettings(BuildContext context, TalkerScreenTheme theme) { final talker = ValueNotifier(widget.talker); showModalBottomSheet( @@ -191,7 +186,7 @@ class _TalkerViewState extends State { ); } - Future _showActionsBottomSheet(BuildContext context) async { + Future _openActions(BuildContext context) async { await showModalBottomSheet( context: context, isScrollControlled: true, @@ -262,7 +257,7 @@ class _TalkerViewState extends State { void _copyFilteredLogs(BuildContext context) { Clipboard.setData(ClipboardData( - text: filteredLogs(widget.talker.history) + text: _getFilteredLogs(widget.talker.history) .text(timeFormat: widget.talker.settings.timeFormat))); _showSnackBar(context, 'All filtered logs copied in buffer'); } diff --git a/packages/talker_flutter/lib/src/ui/theme/default_theme.dart b/packages/talker_flutter/lib/src/ui/theme/default_theme.dart deleted file mode 100644 index 705857176..000000000 --- a/packages/talker_flutter/lib/src/ui/theme/default_theme.dart +++ /dev/null @@ -1,3 +0,0 @@ -import 'package:flutter/material.dart'; - -const defaultCardBackgroundColor = Color.fromARGB(255, 49, 49, 49); diff --git a/packages/talker_flutter/lib/src/ui/theme/talker_screen_theme.dart b/packages/talker_flutter/lib/src/ui/theme/talker_screen_theme.dart index 4ce9af447..ea4ea276a 100644 --- a/packages/talker_flutter/lib/src/ui/theme/talker_screen_theme.dart +++ b/packages/talker_flutter/lib/src/ui/theme/talker_screen_theme.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:talker_flutter/src/ui/theme/default_theme.dart'; import 'package:talker_flutter/talker_flutter.dart'; typedef LogColors = Map; @@ -45,32 +44,34 @@ class TalkerScreenTheme { } extension MapTalkerFlutterColorsExt on LogColors { - Color getByType(TalkerLogType type) { - return this[type.key] ?? Colors.grey; + Color getByKey(String key) { + return this[key] ?? Colors.grey; } } final _defaultColors = { /// Base logs section - TalkerLogType.error.key: const Color.fromARGB(255, 239, 83, 80), - TalkerLogType.critical.key: const Color.fromARGB(255, 198, 40, 40), - TalkerLogType.info.key: const Color.fromARGB(255, 66, 165, 245), - TalkerLogType.debug.key: const Color.fromARGB(255, 158, 158, 158), - TalkerLogType.verbose.key: const Color.fromARGB(255, 189, 189, 189), - TalkerLogType.warning.key: const Color.fromARGB(255, 239, 108, 0), - TalkerLogType.exception.key: const Color.fromARGB(255, 239, 83, 80), + TalkerKey.error: const Color.fromARGB(255, 239, 83, 80), + TalkerKey.critical: const Color.fromARGB(255, 198, 40, 40), + TalkerKey.info: const Color.fromARGB(255, 66, 165, 245), + TalkerKey.debug: const Color.fromARGB(255, 158, 158, 158), + TalkerKey.verbose: const Color.fromARGB(255, 189, 189, 189), + TalkerKey.warning: const Color.fromARGB(255, 239, 108, 0), + TalkerKey.exception: const Color.fromARGB(255, 239, 83, 80), /// Http section - TalkerLogType.httpError.key: const Color.fromARGB(255, 239, 83, 80), - TalkerLogType.httpRequest.key: const Color(0xFFF602C1), - TalkerLogType.httpResponse.key: const Color(0xFF26FF3C), + TalkerKey.httpError: const Color.fromARGB(255, 239, 83, 80), + TalkerKey.httpRequest: const Color(0xFFF602C1), + TalkerKey.httpResponse: const Color(0xFF26FF3C), /// Bloc section - TalkerLogType.blocEvent.key: const Color(0xFF63FAFE), - TalkerLogType.blocTransition.key: const Color(0xFF56FEA8), - TalkerLogType.blocClose.key: const Color(0xFFFF005F), - TalkerLogType.blocCreate.key: const Color.fromARGB(255, 120, 230, 129), + TalkerKey.blocEvent: const Color(0xFF63FAFE), + TalkerKey.blocTransition: const Color(0xFF56FEA8), + TalkerKey.blocClose: const Color(0xFFFF005F), + TalkerKey.blocCreate: const Color.fromARGB(255, 120, 230, 129), /// Flutter section - TalkerLogType.route.key: const Color(0xFFAF5FFF), + TalkerKey.route: const Color(0xFFAF5FFF), }; + +const defaultCardBackgroundColor = Color.fromARGB(255, 49, 49, 49); diff --git a/packages/talker_flutter/lib/src/ui/widgets/base_card.dart b/packages/talker_flutter/lib/src/ui/widgets/base_card.dart index c8c796563..ec1c507f9 100644 --- a/packages/talker_flutter/lib/src/ui/widgets/base_card.dart +++ b/packages/talker_flutter/lib/src/ui/widgets/base_card.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:talker_flutter/src/ui/theme/default_theme.dart'; +import 'package:talker_flutter/src/ui/theme/talker_screen_theme.dart'; class TalkerBaseCard extends StatelessWidget { const TalkerBaseCard({ diff --git a/packages/talker_flutter/lib/src/ui/widgets/bottom_sheet.dart b/packages/talker_flutter/lib/src/ui/widgets/bottom_sheet.dart index e94646bf1..c034872be 100644 --- a/packages/talker_flutter/lib/src/ui/widgets/bottom_sheet.dart +++ b/packages/talker_flutter/lib/src/ui/widgets/bottom_sheet.dart @@ -38,17 +38,15 @@ class BaseBottomSheet extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Padding( - padding: - const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8) - .copyWith(bottom: 16), + padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Text( title, - style: theme.textTheme.headlineSmall - ?.copyWith(color: talkerScreenTheme.textColor), + style: theme.textTheme.headlineSmall?.copyWith( + color: talkerScreenTheme.textColor, fontSize: 28), ), ), InkWell( diff --git a/packages/talker_flutter/lib/src/ui/widgets/data_card.dart b/packages/talker_flutter/lib/src/ui/widgets/data_card.dart index a99e37c72..a152dce97 100644 --- a/packages/talker_flutter/lib/src/ui/widgets/data_card.dart +++ b/packages/talker_flutter/lib/src/ui/widgets/data_card.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:talker_flutter/src/ui/theme/default_theme.dart'; import 'package:talker_flutter/src/ui/widgets/base_card.dart'; import 'package:talker_flutter/talker_flutter.dart'; @@ -182,10 +181,10 @@ class _TalkerDataCardState extends State { String? get _message { final isHttpLog = [ - TalkerLogType.httpError.key, - TalkerLogType.httpRequest.key, - TalkerLogType.httpResponse.key, - ].contains(widget.data.title); + TalkerKey.httpError, + TalkerKey.httpRequest, + TalkerKey.httpResponse, + ].contains(widget.data.key); if (isHttpLog) { return widget.data.generateTextMessage(); } diff --git a/packages/talker_flutter/lib/src/ui/widgets/talker_view_appbar.dart b/packages/talker_flutter/lib/src/ui/widgets/talker_view_appbar.dart index ddaa822fd..5a1e5e762 100644 --- a/packages/talker_flutter/lib/src/ui/widgets/talker_view_appbar.dart +++ b/packages/talker_flutter/lib/src/ui/widgets/talker_view_appbar.dart @@ -10,14 +10,13 @@ class TalkerViewAppBar extends StatefulWidget { required this.leading, required this.talker, required this.talkerTheme, - required this.titlesController, required this.controller, - required this.titles, - required this.uniqTitles, + required this.keys, + required this.uniqKeys, required this.onMonitorTap, required this.onSettingsTap, required this.onActionsTap, - required this.onToggleTitle, + required this.onToggleKey, }) : super(key: key); final String? title; @@ -25,17 +24,17 @@ class TalkerViewAppBar extends StatefulWidget { final Talker talker; final TalkerScreenTheme talkerTheme; - final GroupButtonController titlesController; + final TalkerViewController controller; - final List titles; - final List uniqTitles; + final List keys; + final List uniqKeys; final VoidCallback onMonitorTap; final VoidCallback onSettingsTap; final VoidCallback onActionsTap; - final Function(String title, bool selected) onToggleTitle; + final Function(String key, bool selected) onToggleKey; @override State createState() => _TalkerViewAppBarState(); @@ -44,8 +43,8 @@ class TalkerViewAppBar extends StatefulWidget { class _TalkerViewAppBarState extends State with WidgetsBindingObserver { final GlobalKey _groupButtonKey = GlobalKey(); - final GlobalKey _searchTextFieldKey = GlobalKey(); + final _bcontroller = GroupButtonController(); double? _spaceBarHeight; @@ -60,6 +59,11 @@ class _TalkerViewAppBarState extends State WidgetsBinding.instance ..addObserver(this) ..addPostFrameCallback(_addPostFrameCallback); + final indexes = widget.talker.filter.enabledKeys + .map((e) => widget.keys.indexOf(e)) + .where((index) => index >= 0) + .toList(); + _bcontroller.selectIndexes(indexes); super.initState(); } @@ -91,6 +95,7 @@ class _TalkerViewAppBarState extends State @override Widget build(BuildContext context) { final theme = Theme.of(context); + final uniqKeys = widget.uniqKeys..removeWhere((e) => e == null); return SliverAppBar( backgroundColor: widget.talkerTheme.backgroundColor, elevation: 0, @@ -149,11 +154,13 @@ class _TalkerViewAppBarState extends State padding: const EdgeInsets.symmetric(horizontal: 16.0), child: GroupButton( key: _groupButtonKey, - controller: widget.titlesController, + controller: _bcontroller, isRadio: false, - buttonBuilder: (selected, value, context) { - final count = - widget.titles.where((e) => e == value).length; + buttonBuilder: (selected, key, context) { + final count = widget.keys.where((e) => e == key).length; + final title = key != null + ? widget.talker.settings.getTitleByKey(key) + : 'undefined'; return Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( @@ -175,7 +182,7 @@ class _TalkerViewAppBarState extends State ), const SizedBox(width: 4), Text( - '$value', + title, style: TextStyle( fontSize: 12, color: widget.talkerTheme.textColor, @@ -185,9 +192,11 @@ class _TalkerViewAppBarState extends State ), ); }, - onSelected: (_, i, selected) => - _onToggle(widget.uniqTitles[i], selected), - buttons: widget.uniqTitles, + onSelected: (_, i, selected) => _onToggleKey( + uniqKeys[i], + selected, + ), + buttons: uniqKeys, ), ), const SizedBox(height: _padding), @@ -204,9 +213,9 @@ class _TalkerViewAppBarState extends State ); } - void _onToggle(String? title, bool selected) { - if (title == null) return; - widget.onToggleTitle(title, selected); + void _onToggleKey(String? key, bool selected) { + if (key == null) return; + widget.onToggleKey(key, selected); } } diff --git a/packages/talker_flutter/pubspec.yaml b/packages/talker_flutter/pubspec.yaml index 689b93605..f42cd2301 100644 --- a/packages/talker_flutter/pubspec.yaml +++ b/packages/talker_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: talker_flutter description: Advanced error handler and logger package for flutter and dart. App monitoring, logs history, report sharing, custom logs, and etc. -version: 4.9.3 +version: 5.0.0-dev.8 homepage: https://github.com/Frezyx/talker repository: https://github.com/Frezyx/talker issue_tracker: https://github.com/Frezyx/talker/issues @@ -20,7 +20,7 @@ dependencies: flutter: sdk: flutter - talker: ^4.9.3 + talker: ^5.0.0-dev.8 group_button: ^5.3.4 path_provider: ^2.1.4 share_plus: ^11.0.0 diff --git a/packages/talker_http_logger/CHANGELOG.md b/packages/talker_http_logger/CHANGELOG.md index ea842a9e3..d57e797f7 100644 --- a/packages/talker_http_logger/CHANGELOG.md +++ b/packages/talker_http_logger/CHANGELOG.md @@ -1,3 +1,50 @@ +# 5.0.0-dev.8 +- - [talker] Sync release and prerelease versions + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.7 +- - [talker_dio_logger] Fix ``FormData``s ``contentType`` field + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.6 +- - [talker_dio_logger] Add ``FormData`` parser for request logs data + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.5 +- [talker] Add ``registeredKeys`` field into ``TalkerSettings`` for third-party packages +- [talker] Remove deprecated ``titles`` and ``types`` from ``TalkerFilter`` +- [talker] Add ``enabledKeys`` and ``disabledKeys`` fields into ``TalkerFilter`` to replace old filtering logic +- [talker_flutter] Add ``TalkerFilter`` configuration on ``TalkerScreen`` +- [talker_dio_logger] Add ``TalkerKey``s registration +- [talker_http_logger] Add ``TalkerKey``s registration +- [talker_bloc_logger] Add ``TalkerKey``s registration +- [talker_riverpod_logger] Add ``TalkerKey``s registration + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.4 +- [talker_dio_logger] Remove unused addonId field from dio_logger + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.3 +- [talker] Upgrade **BaseTalkerFilter** class - add new filtering way by **List keys** field +- [talker] Deprecate **titles** and **types** fields from **BaseTalkerFilter** + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.2 +- [talker] Fix errors and exceptions filtering for observer + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 0.1.0-dev.54 +- [talker] Brand new simplified TalkerKeys API (String Log key) + +Thanks to [Frezyx](https://github.com/Frezyx) # 4.9.3 - [talker] chore(deps): update dependency gradle to v8.14.3 [talker] chore(deps): update plugin com.android.application to v8.11.1 diff --git a/packages/talker_http_logger/README.md b/packages/talker_http_logger/README.md index 0e84a72e1..cfb23434c 100644 --- a/packages/talker_http_logger/README.md +++ b/packages/talker_http_logger/README.md @@ -23,7 +23,7 @@ Follow these steps to use this package ### Add dependency ```yaml dependencies: - talker_http_logger: ^4.9.3 + talker_http_logger: ^5.0.0-dev.8 ``` ### Usage diff --git a/packages/talker_http_logger/lib/http_error_log.dart b/packages/talker_http_logger/lib/http_error_log.dart index 180066246..0f09e73e9 100644 --- a/packages/talker_http_logger/lib/http_error_log.dart +++ b/packages/talker_http_logger/lib/http_error_log.dart @@ -26,7 +26,7 @@ class HttpErrorLog extends TalkerLog with ResponseTime { AnsiPen get pen => settings.errorPen ?? (AnsiPen()..red()); @override - String get key => TalkerLogType.httpError.key; + String get key => TalkerKey.httpError; @override LogLevel get logLevel => LogLevel.error; diff --git a/packages/talker_http_logger/lib/http_request_log.dart b/packages/talker_http_logger/lib/http_request_log.dart index b425e1f88..bb93cfc41 100644 --- a/packages/talker_http_logger/lib/http_request_log.dart +++ b/packages/talker_http_logger/lib/http_request_log.dart @@ -23,7 +23,7 @@ class HttpRequestLog extends TalkerLog { AnsiPen get pen => settings.requestPen ?? (AnsiPen()..xterm(219)); @override - String get key => TalkerLogType.httpRequest.key; + String get key => TalkerKey.httpRequest; @override LogLevel get logLevel => settings.logLevel; diff --git a/packages/talker_http_logger/lib/http_response_log.dart b/packages/talker_http_logger/lib/http_response_log.dart index ea4bdea78..615edba37 100644 --- a/packages/talker_http_logger/lib/http_response_log.dart +++ b/packages/talker_http_logger/lib/http_response_log.dart @@ -22,7 +22,7 @@ class HttpResponseLog extends TalkerLog with ResponseTime { AnsiPen get pen => settings.responsePen ?? (AnsiPen()..xterm(46)); @override - String get key => TalkerLogType.httpResponse.key; + String get key => TalkerKey.httpResponse; @override LogLevel get logLevel => settings.logLevel; diff --git a/packages/talker_http_logger/pubspec.yaml b/packages/talker_http_logger/pubspec.yaml index 3f67bc9a6..93ca6039f 100644 --- a/packages/talker_http_logger/pubspec.yaml +++ b/packages/talker_http_logger/pubspec.yaml @@ -1,6 +1,6 @@ name: talker_http_logger description: Lightweight and customizable http client logger on talker base -version: 4.9.3 +version: 5.0.0-dev.8 homepage: https://github.com/Frezyx/talker environment: @@ -9,8 +9,8 @@ environment: dependencies: equatable: ^2.0.7 http_interceptor: ^2.0.0 - meta: ^1.9.1 - talker: ^4.9.3 + talker: ^5.0.0-dev.8 + meta: ^1.15.0 dev_dependencies: http_parser: ^4.1.2 diff --git a/packages/talker_logger/CHANGELOG.md b/packages/talker_logger/CHANGELOG.md index fde58dc62..d5ed40dd3 100644 --- a/packages/talker_logger/CHANGELOG.md +++ b/packages/talker_logger/CHANGELOG.md @@ -1,3 +1,50 @@ +# 5.0.0-dev.8 +- - [talker] Sync release and prerelease versions + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.7 +- - [talker_dio_logger] Fix ``FormData``s ``contentType`` field + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.6 +- - [talker_dio_logger] Add ``FormData`` parser for request logs data + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.5 +- [talker] Add ``registeredKeys`` field into ``TalkerSettings`` for third-party packages +- [talker] Remove deprecated ``titles`` and ``types`` from ``TalkerFilter`` +- [talker] Add ``enabledKeys`` and ``disabledKeys`` fields into ``TalkerFilter`` to replace old filtering logic +- [talker_flutter] Add ``TalkerFilter`` configuration on ``TalkerScreen`` +- [talker_dio_logger] Add ``TalkerKey``s registration +- [talker_http_logger] Add ``TalkerKey``s registration +- [talker_bloc_logger] Add ``TalkerKey``s registration +- [talker_riverpod_logger] Add ``TalkerKey``s registration + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.4 +- [talker_dio_logger] Remove unused addonId field from dio_logger + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.3 +- [talker] Upgrade **BaseTalkerFilter** class - add new filtering way by **List keys** field +- [talker] Deprecate **titles** and **types** fields from **BaseTalkerFilter** + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.2 +- [talker] Fix errors and exceptions filtering for observer + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.1 +- [talker] Brand new simplified TalkerKeys API (String Log key) + +Thanks to [Frezyx](https://github.com/Frezyx) # 4.9.3 - [talker] chore(deps): update dependency gradle to v8.14.3 [talker] chore(deps): update plugin com.android.application to v8.11.1 diff --git a/packages/talker_logger/README.md b/packages/talker_logger/README.md index 5a8fcc4f5..c00a26bad 100644 --- a/packages/talker_logger/README.md +++ b/packages/talker_logger/README.md @@ -23,7 +23,7 @@ Follow these steps to use this package ### Add dependency ```yaml dependencies: - talker_logger: ^4.9.3 + talker_logger: ^5.0.0-dev.8 ``` ### Easy to use diff --git a/packages/talker_logger/pubspec.yaml b/packages/talker_logger/pubspec.yaml index ace245780..7efa6d5fe 100644 --- a/packages/talker_logger/pubspec.yaml +++ b/packages/talker_logger/pubspec.yaml @@ -1,6 +1,6 @@ name: talker_logger description: Logger. Easy, customizable, extensible logging, lightweight with filters, formatters, custom logs, log levels. -version: 4.9.3 +version: 5.0.0-dev.8 homepage: https://github.com/Frezyx/talker repository: https://github.com/Frezyx/talker issue_tracker: https://github.com/Frezyx/talker/issues diff --git a/packages/talker_riverpod_logger/CHANGELOG.md b/packages/talker_riverpod_logger/CHANGELOG.md index 11fe1ca09..f7246b0be 100644 --- a/packages/talker_riverpod_logger/CHANGELOG.md +++ b/packages/talker_riverpod_logger/CHANGELOG.md @@ -1,3 +1,50 @@ +# 5.0.0-dev.8 +- - [talker] Sync release and prerelease versions + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.7 +- - [talker_dio_logger] Fix ``FormData``s ``contentType`` field + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.6 +- - [talker_dio_logger] Add ``FormData`` parser for request logs data + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.5 +- [talker] Add ``registeredKeys`` field into ``TalkerSettings`` for third-party packages +- [talker] Remove deprecated ``titles`` and ``types`` from ``TalkerFilter`` +- [talker] Add ``enabledKeys`` and ``disabledKeys`` fields into ``TalkerFilter`` to replace old filtering logic +- [talker_flutter] Add ``TalkerFilter`` configuration on ``TalkerScreen`` +- [talker_dio_logger] Add ``TalkerKey``s registration +- [talker_http_logger] Add ``TalkerKey``s registration +- [talker_bloc_logger] Add ``TalkerKey``s registration +- [talker_riverpod_logger] Add ``TalkerKey``s registration + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.4 +- [talker_dio_logger] Remove unused addonId field from dio_logger + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.3 +- [talker] Upgrade **BaseTalkerFilter** class - add new filtering way by **List keys** field +- [talker] Deprecate **titles** and **types** fields from **BaseTalkerFilter** + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.2 +- [talker] Fix errors and exceptions filtering for observer + +Thanks to [Frezyx](https://github.com/Frezyx) + +# 5.0.0-dev.1 +- [talker] Brand new simplified TalkerKeys API (String Log key) + +Thanks to [Frezyx](https://github.com/Frezyx) # 4.9.3 - [talker] chore(deps): update dependency gradle to v8.14.3 [talker] chore(deps): update plugin com.android.application to v8.11.1 diff --git a/packages/talker_riverpod_logger/README.md b/packages/talker_riverpod_logger/README.md index eaff30de6..fc08ebe9a 100644 --- a/packages/talker_riverpod_logger/README.md +++ b/packages/talker_riverpod_logger/README.md @@ -31,7 +31,7 @@ Follow these steps to use this package ### Add dependency ```yaml dependencies: - talker_riverpod_logger: ^4.9.3 + talker_riverpod_logger: ^5.0.0-dev.8 ``` ### Usage diff --git a/packages/talker_riverpod_logger/example/pubspec.yaml b/packages/talker_riverpod_logger/example/pubspec.yaml index 35261764f..623717f03 100644 --- a/packages/talker_riverpod_logger/example/pubspec.yaml +++ b/packages/talker_riverpod_logger/example/pubspec.yaml @@ -8,9 +8,9 @@ dependencies: crypto: ^3.0.0 dio: ^5.1.1 freezed_annotation: ^3.0.0 - json_annotation: ^4.9.3 + json_annotation: ^5.0.0-dev.8 riverpod: ^2.5.0 - talker_riverpod_logger: ^4.9.3 + talker_riverpod_logger: ^5.0.0-dev.8 dev_dependencies: build_runner: ^2.0.0 diff --git a/packages/talker_riverpod_logger/lib/riverpod_logs.dart b/packages/talker_riverpod_logger/lib/riverpod_logs.dart index d1ec09d26..2051c6cb1 100644 --- a/packages/talker_riverpod_logger/lib/riverpod_logs.dart +++ b/packages/talker_riverpod_logger/lib/riverpod_logs.dart @@ -27,7 +27,7 @@ class RiverpodAddLog extends TalkerLog { final TalkerRiverpodLoggerSettings settings; @override - String get key => TalkerLogType.riverpodAdd.key; + String get key => TalkerKey.riverpodAdd; @override String generateTextMessage({ @@ -62,7 +62,7 @@ class RiverpodUpdateLog extends TalkerLog { final TalkerRiverpodLoggerSettings settings; @override - String get key => TalkerLogType.riverpodUpdate.key; + String get key => TalkerKey.riverpodUpdate; @override String generateTextMessage({ @@ -95,7 +95,7 @@ class RiverpodDisposeLog extends TalkerLog { final TalkerRiverpodLoggerSettings settings; @override - String get key => TalkerLogType.riverpodDispose.key; + String get key => TalkerKey.riverpodDispose; @override String generateTextMessage({ @@ -128,7 +128,7 @@ class RiverpodFailLog extends TalkerLog { final TalkerRiverpodLoggerSettings settings; @override - String? get key => TalkerLogType.riverpodFail.key; + String? get key => TalkerKey.riverpodFail; @override String generateTextMessage({ diff --git a/packages/talker_riverpod_logger/lib/talker_riverpod_logger_observer.dart b/packages/talker_riverpod_logger/lib/talker_riverpod_logger_observer.dart index 3f9be5cc4..5cf0db44f 100644 --- a/packages/talker_riverpod_logger/lib/talker_riverpod_logger_observer.dart +++ b/packages/talker_riverpod_logger/lib/talker_riverpod_logger_observer.dart @@ -14,6 +14,14 @@ class TalkerRiverpodObserver extends ProviderObserver { this.settings = const TalkerRiverpodLoggerSettings(), }) { _talker = talker ?? Talker(); + _talker.settings.registerKeys( + [ + TalkerKey.riverpodAdd, + TalkerKey.riverpodUpdate, + TalkerKey.riverpodDispose, + TalkerKey.riverpodFail, + ], + ); } late Talker _talker; diff --git a/packages/talker_riverpod_logger/pubspec.yaml b/packages/talker_riverpod_logger/pubspec.yaml index dc47bf61d..2ffefab45 100644 --- a/packages/talker_riverpod_logger/pubspec.yaml +++ b/packages/talker_riverpod_logger/pubspec.yaml @@ -1,6 +1,6 @@ name: talker_riverpod_logger description: Lightweight and customizable Riverpod state management library logger on talker base. -version: 4.9.3 +version: 5.0.0-dev.8 homepage: https://github.com/Frezyx/talker repository: https://github.com/Frezyx/talker issue_tracker: https://github.com/Frezyx/talker/issues @@ -15,7 +15,7 @@ environment: sdk: ">=2.15.0 <4.0.0" dependencies: - talker: ^4.9.3 + talker: ^5.0.0-dev.8 riverpod: ^2.5.0 meta: ^1.8.0 diff --git a/packages/talker_riverpod_logger/test/logs_test.dart b/packages/talker_riverpod_logger/test/logs_test.dart index e49aa6212..e1ba1207c 100644 --- a/packages/talker_riverpod_logger/test/logs_test.dart +++ b/packages/talker_riverpod_logger/test/logs_test.dart @@ -19,7 +19,7 @@ void main() { expect(log.provider, fakeProvider); expect(log.value, fakeValue); expect(log.settings, fakeSettings); - expect(log.key, TalkerLogType.riverpodAdd.key); + expect(log.key, TalkerKey.riverpodAdd); final message = log.generateTextMessage(); expect(message, isA()); @@ -46,7 +46,7 @@ void main() { expect(log.provider, fakeProvider); expect(log.value, fakeValue); expect(log.settings, fakeSettings); - expect(log.key, TalkerLogType.riverpodAdd.key); + expect(log.key, TalkerKey.riverpodAdd); final message = log.generateTextMessage(); expect(message, isA()); @@ -74,7 +74,7 @@ void main() { expect(log.previousValue, fakePreviousValue); expect(log.newValue, fakeNewValue); expect(log.settings, fakeSettings); - expect(log.key, TalkerLogType.riverpodUpdate.key); + expect(log.key, TalkerKey.riverpodUpdate); final message = log.generateTextMessage(); expect(message, isA()); @@ -104,7 +104,7 @@ void main() { expect(log.previousValue, fakePreviousValue); expect(log.newValue, fakeNewValue); expect(log.settings, fakeSettings); - expect(log.key, TalkerLogType.riverpodUpdate.key); + expect(log.key, TalkerKey.riverpodUpdate); final message = log.generateTextMessage(); expect(message, isA()); @@ -126,7 +126,7 @@ void main() { expect(log.provider, fakeProvider); expect(log.settings, fakeSettings); - expect(log.key, TalkerLogType.riverpodDispose.key); + expect(log.key, TalkerKey.riverpodDispose); final message = log.generateTextMessage(); expect(message, isA()); @@ -150,7 +150,7 @@ void main() { expect(log.provider, fakeProvider); expect(log.settings, fakeSettings); - expect(log.key, TalkerLogType.riverpodDispose.key); + expect(log.key, TalkerKey.riverpodDispose); final message = log.generateTextMessage(); expect(message, isA()); @@ -177,7 +177,7 @@ void main() { expect(log.provider, fakeProvider); expect(log.providerError, fakeError); expect(log.providerStackTrace, fakeStackTrace); - expect(log.key, TalkerLogType.riverpodFail.key); + expect(log.key, TalkerKey.riverpodFail); final message = log.generateTextMessage(); expect(message, isA()); @@ -206,7 +206,7 @@ void main() { expect(log.provider, fakeProvider); expect(log.providerError, fakeError); expect(log.providerStackTrace, fakeStackTrace); - expect(log.key, TalkerLogType.riverpodFail.key); + expect(log.key, TalkerKey.riverpodFail); final message = log.generateTextMessage(); expect(message, isA()); diff --git a/utils/version.txt b/utils/version.txt index b8e0e204e..94a72c8cb 100644 --- a/utils/version.txt +++ b/utils/version.txt @@ -1,4 +1,4 @@ -4.9.2 -4.9.3 -[talker] chore(deps): update dependency gradle to v8.14.3 -renovate +5.0.0-dev.7 +5.0.0-dev.8 +- [talker] Sync release and prerelease versions +Frezyx