import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:get/get.dart'; import 'dart:async'; import 'dart:convert'; import 'package:http/http.dart' as http; // import 'package:piring/dashboard/dashboard.dart'; // import 'package:piring/kalori/kalorirvisi.dart'; // import 'package:piring/model/user.dart'; import 'package:piring_baru/kalori/kalorirvisi.dart'; import 'package:piring_baru/model/user.dart'; import 'package:shared_preferences/shared_preferences.dart'; class RevTambah extends StatefulWidget { final String item; const RevTambah({super.key, required this.item}); @override State createState() => _RevTambahState(); } class _RevTambahState extends State { List data = []; List> selectedItems = []; double totalEnergi = 0.0; // Tambahkan variabel total energi List makanan = []; // Array untuk nama makanan terpilih List jumlah = []; // Array untuk kuantitas makanan terpilih String filterText = ''; String Id = ''; Map>> groupedData = {}; // Fungsi untuk mendapatkan data dari API Future fetchData() async { Uri url = Uri.parse('https://isipiringku.esolusindo.com/api/Makanan/makanan'); final response = await http.get(url); if (response.statusCode == 200) { data = json.decode(response.body)['response']; groupedData = groupData(data); setState(() { data = data; }); } else { throw Exception('Gagal memuat data'); } } void updateTotalEnergi() { double newTotalEnergi = 0.0; for (int i = 0; i < makanan.length; i++) { int index = data.indexWhere((item) => item['id_makanan'] == makanan[i]); if (index != -1) { double energi = double.parse(data[index]['energi']); newTotalEnergi += energi * jumlah[i]; } } setState(() { totalEnergi = newTotalEnergi; }); } void addItem(Map item) { String idMakanan = item['id_makanan']; int index = makanan.indexOf(idMakanan); if (index != -1) { jumlah[index]++; } else { makanan.add(idMakanan); jumlah.add(1); } updateTotalEnergi(); } void removeItem(int index) { makanan.removeAt(index); jumlah.removeAt(index); updateTotalEnergi(); } void checkArrays() { print('Array Makanan: $makanan'); print('Array Jumlah: $jumlah'); } void showDetailDialog(Map item) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( title: Text(item['nama_makanan']), content: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Energi: ${item['energi']}'), Text('Karbohidrat: ${item['karbohidrat']}'), Text('Protein: ${item['protein']}'), Text('Lemak: ${item['lemak']}'), // Tambahkan detail lainnya sesuai kebutuhan ], ), actions: [ TextButton( onPressed: () { Navigator.of(context).pop(); }, child: Text('Tutup'), ), ], ); }, ); } List filteredData() { return data .where((item) => item['nama_makanan'] .toLowerCase() .contains(filterText.toLowerCase())) .toList(); } bool isAtLeastOneItemSelectedInEachCategory() { Map categorySelectedStatus = {}; // Inisialisasi status seleksi kategori for (String idMakanan in makanan) { int index = data.indexWhere((item) => item['id_makanan'] == idMakanan); if (index != -1) { String kategori = data[index]['nama_kategori']; categorySelectedStatus[kategori] = true; } } // Periksa apakah setiap kategori memiliki setidaknya satu item yang dipilih for (String kategori in groupedData.keys) { if (categorySelectedStatus[kategori] != true) { return false; // Ada kategori yang tidak memiliki item yang dipilih } } return true; // Setiap kategori memiliki setidaknya satu item yang dipilih } Future cekkirim() async { if (!isAtLeastOneItemSelectedInEachCategory()) { // Ada item yang tidak memiliki kategori showDialog( context: context, builder: (BuildContext context) { return AlertDialog( title: Text('Peringatan'), content: Text('Ada Kategori makanan yang belum anda pilih. Lanjutkan?'), actions: [ TextButton( onPressed: () { Navigator.of(context).pop(); }, child: Text('Batal'), ), TextButton( onPressed: () { // Lanjutkan dengan mengirim data ke API postDataToAPI(); Navigator.of(context).pop(); }, child: Text('Ya'), ), ], ); }, ); } else { // Semua item memiliki kategori, lanjutkan dengan mengirim data ke API postDataToAPI(); } } Future postDataToAPI() async { final String apiUrl = "https://isipiringku.esolusindo.com/api/Konsumsi/Konsumsi"; // Membuat objek body yang berisi parameter yang akan dikirimkan ke API final Map data = { "id_user": Id, "total_kalori": totalEnergi, "keterangan": widget.item, "bahan_makanan_nama_makanan": makanan, "kuantitas": jumlah, }; // Mengirim permintaan POST ke API final response = await http.post( Uri.parse(apiUrl), body: jsonEncode(data), headers: { "Content-Type": "application/json", }, ); if (response.statusCode == 200) { print("Data berhasil dikirim ke API"); print("Respon API: ${response.body}"); Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => RevKalori(), )); Fluttertoast.showToast( msg: "Berhasil Tambahkan Data", backgroundColor: Colors.green, toastLength: Toast.LENGTH_SHORT); } else { throw Exception("Gagal mengirim data ke API"); } } Future loadUserData() async { final prefs = await SharedPreferences.getInstance(); final userDataString = prefs.getString('user_data'); if (userDataString != null) { final userData = UserData.fromJson(json.decode(userDataString)); print(userData.nama); setState(() { Id = userData.idUser.toString(); }); } } Map>> groupData(List data) { // Membuat map untuk mengelompokkan makanan berdasarkan kategori Map>> groupedData = {}; for (Map item in data) { String kategori = item['nama_kategori']; if (groupedData.containsKey(kategori)) { groupedData[kategori]!.add(item); } else { groupedData[kategori] = [item]; } } return groupedData; } @override void initState() { super.initState(); fetchData(); } @override Widget build(BuildContext context) { return Scaffold( body: SingleChildScrollView( child: Stack(children: [ Container( height: 130, width: double.infinity, decoration: BoxDecoration( image: DecorationImage( image: AssetImage('assets/images/head2.jpg'), fit: BoxFit.cover)), ), SafeArea( child: Padding( padding: EdgeInsets.symmetric(horizontal: 15.0), child: Container( width: MediaQuery.of(context).size.width, child: Stack( children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding(padding: EdgeInsets.only(top: 64)), SizedBox(height: 20), Center( child: Container( width: MediaQuery.of(context).size.height * 0.4, height: 30, decoration: BoxDecoration( gradient: LinearGradient( colors: [ Color.fromARGB(255, 250, 154, 0), Color.fromARGB(255, 246, 80, 20), Color.fromARGB(255, 235, 38, 16), ], ), borderRadius: BorderRadius.circular(30), boxShadow: kElevationToShadow[1], ), padding: const EdgeInsets.symmetric( horizontal: 5, vertical: 0, ), child: Center( child: Text( 'Kalori Harian', style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, ), ), ), ), ), Column( children: [ Padding( padding: const EdgeInsets.all(10.0), child: TextFormField( decoration: InputDecoration( labelText: 'Filter Nama Makanan', ), onChanged: (value) { setState(() { filterText = value; }); }, ), ), Container( height: 200, child: Expanded( child: ListView.builder( itemCount: groupedData.length, itemBuilder: (context, index) { String kategori = groupedData.keys.elementAt(index); List>? makananKategori = groupedData[kategori]; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.all(8.0), child: Text( kategori, // Menampilkan judul kategori style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, ), ), ), ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), itemCount: makananKategori?.length, itemBuilder: (context, subIndex) { Map item = makananKategori![subIndex]; return Card( child: ExpansionTile( title: Text( item['nama_makanan']), children: [ ListTile( title: Text( 'Energi: ${item['energi']}'), subtitle: Column( crossAxisAlignment: CrossAxisAlignment .start, children: [ Text( 'Karbohidrat: ${item['karbohidrat']}'), Text( 'Protein: ${item['protein']}'), Text( 'Lemak: ${item['lemak']}'), ], ), ), ], trailing: Row( mainAxisSize: MainAxisSize.min, children: [ IconButton( icon: Icon(Icons.add), onPressed: () { addItem(item); }, ), IconButton( icon: Icon(Icons.remove), onPressed: () { if (makanan .isNotEmpty) { removeItem( makanan.length - 1); } }, ), IconButton( icon: Icon(Icons .remove_red_eye), onPressed: () { showDetailDialog( item); }, ), ], ), ), ); }, ), ], ); }, ), ), ), SizedBox( height: 16.0, ), Text('Item yang Dipilih:'), Column( children: makanan.asMap().entries.map((entry) { int index = entry.key; String idMakanan = entry.value; int qty = jumlah[index]; int dataIdx = data.indexWhere((item) => item['id_makanan'] == idMakanan); if (dataIdx != -1) { Map item = data[dataIdx]; return ListTile( title: Text( '${item['nama_makanan']} (${qty}x)'), subtitle: Text( 'Energi: ${double.parse(item['energi']) * qty}'), ); } else { return SizedBox .shrink(); // Item tidak ditemukan dalam data } }).toList(), ), Text('Total Energi: $totalEnergi'), SizedBox( height: 16.0, ), ElevatedButton( onPressed: cekkirim, child: Text('Simpan'), ), ], ), ], ), ], ), )), ), ]), ), ); } }