import React, { useState, useEffect } from 'react'; import { BookOpen, Search, PenTool, User, Heart, Clock, ChevronLeft, LogIn, LogOut, Compass, MessageSquare, Send } from 'lucide-react'; import { initializeApp } from 'firebase/app'; import { getAuth, signInWithCustomToken, signInAnonymously, onAuthStateChanged } from 'firebase/auth'; import { getFirestore, collection, onSnapshot, addDoc, doc, updateDoc } from 'firebase/firestore'; // Inisialisasi Firebase Database const firebaseConfig = typeof __firebase_config !== 'undefined' ? JSON.parse(__firebase_config) : {}; const app = initializeApp(firebaseConfig); const auth = getAuth(app); const db = getFirestore(app); const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id'; // --- MOCK DATA (Simulasi Database) --- const INITIAL_RESUMES = [ { id: 1, title: "Membangun Kebiasaan Kecil yang Berdampak Besar", bookTitle: "Atomic Habits", bookAuthor: "James Clear", genre: "Self-Improvement", content: "Atomic Habits mengajarkan bahwa perubahan besar tidak datang dari lompatan besar, melainkan dari kebiasaan-kebiasaan kecil yang diulang setiap hari (1% lebih baik setiap hari).\n\nAda 4 Kaidah Perubahan Perilaku:\n1. Menjadikannya Terlihat (Cue)\n2. Menjadikannya Menarik (Craving)\n3. Menjadikannya Mudah (Response)\n4. Menjadikannya Memuaskan (Reward)\n\nBuku ini sangat praktis. Alih-alih berfokus pada 'tujuan' (goal), James Clear menyarankan kita untuk berfokus pada 'sistem'. Jika kita memiliki sistem yang baik, tujuan akan tercapai dengan sendirinya.", authorName: "Budi Santoso", date: "12 Mei 2026", likes: 124, readingTime: "3 min" }, { id: 2, title: "Sejarah Singkat Umat Manusia", bookTitle: "Sapiens", bookAuthor: "Yuval Noah Harari", genre: "Sejarah", content: "Sapiens membawa kita pada perjalanan panjang spesies kita, Homo Sapiens, dari kera biasa menjadi penguasa dunia.\n\nHarari membagi sejarah manusia ke dalam 3 revolusi besar:\n1. Revolusi Kognitif: Kemampuan berimajinasi dan menciptakan fiksi (agama, uang, negara) yang memungkinkan kerja sama dalam skala masif.\n2. Revolusi Agrikultur: Perpindahan dari berburu menjadi bertani. Harari menyebut ini sebagai 'penipuan terbesar dalam sejarah' karena membuat hidup manusia purba lebih sulit.\n3. Revolusi Saintifik: Kesadaran bahwa kita tidak tahu segalanya, memicu penjelajahan dan penemuan luar biasa hingga hari ini.\n\nBuku yang akan mengubah cara Anda melihat dunia.", authorName: "Siti Aminah", date: "10 Mei 2026", likes: 89, readingTime: "5 min" }, { id: 3, title: "Seni Bersikap Bodo Amat", bookTitle: "The Subtle Art of Not Giving a F*ck", bookAuthor: "Mark Manson", genre: "Psikologi", content: "Berbeda dengan buku motivasi pada umumnya, buku ini justru menyuruh kita untuk menerima hal-hal negatif dan menyadari bahwa hidup ini penuh penderitaan.\n\nKuncinya bukan lari dari masalah, tapi memilih masalah apa yang layak kita pedulikan. Kita punya energi ('f*cks') yang terbatas, jadi berikanlah hanya pada hal-hal yang benar-benar penting seperti keluarga, passion, dan nilai hidup kita yang sebenarnya.\n\nJangan memaksakan diri untuk selalu positif, karena itu justru akan meracuni mental kita.", authorName: "Raditya Dika", date: "08 Mei 2026", likes: 256, readingTime: "4 min" } ]; export default function App() { // --- STATES --- const [currentView, setCurrentView] = useState('home'); // 'home', 'explore', 'detail', 'create' const [resumes, setResumes] = useState([]); // Mulai dengan array kosong, akan diisi dari Firebase const [selectedResume, setSelectedResume] = useState(null); const [searchQuery, setSearchQuery] = useState(''); // State untuk fitur pencarian const [allComments, setAllComments] = useState([]); // State untuk menampung semua komentar // Simulasi Autentikasi Frontend & Backend const [currentUser, setCurrentUser] = useState(null); // null = Guest, object = Logged in const [firebaseUser, setFirebaseUser] = useState(null); // --- EFFECTS (Koneksi ke Cloud Database) --- 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, setFirebaseUser); return () => unsubscribe(); }, []); useEffect(() => { if (!firebaseUser) return; // Pastikan user sudah terautentikasi sebelum mengambil data // Mengambil data secara Real-Time dari Firestore const resumesRef = collection(db, 'artifacts', appId, 'public', 'data', 'resumes'); const unsubscribe = onSnapshot(resumesRef, (snapshot) => { const data = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); // Urutkan berdasarkan waktu pembuatan terbaru (dari yang paling baru) data.sort((a, b) => b.createdAt - a.createdAt); if (data.length === 0) { // Tampilkan data simulasi jika database masih kosong sama sekali setResumes(INITIAL_RESUMES); } else { setResumes(data); // Update data resume yang sedang dibaca jika ada perubahan (seperti jumlah Like) if (selectedResume) { const updatedSelected = data.find(r => r.id === selectedResume.id); if (updatedSelected) setSelectedResume(updatedSelected); } } }, (error) => { console.error("Firestore error:", error); }); return () => unsubscribe(); }, [firebaseUser, selectedResume?.id]); // Hati-hati dependency ditambahkan agar data detail terupdate // Effect untuk mengambil data Komentar dari Cloud Database useEffect(() => { if (!firebaseUser) return; const commentsRef = collection(db, 'artifacts', appId, 'public', 'data', 'comments'); const unsubscribe = onSnapshot(commentsRef, (snapshot) => { const data = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); setAllComments(data); }, (error) => { console.error("Firestore comments error:", error); }); return () => unsubscribe(); }, [firebaseUser]); // --- HANDLERS --- const navigateTo = (view, data = null) => { if (data) setSelectedResume(data); setCurrentView(view); window.scrollTo(0, 0); }; const handleLoginToggle = () => { if (currentUser) { setCurrentUser(null); } else { // Buat nama otomatis dari UID akun untuk mensimulasikan registrasi yang mulus const userName = firebaseUser ? `Pembaca ${firebaseUser.uid.substring(0,4)}` : "Pengguna Baru"; setCurrentUser({ name: userName, id: firebaseUser?.uid || "u123" }); } }; const handleCreateSubmit = async (e) => { e.preventDefault(); if (!firebaseUser) return; const formData = new FormData(e.target); // Hitung estimasi waktu baca (kasar: 200 kata per menit) const content = formData.get('content'); const wordCount = content.split(/\s+/).length; const readTime = Math.ceil(wordCount / 200) || 1; const newResume = { title: formData.get('title'), bookTitle: formData.get('bookTitle'), bookAuthor: formData.get('bookAuthor'), genre: formData.get('genre'), content: content, authorName: currentUser.name, date: new Date().toLocaleDateString('id-ID', { day: 'numeric', month: 'long', year: 'numeric' }), likes: 0, readingTime: `${readTime} min`, createdAt: Date.now(), // Digunakan untuk mengurutkan authorUid: firebaseUser.uid }; try { // Simpan resume ke Database Permanen const resumesRef = collection(db, 'artifacts', appId, 'public', 'data', 'resumes'); await addDoc(resumesRef, newResume); navigateTo('home'); } catch (error) { console.error("Error adding document: ", error); } }; const handleLike = async (resumeId, currentLikes) => { if (!firebaseUser) return; try { const resumeRef = doc(db, 'artifacts', appId, 'public', 'data', 'resumes', resumeId.toString()); await updateDoc(resumeRef, { likes: currentLikes + 1 }); } catch (error) { console.log("Gagal menambahkan like (Jika Anda menekan data simulasi, ini normal): ", error); } }; const handleAddComment = async (e) => { e.preventDefault(); if (!firebaseUser || !selectedResume) return; const formData = new FormData(e.target); const commentText = formData.get('commentText'); if (!commentText.trim()) return; const newComment = { resumeId: selectedResume.id, text: commentText, authorName: currentUser?.name || "Pengguna Anonim", authorUid: firebaseUser.uid, createdAt: Date.now(), date: new Date().toLocaleDateString('id-ID', { day: 'numeric', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit' }) }; try { const commentsRef = collection(db, 'artifacts', appId, 'public', 'data', 'comments'); await addDoc(commentsRef, newComment); e.target.reset(); // Kosongkan kolom komentar setelah berhasil terkirim } catch (error) { console.error("Error adding comment: ", error); } }; // --- COMPONENTS --- const Navbar = () => ( ); const ResumeCard = ({ resume }) => (
{resume.content}
{resume.authorName}
{resume.date}
Platform komunitas pecinta buku. Temukan intisari buku terbaik dari pembaca lain, atau bagikan rangkuman bukumu sendiri untuk menginspirasi dunia.
Ide-ide segar dari komunitas kita hari ini.
Coba gunakan kata kunci lain untuk mencari.
Resume dari buku "{selectedResume.bookTitle}" karya {selectedResume.bookAuthor}
{selectedResume.authorName}
{selectedResume.date}
Masuk untuk ikut berdiskusi dan memberikan pendapat Anda.
{comment.text}
Belum ada komentar. Jadilah yang pertama memulai diskusi!
Bagikan pemahamanmu dan bantu orang lain belajar lebih cepat.