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>
63 lines
2 KiB
Dart
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;
|
|
}
|