├── .all-contributorsrc ├── .editorconfig ├── .eslintrc ├── .firebaserc ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ ├── deploy.yml │ ├── format_prettier.yml │ ├── greet.yml │ └── integration.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── firebase.json ├── package-lock.json ├── package.json ├── public ├── favicon.ico ├── img │ ├── android │ │ ├── android-icon-144x144.png │ │ ├── android-icon-192x192.png │ │ ├── android-icon-36x36.png │ │ ├── android-icon-48x48.png │ │ ├── android-icon-72x72.png │ │ └── android-icon-96x96.png │ ├── apple │ │ ├── apple-icon-114x114.png │ │ ├── apple-icon-120x120.png │ │ ├── apple-icon-144x144.png │ │ ├── apple-icon-152x152.png │ │ ├── apple-icon-180x180.png │ │ ├── apple-icon-57x57.png │ │ ├── apple-icon-60x60.png │ │ ├── apple-icon-72x72.png │ │ ├── apple-icon-76x76.png │ │ ├── apple-icon-precomposed.png │ │ └── apple-icon.png │ ├── favicon │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ └── favicon.ico │ ├── ms │ │ ├── ms-icon-144x144.png │ │ ├── ms-icon-150x150.png │ │ ├── ms-icon-310x310.png │ │ └── ms-icon-70x70.png │ └── opencode.png ├── index.html ├── manifest.json ├── robots.txt └── worker.js └── src ├── __tests__ └── components │ └── Homepage │ └── Welcome.test.js ├── actions ├── route.action.js └── types.js ├── components ├── HomePage │ ├── About.js │ ├── Contact.js │ ├── Focus.js │ ├── SectionLayout.js │ └── Welcome.js └── Navbar │ ├── CustomTabs.js │ ├── DrawerList.js │ ├── TemporaryDrawer.js │ └── index.js ├── config ├── Root.js ├── history.js └── theme.js ├── index.css ├── index.js ├── reducers ├── index.js └── route.reducer.js ├── serviceWorker.js ├── setupTests.js └── views ├── App.js └── Home.js /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "files": [ 3 | "README.md" 4 | ], 5 | "imageSize": 100, 6 | "commit": false, 7 | "contributors": [ 8 | { 9 | "login": "DesignrKnight", 10 | "name": "Abel Mathew", 11 | "avatar_url": "https://avatars0.githubusercontent.com/u/27865704?v=4", 12 | "profile": "https://designrknight-website.web.app/", 13 | "contributions": [ 14 | "projectManagement", 15 | "code" 16 | ] 17 | }, 18 | { 19 | "login": "ankitkumarsamota121", 20 | "name": "Ankit Samota", 21 | "avatar_url": "https://avatars0.githubusercontent.com/u/46669484?v=4", 22 | "profile": "https://github.com/ankitkumarsamota121", 23 | "contributions": [ 24 | "projectManagement", 25 | "code" 26 | ] 27 | }, 28 | { 29 | "login": "007vedant", 30 | "name": "Vedant Raghuwanshi", 31 | "avatar_url": "https://avatars3.githubusercontent.com/u/41552480?v=4", 32 | "profile": "https://www.linkedin.com/in/vedantraghuwanshi/", 33 | "contributions": [ 34 | "projectManagement", 35 | "code" 36 | ] 37 | }, 38 | { 39 | "login": "nayakashutosh9", 40 | "name": "Ashutosh Nayak", 41 | "avatar_url": "https://avatars2.githubusercontent.com/u/43809818?v=4", 42 | "profile": "https://nayakashutosh9.github.io/portfolio/", 43 | "contributions": [ 44 | "maintenance", 45 | "projectManagement" 46 | ] 47 | }, 48 | { 49 | "login": "KoushikSahu", 50 | "name": "Koushik Sahu", 51 | "avatar_url": "https://avatars0.githubusercontent.com/u/39738439?v=4", 52 | "profile": "https://github.com/KoushikSahu", 53 | "contributions": [ 54 | "doc" 55 | ] 56 | }, 57 | { 58 | "login": "riteshsp2000", 59 | "name": "Ritesh Patil", 60 | "avatar_url": "https://avatars3.githubusercontent.com/u/56112399?v=4", 61 | "profile": "https://github.com/riteshsp2000", 62 | "contributions": [ 63 | "projectManagement", 64 | "code" 65 | ] 66 | }, 67 | { 68 | "login": "all-contributors", 69 | "name": "All Contributors", 70 | "avatar_url": "https://avatars1.githubusercontent.com/u/46410174?v=4", 71 | "profile": "https://allcontributors.org", 72 | "contributions": [ 73 | "tool" 74 | ] 75 | }, 76 | { 77 | "login": "Vedant1202", 78 | "name": "Vedant Nandoskar", 79 | "avatar_url": "https://avatars0.githubusercontent.com/u/35070972?v=4", 80 | "profile": "https://vedantnandoskar.herokuapp.com/", 81 | "contributions": [ 82 | "code" 83 | ] 84 | } 85 | ], 86 | "contributorsPerLine": 7, 87 | "projectName": "project-apollo", 88 | "projectOwner": "opencodenitr", 89 | "repoType": "github", 90 | "repoHost": "https://github.com", 91 | "skipCi": true 92 | } 93 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 2 7 | indent_style = space 8 | insert_final_newline = true 9 | max_line_length = 100 10 | trim_trailing_whitespace = true 11 | [*.md] 12 | max_line_length = 0 13 | trim_trailing_whitespace = false 14 | [{Makefile,**.mk}] 15 | # Use tabs for indentation (Makefiles require tabs) 16 | indent_style = tab 17 | [*.scss] 18 | indent_size = 2 19 | indent_style = space -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "babel-eslint", 3 | "parserOptions": { 4 | "sourceType": "module", 5 | "allowImportExportEverywhere": false, 6 | "codeFrame": false 7 | }, 8 | "extends": ["airbnb", "prettier"], 9 | "env": { 10 | "browser": true, 11 | "jest": true 12 | }, 13 | "rules": { 14 | "max-len": ["error", { "code": 100 }], 15 | "prefer-promise-reject-errors": ["off"], 16 | "react/jsx-filename-extension": ["off"], 17 | "no-return-assign": ["off"] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "project-apollo-8bc2c" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Firebase Deploy 2 | 3 | on: 4 | push: 5 | branches: 6 | - release 7 | 8 | jobs: 9 | firebase-deploy: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@master 14 | - uses: actions/setup-node@master 15 | with: 16 | node-version: '10.x' 17 | - run: npm ci 18 | - run: npm run build 19 | - uses: w9jds/firebase-action@master 20 | with: 21 | args: deploy --only hosting 22 | env: 23 | FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }} 24 | -------------------------------------------------------------------------------- /.github/workflows/format_prettier.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: [dev] 4 | pull_request: 5 | paths: ['.css', '.js', '.jsx'] 6 | 7 | jobs: 8 | prettier: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - uses: actions/setup-node@v1 13 | with: 14 | node-version: 12 15 | 16 | - name: Run prettier 17 | run: npm run prettier --write 'src/**/*.{css,js,jsx}' 18 | 19 | - uses: stefanzweifel/git-auto-commit-action@v4 20 | with: 21 | commit_message: Apply prettier changes 22 | -------------------------------------------------------------------------------- /.github/workflows/greet.yml: -------------------------------------------------------------------------------- 1 | name: Woofy 2 | on: pull_request_target 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - uses: HarishTeens/hacktoberfest-greet@v1.1.0 8 | with: 9 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 10 | -------------------------------------------------------------------------------- /.github/workflows/integration.yml: -------------------------------------------------------------------------------- 1 | name: Continous Integration 2 | 3 | on: 4 | pull_request: 5 | branches: [dev] 6 | 7 | jobs: 8 | test_pull_request: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - uses: actions/setup-node@v1 13 | with: 14 | node-version: 12 15 | - run: npm ci 16 | - run: npm test 17 | - run: npm run build 18 | 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | 25 | .firebase 26 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "trailingComma": "all", 4 | "tabWidth": 2, 5 | "semi": true, 6 | "singleQuote": true, 7 | "arrowParens": "always", 8 | "bracketSpacing": true, 9 | "endOfLine": "auto", 10 | "proseWrap": "preserve", 11 | "quoteProps": "as-needed", 12 | "jsxBracketSameLine": false, 13 | "jsxSingleQuote": true 14 | } 15 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | > A code of conduct is a set of rules outlining the social norms and rules and responsibilities of, or proper practices for, an individual, party or organization 4 | 5 | ## Summary 6 | 7 | The OpenCode organization is dedicated to providing a harassment-free working environment for all, regardless of gender, sexual orientation, disability, physical appearance, body size, race, or religion. We do not tolerate harassment of any form. All communication should be appropriate for a professional audience including people of many different backgrounds. 8 | 9 | Sexual language and imagery is not appropriate for any communication and/or talks. Be kind and do not insult or put down others. Behave professionally. Remember that harassment and sexist, racist, or exclusionary jokes are not appropriate for OpenCode. Staff violating these rules should be reported to an appropriate line manager. 10 | 11 | These are the values to which people in the OpenCode community should aspire: 12 | 13 | - Be friendly and welcoming 14 | - Be patient 15 | - Remember that people have varying communication styles and that not everyone is using their native language. (Meaning and tone can be lost in translation.) 16 | - Be thoughtful 17 | - Productive communication requires effort. Think about how your words will be interpreted. 18 | - Remember that sometimes it is best to refrain entirely from commenting. 19 | - Be respectful 20 | - In particular, respect differences of opinion. 21 | - Be charitable 22 | - Interpret the arguments of others in good faith, do not seek to disagree. 23 | - When we do disagree, try to understand why. 24 | - Avoid destructive behavior: 25 | - Derailing: stay on topic; if you want to talk about something else, start a new conversation. 26 | - Unconstructive criticism: don't merely decry the current state of affairs; offer—or at least solicit—suggestions as to how things may be improved. 27 | - Snarking (pithy, unproductive, sniping comments) 28 | - Discussing potentially offensive or sensitive issues; this all too often leads to unnecessary conflict. 29 | - Microaggressions: brief and commonplace verbal, behavioral and environmental indignities that communicate hostile, derogatory or negative slights and insults to a person or group. 30 | 31 | People are complicated. You should expect to be misunderstood and to misunderstand others; when this inevitably occurs, resist the urge to be defensive or assign blame. Try not to take offense where no offense was intended. Give people the benefit of the doubt. Even if the intent was to provoke, do not rise to it. It is the responsibility of all parties to de-escalate conflict when it arises. 32 | 33 | ## Reporting an incident 34 | 35 | Incidents that violate the Code of Conduct are extremely damaging to the OpenCode, and they will not be tolerated. The silver lining is that, in many cases, these incidents present a chance for the offenders, and the teams at large, to grow, learn, and become better. 36 | 37 | > The following should be handled by a line manager who has been informed of the incident 38 | 39 | Try to get as much of the incident in written form. The important information to gather include the following: 40 | 41 | - Name and team of the participant doing the harassing 42 | - The location in which the incident occurred 43 | - The behavior that was in violation 44 | - The approximate time of the behavior 45 | - The circumstances surrounding the incident 46 | - Other people involved in the incident 47 | 48 | Depending on the severity/details of the incident, please follow these guidelines: 49 | 50 | - If there is any general threat to staff or any other doubts, summon security or police 51 | - Offer the victim a private place to sit 52 | - Ask "is there a friend or trusted person who you would like to be with you?" (if so, arrange for someone to fetch this person) 53 | - Ask them "how can I help?" 54 | - Provide them with your list of emergency contacts if they need help later 55 | - If everyone is presently physically safe, involve the police or security only at a victim's request 56 | 57 | There are also some guidelines as to what not to do as an initial response: 58 | 59 | - Do not overtly invite them to withdraw the complaint or mention that withdrawal is OK. This suggests that you want them to do so, and is therefore coercive. "If you're OK with pursuing the complaint" suggests that you are by default pursuing it and is not coercive. 60 | - Do not ask for their advice on how to deal with the complaint. This is a staff responsibility. 61 | - Do not offer them input into penalties. This is the staff's responsibility. 62 | 63 | The line manager who is handling the reported offence should find out the following: 64 | 65 | - What happened? 66 | - Are we doing anything about it? 67 | - Who is doing those things? 68 | - When are they doing them? 69 | 70 | After the above has been identified and discussed, have an appropriate line manager communicate with the alleged harasser. Make sure to inform them of what has been reported about them. 71 | 72 | Allow the alleged harasser to give their side of the story. After this point, if the report stands, let the alleged harasser know what actions will be taken against them. 73 | 74 | Some things for the staff to consider when dealing with Code of Conduct offenders: 75 | 76 | - Warning the harasser to cease their behaviour and that any further reports will result in sanctions 77 | - Requiring that the harasser avoid any interaction with, and physical proximity to, their victim until a resolution or course of action has been decided upon 78 | - Requiring that the harasser not volunteer for future events your organisation runs (either indefinitely or for a certain time period) 79 | - Depending on the severity/details of the incident, requiring that the harasser immediately be sent home 80 | - Depending on the severity/details of the incident, removing a harasser from membership of relevant OpenCode organisations 81 | - Depending on the severity/details of the incident, publishing an account of the harassment and calling for the resignation of the harasser from their responsibilities (usually pursued by people without formal authority: may be called for if the harasser is a team leader, or refuses to stand aside from the conflict of interest) 82 | 83 | Give accused staff members a place to appeal to if there is one, but in the meantime the report stands. Keep in mind that it is not a good idea to encourage an apology from the harasser. 84 | 85 | It is very important how we deal with the incident publicly. Our policy is to make sure that everyone aware of the initial incident is also made aware that it is not according to policy and that official action has been taken - while still respecting the privacy of individual staff members. When speaking to individuals (those who are aware of the incident, but were not involved with the incident) about the incident it is a good idea to keep the details out. 86 | 87 | Depending on the incident, the head of responsible department, or designate, may decide to make one or more public announcements. If necessary, this will be done with a short announcement either during the plenary and/or through other channels. No one other than the head of responsible department or someone delegated authority from them should make any announcements. No personal information about either party will be disclosed as part of this process. 88 | 89 | If some members of staff were angered by the incident, it is best to apologise to them that the incident occurred to begin with. If there are residual hard feelings, suggest to them to write an email to the responsible head of department. It will be dealt with accordingly. 90 | 91 | ## Attribution 92 | 93 | This Code of Conduct was adapted from both [Golang](https://golang.org/conduct) an the [Golang UK Conference](http://golanguk.com/conduct/). -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | When contributing to this repository, please first discuss the change you wish to make via issue with the maintainers of this repository before making a change. 4 | 5 | Please note we have a code of conduct, please follow it in all your interactions with the project. 6 | 7 | ## Pull Request Process 8 | 9 | 1. Ensure any install or build dependencies are removed before the end of the layer when doing a 10 | build. Add only relevant files to commit and ignore the rest to keep the repo clean. 11 | 2. Update the README.md with details of changes to the interface, this includes new environment 12 | variables, exposed ports, useful file locations and container parameters. 13 | 3. You should request review from the maintainers once you submit the Pull Request. 14 | 15 | ## Instructions 16 | 17 | - Git Workflow 18 | 19 | ```bash 20 | ## Step 1: Fork Repository 21 | 22 | ## Step 2: Git Set Up & Download 23 | # Clone the repo 24 | $ git clone https://github.com//.git 25 | # Add upstream remote 26 | $ git remote add upstream https://github.com/opencodenitr/project-apollo.git 27 | # Fetch and merge with upstream/dev 28 | $ git fetch upstream 29 | $ git merge upstream/dev 30 | 31 | ## Step 2: Create and Publish Working Branch 32 | $ git checkout -b //{} 33 | $ git push origin //{} 34 | 35 | ## Types: 36 | # wip - Work in Progress; long term work; mainstream changes; 37 | # feat - New Feature; future planned; non-mainstream changes; 38 | # bug - Bug Fixes 39 | # exp - Experimental; random experiemntal features; 40 | ``` 41 | 42 | - On Task Completion: 43 | 44 | ```bash 45 | ## Committing and pushing your work 46 | # Ensure branch 47 | $ git branch 48 | # Fetch and merge with upstream/dev 49 | $ git fetch upstream 50 | $ git merge upstream/development 51 | # Add untracked files 52 | $ git add . 53 | # Commit all changes with appropriate commit message and description 54 | $ git commit -m "your-commit-message" -m "your-commit-description" 55 | # Fetch and merge with upstream/development again 56 | $ git fetch upstream 57 | $ git merge upstream/dev 58 | # Push changes to your forked repository 59 | $ git push origin //{} 60 | 61 | ## Creating the PR using GitHub Website 62 | # Create Pull Request from //{} branch in your forked repository to the dev branch in the upstream repository 63 | # After creating PR, add a Reviewer (Any Admin) and yourself as the assignee 64 | # Link Pull Request to appropriate Issue, or Project+Milestone (if no issue created) 65 | # IMPORTANT: Do Not Merge the PR unless specifically asked to by an admin. 66 | ``` 67 | 68 | - After PR Merge 69 | 70 | ```bash 71 | # Delete branch from forked repo 72 | $ git branch -d //{} 73 | $ git push --delete origin //{} 74 | # Fetch and merge with upstream/dev 75 | $ git checkout dev 76 | $ git pull upstream 77 | $ git push origin 78 | ``` 79 | 80 | - Always follow [commit message standards](https://chris.beams.io/posts/git-commit/) 81 | - About the [fork-and-branch workflow](https://blog.scottlowe.org/2015/01/27/using-fork-branch-git-workflow/) 82 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 OpenCode 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Starware](https://img.shields.io/badge/Starware-⭐-black?labelColor=f9b00d)](https://github.com/zepfietje/starware) 2 | 3 | [![All Contributors](https://img.shields.io/badge/all_contributors-8-orange.svg?style=flat-square)](#contributors-) 4 | 5 | ### Contributing 🎃 6 | ------------ 7 | 8 | This repository is one of the many repositories maintained by the NIT Rourkela tech community. To get more info about all of our projects, visit our [Info Doc](https://www.notion.so/c019f8d965c24047b92f227a1b20fe4b?v=b1de077e3ea54a7daf480e8ca59e3167)
9 | We are super happy that you are here and invite you to join us at [our Hacktoberfest Meetup](http://bit.ly/NITR-HF).
10 | Our Slack Community: [Slack Invite](http://bit.ly/NITRDevs)
11 | #### We are excited to see your awesome PRs. As a recognition of your awesome efforts, we would be giving a badge of gratitute to you to showcase your fantastic contribution on sending your first PR in October 2020 12 | `Contributions for Hacktoberfest 2020 are welcome 🎉🎉` 13 | 14 | Please refer to the project's style and contribution guidelines for submitting patches and additions. In general, we follow the "fork-and-pull" Git workflow. 15 | 16 | 1. **Fork** the repo on GitHub 17 | 2. **Clone** the project to your own machine 18 | 3. **Commit** changes to your own branch 19 | 4. **Push** your work back up to your fork 20 | 5. Submit a **Pull request** so that we can review your changes 21 | 22 | NOTE 1: Please abide by the [Contributing Guidelines](https://github.com/opencodenitr/project-apollo/blob/dev/CONTRIBUTING.md). 23 | 24 | NOTE 2: Please abide by the [Code of Conduct](https://github.com/opencodenitr/project-apollo/blob/dev/CODE_OF_CONDUCT.md). 25 | 26 | 27 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 28 | 29 | ## Starware 30 | 31 | opencodenitr/project-apollo is Starware. 32 | This means you're free to use the project, as long as you star its GitHub repository. 33 | Your appreciation makes us grow and glow up. ⭐ 34 | 35 | ## Available Scripts 36 | 37 | In the project directory, you can run: 38 | 39 | ### `npm start` 40 | 41 | Runs the app in the development mode.
42 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 43 | 44 | The page will reload if you make edits.
45 | You will also see any lint errors in the console. 46 | 47 | ### `npm test` 48 | 49 | Launches the test runner in the interactive watch mode.
50 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 51 | 52 | ### `npm run build` 53 | 54 | Builds the app for production to the `build` folder.
55 | It correctly bundles React in production mode and optimizes the build for the best performance. 56 | 57 | The build is minified and the filenames include the hashes.
58 | Your app is ready to be deployed! 59 | 60 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 61 | 62 | ### `npm run eject` 63 | 64 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!** 65 | 66 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 67 | 68 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. 69 | 70 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. 71 | 72 | ## Learn More 73 | 74 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 75 | 76 | To learn React, check out the [React documentation](https://reactjs.org/). 77 | 78 | ### Code Splitting 79 | 80 | This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting 81 | 82 | ### Analyzing the Bundle Size 83 | 84 | This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size 85 | 86 | ### Making a Progressive Web App 87 | 88 | This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app 89 | 90 | ### Advanced Configuration 91 | 92 | This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration 93 | 94 | ### Deployment 95 | 96 | This section has moved here: https://facebook.github.io/create-react-app/docs/deployment 97 | 98 | ### `npm run build` fails to minify 99 | 100 | This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify 101 | 102 | ## Contributors ✨ 103 | 104 | Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 |

Abel Mathew

📆 💻

Ankit Samota

📆 💻

Vedant Raghuwanshi

📆 💻

Ashutosh Nayak

🚧 📆

Koushik Sahu

📖

Ritesh Patil

📆 💻

All Contributors

🔧

Vedant Nandoskar

💻
123 | 124 | 125 | 126 | 127 | 128 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! 129 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "build", 4 | "ignore": [ 5 | "firebase.json", 6 | "**/.*", 7 | "**/node_modules/**" 8 | ] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "project-apollo", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@material-ui/core": "^4.11.0", 7 | "@material-ui/icons": "^4.9.1", 8 | "@testing-library/jest-dom": "^4.2.4", 9 | "@testing-library/react": "^9.5.0", 10 | "@testing-library/user-event": "^7.2.1", 11 | "axios": "^0.20.0", 12 | "enzyme": "^3.11.0", 13 | "enzyme-adapter-react-16": "^1.15.5", 14 | "moxios": "^0.4.0", 15 | "react": "^16.13.1", 16 | "react-dom": "^16.13.1", 17 | "react-redux": "^7.2.1", 18 | "react-router-dom": "^5.2.0", 19 | "react-scripts": "3.4.3", 20 | "redux": "^4.0.5", 21 | "redux-thunk": "^2.3.0" 22 | }, 23 | "scripts": { 24 | "start": "react-scripts start", 25 | "build": "react-scripts build", 26 | "test": "react-scripts test", 27 | "eject": "react-scripts eject" 28 | }, 29 | "eslintConfig": { 30 | "extends": "react-app" 31 | }, 32 | "browserslist": { 33 | "production": [ 34 | ">0.2%", 35 | "not dead", 36 | "not op_mini all" 37 | ], 38 | "development": [ 39 | "last 1 chrome version", 40 | "last 1 firefox version", 41 | "last 1 safari version" 42 | ] 43 | }, 44 | "devDependencies": { 45 | "prettier": "^2.1.2" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/favicon.ico -------------------------------------------------------------------------------- /public/img/android/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/android/android-icon-144x144.png -------------------------------------------------------------------------------- /public/img/android/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/android/android-icon-192x192.png -------------------------------------------------------------------------------- /public/img/android/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/android/android-icon-36x36.png -------------------------------------------------------------------------------- /public/img/android/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/android/android-icon-48x48.png -------------------------------------------------------------------------------- /public/img/android/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/android/android-icon-72x72.png -------------------------------------------------------------------------------- /public/img/android/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/android/android-icon-96x96.png -------------------------------------------------------------------------------- /public/img/apple/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/apple/apple-icon-114x114.png -------------------------------------------------------------------------------- /public/img/apple/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/apple/apple-icon-120x120.png -------------------------------------------------------------------------------- /public/img/apple/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/apple/apple-icon-144x144.png -------------------------------------------------------------------------------- /public/img/apple/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/apple/apple-icon-152x152.png -------------------------------------------------------------------------------- /public/img/apple/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/apple/apple-icon-180x180.png -------------------------------------------------------------------------------- /public/img/apple/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/apple/apple-icon-57x57.png -------------------------------------------------------------------------------- /public/img/apple/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/apple/apple-icon-60x60.png -------------------------------------------------------------------------------- /public/img/apple/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/apple/apple-icon-72x72.png -------------------------------------------------------------------------------- /public/img/apple/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/apple/apple-icon-76x76.png -------------------------------------------------------------------------------- /public/img/apple/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/apple/apple-icon-precomposed.png -------------------------------------------------------------------------------- /public/img/apple/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/apple/apple-icon.png -------------------------------------------------------------------------------- /public/img/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /public/img/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /public/img/favicon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/favicon/favicon-96x96.png -------------------------------------------------------------------------------- /public/img/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/favicon/favicon.ico -------------------------------------------------------------------------------- /public/img/ms/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/ms/ms-icon-144x144.png -------------------------------------------------------------------------------- /public/img/ms/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/ms/ms-icon-150x150.png -------------------------------------------------------------------------------- /public/img/ms/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/ms/ms-icon-310x310.png -------------------------------------------------------------------------------- /public/img/ms/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/ms/ms-icon-70x70.png -------------------------------------------------------------------------------- /public/img/opencode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodenitr/project-apollo/4747bdfda7411814c9f6bc4a6d23d9cad7597e73/public/img/opencode.png -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 16 | 17 | 26 | Opencode 27 | 28 | 29 | 30 |
31 | 46 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "./img/opencode.png", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "./img/opencode.png", 12 | "type": "image/png", 13 | "sizes": "512x512" 14 | } 15 | ], 16 | "start_url": ".", 17 | "display": "standalone", 18 | "theme_color": "#000000", 19 | "background_color": "#ffffff" 20 | } 21 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/worker.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-restricted-globals */ 2 | var CACHE_NAME = 'pwa-task-manager'; 3 | var urlsToCache = [ 4 | '/', 5 | '/completed' 6 | ]; 7 | 8 | // Install a service worker 9 | self.addEventListener('install', event => { 10 | // Perform install steps 11 | event.waitUntil( 12 | caches.open(CACHE_NAME) 13 | .then(function(cache) { 14 | // console.log('Opened cache'); 15 | return cache.addAll(urlsToCache); 16 | }) 17 | ); 18 | }); 19 | 20 | // Cache and return requests 21 | self.addEventListener('fetch', event => { 22 | event.respondWith( 23 | caches.match(event.request) 24 | .then(function(response) { 25 | // Cache hit - return response 26 | if (response) { 27 | return response; 28 | } 29 | return fetch(event.request); 30 | } 31 | ) 32 | ); 33 | }); 34 | 35 | // Update a service worker 36 | self.addEventListener('activate', event => { 37 | var cacheWhitelist = ['pwa-task-manager']; 38 | event.waitUntil( 39 | caches.keys().then(cacheNames => { 40 | return Promise.all( 41 | cacheNames.map(cacheName => { 42 | if (cacheWhitelist.indexOf(cacheName) === -1) { 43 | return caches.delete(cacheName); 44 | } 45 | }) 46 | ); 47 | }) 48 | ); 49 | }); -------------------------------------------------------------------------------- /src/__tests__/components/Homepage/Welcome.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { render, unmountComponentAtNode } from 'react-dom'; 3 | import { act } from 'react-dom/test-utils'; 4 | 5 | import Welcome from '../../../components/HomePage/Welcome'; 6 | import About from '../../../components/HomePage/About'; 7 | import Focus from '../../../components/HomePage/Focus'; 8 | import Contact from '../../../components/HomePage/Contact'; 9 | 10 | let container = null; 11 | beforeEach(() => { 12 | // setup a DOM element as a render target 13 | container = document.createElement('div'); 14 | document.body.appendChild(container); 15 | }); 16 | 17 | afterEach(() => { 18 | // cleanup on exiting 19 | unmountComponentAtNode(container); 20 | container.remove(); 21 | container = null; 22 | }); 23 | 24 | it('renders welcome section content', () => { 25 | act(() => { 26 | render(, container); 27 | }); 28 | expect(container.textContent).toBe('Welcome Section'); 29 | }); 30 | 31 | it('renders about section content', () => { 32 | act(() => { 33 | render(, container); 34 | }); 35 | expect(container.textContent).toBe('About Section'); 36 | }); 37 | 38 | it('renders focus section content', () => { 39 | act(() => { 40 | render(, container); 41 | }); 42 | expect(container.textContent).toBe('Focus Section'); 43 | }); 44 | 45 | it('renders contact us section content', () => { 46 | act(() => { 47 | render(, container); 48 | }); 49 | expect(container.textContent).toBe('Contact Section'); 50 | }); 51 | -------------------------------------------------------------------------------- /src/actions/route.action.js: -------------------------------------------------------------------------------- 1 | import { ROUTE_CHANGE } from './types'; 2 | 3 | export const changeRoute = (routeId) => { 4 | return { type: ROUTE_CHANGE, payload: routeId }; 5 | }; 6 | -------------------------------------------------------------------------------- /src/actions/types.js: -------------------------------------------------------------------------------- 1 | export const ROUTE_CHANGE = 'ROUTE_CHANGE'; 2 | -------------------------------------------------------------------------------- /src/components/HomePage/About.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { makeStyles } from '@material-ui/core/styles'; 3 | 4 | import SectionLayout from './SectionLayout'; 5 | 6 | function About({ onScrollClick }) { 7 | const classes = useStyle(); 8 | 9 | return ( 10 | 11 |

About Section

12 |
13 | ); 14 | } 15 | 16 | export default About; 17 | 18 | const useStyle = makeStyles((theme) => ({ 19 | heading: { 20 | fontFamily: theme.typography.fontFamily, 21 | fontSize: '3em', 22 | }, 23 | })); 24 | -------------------------------------------------------------------------------- /src/components/HomePage/Contact.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { makeStyles } from '@material-ui/core/styles'; 3 | 4 | import SectionLayout from './SectionLayout'; 5 | 6 | function Contact() { 7 | const classes = useStyle(); 8 | 9 | return ( 10 | 11 |

Contact Section

12 |
13 | ); 14 | } 15 | 16 | export default Contact; 17 | 18 | const useStyle = makeStyles((theme) => ({ 19 | heading: { 20 | fontFamily: theme.typography.fontFamily, 21 | fontSize: '3em', 22 | }, 23 | })); 24 | -------------------------------------------------------------------------------- /src/components/HomePage/Focus.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { makeStyles } from '@material-ui/core/styles'; 3 | 4 | import SectionLayout from './SectionLayout'; 5 | 6 | function Focus({ onScrollClick }) { 7 | const classes = useStyle(); 8 | 9 | return ( 10 | 11 |

Focus Section

12 |
13 | ); 14 | } 15 | 16 | export default Focus; 17 | 18 | const useStyle = makeStyles((theme) => ({ 19 | heading: { 20 | fontFamily: theme.typography.fontFamily, 21 | fontSize: '3em', 22 | }, 23 | })); 24 | -------------------------------------------------------------------------------- /src/components/HomePage/SectionLayout.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { makeStyles } from '@material-ui/core/styles'; 3 | import { Container } from '@material-ui/core'; 4 | import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown'; 5 | 6 | function SectionLayout({ children, lastSection, onScrollClick, alternate }) { 7 | const classes = useStyle(); 8 | 9 | return ( 10 | 14 | {children} 15 | {lastSection ? null : ( 16 | 20 | )} 21 | 22 | ); 23 | } 24 | 25 | export default SectionLayout; 26 | 27 | const useStyle = makeStyles((theme) => ({ 28 | container: { 29 | height: '95vh', 30 | padding: theme.spacing(0, 1), 31 | paddingTop: theme.mixins.toolbar.minHeight, 32 | position: 'relative', 33 | display: 'flex', 34 | justifyContent: 'center', 35 | alignItems: 'center', 36 | }, 37 | chevronDown: { 38 | position: 'absolute', 39 | bottom: 20, 40 | }, 41 | })); 42 | -------------------------------------------------------------------------------- /src/components/HomePage/Welcome.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { makeStyles } from '@material-ui/core/styles'; 3 | 4 | import SectionLayout from './SectionLayout'; 5 | 6 | function Welcome({ onScrollClick }) { 7 | const classes = useStyle(); 8 | 9 | return ( 10 | 11 |

Welcome Section

12 |
13 | ); 14 | } 15 | 16 | export default Welcome; 17 | 18 | const useStyle = makeStyles((theme) => ({ 19 | heading: { 20 | fontFamily: theme.typography.fontFamily, 21 | fontSize: '3em', 22 | }, 23 | })); 24 | -------------------------------------------------------------------------------- /src/components/Navbar/CustomTabs.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { connect } from 'react-redux'; 3 | import { Link as RouteLink } from 'react-router-dom'; 4 | 5 | import { makeStyles } from '@material-ui/core/styles'; 6 | import { Tab, Tabs } from '@material-ui/core'; 7 | 8 | import { changeRoute } from '../../actions/route.action'; 9 | 10 | const useStyles = makeStyles((theme) => ({ 11 | indicator: { 12 | display: 'flex', 13 | justifyContent: 'center', 14 | backgroundColor: 'transparent', 15 | '& > span': { 16 | maxWidth: 40, 17 | width: '100%', 18 | backgroundColor: theme.palette.primary.main, 19 | }, 20 | }, 21 | tab: { 22 | textTransform: 'none', 23 | color: theme.palette.text.primary, 24 | fontWeight: theme.typography.fontWeightBold, 25 | fontSize: theme.typography.pxToRem(14), 26 | '&:focus': { 27 | opacity: 1, 28 | }, 29 | }, 30 | tabs: { 31 | minWidth: 120, 32 | width: 120, 33 | }, 34 | })); 35 | 36 | const CustomTabs = ({ selectedRoute, changeRoute }) => { 37 | const classes = useStyles(); 38 | 39 | const handleChange = (event, newValue) => { 40 | changeRoute(newValue); 41 | }; 42 | 43 | return ( 44 |
45 | , 51 | }} 52 | classes={{ 53 | indicator: classes.indicator, 54 | }} 55 | > 56 | 64 | 72 | 80 | 88 | 89 |
90 | ); 91 | }; 92 | 93 | const mapStateToProps = (state) => { 94 | return { selectedRoute: state.selectedRoute }; 95 | }; 96 | 97 | export default connect(mapStateToProps, { changeRoute })(CustomTabs); 98 | -------------------------------------------------------------------------------- /src/components/Navbar/DrawerList.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { connect } from 'react-redux'; 3 | import { Link as RouteLink } from 'react-router-dom'; 4 | 5 | import { makeStyles } from '@material-ui/core/styles'; 6 | import { List, ListItem, ListItemText } from '@material-ui/core'; 7 | 8 | import { changeRoute } from '../../actions/route.action'; 9 | 10 | const useStyles = makeStyles((theme) => ({ 11 | root: { 12 | width: '60vw', 13 | maxWidth: 360, 14 | backgroundColor: theme.palette.background.paper, 15 | }, 16 | listItemText: { 17 | textAlign: 'right', 18 | }, 19 | })); 20 | 21 | const DrawerList = ({ selectedRoute, changeRoute, toggleDrawer }) => { 22 | const classes = useStyles(); 23 | 24 | const handleListItemClick = (event, index) => { 25 | changeRoute(index); 26 | }; 27 | 28 | return ( 29 |
30 | 31 | handleListItemClick(event, 0)} 35 | component={RouteLink} 36 | to='/' 37 | > 38 | 39 | 40 | handleListItemClick(event, 1)} 44 | component={RouteLink} 45 | to='/skills' 46 | > 47 | 48 | 49 | handleListItemClick(event, 2)} 53 | component={RouteLink} 54 | to='/projects' 55 | > 56 | 57 | 58 | handleListItemClick(event, 3)} 62 | component={RouteLink} 63 | to='/contact' 64 | > 65 | 66 | 67 | 68 |
69 | ); 70 | }; 71 | 72 | const mapStateToProps = (state) => { 73 | return { selectedRoute: state.selectedRoute }; 74 | }; 75 | 76 | export default connect(mapStateToProps, { changeRoute })(DrawerList); 77 | -------------------------------------------------------------------------------- /src/components/Navbar/TemporaryDrawer.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import MenuRoundedIcon from '@material-ui/icons/MenuRounded'; 4 | import { makeStyles } from '@material-ui/core/styles'; 5 | import { Drawer, Button } from '@material-ui/core'; 6 | 7 | import DrawerList from './DrawerList'; 8 | 9 | const useStyles = makeStyles((theme) => ({ 10 | div: { 11 | width: '45%', 12 | }, 13 | list: { 14 | '&:focus': { 15 | opacity: 1, 16 | }, 17 | }, 18 | listItem: { 19 | fontWeight: theme.typography.fontWeightBold, 20 | fontSize: theme.typography.pxToRem(14), 21 | }, 22 | fullList: { 23 | width: 'auto', 24 | }, 25 | })); 26 | 27 | const TemporaryDrawer = () => { 28 | const classes = useStyles(); 29 | const [state, setState] = React.useState(false); 30 | 31 | const toggleDrawer = (open) => (event) => { 32 | if ( 33 | event.type === 'keydown' && 34 | (event.key === 'Tab' || event.key === 'Shift') 35 | ) { 36 | return; 37 | } 38 | 39 | setState(open); 40 | }; 41 | 42 | return ( 43 |
44 | 47 | 48 | 49 | 50 |
51 | ); 52 | }; 53 | 54 | export default TemporaryDrawer; 55 | -------------------------------------------------------------------------------- /src/components/Navbar/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { useScrollTrigger } from '@material-ui/core'; 4 | import PropTypes from 'prop-types'; 5 | 6 | import { 7 | Grid, 8 | AppBar, 9 | Toolbar, 10 | Box, 11 | Button, 12 | Container, 13 | } from '@material-ui/core'; 14 | import { makeStyles } from '@material-ui/core/styles'; 15 | import HomeRoundedIcon from '@material-ui/icons/HomeRounded'; 16 | 17 | import TemporaryDrawer from './TemporaryDrawer'; 18 | import CustomTabs from './CustomTabs'; 19 | 20 | const useStyles = makeStyles((theme) => ({ 21 | appbar: { 22 | alignItems: 'center', 23 | background: theme.palette.background.default, 24 | display: 'flex', 25 | padding: theme.spacing(1), 26 | [theme.breakpoints.up('md')]: { 27 | padding: theme.spacing(2), 28 | }, 29 | }, 30 | container: { 31 | display: 'flex', 32 | justifyContent: 'center', 33 | alignItems: 'center', 34 | alignContent: 'center', 35 | }, 36 | grid: { 37 | display: 'flex', 38 | alignItems: 'center', 39 | }, 40 | icon: { 41 | alignItems: 'center', 42 | }, 43 | })); 44 | 45 | function ElevationScroll(props) { 46 | const { children } = props; 47 | 48 | const trigger = useScrollTrigger({ 49 | disableHysteresis: true, 50 | threshold: 0, 51 | }); 52 | 53 | return React.cloneElement(children, { 54 | elevation: trigger ? 4 : 0, 55 | }); 56 | } 57 | 58 | ElevationScroll.propTypes = { 59 | children: PropTypes.element.isRequired, 60 | }; 61 | 62 | const Navbar = () => { 63 | const classes = useStyles(); 64 | 65 | return ( 66 | <> 67 | 68 | 69 | 70 | 71 | 72 | 75 | 76 | 80 | 81 | 82 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | ); 95 | }; 96 | 97 | export default Navbar; 98 | -------------------------------------------------------------------------------- /src/config/Root.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { createStore, applyMiddleware, compose } from 'redux'; 3 | import { Provider } from 'react-redux'; 4 | import thunk from 'redux-thunk'; 5 | 6 | import reducers from '../reducers'; 7 | 8 | export default ({ initialState = {}, children }) => { 9 | const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; 10 | const store = createStore(reducers, initialState, composeEnhancers(applyMiddleware(thunk))); 11 | 12 | return {children}; 13 | }; 14 | -------------------------------------------------------------------------------- /src/config/history.js: -------------------------------------------------------------------------------- 1 | import { createBrowserHistory } from 'history'; 2 | export default createBrowserHistory(); 3 | -------------------------------------------------------------------------------- /src/config/theme.js: -------------------------------------------------------------------------------- 1 | import { createMuiTheme, responsiveFontSizes } from '@material-ui/core/styles'; 2 | 3 | let theme = createMuiTheme({ 4 | palette: { 5 | type: 'dark', 6 | primary: { 7 | main: '#a6f6f1', 8 | }, 9 | background: { 10 | paper: '#00587a', 11 | default: '#0f3057', 12 | }, 13 | }, 14 | breakpoints: { 15 | values: { 16 | xs: 0, 17 | sm: 600, 18 | md: 900, 19 | lg: 1280, 20 | xl: 1920, 21 | }, 22 | }, 23 | typography: { 24 | fontFamily: 'Roboto', 25 | }, 26 | }); 27 | 28 | theme = responsiveFontSizes(theme); 29 | 30 | export default theme; 31 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=Montserrat:wght@200;300;400;500;600;700&family=Poppins:wght@200;300;400;500;600;700&display=swap"); 2 | 3 | *, 4 | *::after, 5 | *::before { 6 | margin: 0; 7 | padding: 0; 8 | box-sizing: inherit; 9 | } 10 | 11 | body { 12 | font-family: "Poppins", "Montserrat", sans-serif !important; 13 | font-weight: 400; 14 | font-size: 16px; 15 | line-height: 1.7; 16 | box-sizing: border-box; 17 | } 18 | 19 | li, 20 | a { 21 | text-decoration: none; 22 | } 23 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | 4 | import Root from './config/Root'; 5 | import App from './views/App'; 6 | 7 | // import './index.css'; 8 | 9 | import * as serviceWorker from './serviceWorker'; 10 | 11 | ReactDOM.render( 12 | 13 | 14 | , 15 | document.querySelector('#root'), 16 | ); 17 | 18 | // If you want your app to work offline and load faster, you can change 19 | // unregister() to register() below. Note this comes with some pitfalls. 20 | // Learn more about service workers: http://bit.ly/CRA-PWA 21 | serviceWorker.register(); 22 | -------------------------------------------------------------------------------- /src/reducers/index.js: -------------------------------------------------------------------------------- 1 | import { combineReducers } from 'redux'; 2 | 3 | import routeReducer from './route.reducer'; 4 | 5 | export default combineReducers({ 6 | selectedRoute: routeReducer, 7 | }); 8 | -------------------------------------------------------------------------------- /src/reducers/route.reducer.js: -------------------------------------------------------------------------------- 1 | import { ROUTE_CHANGE } from '../actions/types'; 2 | 3 | const selectionReducer = (selected = 0, action) => { 4 | switch (action.type) { 5 | case ROUTE_CHANGE: 6 | return action.payload; 7 | default: 8 | return selected; 9 | } 10 | }; 11 | 12 | export default selectionReducer; 13 | -------------------------------------------------------------------------------- /src/serviceWorker.js: -------------------------------------------------------------------------------- 1 | // This optional code is used to register a service worker. 2 | // register() is not called by default. 3 | 4 | // This lets the app load faster on subsequent visits in production, and gives 5 | // it offline capabilities. However, it also means that developers (and users) 6 | // will only see deployed updates on subsequent visits to a page, after all the 7 | // existing tabs open on the page have been closed, since previously cached 8 | // resources are updated in the background. 9 | 10 | // To learn more about the benefits of this model and instructions on how to 11 | // opt-in, read https://bit.ly/CRA-PWA 12 | 13 | const isLocalhost = Boolean( 14 | window.location.hostname === 'localhost' || 15 | // [::1] is the IPv6 localhost address. 16 | window.location.hostname === '[::1]' || 17 | // 127.0.0.0/8 are considered localhost for IPv4. 18 | window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/), 19 | ); 20 | 21 | export function register(config) { 22 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 23 | // The URL constructor is available in all browsers that support SW. 24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); 25 | if (publicUrl.origin !== window.location.origin) { 26 | // Our service worker won't work if PUBLIC_URL is on a different origin 27 | // from what our page is served on. This might happen if a CDN is used to 28 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 29 | return; 30 | } 31 | 32 | window.addEventListener('load', () => { 33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 34 | 35 | if (isLocalhost) { 36 | // This is running on localhost. Let's check if a service worker still exists or not. 37 | checkValidServiceWorker(swUrl, config); 38 | 39 | // Add some additional logging to localhost, pointing developers to the 40 | // service worker/PWA documentation. 41 | navigator.serviceWorker.ready.then(() => { 42 | console.log( 43 | 'This web app is being served cache-first by a service ' + 44 | 'worker. To learn more, visit https://bit.ly/CRA-PWA', 45 | ); 46 | }); 47 | } else { 48 | // Is not localhost. Just register service worker 49 | registerValidSW(swUrl, config); 50 | } 51 | }); 52 | } 53 | } 54 | 55 | function registerValidSW(swUrl, config) { 56 | navigator.serviceWorker 57 | .register(swUrl) 58 | .then((registration) => { 59 | registration.onupdatefound = () => { 60 | const installingWorker = registration.installing; 61 | if (installingWorker == null) { 62 | return; 63 | } 64 | installingWorker.onstatechange = () => { 65 | if (installingWorker.state === 'installed') { 66 | if (navigator.serviceWorker.controller) { 67 | // At this point, the updated precached content has been fetched, 68 | // but the previous service worker will still serve the older 69 | // content until all client tabs are closed. 70 | console.log( 71 | 'New content is available and will be used when all ' + 72 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.', 73 | ); 74 | 75 | // Execute callback 76 | if (config && config.onUpdate) { 77 | config.onUpdate(registration); 78 | } 79 | } else { 80 | // At this point, everything has been precached. 81 | // It's the perfect time to display a 82 | // "Content is cached for offline use." message. 83 | console.log('Content is cached for offline use.'); 84 | 85 | // Execute callback 86 | if (config && config.onSuccess) { 87 | config.onSuccess(registration); 88 | } 89 | } 90 | } 91 | }; 92 | }; 93 | }) 94 | .catch((error) => { 95 | console.error('Error during service worker registration:', error); 96 | }); 97 | } 98 | 99 | function checkValidServiceWorker(swUrl, config) { 100 | // Check if the service worker can be found. If it can't reload the page. 101 | fetch(swUrl, { 102 | headers: { 'Service-Worker': 'script' }, 103 | }) 104 | .then((response) => { 105 | // Ensure service worker exists, and that we really are getting a JS file. 106 | const contentType = response.headers.get('content-type'); 107 | if ( 108 | response.status === 404 || 109 | (contentType != null && contentType.indexOf('javascript') === -1) 110 | ) { 111 | // No service worker found. Probably a different app. Reload the page. 112 | navigator.serviceWorker.ready.then((registration) => { 113 | registration.unregister().then(() => { 114 | window.location.reload(); 115 | }); 116 | }); 117 | } else { 118 | // Service worker found. Proceed as normal. 119 | registerValidSW(swUrl, config); 120 | } 121 | }) 122 | .catch(() => { 123 | console.log('No internet connection found. App is running in offline mode.'); 124 | }); 125 | } 126 | 127 | export function unregister() { 128 | if ('serviceWorker' in navigator) { 129 | navigator.serviceWorker.ready 130 | .then((registration) => { 131 | registration.unregister(); 132 | }) 133 | .catch((error) => { 134 | console.error(error.message); 135 | }); 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /src/setupTests.js: -------------------------------------------------------------------------------- 1 | import Enzyme from 'enzyme'; 2 | import Adapter from 'enzyme-adapter-react-16'; 3 | 4 | Enzyme.configure({ adapter: new Adapter() }); 5 | -------------------------------------------------------------------------------- /src/views/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Router, Route, Redirect, Switch } from 'react-router-dom'; 3 | 4 | import { ThemeProvider } from '@material-ui/core/styles'; 5 | import { CssBaseline } from '@material-ui/core'; 6 | 7 | import createBrowserHistory from '../config/history'; 8 | import Home from './Home'; 9 | import Navbar from '../components/Navbar'; 10 | 11 | import theme from '../config/theme'; 12 | 13 | const App = () => { 14 | return ( 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | ); 28 | }; 29 | 30 | export default App; 31 | -------------------------------------------------------------------------------- /src/views/Home.js: -------------------------------------------------------------------------------- 1 | import React, { useRef } from 'react'; 2 | 3 | // Libraries 4 | import { makeStyles } from '@material-ui/core/styles'; 5 | import { Container } from '@material-ui/core'; 6 | 7 | // Components 8 | import About from '../components/HomePage/About'; 9 | import Contact from '../components/HomePage/Contact'; 10 | import Focus from '../components/HomePage/Focus'; 11 | import Welcome from '../components/HomePage/Welcome'; 12 | 13 | function Home() { 14 | const classes = useStyle(); 15 | const welcomeRef = useRef(); 16 | const aboutRef = useRef(); 17 | const focusRef = useRef(); 18 | const contactRef = useRef(); 19 | 20 | const scrollToRef = (ref) => { 21 | ref.current.scrollIntoView({ behavior: 'smooth' }); 22 | }; 23 | 24 | return ( 25 | 26 |
27 | scrollToRef(aboutRef)} /> 28 |
29 |
30 | scrollToRef(focusRef)} /> 31 |
32 |
33 | scrollToRef(contactRef)} /> 34 |
35 |
36 | 37 |
38 |
39 | ); 40 | } 41 | 42 | export default Home; 43 | 44 | const useStyle = makeStyles((theme) => ({ 45 | container: { 46 | padding: theme.spacing(0, 1), 47 | }, 48 | })); 49 | --------------------------------------------------------------------------------