import 'package:flutter/material.dart'; import 'package:material_symbols_icons/symbols.dart'; import '../../i18n/strings.g.dart'; import 'state_messages.dart'; /// Sliver wrapper around [ErrorStateWidget] for use in `CustomScrollView.slivers`. class SliverErrorState extends StatelessWidget { final String message; final VoidCallback? onRetry; final String? retryLabel; const SliverErrorState({super.key, required this.message, this.onRetry, this.retryLabel}); @override Widget build(BuildContext context) => SliverFillRemaining( child: ErrorStateWidget( message: message, icon: Symbols.error_outline_rounded, onRetry: onRetry, retryLabel: retryLabel ?? t.common.retry, ), ); } /// Sliver wrapper around [EmptyStateWidget] for use in `CustomScrollView.slivers`. class SliverEmptyState extends StatelessWidget { final String message; final IconData? icon; final String? subtitle; const SliverEmptyState({super.key, required this.message, required this.icon, this.subtitle}); @override Widget build(BuildContext context) => SliverFillRemaining( child: EmptyStateWidget(message: message, icon: icon, subtitle: subtitle), ); } /// A widget that handles loading, error, empty, and content states /// Provides a consistent UI pattern across the app for data-driven screens class ContentStateBuilder extends StatelessWidget { /// Whether data is currently loading final bool isLoading; /// Error message to display (null if no error) final String? errorMessage; /// The list of items to display final List items; /// Icon to display when the list is empty final IconData emptyIcon; /// Message to display when the list is empty final String emptyMessage; /// Callback when user taps retry button final VoidCallback onRetry; /// Builder for the content when items are available final Widget Function(List items) builder; const ContentStateBuilder({ super.key, required this.isLoading, required this.errorMessage, required this.items, required this.emptyIcon, required this.emptyMessage, required this.onRetry, required this.builder, }); @override Widget build(BuildContext context) { // Loading state (only show loading indicator if items list is empty) if (isLoading && items.isEmpty) { return const Center(child: CircularProgressIndicator()); } // Error state (only show error if items list is empty) if (errorMessage != null && items.isEmpty) { return ErrorStateWidget( message: errorMessage!, icon: Symbols.error_outline_rounded, onRetry: onRetry, retryLabel: t.common.retry, ); } // Empty state if (items.isEmpty) { return EmptyStateWidget(message: emptyMessage, icon: emptyIcon); } // Content state - delegate to builder return builder(items); } }