437 lines
23 KiB
Dart
437 lines
23 KiB
Dart
import 'package:dikantin/app/data/models/search_model.dart';
|
|
import 'package:dikantin/app/modules/utils/formatDate.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:google_fonts/google_fonts.dart';
|
|
import 'package:lottie/lottie.dart';
|
|
import 'package:shimmer/shimmer.dart';
|
|
import '../../data/models/kantin_model.dart';
|
|
import '../../data/models/menu_model.dart';
|
|
import '../../data/providers/services.dart';
|
|
import '../home/controllers/home_controller.dart';
|
|
import '../home/controllers/kantin_controller.dart';
|
|
|
|
class Kantin extends StatefulWidget {
|
|
const Kantin({Key? key}) : super(key: key);
|
|
|
|
@override
|
|
State<Kantin> createState() => _KantinState();
|
|
}
|
|
|
|
class _KantinState extends State<Kantin> {
|
|
final KantinController controller = Get.put(KantinController());
|
|
final HomeController homeController = Get.find<HomeController>();
|
|
|
|
void buildBottomSheet(Datasearch menuData, String harga) {
|
|
Get.bottomSheet(
|
|
MediaQuery(
|
|
data: MediaQuery.of(context).copyWith(
|
|
textScaleFactor: MediaQuery.of(context).textScaleFactor.clamp(1.0, 1.15),),
|
|
child: Container(
|
|
height: MediaQuery.of(context).size.height,
|
|
color: Colors.white,
|
|
padding: const EdgeInsets.all(16),
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Container(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Align(
|
|
alignment: Alignment.topRight,
|
|
child: IconButton(
|
|
icon: const Icon(Icons.close,
|
|
color: Colors.black, size: 25),
|
|
onPressed: () {
|
|
Get.back(); // Tutup BottomSheet
|
|
},
|
|
),
|
|
),
|
|
Container(
|
|
height: MediaQuery.of(context).size.height * 0.2,
|
|
padding: const EdgeInsets.all(8),
|
|
decoration: BoxDecoration(
|
|
borderRadius:
|
|
const BorderRadius.all(Radius.circular(15)),
|
|
image: DecorationImage(
|
|
image: NetworkImage(
|
|
Api.gambar + menuData.foto.toString()),
|
|
fit: BoxFit.cover,
|
|
),
|
|
),
|
|
),
|
|
const SizedBox(
|
|
height: 10,
|
|
),
|
|
Text(
|
|
menuData.nama ?? '',
|
|
style: GoogleFonts.poppins(
|
|
textStyle: const TextStyle(
|
|
fontSize: 16,
|
|
fontWeight: FontWeight.w600,
|
|
color: Colors.black87,
|
|
),
|
|
),
|
|
),
|
|
const SizedBox(height: 10),
|
|
Text(
|
|
'Harga: $harga',
|
|
style: GoogleFonts.poppins(
|
|
textStyle: const TextStyle(
|
|
fontSize: 15,
|
|
fontWeight: FontWeight.w500,
|
|
color: Colors.black,
|
|
),
|
|
),
|
|
),
|
|
const SizedBox(height: 10),
|
|
],
|
|
),
|
|
),
|
|
Align(
|
|
alignment: Alignment.bottomRight,
|
|
child: Container(
|
|
child: ElevatedButton(
|
|
onPressed: () {
|
|
// Tambahkan aksi yang ingin dilakukan saat tombol ditekan
|
|
homeController.addToCart(
|
|
menuData, homeController.catatanController.text);
|
|
homeController.catatanController
|
|
.clear(); // Tutup BottomSheet
|
|
},
|
|
style: ButtonStyle(
|
|
backgroundColor: MaterialStateProperty.all<Color>(Colors
|
|
.blue), // Mengatur warna latar belakang menjadi biru
|
|
),
|
|
child: Text(
|
|
'Masukkan Keranjang',
|
|
style: GoogleFonts.poppins(
|
|
textStyle: const TextStyle(
|
|
fontSize: 15,
|
|
fontWeight: FontWeight.normal,
|
|
color: Colors.white,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
double textScaleFactor = MediaQuery.of(context).textScaleFactor;
|
|
|
|
const baseColorHex = 0xFFE0E0E0;
|
|
const highlightColorHex = 0xFFC0C0C0;
|
|
final mediaHeight =
|
|
MediaQuery.of(context).size.height - MediaQuery.of(context).padding.top;
|
|
final query = MediaQuery.of(context);
|
|
|
|
return MediaQuery(
|
|
data: query.copyWith(
|
|
textScaleFactor: query.textScaleFactor.clamp(1.0, 1.15),),
|
|
child: RefreshIndicator(
|
|
onRefresh: () async {
|
|
await homeController.refreshData();
|
|
},
|
|
child: SingleChildScrollView(
|
|
child: Padding(
|
|
padding: const EdgeInsets.only(left: 15),
|
|
child: Column(
|
|
children: [
|
|
Obx(() {
|
|
if (controller.isLoading.value) {
|
|
return Shimmer.fromColors(
|
|
baseColor: const Color(baseColorHex),
|
|
highlightColor: const Color(highlightColorHex),
|
|
child: SizedBox(
|
|
height: mediaHeight * 0.40,
|
|
child: ListView.builder(
|
|
shrinkWrap: true,
|
|
itemCount: 5,
|
|
scrollDirection: Axis.horizontal,
|
|
itemBuilder: (BuildContext context, index) {
|
|
return Container(
|
|
padding: const EdgeInsets.all(5),
|
|
width: MediaQuery.of(context).size.width * 0.5,
|
|
child: Stack(
|
|
children: [
|
|
Container(
|
|
decoration: const BoxDecoration(
|
|
color: Color(baseColorHex),
|
|
borderRadius:
|
|
BorderRadius.all(Radius.circular(10)),
|
|
),
|
|
),
|
|
Center(
|
|
child: Column(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.center,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.center,
|
|
children: [
|
|
Shimmer.fromColors(
|
|
baseColor: Colors.transparent,
|
|
highlightColor:
|
|
const Color(highlightColorHex),
|
|
child: Container(
|
|
width: 100,
|
|
height: 20,
|
|
color: const Color(baseColorHex),
|
|
),
|
|
),
|
|
const SizedBox(height: 10),
|
|
Shimmer.fromColors(
|
|
baseColor: Colors.transparent,
|
|
highlightColor:
|
|
const Color(0x0ff67667),
|
|
child: Container(
|
|
width: 150,
|
|
height: 20,
|
|
color: const Color(baseColorHex),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
},
|
|
),
|
|
),
|
|
);
|
|
} else if (controller.kantinResults.isEmpty) {
|
|
return SizedBox(
|
|
height: mediaHeight * 0.25,
|
|
child: Center(
|
|
child:
|
|
Lottie.asset('assets/search.json', repeat: true),
|
|
));
|
|
} else {
|
|
return ListView.builder(
|
|
shrinkWrap: true,
|
|
physics: const ScrollPhysics(),
|
|
itemCount: controller.kantinResults.length,
|
|
itemBuilder: (BuildContext context, index) {
|
|
final kantin = controller.kantinResults[index];
|
|
final menuKantin = controller.menuKantinResults
|
|
.where((menu) => menu.idKantin == kantin.idKantin)
|
|
.toList();
|
|
return Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
const SizedBox(height: 8),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Text(
|
|
kantin.nama.toString(),
|
|
style: GoogleFonts.poppins(
|
|
textStyle: const TextStyle(
|
|
fontSize: 18,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
SizedBox(
|
|
height:
|
|
280, // Ubah tinggi container sesuai kebutuhan
|
|
child: ListView.builder(
|
|
scrollDirection: Axis.horizontal,
|
|
itemCount: menuKantin.length,
|
|
shrinkWrap: true,
|
|
physics: const ScrollPhysics(),
|
|
itemBuilder: (context, index) {
|
|
final menu = menuKantin[index];
|
|
final harga = menu.harga ?? 0;
|
|
final current = harga.toRupiah();
|
|
|
|
return GestureDetector(
|
|
onTap: () {
|
|
buildBottomSheet(menu, current);
|
|
},
|
|
child: Card(
|
|
color: Colors.white,
|
|
clipBehavior: Clip.antiAlias,
|
|
elevation: 4,
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: const BorderRadius.all(
|
|
Radius.circular(10)),
|
|
side: BorderSide(
|
|
color: Colors.grey.shade200),
|
|
),
|
|
child: SizedBox(
|
|
width: 150,
|
|
child: Column(
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: [
|
|
Container(
|
|
height: 110,
|
|
alignment: Alignment.topRight,
|
|
padding: const EdgeInsets.all(8),
|
|
decoration: BoxDecoration(
|
|
borderRadius:
|
|
const BorderRadius.only(
|
|
topLeft: Radius.circular(10),
|
|
topRight: Radius.circular(10),
|
|
),
|
|
image: DecorationImage(
|
|
image: NetworkImage(
|
|
Api.gambar +
|
|
menu.foto.toString()),
|
|
fit: BoxFit.cover,
|
|
),
|
|
),
|
|
),
|
|
Expanded(
|
|
child: Padding(
|
|
padding:
|
|
const EdgeInsets.all(10.0),
|
|
child: Column(
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
mainAxisAlignment:
|
|
MainAxisAlignment
|
|
.spaceEvenly,
|
|
children: [
|
|
Text(
|
|
maxLines: 3,
|
|
overflow:
|
|
TextOverflow.ellipsis,
|
|
menu.nama ?? '',
|
|
style: const TextStyle(
|
|
fontSize: 14,
|
|
color: Colors.black,
|
|
fontWeight:
|
|
FontWeight.w500,
|
|
),
|
|
),
|
|
Text(
|
|
menu.namaKantin ?? '',
|
|
style: const TextStyle(
|
|
fontSize: 14,
|
|
color: Colors.black,
|
|
fontWeight:
|
|
FontWeight.w500,
|
|
),
|
|
),
|
|
Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment
|
|
.spaceBetween,
|
|
children: [
|
|
Text(
|
|
harga.toRupiah(),
|
|
style:
|
|
const TextStyle(
|
|
fontSize: 14,
|
|
color: Colors.black,
|
|
fontWeight:
|
|
FontWeight.w500,
|
|
),
|
|
),
|
|
Obx(() =>
|
|
homeController
|
|
.cartList
|
|
.contains(
|
|
menu)
|
|
? SizedBox(
|
|
height: 30,
|
|
width: 30,
|
|
child: Ink(
|
|
decoration:
|
|
const ShapeDecoration(
|
|
color: Colors
|
|
.blue,
|
|
shape:
|
|
CircleBorder(),
|
|
),
|
|
child: IconButton
|
|
.filled(
|
|
padding:
|
|
EdgeInsets.zero,
|
|
onPressed:
|
|
() {
|
|
homeController
|
|
.removeFromCart(menu);
|
|
},
|
|
iconSize:
|
|
18,
|
|
icon: const Icon(
|
|
color:
|
|
Colors.white,
|
|
Icons.remove),
|
|
),
|
|
),
|
|
)
|
|
: SizedBox(
|
|
height: 30,
|
|
width: 30,
|
|
child: Ink(
|
|
decoration:
|
|
const ShapeDecoration(
|
|
color: Colors
|
|
.blue,
|
|
shape:
|
|
CircleBorder(),
|
|
),
|
|
child:
|
|
IconButton(
|
|
padding:
|
|
EdgeInsets.zero,
|
|
onPressed:
|
|
() {
|
|
homeController.addToCart(
|
|
menu,
|
|
homeController.catatanController.text);
|
|
homeController
|
|
.catatanController
|
|
.clear();
|
|
},
|
|
iconSize:
|
|
18,
|
|
icon: const Icon(
|
|
color:
|
|
Colors.white,
|
|
Icons.add),
|
|
),
|
|
),
|
|
))
|
|
],
|
|
)
|
|
],
|
|
),
|
|
),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
},
|
|
),
|
|
),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|