build method

  1. @override
Widget build(
  1. BuildContext context
)
override

Builds the UI for a single order card.

Displays the order ID, status dropdown, items, total, and expandable shipping details. Filters items to show only those belonging to the farmer.

Parameters:

Returns: A Widget representing the order card UI.

Implementation

@override
Widget build(BuildContext context) {
  final authService = Provider.of<AuthService>(context, listen: false);
  final farmerId = authService.currentUser!.uid;
  final items = (orderData['items'] as List)
      .map((item) => CartItem.fromMap(item))
      .where((item) => item.farmerId == farmerId)
      .toList();
  final createdAt = (orderData['createdAt'] as Timestamp?)?.toDate();
  final farmerTotal = items.fold<double>(
      0, (sum, item) => sum + (item.price * item.quantity));

  return Card(
    elevation: 4,
    margin: const EdgeInsets.only(bottom: 16),
    child: Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Text(
                'Order #${orderData['orderId'].toString().substring(0, 15)}',
                style: const TextStyle(
                  fontSize: 16,
                  fontWeight: FontWeight.bold,
                ),
              ),
              DropdownButton<String>(
                value: orderData['status'],
                items: [
                  'Pending',
                  'Processing',
                  'Shipped',
                  'Completed',
                  'Cancelled'
                ]
                    .map((status) => DropdownMenuItem(
                          value: status,
                          child: Text(
                            status,
                            style: TextStyle(
                              color: _getStatusColor(status),
                              fontWeight: FontWeight.bold,
                            ),
                          ),
                        ))
                    .toList(),
                onChanged: (newStatus) {
                  if (newStatus != null) {
                    _updateOrderStatus(context, newStatus);
                  }
                },
              ),
            ],
          ),
          const SizedBox(height: 8),
          Text(
            createdAt != null
                ? 'Ordered on: ${createdAt.day}/${createdAt.month}/${createdAt.year}'
                : 'Order Date Unavailable',
            style: const TextStyle(color: Colors.grey),
          ),
          const Divider(height: 16),
          ...items.map((item) => Padding(
                padding: const EdgeInsets.symmetric(vertical: 4),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: [
                    Expanded(
                      child: Text(
                        '${item.productName} x ${item.quantity}',
                        overflow: TextOverflow.ellipsis,
                      ),
                    ),
                    Text(
                        '₹${(item.price * item.quantity).toStringAsFixed(2)}'),
                  ],
                ),
              )),
          const Divider(height: 16),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              const Text(
                'Your Total',
                style: TextStyle(
                  fontWeight: FontWeight.bold,
                  fontSize: 16,
                ),
              ),
              Text(
                '₹${farmerTotal.toStringAsFixed(2)}',
                style: const TextStyle(
                  fontWeight: FontWeight.bold,
                  color: Colors.green,
                  fontSize: 16,
                ),
              ),
            ],
          ),
          const SizedBox(height: 8),
          ExpansionTile(
            title: const Text('Shipping Details'),
            children: [
              ListTile(
                title: Text(orderData['shippingDetails']['name']),
                subtitle: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Text(orderData['shippingDetails']['phone']),
                    Text(orderData['shippingDetails']['address']),
                    Text(
                        '${orderData['shippingDetails']['city']} - ${orderData['shippingDetails']['pinCode']}'),
                  ],
                ),
              ),
            ],
          ),
        ],
      ),
    ),
  );
}