# Bookibra - Frontend Dokümantasyonu ## Frontend Genel Bakış Frontend, **React 19** ve **Vite** kullanılarak geliştirilmiş modern bir SPA (Single Page Application) uygulamasıdır. Mobil öncelikli tasarıma sahiptir ve kitap arama, barkod tarama, kütüphane yönetimi özellikleri sunar. ## Teknoloji Yığını | Teknoloji | Versiyon | Kullanım Amacı | |-----------|----------|----------------| | React | ^19.1.1 | UI framework | | Vite | ^7.1.7 | Build tool ve dev server | | React Router | ^7.9.5 | Client-side routing | | Framer Motion | ^12.23.24 | Animasyonlar | | FontAwesome | ^7.1.0 | İkonlar | | react-qr-barcode-scanner | ^2.1.18 | Barkod tarama | | react-image-glow | ^1.0.6 | Resim efektleri | | color-thief-react | ^2.1.0 | Renk extract | ## Dizin Yapısı ``` frontend/src/ ├── components/ # Yeniden kullanılabilir bileşenler │ ├── BookCard.jsx # Kitap kartı bileşeni │ └── SocialButton.jsx # Sosyal medya butonu ├── pages/ # Sayfa bileşenleri │ ├── HomePage.jsx # Ana sayfa │ ├── MyBooksPage.jsx # Kütüphane sayfası │ ├── AddBooksPage.jsx # Kitap ekleme sayfası │ └── ProfilePage.jsx # Profil sayfası ├── context/ # React Context │ └── SavedBooksContext.jsx # Kitap kütüphanesi state yönetimi ├── assets/ # Statik dosyalar │ ├── booklibra-logo.svg │ └── ... ├── App.jsx # Ana uygulama bileşeni ├── main.jsx # Uygulama giriş noktası ├── App.css # Ana stiller └── index.css # Global stiller ``` ## Uygulama Mimarisi ### App Bileşeni (`src/App.jsx`) Uygulamanın kök bileşenidir. Routing ve layout yapısını belirler. **Ana Özellikler:** - `SavedBooksProvider` ile context provider wrapping - `BrowserRouter` ile routing - Bottom navigation ile sayfa geçişi **Navigasyon Yapısı:** ```javascript const tabs = [ { path: '/', label: 'Home', icon: faHouse }, { path: '/my-books', label: 'My Books', icon: faBookOpen }, { path: '/add-books', label: 'Add Books', icon: faPlusCircle }, { path: '/profile', label: 'Profile', icon: faUser } ]; ``` ### Sayfalar #### 1. HomePage (`src/pages/HomePage.jsx`) Ana sayfa bileşeni. Şu anda basit bir başlık gösterir. **Gelecek Özellikler:** - Son eklenen kitaplar - Önerilen kitaplar - İstatistikler #### 2. AddBooksPage (`src/pages/AddBooksPage.jsx`) Kitap arama ve ekleme sayfası. En karmaşık sayfa bileşenidir. **Ana Özellikler:** - Başlık ile arama (yayın yılı filtreleme desteği) - Barkod tarama ile ISBN ile arama - Sonuçları listeleme - Kitapları kütüphaneye ekleme **Önemli Fonksiyonlar:** ```javascript // API Base URL çözümleme const resolveApiBaseUrl = () => { // 1. Environment variable kontrolü // 2. Window location tabanlı çözümleme // 3. Default localhost:8080 }; // Arama input'u parsing const parseSearchInput = (raw) => { // "Kitap Adı .2020" → { title: "Kitap Adı", published: "2020" } // "Kitap Adı" → { title: "Kitap Adı", published: undefined } }; // API cevabını normalizasyon const normalizeBook = (item) => ({ title, authorName, thumbImage, page, rate, publisher, description, isbn, raw }); ``` **Barkod Tarama Akışı:** 1. Kamera butonuna tıklama 2. `react-qr-barcode-scanner` ile kamera açma 3. Barkod algılama (`handleBarcodeUpdate`) 4. ISBN ile API çağrısı 5. Sonuçları gösterme **API Endpoint'ler:** - `/api/books/title?title={query}` - `/api/books/filter?title={query}&published={year}` - `/api/books/isbn/{isbn}?locales=en` #### 3. MyBooksPage (`src/pages/MyBooksPage.jsx`) Kullanıcının kayıtlı kitaplarını gösterir. **Ana Özellikler:** - Kitap listesi görünümü - Kitap detay görünümü - Kitap silme - Görsel efektler (ImageGlow) **State Yönetimi:** ```javascript const { savedBooks, removeBook } = useSavedBooks(); const [selected, setSelected] = useState(null); ``` **Detay Görünümü:** Seçili kitap için: - Kapak resmi (glow efekti ile) - Kitap bilgileri (başlık, yazar, sayfa, puan) - Açıklama - Silme butonu #### 4. ProfilePage (`src/pages/ProfilePage.jsx`) Kullanıcı profili sayfası. Şu anda placeholder durumunda. **Gelecek Özellikler:** - Kullanıcı bilgileri - Ayarlar - İstatistikler ### Bileşenler #### BookCard (`src/components/BookCard.jsx`) Tek bir kitabı gösteren kart bileşeni. **Props:** ```javascript { book: { title: string, authorName: string, thumbImage: string, page: number, rate: number, ... }, onSelect: (book) => void } ``` **Özellikler:** - Kitap kapak resmi - Başlık ve yazar - Sayfa sayısı ve puan - Tıklanabilir (onSelect callback) #### SocialButton (`src/components/SocialButton.jsx`) Sosyal medya giriş butonu. **Props:** ```javascript { provider: 'apple' | 'google', onClick: () => void } ``` ### Context Yönetimi #### SavedBooksContext (`src/context/SavedBooksContext.jsx`) Kitap kütüphanesi için global state yönetimi. **API:** ```javascript const { savedBooks, addBook, removeBook } = useSavedBooks(); ``` **Özellikler:** - `savedBooks`: Kayıtlı kitaplar dizisi - `addBook(book)`: Kitap ekleme (tekrarı kontrol eder) - `removeBook(title)`: Kitap silme **Persistence:** Kitaplar `localStorage`'da saklanır: ```javascript localStorage.setItem('bookibra_saved_books', JSON.stringify(savedBooks)); ``` ## Stil Yapısı ### Ana Layout (`App.css`) **Mobile Shell Pattern:** ```css .mobile-shell { display: flex; flex-direction: column; height: 100vh; } .page-container { flex: 1; overflow-y: auto; padding-bottom: 70px; /* Bottom nav için boşluk */ } ``` **Bottom Navigation:** ```css .bottom-nav { position: fixed; bottom: 0; width: 100%; display: flex; justify-content: space-around; } ``` ### Renk Paleti CSS değişkenleri ile tanımlı: ```css :root { --primary: /* Ana renk */; --secondary: /* İkincil renk */; --accent: /* Vurgu rengi */; --text: /* Metin rengi */; --bg: /* Arka plan */; } ``` ## API Entegrasyonu ### API Base URL Çözümleme ```javascript const resolveApiBaseUrl = () => { // 1. Environment variable (VITE_API_BASE_URL) if (import.meta.env.VITE_API_BASE_URL) return import.meta.env.VITE_API_BASE_URL; // 2. Window location (production) if (typeof window !== 'undefined') { const { protocol, hostname } = window.location; return `${protocol}//${hostname}:8080`; } // 3. Default (development) return 'http://localhost:8080'; }; ``` ### Örnek API Çağrısı ```javascript const response = await fetch(`${API_BASE_URL}/api/books/isbn/${isbn}?locales=en`); const data = await response.json(); if (!response.ok) { throw new Error(data.message || 'Kitap bulunamadi'); } ``` ## Build ve Deployment ### Development ```bash cd frontend npm install npm run dev ``` ### Production Build ```bash npm run build # Çıktı: dist/ dizini ``` ### Docker Build ```dockerfile FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build CMD ["npm", "run", "preview"] ``` ## Ortam Değişkenleri ```bash # .env.example (frontend/.env.example) VITE_API_BASE_URL=http://localhost:8080 ``` ## Performans İpuçları 1. **Lazy Loading**: Sayfalar ihtiyaç anında yüklenir 2. **Image Optimization**: Kapak resimleri lazy loading 3. **Local Caching**: Kitaplar localStorage'da saklanır 4. **API Debouncing**: Arama input'u için debounce eklenebilir ## Erişilebilirlik - Semantic HTML kullanımı - Keyboard navigation desteği - Screen reader friendly (ikonlar için aria-label) --- **İlgili Dosyalar:** - [Proje Genel Bakış](./proje-genel-bakis.md) - [Backend Yapısı](./backend-yapisi.md) - [Teknoloji Yığını](./teknoloji-yigini.md)