diff --git a/lib/features/cart/presentation/screens/cart_screen.dart b/lib/features/cart/presentation/screens/cart_screen.dart index 95da468..a10baba 100644 --- a/lib/features/cart/presentation/screens/cart_screen.dart +++ b/lib/features/cart/presentation/screens/cart_screen.dart @@ -1,3 +1,5 @@ +// ignore_for_file: use_build_context_synchronously + import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; diff --git a/lib/features/cart/presentation/viewmodel/cartitem_vmod.dart b/lib/features/cart/presentation/viewmodel/cartitem_vmod.dart index 0af5923..06cad83 100644 --- a/lib/features/cart/presentation/viewmodel/cartitem_vmod.dart +++ b/lib/features/cart/presentation/viewmodel/cartitem_vmod.dart @@ -4,9 +4,7 @@ import 'package:rijig_mobile/features/cart/repositories/cartitem_repo.dart'; class CartViewModel extends ChangeNotifier { final CartRepository _repository; - CartViewModel(this._repository); - List _cartItems = []; List get cartItems => _cartItems; diff --git a/lib/features/requestpick/presentation/screen/requestpickup_screen.dart b/lib/features/requestpick/presentation/screen/requestpickup_screen.dart index 68b183a..3304d3c 100644 --- a/lib/features/requestpick/presentation/screen/requestpickup_screen.dart +++ b/lib/features/requestpick/presentation/screen/requestpickup_screen.dart @@ -1,10 +1,13 @@ import 'dart:math' as math; +import 'package:collection/collection.dart'; import 'package:custom_refresh_indicator/custom_refresh_indicator.dart'; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:provider/provider.dart'; import 'package:rijig_mobile/core/utils/guide.dart'; +import 'package:rijig_mobile/features/cart/model/cartitem_model.dart'; +import 'package:rijig_mobile/features/cart/presentation/viewmodel/cartitem_vmod.dart'; import 'package:rijig_mobile/globaldata/trash/trash_viewmodel.dart'; import 'package:rijig_mobile/widget/appbar.dart'; import 'package:rijig_mobile/widget/skeletonize.dart'; @@ -17,11 +20,17 @@ class RequestPickScreen extends StatefulWidget { } class RequestPickScreenState extends State { + bool isCartLoaded = false; + @override void initState() { super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - Provider.of(context, listen: false).loadCategories(); + WidgetsBinding.instance.addPostFrameCallback((_) async { + final trashVM = Provider.of(context, listen: false); + final cartVM = Provider.of(context, listen: false); + await trashVM.loadCategories(); + await cartVM.loadLocalCart(); + setState(() => isCartLoaded = true); }); } @@ -31,7 +40,7 @@ class RequestPickScreenState extends State { return Scaffold( backgroundColor: whiteColor, - appBar: CustomAppBar(judul: "Pilih sampah"), + appBar: CustomAppBar(judul: "Pilih Sampah"), body: CustomMaterialIndicator( onRefresh: () async { await Provider.of( @@ -52,28 +61,35 @@ class RequestPickScreenState extends State { ), ); }, - child: Consumer( - builder: (context, viewModel, child) { - if (viewModel.isLoading) { + child: Consumer2( + builder: (context, trashViewModel, cartViewModel, child) { + if (!isCartLoaded || trashViewModel.isLoading) { return ListView.builder( shrinkWrap: true, itemCount: 5, - itemBuilder: (context, index) { - return SkeletonCard(); - }, + itemBuilder: (context, index) => SkeletonCard(), ); } - if (viewModel.errorMessage != null) { - return Center(child: Text(viewModel.errorMessage!)); + if (trashViewModel.errorMessage != null) { + return Center(child: Text(trashViewModel.errorMessage!)); } + final categories = + trashViewModel.trashCategoryResponse?.categories ?? []; + return ListView.builder( - itemCount: - viewModel.trashCategoryResponse?.categories.length ?? 0, + itemCount: categories.length, itemBuilder: (context, index) { - final category = - viewModel.trashCategoryResponse!.categories[index]; + final category = categories[index]; + final cartItems = cartViewModel.cartItems; + final existingItem = cartItems.firstWhereOrNull( + (e) => + e.trashId.trim().toLowerCase() == + category.id.trim().toLowerCase(), + ); + final amount = existingItem?.amount; + return Card( margin: const EdgeInsets.symmetric( vertical: 10, @@ -91,7 +107,59 @@ class RequestPickScreenState extends State { fit: BoxFit.cover, ), title: Text(category.name), - subtitle: Text("${category.price}"), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("Rp${category.price} per kg"), + const SizedBox(height: 6), + (amount != null && amount > 0) + ? Row( + children: [ + IconButton( + onPressed: () { + final newAmount = (amount - 0.25).clamp( + 0.25, + double.infinity, + ); + cartViewModel.addOrUpdateItem( + CartItem( + trashId: category.id, + amount: newAmount, + ), + ); + }, + icon: const Icon(Icons.remove), + ), + Text("${amount.toStringAsFixed(2)} kg"), + IconButton( + onPressed: () { + final newAmount = amount + 0.25; + cartViewModel.addOrUpdateItem( + CartItem( + trashId: category.id, + amount: newAmount, + ), + ); + }, + icon: const Icon(Icons.add), + ), + ], + ) + : ElevatedButton.icon( + onPressed: () { + cartViewModel.addOrUpdateItem( + CartItem(trashId: category.id, amount: 0.25), + ); + }, + icon: const Icon(Icons.add), + label: const Text("Tambah ke Keranjang"), + style: ElevatedButton.styleFrom( + backgroundColor: primaryColor, + foregroundColor: whiteColor, + ), + ), + ], + ), ), ); }, diff --git a/pubspec.lock b/pubspec.lock index 1f369d6..ab92d34 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -74,7 +74,7 @@ packages: source: hosted version: "1.1.2" collection: - dependency: transitive + dependency: "direct main" description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" diff --git a/pubspec.yaml b/pubspec.yaml index ddb0d29..5b9623d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,6 +9,7 @@ environment: dependencies: carousel_slider: ^5.0.0 + collection: ^1.19.1 concentric_transition: ^1.0.3 connectivity_plus: ^6.1.4 cupertino_icons: ^1.0.8