import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:intl/intl.dart'; import '../models/order.dart'; import '../services/order_service.dart'; import 'order_detail_screen.dart'; class OrdersScreen extends StatefulWidget { const OrdersScreen({super.key}); @override State createState() => _OrdersScreenState(); } class _OrdersScreenState extends State { final OrderService _orderService = OrderService(); List _orders = []; bool _isLoading = true; String? _error; @override void initState() { super.initState(); _loadOrders(); } Future _loadOrders() async { setState(() { _isLoading = true; _error = null; }); try { final orders = await _orderService.getOrders(); setState(() { _orders = orders; _isLoading = false; }); } catch (e) { setState(() { _error = e.toString(); _isLoading = false; }); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Meine Bestellungen'), ), body: _isLoading ? const Center(child: CircularProgressIndicator()) : _error != null ? Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Icon(Icons.error_outline, size: 64, color: Colors.red), const SizedBox(height: 16), Text( 'Fehler beim Laden der Bestellungen', style: Theme.of(context).textTheme.titleLarge, ), const SizedBox(height: 8), Padding( padding: const EdgeInsets.symmetric(horizontal: 32), child: Text( _error!, style: Theme.of(context).textTheme.bodyMedium, textAlign: TextAlign.center, ), ), const SizedBox(height: 16), ElevatedButton( onPressed: _loadOrders, child: const Text('Erneut versuchen'), ), ], ), ) : _orders.isEmpty ? Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.shopping_bag_outlined, size: 64, color: Colors.grey[400], ), const SizedBox(height: 16), Text( 'Noch keine Bestellungen', style: Theme.of(context).textTheme.titleLarge?.copyWith( color: Colors.grey[600], ), ), const SizedBox(height: 8), Text( 'Deine Bestellungen werden hier angezeigt', style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Colors.grey[500], ), ), ], ), ) : RefreshIndicator( onRefresh: _loadOrders, child: ListView.builder( padding: const EdgeInsets.all(16), itemCount: _orders.length, itemBuilder: (context, index) { final order = _orders[index]; return _buildOrderCard(order); }, ), ), ); } Widget _buildOrderCard(Order order) { final dateFormat = DateFormat('dd.MM.yyyy'); final statusColor = _getStatusColor(order.status); return Card( margin: const EdgeInsets.only(bottom: 12), child: InkWell( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => OrderDetailScreen(order: order), ), ); }, child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Bestellung #${order.id}', style: Theme.of(context).textTheme.titleMedium?.copyWith( fontWeight: FontWeight.bold, ), ), const SizedBox(height: 4), Text( dateFormat.format(order.dateCreated), style: Theme.of(context).textTheme.bodySmall?.copyWith( color: Colors.grey[600], ), ), ], ), Container( padding: const EdgeInsets.symmetric( horizontal: 12, vertical: 6, ), decoration: BoxDecoration( color: statusColor.withOpacity(0.1), borderRadius: BorderRadius.circular(12), border: Border.all(color: statusColor), ), child: Text( order.statusDisplay, style: TextStyle( color: statusColor, fontWeight: FontWeight.bold, fontSize: 12, ), ), ), ], ), const SizedBox(height: 12), // Produktvorschau if (order.items.isNotEmpty) ...[ Row( children: [ if (order.items[0].imageUrl != null) ClipRRect( borderRadius: BorderRadius.circular(4), child: CachedNetworkImage( imageUrl: order.items[0].imageUrl!, width: 40, height: 40, fit: BoxFit.cover, errorWidget: (context, url, error) => Container( width: 40, height: 40, color: Colors.grey[300], child: const Icon(Icons.image_not_supported, size: 20), ), ), ), const SizedBox(width: 8), Expanded( child: Text( order.items.length == 1 ? order.items[0].name : '${order.items[0].name} + ${order.items.length - 1} weitere', style: Theme.of(context).textTheme.bodyMedium, maxLines: 1, overflow: TextOverflow.ellipsis, ), ), ], ), const SizedBox(height: 12), ], // Gesamtsumme Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Gesamtsumme:', style: Theme.of(context).textTheme.bodyMedium, ), Text( '${order.total} ${order.currency}', style: Theme.of(context).textTheme.titleMedium?.copyWith( color: const Color(0xFF8B6F47), fontWeight: FontWeight.bold, ), ), ], ), ], ), ), ), ); } Color _getStatusColor(String status) { switch (status) { case 'completed': return Colors.green; case 'processing': return Colors.blue; case 'pending': return Colors.orange; case 'on-hold': return Colors.amber; case 'cancelled': return Colors.red; case 'refunded': return Colors.purple; case 'failed': return Colors.red; default: return Colors.grey; } } }