TIF_NGANJUK_E41212433/screens/AksesAdmin/DaftarBarang.js

353 lines
8.5 KiB
JavaScript

import React, { useState } from "react";
import {
View,
Text,
TextInput,
TouchableOpacity,
Image,
ScrollView,
StyleSheet,
Alert,
} from "react-native";
import * as ImagePicker from "expo-image-picker"; // import image picker
import { Ionicons } from "@expo/vector-icons";
import { useNavigation } from "@react-navigation/native";
const DaftarBarang = () => {
const navigation = useNavigation();
const [items, setItems] = useState([
{
id: 1,
name: "Botol Minum",
coin: 300,
image: require("../../assets/images/botol1.png"),
},
{
id: 2,
name: "Botol Minum Anak",
coin: 350,
image: require("../../assets/images/botol2.png"),
},
]);
const [isEditing, setIsEditing] = useState(false);
const [formItem, setFormItem] = useState({
id: null,
name: "",
coin: "",
image: null,
});
const pickImage = async () => {
// Minta izin akses galeri
const { status } = await ImagePicker.requestMediaLibraryPermissionsAsync();
if (status !== "granted") {
Alert.alert(
"Izin Ditolak",
"Izin akses galeri dibutuhkan untuk memilih foto"
);
return;
}
const result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ImagePicker.MediaTypeOptions.Images,
quality: 1,
});
if (!result.canceled) {
setFormItem({ ...formItem, image: { uri: result.assets[0].uri } });
}
};
const handleEdit = (item) => {
setFormItem(item);
setIsEditing(true);
};
const handleAddItem = () => {
setFormItem({ id: null, name: "", coin: "", image: null });
setIsEditing(true);
};
const handleSubmit = () => {
if (formItem.name === "" || formItem.coin === "") {
Alert.alert("Error", "Nama dan koin wajib diisi");
return;
}
if (formItem.id) {
// Edit
setItems(items.map((i) => (i.id === formItem.id ? { ...formItem } : i)));
} else {
// Tambah
setItems([
...items,
{
...formItem,
id: Date.now(),
image: formItem.image
? formItem.image
: require("../../assets/images/botol1.png"),
},
]);
}
setIsEditing(false);
};
const handleDelete = (id) => {
Alert.alert("Konfirmasi", "Apakah Anda yakin ingin menghapus item ini?", [
{
text: "Batal",
style: "cancel",
},
{
text: "Hapus",
style: "destructive",
onPress: () => {
setItems(items.filter((item) => item.id !== id));
},
},
]);
};
return (
<View style={styles.container}>
<View style={styles.headerRow}>
<TouchableOpacity
style={styles.backButton}
onPress={() => navigation.navigate("TukarKoin")}
>
<Ionicons name="arrow-back" size={28} color="#000" />
</TouchableOpacity>
<Text style={styles.title}>DAFTAR BARANG</Text>
</View>
<TouchableOpacity style={styles.addButton} onPress={handleAddItem}>
<Text style={styles.addButtonText}>+ Tambah Item</Text>
</TouchableOpacity>
{isEditing && (
<View style={styles.form}>
<TextInput
placeholder="Nama Barang"
value={formItem.name}
onChangeText={(text) => setFormItem({ ...formItem, name: text })}
style={styles.input}
/>
<TextInput
placeholder="Jumlah Koin"
keyboardType="numeric"
value={formItem.coin.toString()}
onChangeText={(text) => setFormItem({ ...formItem, coin: text })}
style={styles.input}
/>
{/* Tombol pilih foto */}
<TouchableOpacity style={styles.imagePickerBtn} onPress={pickImage}>
<Text style={styles.imagePickerText}>
{formItem.image ? "Ganti Foto" : "Pilih Foto"}
</Text>
</TouchableOpacity>
{/* Preview foto yang dipilih */}
{formItem.image && (
<Image source={formItem.image} style={styles.previewImage} />
)}
<TouchableOpacity style={styles.submitBtn} onPress={handleSubmit}>
<Text style={styles.submitText}>
{formItem.id ? "Simpan Perubahan" : "Tambah"}
</Text>
</TouchableOpacity>
</View>
)}
<ScrollView showsVerticalScrollIndicator={false}>
<View style={styles.itemGrid}>
{items.map((item) => (
<View key={item.id} style={styles.itemCard}>
<Image source={item.image} style={styles.itemImage} />
<Text style={styles.itemName}>{item.name}</Text>
<View style={styles.coinBoxItem}>
<Text style={styles.itemCoin}>{item.coin} Koin</Text>
</View>
<View style={styles.actionRow}>
<TouchableOpacity
style={styles.editBtn}
onPress={() => handleEdit(item)}
>
<Text style={styles.actionText}>Edit</Text>
</TouchableOpacity>
<TouchableOpacity
style={styles.deleteBtn}
onPress={() => handleDelete(item.id)}
>
<Text style={styles.actionText}>Hapus</Text>
</TouchableOpacity>
</View>
</View>
))}
</View>
</ScrollView>
</View>
);
};
const styles = StyleSheet.create({
container: { flex: 1, padding: 20, backgroundColor: "#fff" },
backButton: { marginBottom: 10 },
title: {
fontSize: 22,
fontWeight: "bold",
color: "#000",
textAlign: "left",
marginBottom: 12,
marginLeft: 20,
marginRight: 50,
},
headerRow: {
flexDirection: "row",
alignItems: "center",
marginBottom: 16,
marginTop: 30,
},
backButton: {
marginRight: 10,
},
title: {
fontSize: 22,
fontWeight: "bold",
color: "#000",
},
// title: {
// fontSize: 26,
// fontWeight: "bold",
// color: "#000",
// marginBottom: 20,
// textAlign: "center",
// marginTop: 30,
// },
addButton: {
backgroundColor: "#2D572C",
paddingVertical: 12,
paddingHorizontal: 20,
borderRadius: 10,
alignSelf: "center",
marginBottom: 20,
},
addButtonText: { color: "white", fontWeight: "bold", fontSize: 16 },
form: {
backgroundColor: "#f9f9f9",
padding: 20,
borderRadius: 12,
marginBottom: 25,
borderWidth: 1,
borderColor: "#d1d1d1",
},
input: {
backgroundColor: "#fff",
padding: 14,
borderRadius: 8,
borderWidth: 1,
borderColor: "#ccc",
marginBottom: 15,
fontSize: 16,
},
imagePickerBtn: {
backgroundColor: "#DDD",
paddingVertical: 12,
borderRadius: 8,
alignItems: "center",
marginBottom: 10,
padding: 10,
width: "40%",
},
imagePickerText: {
color: "BLACK",
fontWeight: "bold",
fontSize: 16,
},
previewImage: {
width: 100,
height: 140,
alignSelf: "center",
marginBottom: 15,
resizeMode: "contain",
borderRadius: 10,
},
submitBtn: {
backgroundColor: "#2D572C",
paddingVertical: 14,
borderRadius: 8,
alignItems: "center",
},
submitText: { color: "white", fontWeight: "bold", fontSize: 16 },
itemGrid: {
flexDirection: "row",
flexWrap: "wrap",
justifyContent: "space-between",
},
itemCard: {
width: "48%",
backgroundColor: "#fff",
borderRadius: 12,
padding: 15,
marginBottom: 20,
elevation: 4,
shadowColor: "#000",
shadowOpacity: 0.1,
shadowRadius: 6,
shadowOffset: { width: 0, height: 3 },
alignItems: "center",
},
itemImage: {
width: 80,
height: 110,
resizeMode: "contain",
marginBottom: 12,
},
itemName: {
fontSize: 18,
fontWeight: "bold",
color: "#2D572C",
marginBottom: 8,
textAlign: "center",
},
coinBoxItem: {
backgroundColor: "#2D572C",
paddingVertical: 6,
paddingHorizontal: 16,
borderRadius: 8,
marginBottom: 10,
},
itemCoin: {
color: "white",
fontWeight: "bold",
fontSize: 16,
},
actionRow: {
flexDirection: "row",
justifyContent: "space-between",
width: "100%",
},
editBtn: {
flex: 1,
backgroundColor: "#4CAF50",
paddingVertical: 10,
borderRadius: 8,
alignItems: "center",
marginRight: 8,
},
deleteBtn: {
flex: 1,
backgroundColor: "#E53935",
paddingVertical: 10,
borderRadius: 8,
alignItems: "center",
},
actionText: { color: "white", fontWeight: "bold", fontSize: 14 },
});
export default DaftarBarang;