Project Structure

Let's begin with Project Structure.

It depends on an individual choice of how they structure their projects. However, in this project, we'll be splitting our app into two main folders app and features under the src folder.

For the assets like images, logo, etc. We'll put them into the public folder.
We'll use a global CSS file styles.css(located in src/app/layout) and we store our index.js file in our src folder.


src
โ”ฃ app/
โ”ฃ features/
โ”ฃ index.js
โ”ฃ reportWebVitals.js
โ”— setupTests.js

Complete Structure#

public folder#

public/
โ”ฃ assets/
โ”ƒ โ”ฃ categoryImages/
โ”ƒ โ”ƒ โ”ฃ culture.jpg
โ”ƒ โ”ƒ โ”ฃ drinks.jpg
โ”ƒ โ”ƒ โ”ฃ film.jpg
โ”ƒ โ”ƒ โ”ฃ food.jpg
โ”ƒ โ”ƒ โ”ฃ music.jpg
โ”ƒ โ”ƒ โ”— travel.jpg
โ”ƒ โ”ฃ logo.png
โ”ƒ โ”— user.png
โ”ฃ android-chrome-192x192.png
โ”ฃ android-chrome-512x512.png
โ”ฃ apple-touch-icon.png
โ”ฃ favicon-16x16.png
โ”ฃ favicon-32x32.png
โ”ฃ favicon.ico
โ”ฃ index.html
โ”ฃ manifest.json
โ”— robots.txt

src folder#

src/
โ”ฃ app/
โ”ƒ โ”ฃ api/
โ”ƒ โ”ƒ โ”— categoryOptions.js
โ”ƒ โ”ฃ common/
โ”ƒ โ”ƒ โ”ฃ errors/
โ”ƒ โ”ƒ โ”ƒ โ”— ErrorComponent.jsx
โ”ƒ โ”ƒ โ”ฃ form/
โ”ƒ โ”ƒ โ”ƒ โ”ฃ MyDateInput.jsx
โ”ƒ โ”ƒ โ”ƒ โ”ฃ MySelectInput.jsx
โ”ƒ โ”ƒ โ”ƒ โ”ฃ MyTextArea.jsx
โ”ƒ โ”ƒ โ”ƒ โ”— MyTextInput.jsx
โ”ƒ โ”ƒ โ”ฃ modals/
โ”ƒ โ”ƒ โ”ƒ โ”ฃ ModalManager.jsx
โ”ƒ โ”ƒ โ”ƒ โ”— ModalWrapper.jsx
โ”ƒ โ”ƒ โ”ฃ photos/
โ”ƒ โ”ƒ โ”ƒ โ”ฃ PhotoUploadWidget.jsx
โ”ƒ โ”ƒ โ”ƒ โ”ฃ PhotoWidgetCropper.jsx
โ”ƒ โ”ƒ โ”ƒ โ”— PhotoWidgetDropzone.jsx
โ”ƒ โ”ƒ โ”— util/
โ”ƒ โ”ƒ โ”— util.js
โ”ƒ โ”ฃ config/
โ”ƒ โ”ƒ โ”— firebase.js
โ”ƒ โ”ฃ firestore/
โ”ƒ โ”ƒ โ”ฃ firebaseService.js
โ”ƒ โ”ƒ โ”— firestoreService.js
โ”ƒ โ”ฃ hooks/
โ”ƒ โ”ƒ โ”ฃ useFirestoreCollection.js
โ”ƒ โ”ƒ โ”— useFirestoreDoc.js
โ”ƒ โ”— layout/
โ”ƒ โ”ฃ App.jsx
โ”ƒ โ”ฃ LoadingComponent.jsx
โ”ƒ โ”ฃ PrivateRoute.jsx
โ”ƒ โ”ฃ ScrollToTop.jsx
โ”ƒ โ”— styles.css
โ”ฃ features/
โ”ƒ โ”ฃ auth/
โ”ƒ โ”ƒ โ”ฃ AccountPage.jsx
โ”ƒ โ”ƒ โ”ฃ LoginInForm.jsx
โ”ƒ โ”ƒ โ”ฃ RegisterForm.jsx
โ”ƒ โ”ƒ โ”ฃ SocialLogin.jsx
โ”ƒ โ”ƒ โ”— UnauthModal.jsx
โ”ƒ โ”ฃ events/
โ”ƒ โ”ƒ โ”ฃ eventDashboard/
โ”ƒ โ”ƒ โ”ƒ โ”ฃ EventDashboard.jsx
โ”ƒ โ”ƒ โ”ƒ โ”ฃ EventFilters.jsx
โ”ƒ โ”ƒ โ”ƒ โ”ฃ EventList.jsx
โ”ƒ โ”ƒ โ”ƒ โ”ฃ EventListAttendee.jsx
โ”ƒ โ”ƒ โ”ƒ โ”ฃ EventListItem.jsx
โ”ƒ โ”ƒ โ”ƒ โ”— EventListItemPlaceholder.jsx
โ”ƒ โ”ƒ โ”ฃ eventDetailed/
โ”ƒ โ”ƒ โ”ƒ โ”ฃ EventDetailedChat.jsx
โ”ƒ โ”ƒ โ”ƒ โ”ฃ EventDetailedChatForm.jsx
โ”ƒ โ”ƒ โ”ƒ โ”ฃ EventDetailedHeader.jsx
โ”ƒ โ”ƒ โ”ƒ โ”ฃ EventDetailedInfo.jsx
โ”ƒ โ”ƒ โ”ƒ โ”ฃ EventDetailedPage.jsx
โ”ƒ โ”ƒ โ”ƒ โ”— EventDetailedSidebar.jsx
โ”ƒ โ”ƒ โ”— eventForm/
โ”ƒ โ”ƒ โ”— EventForm.jsx
โ”ƒ โ”ฃ home/
โ”ƒ โ”ƒ โ”— HomePage.jsx
โ”ƒ โ”ฃ nav/
โ”ƒ โ”ƒ โ”ฃ NavBar.jsx
โ”ƒ โ”ƒ โ”ฃ SignedIn.jsx
โ”ƒ โ”ƒ โ”— SignedOut.jsx
โ”ƒ โ”ฃ profiles/
โ”ƒ โ”ƒ โ”— profilePage/
โ”ƒ โ”ƒ โ”ฃ AboutTab.jsx
โ”ƒ โ”ƒ โ”ฃ EventsTab.jsx
โ”ƒ โ”ƒ โ”ฃ FollowingTab.jsx
โ”ƒ โ”ƒ โ”ฃ PhotosTab.jsx
โ”ƒ โ”ƒ โ”ฃ ProfileCard.jsx
โ”ƒ โ”ƒ โ”ฃ ProfileContent.jsx
โ”ƒ โ”ƒ โ”ฃ ProfileForm.jsx
โ”ƒ โ”ƒ โ”ฃ ProfileHeader.jsx
โ”ƒ โ”ƒ โ”— ProfilePage.jsx
โ”ƒ โ”— store/
โ”ƒ โ”ฃ actions/
โ”ƒ โ”ƒ โ”ƒ โ”ฃ actionTypes.js
โ”ƒ โ”ƒ โ”ƒ โ”ฃ authActions.js
โ”ƒ โ”ƒ โ”ƒ โ”ฃ eventActions.js
โ”ƒ โ”ƒ โ”ƒ โ”— profileActions.js
โ”ƒ โ”ฃ reducers/
โ”ƒ โ”ƒ โ”ƒ โ”ฃ asyncReducer.js
โ”ƒ โ”ƒ โ”ƒ โ”ฃ authReducer.js
โ”ƒ โ”ƒ โ”ƒ โ”ฃ eventReducer.js
โ”ƒ โ”ƒ โ”ƒ โ”ฃ modalReducer.js
โ”ƒ โ”ƒ โ”ƒ โ”ฃ profileReducer.js
โ”ƒ โ”ƒ โ”ƒ โ”— rootReducer.js
โ”ƒ โ”— configStore.js
โ”ฃ index.js
โ”ฃ reportWebVitals.js
โ”— setupTests.js