Kode berhasil disalin!
Friday, 9 January 2026
Tuesday, 6 January 2026
CBT sekolah
import React, { useState, useEffect } from 'react';
import { initializeApp } from 'firebase/app';
import {
getFirestore,
collection,
addDoc,
onSnapshot,
query,
doc,
setDoc
} from 'firebase/firestore';
import {
getAuth,
signInAnonymously,
onAuthStateChanged,
signInWithCustomToken
} from 'firebase/auth';
import { BookOpen, Send, ClipboardList, User, PlusCircle, CheckCircle, Clock, Trash2 } from 'lucide-react';
// Konfigurasi Firebase
const firebaseConfig = JSON.parse(__firebase_config);
const app = initializeApp(firebaseConfig);
const auth = getAuth(app);
const db = getFirestore(app);
const appId = typeof __app_id !== 'undefined' ? __app_id : 'guru-tugas-simple';
export default function App() {
const [user, setUser] = useState(null);
const [role, setRole] = useState(null); // 'guru' atau 'siswa'
const [tugas, setTugas] = useState([]);
const [jawaban, setJawaban] = useState([]);
const [view, setView] = useState('landing'); // landing, guru, siswa
// State Form Guru
const [judulTugas, setJudulTugas] = useState('');
const [deskripsiTugas, setDeskripsiTugas] = useState('');
const [deadline, setDeadline] = useState('');
// State Form Siswa
const [namaSiswa, setNamaSiswa] = useState('');
const [teksJawaban, setTeksJawaban] = useState('');
const [selectedTugasId, setSelectedTugasId] = useState(null);
// 1. Inisialisasi Auth (Perbaikan: Import dari firebase/auth)
useEffect(() => {
const initAuth = async () => {
try {
if (typeof __initial_auth_token !== 'undefined' && __initial_auth_token) {
await signInWithCustomToken(auth, __initial_auth_token);
} else {
await signInAnonymously(auth);
}
} catch (error) {
console.error("Auth error:", error);
}
};
initAuth();
const unsubscribe = onAuthStateChanged(auth, (user) => {
setUser(user);
});
return () => unsubscribe();
}, []);
// 2. Ambil Data (Tugas & Jawaban)
useEffect(() => {
if (!user) return;
const tugasRef = collection(db, 'artifacts', appId, 'public', 'data', 'daftar_tugas');
const unsubscribeTugas = onSnapshot(tugasRef, (snapshot) => {
const data = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() }));
setTugas(data);
}, (err) => console.error("Firestore Error (Tugas):", err));
const jawabanRef = collection(db, 'artifacts', appId, 'public', 'data', 'jawaban_siswa');
const unsubscribeJawaban = onSnapshot(jawabanRef, (snapshot) => {
const data = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() }));
setJawaban(data);
}, (err) => console.error("Firestore Error (Jawaban):", err));
return () => {
unsubscribeTugas();
unsubscribeJawaban();
};
}, [user]);
// Fungsi Guru: Buat Tugas Baru
const handleBuatTugas = async (e) => {
e.preventDefault();
if (!user || !judulTugas || !deskripsiTugas) return;
try {
await addDoc(collection(db, 'artifacts', appId, 'public', 'data', 'daftar_tugas'), {
judul: judulTugas,
deskripsi: deskripsiTugas,
tenggat: deadline,
createdAt: new Date().toISOString()
});
setJudulTugas('');
setDeskripsiTugas('');
setDeadline('');
} catch (err) {
console.error(err);
}
};
// Fungsi Siswa: Kirim Jawaban
const handleKirimJawaban = async (e) => {
e.preventDefault();
if (!user || !namaSiswa || !teksJawaban || !selectedTugasId) return;
try {
await addDoc(collection(db, 'artifacts', appId, 'public', 'data', 'jawaban_siswa'), {
tugasId: selectedTugasId,
nama: namaSiswa,
isi: teksJawaban,
waktuKumpul: new Date().toISOString()
});
setTeksJawaban('');
setSelectedTugasId(null);
alert("Jawaban Anda berhasil dikirim!");
} catch (err) {
console.error(err);
}
};
if (view === 'landing') {
return (
);
}
return (
{role === 'guru' ? (
{tugas.length === 0 ? (
) : (
)}
);
}
EduTask Online
Platform sederhana untuk mengelola tugas dan pengumpulan jawaban siswa secara praktis.
{/* Form Buat Tugas */}
{/* Rekap Jawaban */}
{jawaban.length} Siswa
{jawaban.length === 0 ? (
) : (
) : (
Buat Tugas
Jawaban Masuk
{jawaban.length} Siswa
Belum ada jawaban yang dikirimkan siswa.
{jawaban.sort((a,b) => new Date(b.waktuKumpul) - new Date(a.waktuKumpul)).map((j) => {
const t = tugas.find(task => task.id === j.tugasId);
return (
{new Date(j.waktuKumpul).toLocaleDateString('id-ID')}
);
})}
)}
{j.nama}
Tugas: {t?.judul || 'Dihapus'}
{j.isi}
Tugas Aktif
Semua Beres!
Saat ini tidak ada tugas yang perlu dikerjakan.
{tugas.sort((a,b) => new Date(b.createdAt) - new Date(a.createdAt)).map((t) => (
Deadline: {t.tenggat}
)}
{selectedTugasId === t.id && (
)}
))}
)}
{t.judul}
{t.tenggat && (
{t.deskripsi}
Subscribe to:
Posts (Atom)
Membangun web sekolah berbasis Google Apps Script (GAS) dengan Google Sheets sebagai basis datanya.
Berikut adalah modul panduan langkah demi langkah untuk membangun web sekolah berbasis Google Apps Script (GAS) dengan Google Sheets seb...
-
Cara Membuat POE (Power over Ethernet) Untuk Access Point Awalnya saya kira PoE ini adalah PPoE hehe . tapi ternyata beda. Po...
-
Mungkin masih banyak yang belum mengenal Robocopy ini . Robocopy (Robust File Copy) adalah perintah DOS yang berguna untuk mengopi file at...
-
Agar dapat mengakses halaman PHP dari web browser, maka kita harus menempatkan file PHP di dalam folder khusus yang merupakan folder hom...