{"id":26153470,"url":"https://github.com/supiyasingh/module4_main_evolution","last_synced_at":"2026-04-18T20:04:47.749Z","repository":{"id":280497538,"uuid":"940726911","full_name":"Supiyasingh/Module4_Main_Evolution","owner":"Supiyasingh","description":null,"archived":false,"fork":false,"pushed_at":"2025-03-03T18:23:31.000Z","size":78,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-03T19:30:50.187Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Supiyasingh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-28T17:22:17.000Z","updated_at":"2025-03-03T18:23:34.000Z","dependencies_parsed_at":"2025-03-03T19:31:01.909Z","dependency_job_id":"268e9ed4-887e-4d5c-bf4f-ea7018546787","html_url":"https://github.com/Supiyasingh/Module4_Main_Evolution","commit_stats":null,"previous_names":["supiyasingh/module4_main_evolution"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Supiyasingh%2FModule4_Main_Evolution","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Supiyasingh%2FModule4_Main_Evolution/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Supiyasingh%2FModule4_Main_Evolution/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Supiyasingh%2FModule4_Main_Evolution/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Supiyasingh","download_url":"https://codeload.github.com/Supiyasingh/Module4_Main_Evolution/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242995912,"owners_count":20218828,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-11T07:58:05.817Z","updated_at":"2026-04-18T20:04:47.739Z","avatar_url":"https://github.com/Supiyasingh.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Q: 1 Problem Statement: Building a Books Library Management App\n\n## Overview:\nYour task is to build a simplified version of GoodReads, a book-tracking application. This application will allow users to register, log in, view a list of books, track their reading progress, and rate books. The app is built using React, Redux, Firebase Authentication, and React Router.\n\nDemo Link\nhttps://www.loom.com/share/7113b4da2d834d00a2a8ac6a25cb0ddc?sid=369bd52d-a861-4f1d-82ad-a19fabddb575\n\nFolder Structure\n\n\nFeatures to Implement:\nUser Authentication\nRegister a new user using Firebase Authentication.\nLog in as an existing user.\nStore user session in local storage.\nImplement logout functionality.\nNavigation Bar\nDisplay the app title: \"My Library\".\nProvide navigation links: Home, My Books (only if logged in), Login/Register (if not logged in), and Logout (if logged in).\nDisplay logged-in user’s email.\nHome Page\nFetch and display a list of books from Redux state.\nShow a loading message while fetching books.\nDisplay books using a BookCard component.\nA Book card can have all the details and want to read button, on clicking it should be added to My Books page if logged in, else show an alert to login and then add.\nUser Book Management (My Books Page)\nDisplay books added by the logged-in user.\nAllow users to update the reading status of books (Want to Read, Currently Reading, Read).\nAllow users to rate books (1-5 stars).\nState Management (Redux)\nManage authentication state (login, register, logout actions).\nFetch books from a central store.\nUpdate book ratings and status in Redux state.\nPages:\nHome - Fetches and displays all the available books. (can see without login but only can add to my books page with login)\nMyBooks - Fetch all the books added from the Home page along with the details, rating, and current status.\nComponents:\nNavbar - Handles navigation and user authentication status.\nLogin - Allows users to log in.\nRegister - Allows users to sign up.\nBookCard - Displays book details.\nMyBookCard - Allows users to update book status and rating.\nAPI \u0026 State Management:\nUse Redux actions to fetch books, update book status, and handle authentication.\nUse Firebase Authentication to log in and register.\nStore user details in local storage for session persistence.\nRedux Actions:\nAuthentication Actions\nREGISTER_USER – Dispatch when a user registers.\nLOGIN_USER – Dispatch when a user logs in.\nLOGOUT_USER – Dispatch when a user logs out.\nSET_USER – Dispatch to store the logged-in user in Redux.\nBooks Actions\nFETCH_BOOKS_REQUEST – Dispatch before fetching books.\nFETCH_BOOKS_SUCCESS – Dispatch when books are successfully fetched.\nFETCH_BOOKS_FAILURE – Dispatch if fetching books fails.\nADD_BOOK_TO_USER_LIST – Dispatch when a user adds a book to their list from the Home page.\nFETCH_MY_BOOKS - Dispatch when user visits My Books Page\nUPDATE_BOOK_STATUS – Dispatch when a user updates their reading status.\nUPDATE_BOOK_RATING – Dispatch when a user rates a book.\nFirebase Realtime Database REST API Endpoints:\nAuthentication:\n\nUse Email/Password Authentication from Firebase.\n\nFetch Books\nEndpoint: GET /books.json\n\nRequest:\n\nNo request body required.\n\nResponse:\n\n{\n  \"-BOOK_ID_1\": {\n    \"author\": \"Author Name\",\n    \"availability\": true,\n    \"coverImage\": \"image_url\",\n    \"status\": \"want to read\",\n    \"title\": \"Book Title\"\n  },\n  \"-BOOK_ID_2\": { ... }\n}\n\nRedux Action:\n\nType: FETCH_BOOKS_SUCCESS\nPayload: Array of books with id, author, availability, coverImage, status, and title\nFetch My Books\nEndpoint: GET /users/{userId}/myBooks.json\n\nRequest:\n\nNo request body required.\n\nResponse:\n\n{\n  \"-BOOK_ID_1\": {\n    \"author\": \"Author Name\",\n    \"availability\": true,\n    \"coverImage\": \"image_url\",\n    \"id\": \"-BOOK_ID_1\",\n    \"rating\": 3,\n    \"status\": \"Currently Reading\",\n    \"title\": \"Book Title\"\n  }\n}\n\nRedux Action:\n\nType: FETCH_MY_BOOKS\nPayload: Array of books belonging to the user\nAdd to My Books\nEndpoint: PUT /users/{userId}/myBooks/{bookId}.json\n\nRequest:\n\n{\n  \"author\": \"Author Name\",\n  \"availability\": true,\n  \"coverImage\": \"image_url\",\n  \"status\": \"Want to Read\",\n  \"title\": \"Book Title\"\n}\n\nResponse:\n\n{\n  \"author\": \"Author Name\",\n  \"availability\": true,\n  \"coverImage\": \"image_url\",\n  \"status\": \"Want to Read\",\n  \"title\": \"Book Title\"\n}\n\nRedux Action:\n\nType: ADD_TO_MY_BOOKS\nPayload: Response data from API\nUpdate Book Status\nEndpoint: PATCH /users/{userId}/myBooks/{bookId}.json\n\nRequest:\n\n{\n  \"status\": \"Read\"\n}\n\nResponse:\n\n{\n  \"status\": \"Read\"\n}\n\nRedux Action:\n\nType: UPDATE_BOOK_STATUS\nPayload: { bookId, status }\nUpdate Book Rating\nEndpoint: PATCH /users/{userId}/myBooks/{bookId}.json\n\nRequest:\n\n{\n  \"rating\": 5\n}\n\nResponse:\n\n{\n  \"rating\": 5\n}\n\nRedux Action:\n\nType: UPDATE_BOOK_RATING\nPayload: { bookId, rating }\nInitial data for firebase\nSave the following data in a JSON file\nImport this JSON file into the Real Time Database URL of your firebase project.\n{\n\t\"books\": {\n\t\t\"-OK60V0HT8YMnyeQ2RSV\": {\n\t\t\t\"author\": \"Andrew Hunt \u0026 David Thomas\",\n\t\t\t\"availability\": true,\n\t\t\t\"coverImage\": \"https://placehold.co/300x300/FF5733/FFFFFF?text=The+Pragmatic+Programmer\",\n\t\t\t\"status\": \"want to read\",\n\t\t\t\"title\": \"The Pragmatic Programmer\"\n\t\t},\n\t\t\"-OK6CNe_wybyaqRGSSCu\": {\n\t\t\t\"author\": \"Robert C. Martin\",\n\t\t\t\"availability\": true,\n\t\t\t\"coverImage\": \"https://placehold.co/300x300/3498DB/FFFFFF?text=Clean+Code\",\n\t\t\t\"status\": \"currently reading\",\n\t\t\t\"title\": \"Clean Code\"\n\t\t},\n\t\t\"-OK6CUEIvB2JYxvlZOoV\": {\n\t\t\t\"author\": \"Kyle Simpson\",\n\t\t\t\"availability\": false,\n\t\t\t\"coverImage\": \"https://placehold.co/300x300/2ECC71/FFFFFF?text=You+Don't+Know+JS\",\n\t\t\t\"status\": \"want to read\",\n\t\t\t\"title\": \"You Don't Know JS\"\n\t\t},\n\t\t\"-OK6CYpfCNU7NtpPieOB\": {\n\t\t\t\"author\": \"Marijn Haverbeke\",\n\t\t\t\"availability\": true,\n\t\t\t\"coverImage\": \"https://placehold.co/300x300/F1C40F/000000?text=Eloquent+JavaScript\",\n\t\t\t\"status\": \"read\",\n\t\t\t\"title\": \"Eloquent JavaScript\"\n\t\t},\n\t\t\"-OK7BPrzsOrX5Aoej1kA\": {\n\t\t\t\"author\": \"John Resig \u0026 Bear Bibeault\",\n\t\t\t\"availability\": false,\n\t\t\t\"coverImage\": \"https://placehold.co/300x300/C0392B/FFFFFF?text=Secrets+of+the+JavaScript+Ninja\",\n\t\t\t\"status\": \"read\",\n\t\t\t\"title\": \"Secrets of the JavaScript Ninja\"\n\t\t},\n\t\t\"-OK7BTzxqbfTxLWcaA6K\": {\n\t\t\t\"author\": \"Mark Ethan Trostler\",\n\t\t\t\"availability\": true,\n\t\t\t\"coverImage\": \"https://placehold.co/300x300/D35400/FFFFFF?text=Testable+JavaScript\",\n\t\t\t\"status\": \"want to read\",\n\t\t\t\"title\": \"Testable JavaScript\"\n\t\t},\n\t\t\"-OK7BWgtz8mmHnJqPbt7\": {\n\t\t\t\"author\": \"Kyle Simpson\",\n\t\t\t\"availability\": true,\n\t\t\t\"coverImage\": \"https://placehold.co/300x300/1ABC9C/FFFFFF?text=You+Don%27t+Know+JS%3A+ES6+%26+Beyond\",\n\t\t\t\"status\": \"read\",\n\t\t\t\"title\": \"You Don't Know JS: ES6 \u0026 Beyond\"\n\t\t},\n\t\t\"-OK7B_FT6xi2QwZBHlex\": {\n\t\t\t\"author\": \"Addy Osmani\",\n\t\t\t\"availability\": true,\n\t\t\t\"coverImage\": \"https://placehold.co/300x300/F39C12/FFFFFF?text=Learning+JavaScript+Design+Patterns\",\n\t\t\t\"status\": \"currently reading\",\n\t\t\t\"title\": \"Learning JavaScript Design Patterns\"\n\t\t},\n\t\t\"-OK7BbeBfVvtc6kLxXgq\": {\n\t\t\t\"author\": \"David Flanagan\",\n\t\t\t\"availability\": true,\n\t\t\t\"coverImage\": \"https://placehold.co/300x300/9B59B6/FFFFFF?text=JavaScript%3A+The+Definitive+Guide\",\n\t\t\t\"status\": \"read\",\n\t\t\t\"title\": \"JavaScript: The Definitive Guide\"\n\t\t}\n\t}\n}\n\nEnsure that your code is well-commented.\nSubmit a GitHub repository with the complete project.\nInclude Firebase credentials in a .env file (Do not expose API keys in public repositories an d make sure .env is created at root level).\nDeploy the app using Firebase Hosting and share the live URL.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsupiyasingh%2Fmodule4_main_evolution","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsupiyasingh%2Fmodule4_main_evolution","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsupiyasingh%2Fmodule4_main_evolution/lists"}