From 5c02c8e1b5e8ff8443843064a3e02c87f7d6a58e Mon Sep 17 00:00:00 2001 From: ahmdkaml Date: Fri, 18 Sep 2026 15:52:29 +0300 Subject: [PATCH 1/2] clean unused files --- .../components/BookCard/BookCard.module.scss | 11 ----- frontend/src/components/BookCard/BookCard.tsx | 19 --------- .../src/components/Footer/Footer.module.scss | 7 ---- frontend/src/components/Footer/Footer.tsx | 9 ---- .../src/components/Header/Header.module.scss | 9 ---- frontend/src/components/Header/Header.tsx | 10 ----- .../src/components/Layout/Layout.module.scss | 10 ----- frontend/src/components/Layout/Layout.tsx | 18 -------- .../LoadingSpinner/LoadingSpinner.module.scss | 9 ---- .../LoadingSpinner/LoadingSpinner.tsx | 5 --- .../src/components/Navbar/Navbar.module.scss | 3 -- frontend/src/components/Navbar/Navbar.tsx | 28 ------------- .../Pagination/Pagination.module.scss | 16 ------- .../src/components/Pagination/Pagination.tsx | 23 ---------- .../RatingStars/RatingStars.module.scss | 3 -- .../components/RatingStars/RatingStars.tsx | 19 --------- .../components/Sidebar/Sidebar.module.scss | 19 --------- frontend/src/components/Sidebar/Sidebar.tsx | 22 ---------- .../ThemeToggle/ThemeToggle.module.scss | 9 ---- .../components/ThemeToggle/ThemeToggle.tsx | 11 ----- frontend/src/context/ThemeContext.tsx | 41 ------------------ frontend/src/models/Book.ts | 10 ----- frontend/src/models/User.ts | 6 --- frontend/src/pages/Login/Login.tsx | 5 +-- frontend/src/services/authService.ts | 21 ---------- frontend/src/services/bookService.ts | 42 ------------------- frontend/src/services/cartService.ts | 19 --------- frontend/src/services/searchService.ts | 14 ------- 28 files changed, 2 insertions(+), 416 deletions(-) delete mode 100644 frontend/src/components/BookCard/BookCard.module.scss delete mode 100644 frontend/src/components/BookCard/BookCard.tsx delete mode 100644 frontend/src/components/Footer/Footer.module.scss delete mode 100644 frontend/src/components/Footer/Footer.tsx delete mode 100644 frontend/src/components/Header/Header.module.scss delete mode 100644 frontend/src/components/Header/Header.tsx delete mode 100644 frontend/src/components/Layout/Layout.module.scss delete mode 100644 frontend/src/components/Layout/Layout.tsx delete mode 100644 frontend/src/components/LoadingSpinner/LoadingSpinner.module.scss delete mode 100644 frontend/src/components/LoadingSpinner/LoadingSpinner.tsx delete mode 100644 frontend/src/components/Navbar/Navbar.module.scss delete mode 100644 frontend/src/components/Navbar/Navbar.tsx delete mode 100644 frontend/src/components/Pagination/Pagination.module.scss delete mode 100644 frontend/src/components/Pagination/Pagination.tsx delete mode 100644 frontend/src/components/RatingStars/RatingStars.module.scss delete mode 100644 frontend/src/components/RatingStars/RatingStars.tsx delete mode 100644 frontend/src/components/Sidebar/Sidebar.module.scss delete mode 100644 frontend/src/components/Sidebar/Sidebar.tsx delete mode 100644 frontend/src/components/ThemeToggle/ThemeToggle.module.scss delete mode 100644 frontend/src/components/ThemeToggle/ThemeToggle.tsx delete mode 100644 frontend/src/context/ThemeContext.tsx delete mode 100644 frontend/src/models/Book.ts delete mode 100644 frontend/src/models/User.ts delete mode 100644 frontend/src/services/authService.ts delete mode 100644 frontend/src/services/bookService.ts delete mode 100644 frontend/src/services/cartService.ts delete mode 100644 frontend/src/services/searchService.ts diff --git a/frontend/src/components/BookCard/BookCard.module.scss b/frontend/src/components/BookCard/BookCard.module.scss deleted file mode 100644 index ef97211..0000000 --- a/frontend/src/components/BookCard/BookCard.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -.card { - display: block; - width: 180px; - border: 1px solid var(--border-color); - border-radius: 8px; - padding: 0.75rem; - background: var(--card-bg); -} -.cover { width: 100%; border-radius: 4px; margin-bottom: 0.5rem; } -.title { font-size: 1rem; margin-bottom: 0.25rem; color: var(--text-color); } -.author { font-size: 0.875rem; color: var(--muted-text); margin-bottom: 0.5rem; } diff --git a/frontend/src/components/BookCard/BookCard.tsx b/frontend/src/components/BookCard/BookCard.tsx deleted file mode 100644 index 2097159..0000000 --- a/frontend/src/components/BookCard/BookCard.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Link } from 'react-router-dom'; -import { Book } from '../../models/Book'; -import RatingStars from '../RatingStars/RatingStars'; -import styles from './BookCard.module.scss'; - -interface BookCardProps { - book: Book; -} - -export default function BookCard({ book }: BookCardProps) { - return ( - - {book.title} -

{book.title}

-

{book.author}

- - - ); -} diff --git a/frontend/src/components/Footer/Footer.module.scss b/frontend/src/components/Footer/Footer.module.scss deleted file mode 100644 index b9a1805..0000000 --- a/frontend/src/components/Footer/Footer.module.scss +++ /dev/null @@ -1,7 +0,0 @@ -.footer { - padding: 1rem 1.5rem; - text-align: center; - border-top: 1px solid var(--border-color); - font-size: 0.875rem; - color: var(--muted-text); -} diff --git a/frontend/src/components/Footer/Footer.tsx b/frontend/src/components/Footer/Footer.tsx deleted file mode 100644 index 4492f98..0000000 --- a/frontend/src/components/Footer/Footer.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import styles from './Footer.module.scss'; - -export default function Footer() { - return ( -
-

© {new Date().getFullYear()} Zemolibrary

-
- ); -} diff --git a/frontend/src/components/Header/Header.module.scss b/frontend/src/components/Header/Header.module.scss deleted file mode 100644 index 3910404..0000000 --- a/frontend/src/components/Header/Header.module.scss +++ /dev/null @@ -1,9 +0,0 @@ -.header { - display: flex; - align-items: center; - padding: 1rem 1.5rem; - border-bottom: 1px solid var(--border-color); - background: var(--surface); - backdrop-filter: blur(6px); -} -.logo { font-weight: 700; font-size: 1.25rem; color: var(--text-color); } diff --git a/frontend/src/components/Header/Header.tsx b/frontend/src/components/Header/Header.tsx deleted file mode 100644 index a141ad2..0000000 --- a/frontend/src/components/Header/Header.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { Link } from 'react-router-dom'; -import styles from './Header.module.scss'; - -export default function Header() { - return ( -
- Zemolibrary -
- ); -} diff --git a/frontend/src/components/Layout/Layout.module.scss b/frontend/src/components/Layout/Layout.module.scss deleted file mode 100644 index 308db61..0000000 --- a/frontend/src/components/Layout/Layout.module.scss +++ /dev/null @@ -1,10 +0,0 @@ -.layout { - display: flex; - flex-direction: column; - min-height: 100%; -} - -.content { - flex: 1; - padding: 1.5rem; -} diff --git a/frontend/src/components/Layout/Layout.tsx b/frontend/src/components/Layout/Layout.tsx deleted file mode 100644 index 50d8678..0000000 --- a/frontend/src/components/Layout/Layout.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { Outlet } from 'react-router-dom'; -import Header from '../Header/Header'; -import Navbar from '../Navbar/Navbar'; -import Footer from '../Footer/Footer'; -import styles from './Layout.module.scss'; - -export default function Layout() { - return ( -
-
- -
- -
-
-
- ); -} diff --git a/frontend/src/components/LoadingSpinner/LoadingSpinner.module.scss b/frontend/src/components/LoadingSpinner/LoadingSpinner.module.scss deleted file mode 100644 index bcdb7f5..0000000 --- a/frontend/src/components/LoadingSpinner/LoadingSpinner.module.scss +++ /dev/null @@ -1,9 +0,0 @@ -.spinner { - width: 32px; - height: 32px; - border: 3px solid var(--border-color); - border-top-color: var(--text-color); - border-radius: 50%; - animation: spin 0.8s linear infinite; -} -@keyframes spin { to { transform: rotate(360deg); } } diff --git a/frontend/src/components/LoadingSpinner/LoadingSpinner.tsx b/frontend/src/components/LoadingSpinner/LoadingSpinner.tsx deleted file mode 100644 index 90328dd..0000000 --- a/frontend/src/components/LoadingSpinner/LoadingSpinner.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import styles from './LoadingSpinner.module.scss'; - -export default function LoadingSpinner() { - return
; -} diff --git a/frontend/src/components/Navbar/Navbar.module.scss b/frontend/src/components/Navbar/Navbar.module.scss deleted file mode 100644 index 21d99d9..0000000 --- a/frontend/src/components/Navbar/Navbar.module.scss +++ /dev/null @@ -1,3 +0,0 @@ -.nav { display: flex; align-items: center; gap: 1rem; } -.link { color: var(--muted-text); } -.active { color: var(--text-color); font-weight: 600; } diff --git a/frontend/src/components/Navbar/Navbar.tsx b/frontend/src/components/Navbar/Navbar.tsx deleted file mode 100644 index ad5dd04..0000000 --- a/frontend/src/components/Navbar/Navbar.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { NavLink } from 'react-router-dom'; -import ThemeToggle from '../ThemeToggle/ThemeToggle'; -import styles from './Navbar.module.scss'; - -const LINKS = [ - { to: '/', label: 'Home' }, - { to: '/catalog', label: 'Catalog' }, - { to: '/search', label: 'Search' }, - { to: '/login', label: 'Login' }, - { to: '/profile', label: 'Profile' } -]; - -export default function Navbar() { - return ( - - ); -} diff --git a/frontend/src/components/Pagination/Pagination.module.scss b/frontend/src/components/Pagination/Pagination.module.scss deleted file mode 100644 index 626aafb..0000000 --- a/frontend/src/components/Pagination/Pagination.module.scss +++ /dev/null @@ -1,16 +0,0 @@ -.pagination { - display: flex; - align-items: center; - gap: 0.75rem; - - button { - padding: 0.375rem 0.75rem; - border: 1px solid var(--border-color); - border-radius: 4px; - background: var(--card-bg); - color: var(--text-color); - cursor: pointer; - - &:disabled { opacity: 0.5; cursor: not-allowed; } - } -} diff --git a/frontend/src/components/Pagination/Pagination.tsx b/frontend/src/components/Pagination/Pagination.tsx deleted file mode 100644 index dc84e28..0000000 --- a/frontend/src/components/Pagination/Pagination.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import styles from './Pagination.module.scss'; - -interface PaginationProps { - page: number; - totalPages: number; - onPageChange: (page: number) => void; -} - -export default function Pagination({ page, totalPages, onPageChange }: PaginationProps) { - return ( -
- - - {page} / {totalPages} - - -
- ); -} diff --git a/frontend/src/components/RatingStars/RatingStars.module.scss b/frontend/src/components/RatingStars/RatingStars.module.scss deleted file mode 100644 index 16fb8a4..0000000 --- a/frontend/src/components/RatingStars/RatingStars.module.scss +++ /dev/null @@ -1,3 +0,0 @@ -.stars { display: inline-flex; } -.filled { color: #f5b301; } -.empty { color: var(--border-color); } diff --git a/frontend/src/components/RatingStars/RatingStars.tsx b/frontend/src/components/RatingStars/RatingStars.tsx deleted file mode 100644 index 60d2efd..0000000 --- a/frontend/src/components/RatingStars/RatingStars.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import styles from './RatingStars.module.scss'; - -interface RatingStarsProps { - rating: number; - max?: number; -} - -export default function RatingStars({ rating, max = 5 }: RatingStarsProps) { - const stars = Array.from({ length: max }, (_, i) => i < Math.round(rating)); - return ( -
- {stars.map((filled, i) => ( - - ★ - - ))} -
- ); -} diff --git a/frontend/src/components/Sidebar/Sidebar.module.scss b/frontend/src/components/Sidebar/Sidebar.module.scss deleted file mode 100644 index 145cde1..0000000 --- a/frontend/src/components/Sidebar/Sidebar.module.scss +++ /dev/null @@ -1,19 +0,0 @@ -.sidebar { - width: 200px; - padding: 0.75rem; - border-radius: 8px; - background: var(--surface); - backdrop-filter: blur(6px); - - ul { list-style: none; } - li { margin-bottom: 0.5rem; } - - button { - background: none; - border: none; - cursor: pointer; - font-size: 0.9rem; - padding: 0; - color: var(--text-color); - } -} diff --git a/frontend/src/components/Sidebar/Sidebar.tsx b/frontend/src/components/Sidebar/Sidebar.tsx deleted file mode 100644 index f6369db..0000000 --- a/frontend/src/components/Sidebar/Sidebar.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import styles from './Sidebar.module.scss'; - -const GENRES = ['Mystery', 'Historical Fiction', 'Sci-Fi', 'Romance', 'Non-Fiction']; - -interface SidebarProps { - onSelectGenre?: (genre: string) => void; -} - -export default function Sidebar({ onSelectGenre }: SidebarProps) { - return ( - - ); -} diff --git a/frontend/src/components/ThemeToggle/ThemeToggle.module.scss b/frontend/src/components/ThemeToggle/ThemeToggle.module.scss deleted file mode 100644 index 95c1741..0000000 --- a/frontend/src/components/ThemeToggle/ThemeToggle.module.scss +++ /dev/null @@ -1,9 +0,0 @@ -.toggle { - background: none; - border: 1px solid var(--border-color); - border-radius: 6px; - padding: 0.3rem 0.6rem; - cursor: pointer; - font-size: 1rem; - color: var(--text-color); -} diff --git a/frontend/src/components/ThemeToggle/ThemeToggle.tsx b/frontend/src/components/ThemeToggle/ThemeToggle.tsx deleted file mode 100644 index 1493e66..0000000 --- a/frontend/src/components/ThemeToggle/ThemeToggle.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { useTheme } from '../../context/ThemeContext'; -import styles from './ThemeToggle.module.scss'; - -export default function ThemeToggle() { - const { theme, toggleTheme } = useTheme(); - return ( - - ); -} diff --git a/frontend/src/context/ThemeContext.tsx b/frontend/src/context/ThemeContext.tsx deleted file mode 100644 index 85fa1b3..0000000 --- a/frontend/src/context/ThemeContext.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { createContext, useContext, useEffect, useState, ReactNode } from 'react'; - -type Theme = 'light' | 'dark'; - -interface ThemeContextValue { - theme: Theme; - toggleTheme: () => void; -} - -const ThemeContext = createContext(undefined); - -function getInitialTheme(): Theme { - const stored = localStorage.getItem('theme'); - if (stored === 'light' || stored === 'dark') return stored; - return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; -} - -export function ThemeProvider({ children }: { children: ReactNode }) { - const [theme, setTheme] = useState(getInitialTheme); - - useEffect(() => { - document.documentElement.setAttribute('data-theme', theme); - localStorage.setItem('theme', theme); - }, [theme]); - - function toggleTheme() { - setTheme((t) => (t === 'light' ? 'dark' : 'light')); - } - - return ( - - {children} - - ); -} - -export function useTheme(): ThemeContextValue { - const ctx = useContext(ThemeContext); - if (!ctx) throw new Error('useTheme must be used within ThemeProvider'); - return ctx; -} diff --git a/frontend/src/models/Book.ts b/frontend/src/models/Book.ts deleted file mode 100644 index 09c2f4a..0000000 --- a/frontend/src/models/Book.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface Book { - id: string; - title: string; - author: string; - coverUrl: string; - description: string; - genre: string; - rating: number; - publishedYear: number; -} diff --git a/frontend/src/models/User.ts b/frontend/src/models/User.ts deleted file mode 100644 index c07d8c9..0000000 --- a/frontend/src/models/User.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface User { - id: string; - name: string; - email: string; - avatarUrl?: string; -} diff --git a/frontend/src/pages/Login/Login.tsx b/frontend/src/pages/Login/Login.tsx index 7684399..7181b30 100644 --- a/frontend/src/pages/Login/Login.tsx +++ b/frontend/src/pages/Login/Login.tsx @@ -1,6 +1,5 @@ import { FormEvent, useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import { login, signup } from '../../services/authService'; import styles from './Login.module.scss'; type Mode = 'signin' | 'signup'; @@ -28,9 +27,9 @@ export default function Login() { setError('Passwords do not match.'); return; } - await signup(name, email, password); + // await signup(name, email, password); } else { - await login(email, password); + // await login(email, password); } navigate('/profile'); diff --git a/frontend/src/services/authService.ts b/frontend/src/services/authService.ts deleted file mode 100644 index cda8057..0000000 --- a/frontend/src/services/authService.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { User } from '../models/User'; - -let currentUser: User | null = null; - -export function login(email: string, _password: string): Promise { - currentUser = { id: 'u1', name: 'Guest User', email }; - return Promise.resolve(currentUser); -} - -export function signup(name: string, email: string, _password: string): Promise { - currentUser = { id: 'u1', name, email }; - return Promise.resolve(currentUser); -} - -export function logout(): void { - currentUser = null; -} - -export function getCurrentUser(): User | null { - return currentUser; -} diff --git a/frontend/src/services/bookService.ts b/frontend/src/services/bookService.ts deleted file mode 100644 index bf24124..0000000 --- a/frontend/src/services/bookService.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Book } from '../models/Book'; - -const MOCK_BOOKS: Book[] = [ - { - id: '1', - title: 'The Silent Library', - author: 'Amara Osei', - coverUrl: 'https://placehold.co/200x300', - description: 'A mystery unfolding inside an ancient library.', - genre: 'Mystery', - rating: 4.5, - publishedYear: 2019 - }, - { - id: '2', - title: 'Echoes of Cairo', - author: 'Youssef Hassan', - coverUrl: 'https://placehold.co/200x300', - description: 'A historical drama set in old Cairo.', - genre: 'Historical Fiction', - rating: 4.2, - publishedYear: 2021 - }, - { - id: '3', - title: 'Code & Ink', - author: 'Lina Farouk', - coverUrl: 'https://placehold.co/200x300', - description: 'A programmer discovers a hidden manuscript.', - genre: 'Sci-Fi', - rating: 4.8, - publishedYear: 2023 - } -]; - -export function getAll(): Promise { - return Promise.resolve(MOCK_BOOKS); -} - -export function getById(id: string): Promise { - return Promise.resolve(MOCK_BOOKS.find((b) => b.id === id)); -} diff --git a/frontend/src/services/cartService.ts b/frontend/src/services/cartService.ts deleted file mode 100644 index e1da476..0000000 --- a/frontend/src/services/cartService.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Book } from '../models/Book'; - -let cart: Book[] = []; - -export function addToCart(book: Book): void { - cart.push(book); -} - -export function removeFromCart(bookId: string): void { - cart = cart.filter((b) => b.id !== bookId); -} - -export function getCart(): Book[] { - return cart; -} - -export function clearCart(): void { - cart = []; -} diff --git a/frontend/src/services/searchService.ts b/frontend/src/services/searchService.ts deleted file mode 100644 index 93575fd..0000000 --- a/frontend/src/services/searchService.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Book } from '../models/Book'; -import { getAll } from './bookService'; - -export async function searchBooks(query: string): Promise { - const books = await getAll(); - const q = query.trim().toLowerCase(); - if (!q) return books; - return books.filter( - (b) => - b.title.toLowerCase().includes(q) || - b.author.toLowerCase().includes(q) || - b.genre.toLowerCase().includes(q) - ); -} From 4edb8c0add74561e97982629e845bc777efa411c Mon Sep 17 00:00:00 2001 From: ahmdkaml Date: Fri, 18 Sep 2026 15:56:00 +0300 Subject: [PATCH 2/2] clean unused files --- frontend/src/context/ThemeContext.tsx | 41 +++++++++++++++++++++++++++ frontend/tsconfig.tsbuildinfo | 2 +- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 frontend/src/context/ThemeContext.tsx diff --git a/frontend/src/context/ThemeContext.tsx b/frontend/src/context/ThemeContext.tsx new file mode 100644 index 0000000..85fa1b3 --- /dev/null +++ b/frontend/src/context/ThemeContext.tsx @@ -0,0 +1,41 @@ +import { createContext, useContext, useEffect, useState, ReactNode } from 'react'; + +type Theme = 'light' | 'dark'; + +interface ThemeContextValue { + theme: Theme; + toggleTheme: () => void; +} + +const ThemeContext = createContext(undefined); + +function getInitialTheme(): Theme { + const stored = localStorage.getItem('theme'); + if (stored === 'light' || stored === 'dark') return stored; + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; +} + +export function ThemeProvider({ children }: { children: ReactNode }) { + const [theme, setTheme] = useState(getInitialTheme); + + useEffect(() => { + document.documentElement.setAttribute('data-theme', theme); + localStorage.setItem('theme', theme); + }, [theme]); + + function toggleTheme() { + setTheme((t) => (t === 'light' ? 'dark' : 'light')); + } + + return ( + + {children} + + ); +} + +export function useTheme(): ThemeContextValue { + const ctx = useContext(ThemeContext); + if (!ctx) throw new Error('useTheme must be used within ThemeProvider'); + return ctx; +} diff --git a/frontend/tsconfig.tsbuildinfo b/frontend/tsconfig.tsbuildinfo index cd1f90b..70a4da1 100644 --- a/frontend/tsconfig.tsbuildinfo +++ b/frontend/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/App.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/components/BookCard/BookCard.tsx","./src/components/Footer/Footer.tsx","./src/components/Header/Header.tsx","./src/components/Layout/Layout.tsx","./src/components/LoadingSpinner/LoadingSpinner.tsx","./src/components/Navbar/Navbar.tsx","./src/components/Pagination/Pagination.tsx","./src/components/RatingStars/RatingStars.tsx","./src/components/Sidebar/Sidebar.tsx","./src/components/ThemeToggle/ThemeToggle.tsx","./src/context/ThemeContext.tsx","./src/models/Book.ts","./src/models/User.ts","./src/pages/BookDetail/BookDetail.tsx","./src/pages/Catalog/Catalog.tsx","./src/pages/CommingSoon/ComingSoon.tsx","./src/pages/Home/Home.tsx","./src/pages/Login/Login.tsx","./src/pages/NotFound/NotFound.tsx","./src/pages/Profile/Profile.tsx","./src/pages/Search/Search.tsx","./src/services/authService.ts","./src/services/bookService.ts","./src/services/cartService.ts","./src/services/searchService.ts"],"errors":true,"version":"5.9.3"} \ No newline at end of file +{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/context/themecontext.tsx","./src/pages/errorpage/errorpage.tsx","./src/pages/login/login.tsx"],"version":"5.9.3"} \ No newline at end of file