// Ayarlar Sayfası function SettingsPage({ settings, onUpdate }) { const { useState, useEffect, useMemo } = React; const [diplomaNotu, setDiplomaNotu] = useState(settings?.diploma_notu || 0); const [hedefPuan, setHedefPuan] = useState(settings?.hedef_puan || 0); const [hedefSiralama, setHedefSiralama] = useState(settings?.hedef_siralama || 0); const [saving, setSaving] = useState(false); const [message, setMessage] = useState(''); useEffect(() => { if (settings) { setDiplomaNotu(settings.diploma_notu || 0); setHedefPuan(settings.hedef_puan || 0); setHedefSiralama(settings.hedef_siralama || 0); } }, [settings]); const obp = useMemo(() => { const calc = obpFromDiploma(diplomaNotu); return calc; }, [diplomaNotu]); const handleSave = async () => { setSaving(true); setMessage(''); const result = await apiCall('/settings.php', { method: 'POST', body: JSON.stringify({ diploma_notu: diplomaNotu, hedef_puan: hedefPuan, hedef_siralama: hedefSiralama, alan: 'SAY' }), }); if (result.success) { setMessage('✅ Ayarlar başarıyla kaydedildi!'); onUpdate(); } else { setMessage('❌ Hata: ' + result.message); } setSaving(false); }; return (

⚙️ Ayarlar

{/* Diploma Notu */}

Diploma Bilgileri

setDiplomaNotu(Number(e.target.value))} min="0" max="100" step="0.01" className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-gray-700 input-field" />
OBS Puanınız (500'lük)
{round2(obp.obp)}
YKS'ye Katkısı
+{round2(obp.add)}
💡 OBS Puanı = Diploma Notu × 5
💡 YKS Katkısı = OBS Puanı × 0.12 = Diploma Notu × 0.6
{/* Hedefler */}

Hedefleriniz

setHedefPuan(Number(e.target.value))} min="0" max="600" step="0.01" className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-gray-700 input-field" />
setHedefSiralama(Number(e.target.value))} min="0" className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-gray-700 input-field" />
{/* Kaydet Butonu */}
{message && (
{message}
)}
); } // Denemeler Listesi Sayfası function ExamsPage({ settings }) { const { useState, useEffect } = React; const [exams, setExams] = useState([]); const [loading, setLoading] = useState(true); const [selectedExam, setSelectedExam] = useState(null); const [editingExam, setEditingExam] = useState(null); const [isSavingEdit, setIsSavingEdit] = useState(false); const [editError, setEditError] = useState(''); useEffect(() => { loadExams(); }, []); const loadExams = async () => { setLoading(true); try { const result = await apiCall('/exam.php'); if (result.success && result.data && Array.isArray(result.data.exams)) { const fixedExams = result.data.exams.map((exam, index) => { const realId = Number(exam.id); const hasRealId = Number.isInteger(realId) && realId > 0; const fallbackId = `tmp-${exam.olusturma_tarihi || exam.deneme_tarihi || 'exam'}-${index}`; return { ...exam, id: hasRealId ? realId : fallbackId, realId: hasRealId ? realId : null, }; }); setExams(fixedExams); } else { setExams([]); } } catch (error) { console.error('Denemeler yüklenirken hata:', error); setExams([]); } finally { setLoading(false); } }; const hasAytData = (exam) => { if (!exam) return false; const aytFields = [ 'ayt_toplam_net', 'ayt_puan', 'ayt_mat_dogru', 'ayt_mat_yanlis', 'ayt_fizik_dogru', 'ayt_fizik_yanlis', 'ayt_kimya_dogru', 'ayt_kimya_yanlis', 'ayt_biyoloji_dogru', 'ayt_biyoloji_yanlis' ]; return aytFields.some(field => Number(exam[field]) > 0); }; const startEdit = (exam) => { if (!exam) return; setEditingExam({ id: exam.id, realId: exam.realId, deneme_adi: exam.deneme_adi, deneme_tarihi: exam.deneme_tarihi, }); setEditError(''); }; const cancelEdit = () => { setEditingExam(null); setIsSavingEdit(false); setEditError(''); }; const saveEdit = async () => { if (!editingExam) return; const name = editingExam.deneme_adi?.trim(); if (!name) { setEditError('Deneme adı boş olamaz'); return; } const realId = editingExam.realId || editingExam.id; if (!realId) { setEditError('Bu denemenin ID bilgisi bulunamadı.'); return; } setIsSavingEdit(true); setEditError(''); const payload = { deneme_adi: name, deneme_tarihi: editingExam.deneme_tarihi, }; const result = await apiCall(`/exam.php?id=${realId}`, { method: 'PUT', body: JSON.stringify(payload), }); if (result.success) { setExams(prevExams => prevExams.map(exam => { if (exam.id === editingExam.id) { return { ...exam, deneme_adi: name, deneme_tarihi: editingExam.deneme_tarihi, }; } return exam; })); cancelEdit(); } else { setEditError(result.message || 'Güncelleme başarısız oldu'); setIsSavingEdit(false); } }; const handleDelete = async (examKey) => { if (!confirm('Bu denemeyi silmek istediğinizden emin misiniz?')) return; const examToDelete = exams.find(exam => exam.id === examKey); if (!examToDelete) return; const params = new URLSearchParams(); if (examToDelete.realId) { params.append('id', examToDelete.realId); } else if (examToDelete.olusturma_tarihi) { params.append('created_at', examToDelete.olusturma_tarihi); } else { alert('Bu deneme için benzersiz bir kimlik bulunamadı.'); return; } const result = await apiCall(`/exam.php?${params.toString()}`, { method: 'DELETE' }); if (result.success) { setExams(prevExams => prevExams.filter(exam => exam.id !== examKey)); } else { alert('Silme işlemi başarısız: ' + (result.message || 'Bilinmeyen hata')); } }; if (loading) { return
Yükleniyor...
; } return (

📝 Denemelerim

Tüm deneme sonuçlarınızı burada görüntüleyebilirsiniz

Toplam: {exams ? exams.length : 0} deneme
{!exams || exams.length === 0 ? (
📚

Henüz deneme yok

İlk denemenizi ekleyerek başlayın!

➕ Yeni Deneme Ekle
) : (
{exams.map((exam, index) => { const aytExists = hasAytData(exam); return (

{exam.deneme_adi} {!aytExists && ( TYT DENEMESİ )}

{exam.deneme_tarihi}
TYT Net
{round2(exam.tyt_toplam_net)}
{aytExists && (
AYT Net
{round2(exam.ayt_toplam_net)}
)}
TYT Puan
{round2(exam.tyt_puan)}
{aytExists && (
AYT Puan
{round2(exam.ayt_puan)}
)}
🎯 Tahmini Sıralama ({aytExists ? 'AYT' : 'TYT'})
{Number(exam.tahmini_siralama || 0).toLocaleString()}
{/* Detaylı Netler */}
📊 Detaylı Netleri Göster
Türkçe
{round2(exam.tyt_turkce_net)} net
{exam.tyt_turkce_dogru}D {exam.tyt_turkce_yanlis}Y
Sosyal
{round2(exam.tyt_sosyal_net)} net
{exam.tyt_sosyal_dogru}D {exam.tyt_sosyal_yanlis}Y
TYT Mat
{round2(exam.tyt_mat_net)} net
{exam.tyt_mat_dogru}D {exam.tyt_mat_yanlis}Y
Fen
{round2(exam.tyt_fen_net)} net
{exam.tyt_fen_dogru}D {exam.tyt_fen_yanlis}Y
{aytExists && ( <>
AYT Mat
{round2(exam.ayt_mat_net)} net
{exam.ayt_mat_dogru}D {exam.ayt_mat_yanlis}Y
Fizik
{round2(exam.ayt_fizik_net)} net
{exam.ayt_fizik_dogru}D {exam.ayt_fizik_yanlis}Y
Kimya
{round2(exam.ayt_kimya_net)} net
{exam.ayt_kimya_dogru}D {exam.ayt_kimya_yanlis}Y
Biyoloji
{round2(exam.ayt_biyoloji_net)} net
{exam.ayt_biyoloji_dogru}D {exam.ayt_biyoloji_yanlis}Y
)}
); })}
)} {editingExam && (

Deneme Adını Düzenle

setEditingExam(prev => ({ ...prev, deneme_adi: e.target.value }))} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500" placeholder="Yeni deneme adını girin" />
setEditingExam(prev => ({ ...prev, deneme_tarihi: e.target.value }))} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500" />
{editError && (
{editError}
)}
)}
); } // New Exam Page içeriği pages2.jsx'te devam edecek