This commit is contained in:
pahmiudahgede 2025-05-20 01:36:17 +07:00
parent 83e65714ad
commit e0060e244d
5 changed files with 88 additions and 19 deletions

View File

@ -1,3 +1,5 @@
// ignore_for_file: use_build_context_synchronously
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';

View File

@ -4,9 +4,7 @@ import 'package:rijig_mobile/features/cart/repositories/cartitem_repo.dart';
class CartViewModel extends ChangeNotifier { class CartViewModel extends ChangeNotifier {
final CartRepository _repository; final CartRepository _repository;
CartViewModel(this._repository); CartViewModel(this._repository);
List<CartItem> _cartItems = []; List<CartItem> _cartItems = [];
List<CartItem> get cartItems => _cartItems; List<CartItem> get cartItems => _cartItems;

View File

@ -1,10 +1,13 @@
import 'dart:math' as math; import 'dart:math' as math;
import 'package:collection/collection.dart';
import 'package:custom_refresh_indicator/custom_refresh_indicator.dart'; import 'package:custom_refresh_indicator/custom_refresh_indicator.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:rijig_mobile/core/utils/guide.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/globaldata/trash/trash_viewmodel.dart';
import 'package:rijig_mobile/widget/appbar.dart'; import 'package:rijig_mobile/widget/appbar.dart';
import 'package:rijig_mobile/widget/skeletonize.dart'; import 'package:rijig_mobile/widget/skeletonize.dart';
@ -17,11 +20,17 @@ class RequestPickScreen extends StatefulWidget {
} }
class RequestPickScreenState extends State<RequestPickScreen> { class RequestPickScreenState extends State<RequestPickScreen> {
bool isCartLoaded = false;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) async {
Provider.of<TrashViewModel>(context, listen: false).loadCategories(); final trashVM = Provider.of<TrashViewModel>(context, listen: false);
final cartVM = Provider.of<CartViewModel>(context, listen: false);
await trashVM.loadCategories();
await cartVM.loadLocalCart();
setState(() => isCartLoaded = true);
}); });
} }
@ -31,7 +40,7 @@ class RequestPickScreenState extends State<RequestPickScreen> {
return Scaffold( return Scaffold(
backgroundColor: whiteColor, backgroundColor: whiteColor,
appBar: CustomAppBar(judul: "Pilih sampah"), appBar: CustomAppBar(judul: "Pilih Sampah"),
body: CustomMaterialIndicator( body: CustomMaterialIndicator(
onRefresh: () async { onRefresh: () async {
await Provider.of<TrashViewModel>( await Provider.of<TrashViewModel>(
@ -52,28 +61,35 @@ class RequestPickScreenState extends State<RequestPickScreen> {
), ),
); );
}, },
child: Consumer<TrashViewModel>( child: Consumer2<TrashViewModel, CartViewModel>(
builder: (context, viewModel, child) { builder: (context, trashViewModel, cartViewModel, child) {
if (viewModel.isLoading) { if (!isCartLoaded || trashViewModel.isLoading) {
return ListView.builder( return ListView.builder(
shrinkWrap: true, shrinkWrap: true,
itemCount: 5, itemCount: 5,
itemBuilder: (context, index) { itemBuilder: (context, index) => SkeletonCard(),
return SkeletonCard();
},
); );
} }
if (viewModel.errorMessage != null) { if (trashViewModel.errorMessage != null) {
return Center(child: Text(viewModel.errorMessage!)); return Center(child: Text(trashViewModel.errorMessage!));
} }
final categories =
trashViewModel.trashCategoryResponse?.categories ?? [];
return ListView.builder( return ListView.builder(
itemCount: itemCount: categories.length,
viewModel.trashCategoryResponse?.categories.length ?? 0,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final category = final category = categories[index];
viewModel.trashCategoryResponse!.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( return Card(
margin: const EdgeInsets.symmetric( margin: const EdgeInsets.symmetric(
vertical: 10, vertical: 10,
@ -91,7 +107,59 @@ class RequestPickScreenState extends State<RequestPickScreen> {
fit: BoxFit.cover, fit: BoxFit.cover,
), ),
title: Text(category.name), 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,
),
),
],
),
), ),
); );
}, },

View File

@ -74,7 +74,7 @@ packages:
source: hosted source: hosted
version: "1.1.2" version: "1.1.2"
collection: collection:
dependency: transitive dependency: "direct main"
description: description:
name: collection name: collection
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"

View File

@ -9,6 +9,7 @@ environment:
dependencies: dependencies:
carousel_slider: ^5.0.0 carousel_slider: ^5.0.0
collection: ^1.19.1
concentric_transition: ^1.0.3 concentric_transition: ^1.0.3
connectivity_plus: ^6.1.4 connectivity_plus: ^6.1.4
cupertino_icons: ^1.0.8 cupertino_icons: ^1.0.8