payfrit-app/lib/models/menu_item.dart
John Mizerek f505eeb722 Implement complete cart management system
Add full cart functionality with API integration:
- Created Cart and OrderLineItem models with robust JSON parsing
- Implemented cart API methods (getOrCreateCart, setLineItem, getCart, submitOrder)
- Added cart state management to AppState with item count tracking
- Built cart view screen with item display, quantity editing, and removal
- Added cart badge to menu screen showing item count
- Implemented real add-to-cart logic with recursive modifier handling
- Added category name display in menu browsing
- Fixed API response case sensitivity (ORDER/ORDERLINEITEMS)
- Enhanced MenuItem model with categoryName field

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-29 11:14:19 -08:00

63 lines
2 KiB
Dart

class MenuItem {
final int itemId;
final int categoryId;
final String categoryName;
final String name;
final String description;
final int parentItemId;
final double price;
final bool isActive;
final bool isCheckedByDefault;
final bool requiresChildSelection;
final int maxNumSelectionReq;
final bool isCollapsible;
final int sortOrder;
const MenuItem({
required this.itemId,
required this.categoryId,
required this.categoryName,
required this.name,
required this.description,
required this.parentItemId,
required this.price,
required this.isActive,
required this.isCheckedByDefault,
required this.requiresChildSelection,
required this.maxNumSelectionReq,
required this.isCollapsible,
required this.sortOrder,
});
factory MenuItem.fromJson(Map<String, dynamic> json) {
return MenuItem(
itemId: (json["ItemID"] as num).toInt(),
categoryId: (json["ItemCategoryID"] as num).toInt(),
categoryName: (json["ItemCategoryName"] as String?) ?? "",
name: (json["ItemName"] as String?) ?? "",
description: (json["ItemDescription"] as String?) ?? "",
parentItemId: (json["ItemParentItemID"] as num?)?.toInt() ?? 0,
price: (json["ItemPrice"] as num?)?.toDouble() ?? 0.0,
isActive: _parseBool(json["ItemIsActive"]),
isCheckedByDefault: _parseBool(json["ItemIsCheckedByDefault"]),
requiresChildSelection: _parseBool(json["ItemRequiresChildSelection"]),
maxNumSelectionReq: (json["ItemMaxNumSelectionReq"] as num?)?.toInt() ?? 0,
isCollapsible: _parseBool(json["ItemIsCollapsible"]),
sortOrder: (json["ItemSortOrder"] as num?)?.toInt() ?? 0,
);
}
static bool _parseBool(dynamic value) {
if (value == null) return false;
if (value is bool) return value;
if (value is num) return value != 0;
if (value is String) {
final lower = value.toLowerCase();
return lower == "true" || lower == "1";
}
return false;
}
bool get isRootItem => parentItemId == 0;
bool get isModifier => parentItemId != 0;
}