From 6986a12b911fdfe490d8a288d08634ea96f56a4c Mon Sep 17 00:00:00 2001 From: Mathias Beaulieu-Duncan Date: Tue, 20 Jan 2026 11:54:12 -0500 Subject: [PATCH] auto-claude: subtask-6-1 - Run flutter analyze to ensure no errors or warnings Fixed all 39 analyzer issues: - Removed unused import (animation_system.dart in collapsible_routes_sidebar.dart) - Removed unused element (_buildActionButton in dark_mode_map.dart) - Fixed unnecessary non-null assertions on AppLocalizations.of(context) - Removed unnecessary type checks in providers.dart - Used super parameters for key in navigation_tc_dialog.dart and status_colors.dart - Replaced print statements with debugPrint in providers.dart and logging_interceptor.dart Co-Authored-By: Claude --- .auto-claude-status | 10 ++-- .../collapsible_routes_sidebar.dart | 3 +- lib/components/dark_mode_map.dart | 56 ------------------- lib/components/delivery_list_item.dart | 2 +- lib/components/navigation_tc_dialog.dart | 4 +- lib/components/route_list_item.dart | 2 +- lib/pages/deliveries_page.dart | 13 ++--- lib/pages/login_page.dart | 18 +++--- lib/pages/settings_page.dart | 2 +- lib/providers/providers.dart | 20 +++---- lib/theme/status_colors.dart | 8 +-- lib/utils/logging_interceptor.dart | 19 ++++--- 12 files changed, 48 insertions(+), 109 deletions(-) diff --git a/.auto-claude-status b/.auto-claude-status index f0f66ad..b749234 100644 --- a/.auto-claude-status +++ b/.auto-claude-status @@ -3,23 +3,23 @@ "spec": "001-normalize-code-update-packages-widgetify-component", "state": "building", "subtasks": { - "completed": 10, + "completed": 11, "total": 14, "in_progress": 1, "failed": 0 }, "phase": { - "current": "Unlock Orientation", + "current": "Cleanup and Verification", "id": null, - "total": 1 + "total": 3 }, "workers": { "active": 0, "max": 1 }, "session": { - "number": 11, + "number": 12, "started_at": "2026-01-20T11:20:56.182893" }, - "last_update": "2026-01-20T11:46:27.066658" + "last_update": "2026-01-20T11:47:55.069999" } \ No newline at end of file diff --git a/lib/components/collapsible_routes_sidebar.dart b/lib/components/collapsible_routes_sidebar.dart index a59d46b..b422c29 100644 --- a/lib/components/collapsible_routes_sidebar.dart +++ b/lib/components/collapsible_routes_sidebar.dart @@ -4,7 +4,6 @@ import '../l10n/app_localizations.dart'; import '../models/delivery_route.dart'; import '../theme/spacing_system.dart'; import '../theme/size_system.dart'; -import '../theme/animation_system.dart'; import '../theme/color_system.dart'; import '../utils/breakpoints.dart'; import '../providers/providers.dart'; @@ -73,7 +72,7 @@ class _CollapsibleRoutesSidebarState extends ConsumerState { ); } - Widget _buildActionButton({ - required String label, - required IconData icon, - required VoidCallback? onPressed, - required Color color, - }) { - final isDisabled = onPressed == null; - final buttonColor = isDisabled ? color.withValues(alpha: 0.5) : color; - - return Container( - margin: const EdgeInsets.only(bottom: 8), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.3), - blurRadius: 4, - offset: const Offset(0, 2), - ), - ], - ), - child: Material( - color: buttonColor, - borderRadius: BorderRadius.circular(8), - child: InkWell( - onTap: onPressed, - borderRadius: BorderRadius.circular(8), - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 12, - vertical: 8, - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - icon, - color: Colors.white, - size: 18, - ), - const SizedBox(width: 6), - Text( - label, - style: const TextStyle( - color: Colors.white, - fontWeight: FontWeight.w500, - fontSize: 14, - ), - ), - ], - ), - ), - ), - ), - ); - } } diff --git a/lib/components/delivery_list_item.dart b/lib/components/delivery_list_item.dart index 55f4d4b..4099f9a 100644 --- a/lib/components/delivery_list_item.dart +++ b/lib/components/delivery_list_item.dart @@ -95,7 +95,7 @@ class _DeliveryListItemState extends State Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; final statusColor = _getStatusColor(widget.delivery); - final l10n = AppLocalizations.of(context)!; + final l10n = AppLocalizations.of(context); // Collapsed view: Show only the badge if (widget.isCollapsed) { diff --git a/lib/components/navigation_tc_dialog.dart b/lib/components/navigation_tc_dialog.dart index 9fab231..8ff504d 100644 --- a/lib/components/navigation_tc_dialog.dart +++ b/lib/components/navigation_tc_dialog.dart @@ -6,10 +6,10 @@ class NavigationTermsAndConditionsDialog extends StatelessWidget { final VoidCallback? onDecline; const NavigationTermsAndConditionsDialog({ - Key? key, + super.key, required this.onAccept, this.onDecline, - }) : super(key: key); + }); @override Widget build(BuildContext context) { diff --git a/lib/components/route_list_item.dart b/lib/components/route_list_item.dart index cbc597b..7f870ce 100644 --- a/lib/components/route_list_item.dart +++ b/lib/components/route_list_item.dart @@ -80,7 +80,7 @@ class _RouteListItemState extends State Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; final statusColor = _getStatusColor(widget.route); - final l10n = AppLocalizations.of(context)!; + final l10n = AppLocalizations.of(context); // Collapsed view: Show only the badge if (widget.isCollapsed) { diff --git a/lib/pages/deliveries_page.dart b/lib/pages/deliveries_page.dart index 748fdda..ebcaacc 100644 --- a/lib/pages/deliveries_page.dart +++ b/lib/pages/deliveries_page.dart @@ -88,7 +88,7 @@ class _DeliveriesPageState extends ConsumerState { final deliveriesData = ref.watch(deliveriesProvider(widget.routeFragmentId)); final tokenAsync = ref.watch(authTokenProvider); final token = tokenAsync.hasValue ? tokenAsync.value : null; - final l10n = AppLocalizations.of(context)!; + final l10n = AppLocalizations.of(context); // When embedded in sidebar, show only the delivery list with back button // This is a responsive sidebar that collapses like routes @@ -300,7 +300,7 @@ class _DeliveriesPageState extends ConsumerState { } if (token == null) { - final l10n = AppLocalizations.of(context)!; + final l10n = AppLocalizations.of(context); ToastHelper.showError(context, l10n.authenticationRequired); return; } @@ -322,7 +322,7 @@ class _DeliveriesPageState extends ConsumerState { ); result.when( success: (_) { - final l10n = AppLocalizations.of(context)!; + final l10n = AppLocalizations.of(context); // ignore: unused_result ref.refresh(deliveriesProvider(widget.routeFragmentId)); // ignore: unused_result @@ -330,7 +330,7 @@ class _DeliveriesPageState extends ConsumerState { ToastHelper.showSuccess(context, l10n.deliverySuccessful); }, onError: (error) { - final l10n = AppLocalizations.of(context)!; + final l10n = AppLocalizations.of(context); ToastHelper.showError(context, l10n.error(error.message)); }, ); @@ -343,7 +343,6 @@ class _DeliveriesPageState extends ConsumerState { ); result.when( success: (_) { - final l10n = AppLocalizations.of(context)!; // ignore: unused_result ref.refresh(deliveriesProvider(widget.routeFragmentId)); // ignore: unused_result @@ -351,7 +350,7 @@ class _DeliveriesPageState extends ConsumerState { ToastHelper.showSuccess(context, 'Delivery marked as uncompleted'); }, onError: (error) { - final l10n = AppLocalizations.of(context)!; + final l10n = AppLocalizations.of(context); ToastHelper.showError(context, l10n.error(error.message)); }, ); @@ -386,7 +385,7 @@ class _DeliveriesPageState extends ConsumerState { String? token, ) async { if (token == null) { - final l10n = AppLocalizations.of(context)!; + final l10n = AppLocalizations.of(context); ToastHelper.showError(context, l10n.authenticationRequired); return; } diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 579f7bf..54ec189 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -79,7 +79,7 @@ class _LoginPageState extends ConsumerState { ), const SizedBox(height: 24), Text( - AppLocalizations.of(context)!.appTitle, + AppLocalizations.of(context).appTitle, textAlign: TextAlign.center, style: Theme.of(context).textTheme.displayMedium?.copyWith( color: Theme.of(context).colorScheme.primary, @@ -88,7 +88,7 @@ class _LoginPageState extends ConsumerState { ), const SizedBox(height: 8), Text( - AppLocalizations.of(context)!.appDescription, + AppLocalizations.of(context).appDescription, textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodyLarge?.copyWith( color: Theme.of(context).colorScheme.onSurfaceVariant, @@ -98,8 +98,8 @@ class _LoginPageState extends ConsumerState { TextFormField( controller: _usernameController, decoration: InputDecoration( - labelText: AppLocalizations.of(context)!.username, - hintText: AppLocalizations.of(context)!.usernameHint, + labelText: AppLocalizations.of(context).username, + hintText: AppLocalizations.of(context).usernameHint, prefixIcon: const Icon(Icons.person), border: const OutlineInputBorder(), ), @@ -107,7 +107,7 @@ class _LoginPageState extends ConsumerState { enabled: !_isLoading, validator: (value) { if (value == null || value.trim().isEmpty) { - return AppLocalizations.of(context)!.usernameRequired; + return AppLocalizations.of(context).usernameRequired; } return null; }, @@ -116,8 +116,8 @@ class _LoginPageState extends ConsumerState { TextFormField( controller: _passwordController, decoration: InputDecoration( - labelText: AppLocalizations.of(context)!.password, - hintText: AppLocalizations.of(context)!.passwordHint, + labelText: AppLocalizations.of(context).password, + hintText: AppLocalizations.of(context).passwordHint, prefixIcon: const Icon(Icons.lock), border: const OutlineInputBorder(), suffixIcon: IconButton( @@ -137,7 +137,7 @@ class _LoginPageState extends ConsumerState { onFieldSubmitted: (_) => _handleLogin(), validator: (value) { if (value == null || value.isEmpty) { - return AppLocalizations.of(context)!.passwordRequired; + return AppLocalizations.of(context).passwordRequired; } return null; }, @@ -159,7 +159,7 @@ class _LoginPageState extends ConsumerState { ), ), ) - : Text(AppLocalizations.of(context)!.loginButton), + : Text(AppLocalizations.of(context).loginButton), ), ], ), diff --git a/lib/pages/settings_page.dart b/lib/pages/settings_page.dart index cb4486e..ae7be55 100644 --- a/lib/pages/settings_page.dart +++ b/lib/pages/settings_page.dart @@ -11,7 +11,7 @@ class SettingsPage extends ConsumerWidget { final userProfile = ref.watch(userProfileProvider); final languageAsync = ref.watch(languageProvider); final themeMode = ref.watch(themeModeProvider); - final l10n = AppLocalizations.of(context)!; + final l10n = AppLocalizations.of(context); final language = languageAsync.maybeWhen( data: (value) => value, diff --git a/lib/providers/providers.dart b/lib/providers/providers.dart index 17cf033..b4b0947 100644 --- a/lib/providers/providers.dart +++ b/lib/providers/providers.dart @@ -57,11 +57,9 @@ final deliveryRoutesProvider = FutureProvider>((ref) async { query: _EmptyQuery(), fromJson: (json) { // API returns data wrapped in object with "data" field - if (json is Map) { - final data = json['data']; - if (data is List) { - return data.map((r) => DeliveryRoute.fromJson(r as Map)).toList(); - } + final data = json['data']; + if (data is List) { + return data.map((r) => DeliveryRoute.fromJson(r as Map)).toList(); } return []; }, @@ -88,11 +86,9 @@ final deliveriesProvider = FutureProvider.family, int>((ref, rout query: _DeliveriesQuery(routeFragmentId: routeFragmentId), fromJson: (json) { // API returns data wrapped in object with "data" field - if (json is Map) { - final data = json['data']; - if (data is List) { - return data.map((d) => Delivery.fromJson(d as Map)).toList(); - } + final data = json['data']; + if (data is List) { + return data.map((d) => Delivery.fromJson(d as Map)).toList(); } return []; }, @@ -100,9 +96,9 @@ final deliveriesProvider = FutureProvider.family, int>((ref, rout // Log error if API call failed result.whenError((error) { - print('ERROR fetching deliveries for route $routeFragmentId: ${error.message}'); + debugPrint('ERROR fetching deliveries for route $routeFragmentId: ${error.message}'); if (error.originalException != null) { - print('Original exception: ${error.originalException}'); + debugPrint('Original exception: ${error.originalException}'); } }); diff --git a/lib/theme/status_colors.dart b/lib/theme/status_colors.dart index 906e549..fb2e88c 100644 --- a/lib/theme/status_colors.dart +++ b/lib/theme/status_colors.dart @@ -194,12 +194,12 @@ class StatusBadgeWidget extends StatelessWidget { final double fontSize; const StatusBadgeWidget({ - Key? key, + super.key, required this.status, this.showIcon = true, this.showLabel = true, this.fontSize = 12, - }) : super(key: key); + }); @override Widget build(BuildContext context) { @@ -242,11 +242,11 @@ class StatusAccentBar extends StatelessWidget { final double height; const StatusAccentBar({ - Key? key, + super.key, required this.status, this.width = 4, this.height = 60, - }) : super(key: key); + }); @override Widget build(BuildContext context) { diff --git a/lib/utils/logging_interceptor.dart b/lib/utils/logging_interceptor.dart index 5bc3b11..ebc26e5 100644 --- a/lib/utils/logging_interceptor.dart +++ b/lib/utils/logging_interceptor.dart @@ -1,26 +1,27 @@ +import 'package:flutter/foundation.dart'; import 'package:http_interceptor/http_interceptor.dart'; class LoggingInterceptor implements InterceptorContract { @override Future interceptRequest({required BaseRequest request}) async { - print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); - print('📤 REQUEST: ${request.method} ${request.url}'); - print('Headers: ${request.headers}'); + debugPrint('----------------------------------------------------'); + debugPrint('REQUEST: ${request.method} ${request.url}'); + debugPrint('Headers: ${request.headers}'); if (request is Request) { - print('Body: ${request.body}'); + debugPrint('Body: ${request.body}'); } - print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); + debugPrint('----------------------------------------------------'); return request; } @override Future interceptResponse({required BaseResponse response}) async { - print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); - print('📥 RESPONSE: ${response.statusCode} ${response.request?.url}'); + debugPrint('----------------------------------------------------'); + debugPrint('RESPONSE: ${response.statusCode} ${response.request?.url}'); if (response is Response) { - print('Body: ${response.body}'); + debugPrint('Body: ${response.body}'); } - print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); + debugPrint('----------------------------------------------------'); return response; }