import { useEffect, useState } from "react"; import { Alert, Image, KeyboardAvoidingView, Modal, Platform, Pressable, ScrollView, Switch, Text, TextInput, View, } from "react-native"; import { Ionicons } from "@expo/vector-icons"; import * as Haptics from "expo-haptics"; import * as ImagePicker from "expo-image-picker"; import type { MenuItemData } from "./MenuItemCard"; interface ItemDetailSheetProps { item: MenuItemData | null; visible: boolean; onClose: () => void; onSave: (updatedItem: MenuItemData) => Promise; onDelete: (itemId: string) => Promise; } export function ItemDetailSheet({ item, visible, onClose, onSave, onDelete, }: ItemDetailSheetProps) { const [name, setName] = useState(""); const [price, setPrice] = useState(""); const [description, setDescription] = useState(""); const [imageUrl, setImageUrl] = useState(null); const [isActive, setIsActive] = useState(true); const [saving, setSaving] = useState(false); const [deleting, setDeleting] = useState(false); useEffect(() => { if (item) { setName(item.name); setPrice(String(item.price)); setDescription(item.description ?? ""); setImageUrl(item.image_url ?? null); setIsActive(item.is_active); } }, [item]); if (!item) return null; async function handlePickImage() { Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light).catch(() => {}); const permission = await ImagePicker.requestMediaLibraryPermissionsAsync(); if (!permission.granted) { Alert.alert("İzin Gerekli", "Ürün görseli seçebilmek için fotoğraf galerisi erişim izni gereklidir."); return; } const result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ["images"], allowsEditing: true, aspect: [4, 3], quality: 0.6, base64: true, }); if (!result.canceled && result.assets[0]) { const asset = result.assets[0]; if (asset.base64) { setImageUrl(`data:image/jpeg;base64,${asset.base64}`); } else { setImageUrl(asset.uri); } } } async function handleSave() { const parsedPrice = Number(price.replace(",", ".")); if (!name.trim()) { Alert.alert("Eksik Bilgi", "Lütfen ürün adını giriniz."); return; } if (Number.isNaN(parsedPrice) || parsedPrice < 0) { Alert.alert("Geçersiz Fiyat", "Lütfen geçerli bir fiyat giriniz."); return; } setSaving(true); try { await onSave({ ...item!, name: name.trim(), price: parsedPrice, description: description.trim() || null, image_url: imageUrl || null, is_active: isActive, }); Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success).catch(() => {}); onClose(); } catch (err) { Alert.alert("Hata", err instanceof Error ? err.message : "Kaydedilemedi."); } finally { setSaving(false); } } function confirmDelete() { Alert.alert( "Ürünü Sil", `"${item?.name}" menüden silinecek. Emin misiniz?`, [ { text: "Vazgeç", style: "cancel" }, { text: "Sil", style: "destructive", onPress: async () => { setDeleting(true); try { await onDelete(item!.id); Haptics.notificationAsync(Haptics.NotificationFeedbackType.Warning).catch(() => {}); onClose(); } catch (err) { Alert.alert("Hata", err instanceof Error ? err.message : "Silinemedi."); } finally { setDeleting(false); } }, }, ], ); } return ( {/* Header Handle & Bar */} Ürün Detayları {/* Availability Toggle Box */} {isActive ? "Menüde Aktif & Siparişe Açık" : "Tükendi / Menüde Gizli"} {isActive ? "Müşteriler bu ürünü QR menüde görebilir." : "Müşteriler ürünü Tükendi olarak görür."} { Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium).catch(() => {}); setIsActive(val); }} trackColor={{ false: "#D6D3D1", true: "#059669" }} thumbColor="#FFFFFF" /> {/* Image Picker / Preview */} Ürün Fotoğrafı {imageUrl ? ( setImageUrl(null)} style={{ position: "absolute", top: 10, right: 10, backgroundColor: "rgba(0,0,0,0.65)", borderRadius: 14, padding: 6, }} > Değiştir ) : ( ({ height: 100, borderRadius: 14, borderWidth: 1.5, borderStyle: "dashed", borderColor: "#D6D3D1", backgroundColor: "#FAF8F5", alignItems: "center", justifyContent: "center", gap: 6, opacity: pressed ? 0.8 : 1, })} > Galeriden Fotoğraf Seç )} {/* Name Input */} Ürün Adı * {/* Price Input */} Fiyat (₺) * {/* Description Input */} Açıklama / Malzemeler {/* Action Buttons */} ({ backgroundColor: "#1C1917", paddingVertical: 16, borderRadius: 14, alignItems: "center", opacity: pressed || saving ? 0.85 : 1, shadowColor: "#000", shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.1, shadowRadius: 6, })} > {saving ? "Kaydediliyor..." : "Değişiklikleri Kaydet"} ({ backgroundColor: "#FEF2F2", borderWidth: 1, borderColor: "#FEE2E2", paddingVertical: 14, borderRadius: 14, alignItems: "center", opacity: pressed || deleting ? 0.85 : 1, })} > {deleting ? "Siliniyor..." : "Bu Ürünü Menüden Sil"} ); }