refact
This commit is contained in:
parent
83e65714ad
commit
e0060e244d
|
@ -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';
|
||||
|
|
|
@ -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<CartItem> _cartItems = [];
|
||||
|
||||
List<CartItem> get cartItems => _cartItems;
|
||||
|
|
|
@ -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<RequestPickScreen> {
|
||||
bool isCartLoaded = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
Provider.of<TrashViewModel>(context, listen: false).loadCategories();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
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(
|
||||
backgroundColor: whiteColor,
|
||||
appBar: CustomAppBar(judul: "Pilih sampah"),
|
||||
appBar: CustomAppBar(judul: "Pilih Sampah"),
|
||||
body: CustomMaterialIndicator(
|
||||
onRefresh: () async {
|
||||
await Provider.of<TrashViewModel>(
|
||||
|
@ -52,28 +61,35 @@ class RequestPickScreenState extends State<RequestPickScreen> {
|
|||
),
|
||||
);
|
||||
},
|
||||
child: Consumer<TrashViewModel>(
|
||||
builder: (context, viewModel, child) {
|
||||
if (viewModel.isLoading) {
|
||||
child: Consumer2<TrashViewModel, CartViewModel>(
|
||||
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<RequestPickScreen> {
|
|||
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,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
|
|
|
@ -74,7 +74,7 @@ packages:
|
|||
source: hosted
|
||||
version: "1.1.2"
|
||||
collection:
|
||||
dependency: transitive
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: collection
|
||||
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue