import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import '../../l10n/app_localizations.dart'; import '../../models/bar_tab.dart'; import '../../models/tab_item.dart'; import '../../utils/easter_eggs.dart'; import '../../utils/money.dart'; import '../../utils/tab_orders.dart'; import 'order_history_list.dart'; class OpenTabHistoryCard extends StatefulWidget { final BarTab tab; const OpenTabHistoryCard({super.key, required this.tab}); @override State createState() => _OpenTabHistoryCardState(); } class _OpenTabHistoryCardState extends State { bool _expanded = false; @override Widget build(BuildContext context) { final tab = widget.tab; final l10n = AppLocalizations.of(context); final locale = Localizations.localeOf(context).toLanguageTag(); final dateFormat = DateFormat.yMMMd(locale).add_jm(); final scheme = Theme.of(context).colorScheme; return Container( decoration: BoxDecoration( color: scheme.primary.withValues(alpha: 0.06), borderRadius: BorderRadius.circular(14), border: Border.all(color: scheme.primary.withValues(alpha: 0.2)), ), clipBehavior: Clip.antiAlias, child: Material( color: Colors.transparent, child: InkWell( onTap: () => setState(() => _expanded = !_expanded), enableFeedback: true, splashFactory: NoSplash.splashFactory, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.symmetric( horizontal: 16, vertical: 14, ), child: Row( children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Text( customerDisplayName(tab.customerName), maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w800, color: scheme.onSurface, ), ), ), const SizedBox(width: 8), Container( padding: const EdgeInsets.symmetric( horizontal: 8, vertical: 3, ), decoration: BoxDecoration( color: scheme.primary.withValues(alpha: 0.12), borderRadius: BorderRadius.circular(999), ), child: Text( l10n.openTabs, style: TextStyle( fontSize: 11, fontWeight: FontWeight.w700, color: scheme.primary, ), ), ), ], ), const SizedBox(height: 2), Text( '${dateFormat.format(tab.openedAt)} ยท ${l10n.tabItemCount(tab.itemCount)}', style: Theme.of(context).textTheme.bodySmall, ), ], ), ), const SizedBox(width: 8), Text( tab.totalInCents.asEuro, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w800, color: scheme.onSurface, ), ), const SizedBox(width: 4), Icon( _expanded ? Icons.expand_less_rounded : Icons.expand_more_rounded, color: scheme.onSurface.withValues(alpha: 0.5), ), ], ), ), AnimatedCrossFade( duration: const Duration(milliseconds: 150), crossFadeState: _expanded ? CrossFadeState.showFirst : CrossFadeState.showSecond, firstChild: Padding( padding: const EdgeInsets.fromLTRB(16, 0, 16, 14), child: Column( children: [ const Divider(height: 1), const SizedBox(height: 8), OrderHistoryList( orders: ordersOfTab(tab, includeRemoved: true), productName: (TabItem item) => item.productName, unitPriceInCents: (TabItem item) => item.unitPriceInCents, ), ], ), ), secondChild: const SizedBox(width: double.infinity), ), ], ), ), ), ); } }