// 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 */}
{/* 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 ? (
) : (
{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