├── .editorconfig
├── .env.sample
├── .eslintrc.json
├── .gitignore
├── .prettierrc
├── LICENSE
├── README.md
├── package.json
├── public
├── favicon.ico
├── index.html
├── logo.png
├── manifest.json
├── opensource.png
└── robots.txt
├── src
├── app
│ ├── Router.js
│ ├── assets
│ │ ├── back.svg
│ │ ├── computer.svg
│ │ ├── details.svg
│ │ ├── detailz.svg
│ │ ├── example.svg
│ │ ├── front.svg
│ │ ├── icons
│ │ │ ├── fork.svg
│ │ │ ├── star.svg
│ │ │ └── view.svg
│ │ ├── index.js
│ │ ├── issue.svg
│ │ ├── issues.svg
│ │ ├── langing.svg
│ │ ├── logo.png
│ │ └── search.svg
│ ├── components
│ │ ├── Button
│ │ │ └── index.js
│ │ ├── ChartLang
│ │ │ ├── index.js
│ │ │ └── style.js
│ │ ├── Footer
│ │ │ ├── index.js
│ │ │ └── style.js
│ │ ├── IssueList
│ │ │ └── index.js
│ │ ├── Navbar
│ │ │ ├── index.js
│ │ │ └── style.js
│ │ ├── Progressbar
│ │ │ ├── index.js
│ │ │ └── style.js
│ │ ├── ProjectCard
│ │ │ ├── index.js
│ │ │ └── style.js
│ │ ├── ProjectDetailsCard
│ │ │ ├── index.js
│ │ │ ├── style.css
│ │ │ └── style.js
│ │ ├── SearchBoxx
│ │ │ ├── index.js
│ │ │ └── style.js
│ │ └── index.js
│ ├── pages
│ │ ├── Contact.js
│ │ ├── LandingPage.js
│ │ ├── Login.js
│ │ ├── NotFoundPage.js
│ │ ├── ProjectDetail.js
│ │ ├── Projects.js
│ │ ├── Start.js
│ │ ├── index.js
│ │ ├── style.css
│ │ └── style.js
│ └── redux
│ │ ├── actions
│ │ └── index.js
│ │ ├── index.js
│ │ ├── reducers
│ │ ├── index.js
│ │ └── projectReducer.js
│ │ └── store
│ │ └── index.js
├── index.js
├── reportWebVitals.js
└── reset.css
└── yarn.lock
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | end_of_line = lf
6 | indent_size = 2
7 | indent_style = space
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/.env.sample:
--------------------------------------------------------------------------------
1 | REACT_APP_API_URL =
2 | REACT_APP_GH_CLIENT_ID =
3 | REACT_APP_ALGOLIA_KEY_ONE =
4 | REACT_APP_ALGOLIA_KEY_TWO =
5 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": true,
4 | "es2021": true
5 | },
6 | "extends": [
7 | "plugin:react/recommended",
8 | "standard"
9 | ],
10 | "parserOptions": {
11 | "ecmaFeatures": {
12 | "jsx": true
13 | },
14 | "ecmaVersion": 12,
15 | "sourceType": "module"
16 | },
17 | "plugins": [
18 | "react"
19 | ],
20 | "rules": {
21 | "react/prop-types": "off"
22 | },
23 | "settings": {
24 | "react": {
25 | "version": "latest"
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/.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 | .env
16 | .DS_Store
17 | .env.local
18 | .env.development.local
19 | .env.test.local
20 | .env.production.local
21 |
22 | npm-debug.log*
23 | yarn-debug.log*
24 | yarn-error.log*
25 |
26 | .eslintcache
27 | client/.eslintcache
28 | .vscode
29 | .idea/**/*
30 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 100,
3 | "trailingComma": "none",
4 | "tabWidth": 2,
5 | "semi": false,
6 | "singleQuote": true,
7 | "space-before-function-paren",
8 | }
9 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 opensource-place
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 | # Open Source Place (React Front-end)
2 |
3 |
4 |
5 |
6 | ## Want to Contribute?
7 |
8 | You have 2 things you can do:
9 |
10 | 1. Either open an issue about a bug, feature request, page, or component,
11 | 2. __Or__ close an issue, by writing and/or implementing it in your own fork!
12 |
13 |
14 |
15 | ## A Little About Design
16 |
17 | [`Figma Design Sheet`](https://www.figma.com/file/qOFIkueP572MnHwaF7ey0a/Untitled?node-id=59%3A490)
18 | is here in case you want to take a look.
19 | Bear in mind that it's still in development!
20 |
21 |
22 |
23 | ## Development & Deploying Guide
24 |
25 | Firstly, install your dependencies!
26 |
27 | ```sh
28 | yarn install
29 | ```
30 |
31 | Next up, create yourself a `.env` file!
32 |
33 | ```sh
34 | # .env
35 | REACT_APP_API_URL = {your backend api url here}
36 | ```
37 |
38 | Then you can do:
39 |
40 | ```sh
41 | yarn start
42 | ```
43 |
44 | for a development server, or
45 |
46 | ```sh
47 | yarn run build
48 | ```
49 |
50 | for building the project into static, deployable files.
51 |
52 |
53 |
54 | ## Linting
55 |
56 | > Additionally, you can do `yarn run lint` to see formatting errors
57 | > and `yarn run lint:fix` to fix them.
58 | > Don't worry if you forgot to lint your code!
59 | > Someone will definitely fix it in another commit for you :smiley:
60 |
61 |
62 | ## .vscode settings.json
63 | ```
64 | {
65 | "editor.codeActionsOnSave": {
66 | "source.fixAll.eslint": true
67 | },
68 | "eslint.validate": ["js"],
69 | "editor.formatOnSave": true
70 | }
71 | ```
72 | ## for disable eslint while coding
73 | ```
74 | /* eslint-disable */
75 | ```
76 |
77 |
78 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@nivo/bar": "^0.67.0",
7 | "@nivo/core": "^0.67.0",
8 | "@reduxjs/toolkit": "^1.5.0",
9 | "@tailwindcss/postcss7-compat": "^2.0.2",
10 | "@testing-library/jest-dom": "^5.11.4",
11 | "@testing-library/react": "^11.1.0",
12 | "@testing-library/user-event": "^12.1.10",
13 | "algoliasearch": "^4.8.5",
14 | "axios": "^0.21.1",
15 | "bizcharts": "^4.1.5",
16 | "dotenv": "^8.2.0",
17 | "eslint": "^7.12.1",
18 | "eslint-config-standard": "^16.0.2",
19 | "eslint-plugin-import": "^2.22.1",
20 | "eslint-plugin-node": "^11.1.0",
21 | "eslint-plugin-promise": "^4.2.1",
22 | "eslint-plugin-react": "^7.22.0",
23 | "markdown-to-jsx": "^7.1.1",
24 | "react": "^17.0.1",
25 | "react-circular-progressbar": "^2.0.3",
26 | "react-dom": "^17.0.1",
27 | "react-instantsearch-dom": "^6.9.0",
28 | "react-redux": "^7.2.2",
29 | "react-router-dom": "^5.2.0",
30 | "react-scripts": "4.0.1",
31 | "react-search-input": "^0.11.3",
32 | "redux": "^4.0.5",
33 | "redux-logger": "^3.0.6",
34 | "redux-thunk": "^2.3.0",
35 | "styled-components": "^5.2.1",
36 | "web-vitals": "^0.2.4"
37 | },
38 | "scripts": {
39 | "start": "react-scripts start",
40 | "build": "react-scripts build",
41 | "test": "react-scripts test",
42 | "eject": "react-scripts eject",
43 | "lint": "eslint .",
44 | "lint:fix": "eslint . --fix"
45 | },
46 | "browserslist": {
47 | "production": [
48 | ">0.2%",
49 | "not dead",
50 | "not op_mini all"
51 | ],
52 | "development": [
53 | "last 1 chrome version",
54 | "last 1 firefox version",
55 | "last 1 safari version"
56 | ]
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opensource-place/frontend/a5942eb705015823692f72b8df3c1f8111ae198b/public/favicon.ico
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
22 |
23 |
24 |
25 |
34 | Open Source Place
35 |
37 |
38 |
39 |
40 |
41 |
42 | You need to enable JavaScript to run this app.
43 |
44 |
45 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opensource-place/frontend/a5942eb705015823692f72b8df3c1f8111ae198b/public/logo.png
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/public/opensource.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opensource-place/frontend/a5942eb705015823692f72b8df3c1f8111ae198b/public/opensource.png
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/src/app/Router.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { BrowserRouter as Routers, Route, Switch } from 'react-router-dom'
3 | import axios from 'axios'
4 | import { Projects, LandingPage, Start, Login, ProjectDetail, Contact, NotFoundPage } from './pages'
5 | import { Provider } from 'react-redux'
6 | import storex from './redux/store'
7 |
8 | const Router = () => {
9 | axios.defaults.baseURL = process.env.REACT_APP_API_URL
10 |
11 | return (
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | )
26 | }
27 |
28 | export default Router
29 |
--------------------------------------------------------------------------------
/src/app/assets/computer.svg:
--------------------------------------------------------------------------------
1 | 3_Web development_isometric
--------------------------------------------------------------------------------
/src/app/assets/details.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
--------------------------------------------------------------------------------
/src/app/assets/example.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/app/assets/icons/fork.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/app/assets/icons/star.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/app/assets/icons/view.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/app/assets/index.js:
--------------------------------------------------------------------------------
1 | import Star from './icons/star.svg'
2 | import Fork from './icons/fork.svg'
3 | import View from './icons/view.svg'
4 | import IssuesWarning from './issues.svg'
5 | import front from './front.svg'
6 | import landing from './langing.svg'
7 | import details from './details.svg'
8 | import issue from './issue.svg'
9 | import search from './search.svg'
10 | import computer from './computer.svg'
11 |
12 | export { Star, Fork, View, IssuesWarning, front, landing, details, search, issue, computer }
13 |
--------------------------------------------------------------------------------
/src/app/assets/issues.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/app/assets/langing.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/app/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opensource-place/frontend/a5942eb705015823692f72b8df3c1f8111ae198b/src/app/assets/logo.png
--------------------------------------------------------------------------------
/src/app/components/Button/index.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 |
3 | const StyledButton = styled.button`
4 | border-radius: 8px;
5 | padding: 0.5rem;
6 | width: ${(props) => props.width};
7 | height: ${(props) => props.height};
8 | border: ${(props) => props.border};
9 | margin-right: ${(props) => props.margin};
10 | margin: ${(props) => props.marging};
11 | color: ${(props) => props.color};
12 | border-radius: ${(props) => props.radius};
13 | font-weight: ${(props) => props.fontWeight};
14 | display: flex;
15 | align-items: center;
16 | justify-content: center;
17 | font-size: ${(props) => props.fontSize};
18 | background-color: ${(props) => props.bcolor};
19 |
20 | background: ${(props) =>
21 | props.dublicate
22 | ? '#FFC107'
23 | : props.bug
24 | ? '#B83239'
25 | : props.issue
26 | ? '#16B83F'
27 | : props.wanted
28 | ? '#109DEB'
29 | : props.hard
30 | ? '#00463A'
31 | : props.easy
32 | ? '#008622'
33 | : props.deneme
34 | ? '#1F8874'
35 | : props.landing
36 | ? '#63D0AB'
37 | : props.primary
38 | ? '#1F8874'
39 | : '#00000'};
40 | padding: ${(props) => props.padding || '1rem'};
41 | `
42 | export default StyledButton
43 |
--------------------------------------------------------------------------------
/src/app/components/ChartLang/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Container } from './style'
3 |
4 | const ChartLang = ({ repository }) => {
5 | return
6 | }
7 |
8 | export default ChartLang
9 |
--------------------------------------------------------------------------------
/src/app/components/ChartLang/style.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 |
3 | const Container = styled.div`
4 | @media screen and (min-width: 1024px) {
5 | }
6 |
7 | @media screen and (min-width: 768px) {
8 | }
9 |
10 | @media screen and (min-width: 320px) {
11 | }
12 | `
13 |
14 | export { Container }
15 |
--------------------------------------------------------------------------------
/src/app/components/Footer/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Link } from 'react-router-dom'
3 | import { Container, Text } from './style'
4 |
5 | const year = new Date().getFullYear()
6 |
7 | const Footer = () => (
8 |
9 |
10 |
11 | Documents
12 |
13 |
14 | Contacts
15 |
16 |
17 | © Copyright {year} - Open Source Place
18 |
19 | )
20 |
21 | export default Footer
22 |
--------------------------------------------------------------------------------
/src/app/components/Footer/style.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 |
3 | const Container = styled.div`
4 | width: 100%;
5 | display: flex;
6 | justify-content: center;
7 | align-items: center;
8 | flex-direction: column;
9 | margin-top: auto;
10 | background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgba(139, 255, 234, 0.2) 100%);
11 | `
12 | const Wrapper = styled.div`
13 | display: flex;
14 | align-items: flex-end;
15 | justify-content: center;
16 | font-family: Arial, Helvetica, sans-serif !important;
17 | color: '#21403A';
18 | width: 1rem;
19 | `
20 | const Link = styled.button`
21 | text-decoration: none;
22 | margin-left: 2%;
23 | font-size: 1.5rem;
24 | font-weight: 500;
25 | font-style: normal;
26 | color: rgb(75, 125, 116);
27 | padding: 1rem;
28 | &:hover {
29 | color: rgb(33, 64, 58);
30 | }
31 | `
32 | const Menus = styled.div`
33 | display: flex;
34 | `
35 | const Img = styled.img`
36 | width: 10em;
37 | height: 10em;
38 | `
39 | const Text = styled.p`
40 | font-size: 1rem;
41 | font-weight: 300;
42 | color: #4b7d74;
43 | `
44 |
45 | export { Container, Img, Wrapper, Link, Menus, Text }
46 |
--------------------------------------------------------------------------------
/src/app/components/IssueList/index.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react'
2 | import axios from 'axios'
3 |
4 | const IssueList = (props) => {
5 | const [issues, setIssues] = useState([])
6 |
7 | useEffect(() => {
8 | dataFetch()
9 | }, [])
10 |
11 | const dataFetch = async () => {
12 | const res = await axios.get(`/${props.repository_slug}/issues`)
13 | setIssues(res.data)
14 | }
15 |
16 | return issues.map((issue, index) => (
17 |
18 |
19 | {issue.title}
20 |
21 |
22 | ))
23 | }
24 |
25 | export default IssueList
26 |
--------------------------------------------------------------------------------
/src/app/components/Navbar/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Link } from 'react-router-dom'
3 | import styled from 'styled-components'
4 | import { Wrapper, ItemsWrapper, LogoAndText, Menus, NavItem, NavTitle } from './style'
5 |
6 | const Navbar = styled.nav`
7 | padding: 0.5rem 10%;
8 | width: 100%;
9 | position: fixed;
10 | top: 0;
11 | z-index: 1;
12 | background-color: #f7f7f7;
13 | box-shadow: 0 4px 14px 0 rgb(0 0 0 / 10%), 0 6px 20px 2px rgb(0 0 0 / 3%);
14 | @media screen and (max-width: 768px) {
15 | padding: 0.5rem 5px;
16 | }
17 | `
18 | const LogoImg = styled.img`
19 | width: 35px;
20 |
21 | @media screen and (max-width: 768px) {
22 | width: 38px;
23 | }
24 | `
25 |
26 | export const NavBar = () => (
27 |
28 |
29 |
30 |
31 |
32 |
33 | Open Source Place
34 |
35 |
36 |
58 |
59 |
60 |
61 | )
62 |
63 | export default NavBar
64 |
--------------------------------------------------------------------------------
/src/app/components/Navbar/style.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 |
3 | const Container = styled.div`
4 | display: flex;
5 | justify-content: center;
6 | align-items: center;
7 | flex-direction: column;
8 | border-radius: 15px;
9 | position: fixed;
10 | bottom: 0;
11 | `
12 | const Wrapper = styled.div`
13 | display: flex;
14 | justify-content: space-between;
15 | align-items: center;
16 | width: 100%;
17 | background-color: #fff;
18 | `
19 | const ItemsWrapper = styled.div`
20 | display: flex;
21 | align-items: center;
22 | justify-content: space-between;
23 | width: 100%;
24 |
25 | @media screen and (max-width: 768px) {
26 | flex-direction: column;
27 | }
28 | `
29 | const LogoAndText = styled.div`
30 | display: flex;
31 | align-items: center;
32 | font-weight: 600;
33 | font-size: 30px;
34 | `
35 | const Menus = styled.div`
36 | margin-right: 5px;
37 | display: flex;
38 | margin-left: auto;
39 |
40 | @media screen and (max-width: 768px) {
41 | margin: 0 auto;
42 | padding-top: 1rem;
43 | justify-content: center;
44 | flex-wrap: wrap;
45 | }
46 | `
47 | const NavItem = styled.div`
48 | margin-left: 25px;
49 | color: '#1FB79B' !important;
50 | font-weight: 600;
51 |
52 | @media screen and (max-width: 768px) {
53 | margin: 0.5rem;
54 | }
55 | `
56 | const NavTitle = styled.div`
57 | margin-left: 10px;
58 | font-size: 18px;
59 | color: #1fb79b;
60 |
61 | @media screen and (max-width: 768px) {
62 | font-size: 22px;
63 | }
64 | `
65 |
66 | export { Container, Wrapper, ItemsWrapper, LogoAndText, Menus, NavItem, NavTitle }
67 |
--------------------------------------------------------------------------------
/src/app/components/Progressbar/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Container, TopDiv, Text, LengthText } from './style'
3 | import {
4 | buildStyles,
5 | CircularProgressbarWithChildren
6 | } from 'react-circular-progressbar'
7 |
8 | const Progressbar = ({ issues }) => {
9 | const progress = issues.length
10 | return (
11 |
12 |
13 |
20 |
28 |
29 | {issues.length}
30 | issues
31 |
32 |
33 |
34 |
35 |
36 | )
37 | }
38 |
39 | export default Progressbar
40 |
--------------------------------------------------------------------------------
/src/app/components/Progressbar/style.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 |
3 | const Container = styled.div`
4 | @media screen and (min-width: 1024px) {
5 | }
6 |
7 | @media screen and (min-width: 768px) {
8 | }
9 |
10 | @media screen and (min-width: 320px) {
11 | }
12 | display: flex;
13 | flex-direction: column;
14 | align-items: center;
15 | justify-content: flex-start;
16 | height: 100%;
17 | width: 100%;
18 | `
19 |
20 | const Text = styled.div`
21 | height: 70%;
22 | width: 70%;
23 | text-align: center;
24 | display: flex;
25 | flex-direction: column;
26 | justify-content: center;
27 | font-size: 0.75rem;
28 | color: #333333;
29 | background: #f2f2f2;
30 | border-radius: 100%;
31 | `
32 | const TopDiv = styled.div``
33 | const LengthText = styled.strong`
34 | display: flex;
35 | justify-content: center;
36 | font-size: 24px;
37 | `
38 |
39 | export { Container, Text, TopDiv, LengthText }
40 |
--------------------------------------------------------------------------------
/src/app/components/ProjectCard/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Link } from 'react-router-dom'
3 | import { Container, Text, TopDiv, BottomDiv } from './style'
4 | import { StyledButton, Progressbar } from '../index'
5 | import { ResponsiveBar } from '@nivo/bar'
6 |
7 | const ProjectCard = ({ hit }) => {
8 | const data = [hit.languages]
9 | const path = `/project${hit.pathname}`
10 | const pathx = path.split('/')
11 | return (
12 |
13 |
14 |
15 | {pathx[3]}
16 |
17 |
76 | {id} : {value}
77 |
78 | )
79 | }}
80 | motionStiffness={90}
81 | motionDamping={15}
82 | />
83 |
84 |
85 |
94 | Details
95 |
96 |
97 |
98 |
99 | )
100 | }
101 |
102 | export default ProjectCard
103 |
--------------------------------------------------------------------------------
/src/app/components/ProjectCard/style.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 |
3 | const Container = styled.div`
4 | @media screen and (min-width: 1024px) {
5 | height: 28rem;
6 | width: 18rem;
7 | }
8 |
9 | @media screen and (min-width: 768px) {
10 | height: 28rem;
11 | width: 18rem;
12 | }
13 |
14 | @media screen and (min-width: 320px) {
15 | height: 29rem;
16 | width: 18rem;
17 | top: 1rem;
18 | }
19 | display: flex;
20 | flex-direction: column;
21 | border: 2px solid #4b7d74;
22 | border-radius: 30px;
23 | justify-content: space-between;
24 | margin: 2rem 0.6rem;
25 | transition: all 0.18s ease;
26 | box-shadow: 1px 4px 6px rgba(0, 0, 0, 0.25);
27 | &:hover {
28 | transform: translateY(-10px);
29 | }
30 | `
31 |
32 | const Text = styled.h1`
33 | font-size: 1rem;
34 | color: #000;
35 | margin-top: 10px;
36 | `
37 | const BottomDiv = styled.div`
38 | display: flex;
39 | align-items: center;
40 | flex-direction: column;
41 | height: 100px;
42 | width: 100%;
43 | `
44 | const TopDiv = styled.div`
45 | display: flex;
46 | justify-content: center;
47 | align-items: center;
48 | flex-direction: column;
49 | width: 100%;
50 | margin-top: 25px;
51 | `
52 |
53 | export { Container, Text, TopDiv, BottomDiv }
54 |
--------------------------------------------------------------------------------
/src/app/components/ProjectDetailsCard/index.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | import React, { useEffect, useState } from 'react'
3 | import {
4 | Container,
5 | Issues,
6 | Details,
7 | IssuesDetail,
8 | IssuesFull,
9 | IssuesDetailRigth,
10 | IssuesDetailLeft,
11 | DetailsRight,
12 | DetailsRightRow,
13 | DetailsRightText,
14 | DetailsMiddle,
15 | DetailsLeft,
16 | Language,
17 | BottomDiv,
18 | Readme,
19 | Text,
20 | TextB,
21 | Label,
22 | GithubDirecting,
23 | UserDirecting
24 | } from './style'
25 | import './style.css'
26 | import { useParams } from 'react-router-dom'
27 | import { Progressbar, StyledButton } from '../index'
28 | import axios from 'axios'
29 | import { Fork, View, Star, IssuesWarning } from '../../assets'
30 | import Markdown from 'markdown-to-jsx'
31 |
32 | const ProjectDetail = () => {
33 | const { projectname, reponame } = useParams()
34 | const [issues, setIssues] = useState([])
35 | const [repo, setRepo] = useState([])
36 | const [content, setContent] = useState('')
37 |
38 | useEffect(() => {
39 | projectFetch()
40 | getMarkdown()
41 | }, [])
42 |
43 | const findDate = (datex) => {
44 | if (!datex) return 'invalid time error'
45 | const dayConvert = 1000 * 3600 * 24
46 | const milisaniye = new Date(datex).getTime()
47 | const sonuc = Date.now() - milisaniye
48 | const gunHesapla = Math.ceil(sonuc / dayConvert)
49 | return gunHesapla
50 | }
51 |
52 | const projectFetch = async () => {
53 | const query = `{
54 | issues(pathname:"/${projectname}/${reponame}") {
55 | html_url
56 | title
57 | created_at
58 | number
59 | user{
60 | login
61 | avatar_url
62 | }
63 | labels{
64 | name
65 | color
66 | }
67 | }
68 | }`
69 |
70 | const repos = `{
71 | repository(pathname:"/${projectname}/${reponame}"){
72 | pathname
73 | forks_count
74 | stargazers_count
75 | contributors{
76 | avatar_url
77 | }
78 | }
79 | }`
80 |
81 | const res = await axios.get(`${process.env.REACT_APP_API_URL}/graphql?query=${query}`)
82 | setIssues(res.data.data.issues)
83 |
84 | const repox = await axios.get(`${process.env.REACT_APP_API_URL}/graphql?query=${repos}`)
85 | setRepo(repox.data.data.repository)
86 | }
87 |
88 | const getMarkdown = async () => {
89 | const res = await axios.get(
90 | `https://raw.githubusercontent.com/${projectname}/${reponame}/master/README.md`
91 | )
92 | setContent(await res.data)
93 | }
94 |
95 | const GithubUrl = `https://www.github.com/${projectname}/${reponame}`
96 | // const avatar = [
97 | // repo.contributors[0].avatar_url,
98 | // repo.contributors[1].avatar_url,
99 | // repo.contributors[2].avatar_url
100 | // ]
101 |
102 | // console.log(repo.contributors[0])
103 |
104 | return (
105 |
106 |
107 |
108 | {reponame}
109 |
110 | {projectname}
111 |
112 |
113 |
114 |
115 |
116 |
117 | {/* JavaScript */}
118 | {/*
119 |
120 | 78
121 | */}
122 |
123 |
124 | {repo.stargazers_count}
125 |
126 |
127 |
128 | {repo.forks_count}
129 |
130 |
131 |
132 |
133 | {issues.map((item, i) => (
134 |
135 |
136 | {item.labels.map((label, i) => (
137 |
149 | {label.name}
150 |
151 | ))}
152 |
153 |
154 | {item.title}
155 |
156 |
157 | #{item.number}, {findDate(item.created_at)} days, by {item.user.login}{' '}
158 |
159 |
160 |
161 | ))}
162 |
163 |
164 |
165 | README.md
166 |
177 | {content}
178 |
179 |
180 |
181 | ISSUES
182 | {issues.map((item, i) => (
183 |
184 |
185 |
190 |
191 |
192 |
193 | {item.title}
194 |
195 |
196 | #{item.number}, {findDate(item.created_at)} days, by {item.user.login}{' '}
197 |
198 |
199 |
200 | ))}
201 |
202 |
203 |
204 | )
205 | }
206 |
207 | export default ProjectDetail
208 |
--------------------------------------------------------------------------------
/src/app/components/ProjectDetailsCard/style.css:
--------------------------------------------------------------------------------
1 | .foo {
2 | max-width:100%;
3 | }
4 |
--------------------------------------------------------------------------------
/src/app/components/ProjectDetailsCard/style.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 |
3 | const Container = styled.div`
4 | display: flex;
5 | justify-content: center;
6 | align-items: center;
7 | flex-direction: column;
8 | flex-wrap: wrap;
9 | `
10 |
11 | const Details = styled.div`
12 | display: flex;
13 | justify-content: space-between;
14 | align-items: center;
15 | border: 1px solid #4b7d74;
16 | border-radius: 30px;
17 | color: white;
18 | padding: 1rem;
19 | margin: 2.5rem 0 5rem;
20 | width: auto;
21 | min-width: 40%;
22 | height: 12rem;
23 | border: 2px solid rgba(60, 176, 155, 20%);
24 | `
25 | const Issues = styled.div`
26 | display: flex;
27 | width: 80%;
28 | justify-content: center;
29 | align-items: center;
30 | flex-direction: row;
31 | flex-wrap: wrap;
32 | `
33 |
34 | const IssuesFull = styled.div`
35 | display: flex;
36 | justify-content: flex-start;
37 | align-items: start;
38 | padding: 20px;
39 | margin-right: 10px;
40 | `
41 | const IssuesDetail = styled.div`
42 | display: flex;
43 | justify-content: center;
44 | align-items: center;
45 | flex-direction: column;
46 | flex-wrap: wrap;
47 | width: 40%;
48 | margin: 5.5px;
49 | border-radius: 30px;
50 | border: 2px solid rgba(60, 176, 155, 20%);
51 | padding: 0 1rem;
52 | `
53 |
54 | const IssuesDetailRigth = styled.div`
55 | display: flex;
56 | justify-content: flex-start;
57 | align-items: start;
58 | flex-direction: column;
59 | `
60 | const IssuesDetailLeft = styled.div`
61 | display: flex;
62 | justify-content: center;
63 | align-items: center;
64 | `
65 |
66 | const DetailsLeft = styled.div`
67 | text-align: center;
68 | display: flex;
69 | flex-direction: column;
70 | justify-content: center;
71 | align-items: center;
72 | margin-right: 1rem;
73 | `
74 | const DetailsMiddle = styled.div`
75 | margin: 0 15px;
76 | `
77 | const DetailsRight = styled.div`
78 | display: flex;
79 | justify-content: center;
80 | align-items: center;
81 | flex-direction: column;
82 | width: 125px;
83 | `
84 | const DetailsRightRow = styled.div`
85 | display: flex;
86 | justify-content: center;
87 | align-items: center;
88 | font-height: 12px;
89 | margin-bottom: 6px;
90 | `
91 | const DetailsRightText = styled.p`
92 | display: flex;
93 | margin: 0 0 0 6px;
94 | color: #4b7d74;
95 | `
96 | const Language = styled.h6`
97 | color: #4b7d74;
98 | `
99 |
100 | const BottomDiv = styled.div`
101 | display: flex;
102 | justify-content: center;
103 | width: 100%;
104 | margin-top: 1rem;
105 | margin-bottom: 2rem;
106 | `
107 | const Readme = styled.div`
108 | padding: 1rem;
109 | width: 40%;
110 | min-width: 500px;
111 | border: 2px solid rgba(60, 176, 155, 20%);
112 | border-radius: 30px;
113 | font-size: 12px;
114 | margin: 0.2rem;
115 | height: 100%;
116 | `
117 | const TextB = styled.h4`
118 | display: flex;
119 | justify-content: center;
120 | align-items: center;
121 | font-size: 12px;
122 | color: #9f9f9f;
123 | `
124 |
125 | const Text = styled.h4`
126 | display: flex;
127 | justify-content: center;
128 | text-align: center;
129 | align-items: center;
130 | font-size: 0.75rem;
131 | font-weight: medium !important;
132 | color: #000;
133 | `
134 |
135 | const Label = styled.div`
136 | display: flex;
137 | align-items: center;
138 | justify-content: center;
139 | flex-wrap: wrap;
140 | margin: 24px 0 8px 0;
141 | `
142 |
143 | const GithubDirecting = styled.a`
144 | color: #4b7d74;
145 | font-size: 2rem;
146 | &:hover {
147 | color: #4b7d74;
148 | }
149 | `
150 | const UserDirecting = styled.a`
151 | color: rgba(0, 0, 0, 0.35);
152 | font-weight: 600;
153 | &:hover {
154 | color: #4b7d74;
155 | cursor: pointer;
156 | }
157 | `
158 |
159 | export {
160 | Container,
161 | Issues,
162 | Details,
163 | IssuesFull,
164 | IssuesDetail,
165 | IssuesDetailRigth,
166 | IssuesDetailLeft,
167 | DetailsRight,
168 | DetailsRightRow,
169 | DetailsRightText,
170 | DetailsMiddle,
171 | DetailsLeft,
172 | BottomDiv,
173 | Language,
174 | Readme,
175 | Text,
176 | TextB,
177 | Label,
178 | GithubDirecting,
179 | UserDirecting
180 | }
181 |
--------------------------------------------------------------------------------
/src/app/components/SearchBoxx/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import algoliasearch from 'algoliasearch/lite'
4 | import { SearchBox, InstantSearch } from 'react-instantsearch-dom'
5 |
6 | const Search = styled.div`
7 | display: flex;
8 | width: 400px;
9 | height: 480px;
10 | border: 1px solid black;
11 | margin: 0 48px 0 0;
12 | `
13 |
14 | const searchClient = algoliasearch(
15 | process.env.REACT_APP_ALGOLIA_KEY_ONE,
16 | process.env.REACT_APP_ALGOLIA_KEY_TWO
17 | )
18 |
19 | const SearchBoxx = () => {
20 | return (
21 |
22 |
23 |
24 |
25 |
26 | )
27 | }
28 | export default SearchBoxx
29 |
--------------------------------------------------------------------------------
/src/app/components/SearchBoxx/style.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 |
3 | /**
4 | * const Input = styled.input`
5 | margin: 5px 0px;
6 | padding: 10px;
7 | width: 100%;
8 | border-radius: 5px;
9 | `
10 | *type='search'
11 | placeholder={placeholder}
12 | onChange={handleChange}
13 | */
14 | export const Container = styled.input`
15 | width: ${(props) => props.width};
16 | height: ${(props) => props.height};
17 | border: ${(props) => props.border};
18 | color: ${(props) => props.color};
19 | border-radius: 15px;
20 |
21 | `
22 |
--------------------------------------------------------------------------------
/src/app/components/index.js:
--------------------------------------------------------------------------------
1 | export { default as Footer } from './Footer'
2 | export { default as IssueList } from './IssueList'
3 | export { default as NavBar } from './Navbar'
4 | export { default as ProjectCard } from './ProjectCard'
5 | export { default as SearchBoxx } from './SearchBoxx'
6 | export { default as StyledButton } from './Button'
7 | export { default as ChartLang } from './ChartLang'
8 | export { default as ProjectDetailsCard } from './ProjectDetailsCard'
9 | export { default as Progressbar } from './Progressbar'
10 |
--------------------------------------------------------------------------------
/src/app/pages/Contact.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { NavBar } from '../components'
3 | import styled from 'styled-components'
4 | import Footer from '../components/Footer'
5 |
6 | const Container = styled.div`
7 | display: flex;
8 | align-items: center;
9 | justify: center;
10 | width: 100%;
11 | min-height: 90vh;
12 | margin-top: 90px;
13 | `
14 |
15 | const HeroTitle = styled.h1`
16 | text-align: center;
17 | font-size: 2.6rem;
18 | font-weight: 700;
19 | background: -webkit-linear-gradient(
20 | 331deg,
21 | rgba(114, 137, 218, 1) 0%,
22 | rgba(84, 172, 152, 1) 73%,
23 | rgba(99, 208, 171, 1) 100%
24 | );
25 | -webkit-background-clip: text;
26 | -webkit-text-fill-color: transparent;
27 | `
28 | const HeroTitleContent = styled.p`
29 | font-size: 1.2rem;
30 | text-align: center;
31 | line-height: 1.4;
32 | width: 50%;
33 | color-opaticy: 10%;
34 | color: #72aea3;
35 | margin-bottom: 0.2rem;
36 | @media screen and (max-width: 768px) {
37 | width: 100%;
38 | padding: 1rem 1rem 0;
39 | }
40 | `
41 |
42 | const Soon = styled.div`
43 | display: flex;
44 | align-items: center;
45 | justify-content: center;
46 | flex-direction: column;
47 | width: 100%;
48 | @media screen and (max-width: 768px) {
49 | margin-top: 3rem;
50 | }
51 | `
52 | const Button = styled.div`
53 | display: flex;
54 | margin: 2rem 1rem;
55 | `
56 |
57 | const Go = styled.a`
58 | background-color: #0d0a0b;
59 | background-image: linear-gradient(
60 | 331deg,
61 | rgba(114, 137, 218, 1) 0%,
62 | rgba(84, 172, 152, 1) 73%,
63 | rgba(99, 208, 171, 1) 100%
64 | );
65 | color: white;
66 | font-size: 1.2rem;
67 | padding: 10px 15px;
68 | border-radius: 1rem;
69 | text-decoration: none;
70 | cursor: pointer;
71 | box-shadow: 0px 1px 1px #ccc;
72 | ::hover {
73 | color: white !important;
74 | }
75 | `
76 |
77 | const Start = () => {
78 | return (
79 | <>
80 |
81 |
82 |
83 |
84 | You can join this channel
85 | to communicate with each other.
86 |
87 |
88 | Do you want to be a mentor & mentee while creating projects or contributing?
89 | So you gotta jump on our discord channel
90 |
91 |
92 | Find mentor&mentee
93 |
94 |
103 |
104 |
105 |
106 | >
107 | )
108 | }
109 |
110 | export default Start
111 |
--------------------------------------------------------------------------------
/src/app/pages/LandingPage.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Link } from 'react-router-dom'
3 | import { Footer, NavBar } from '../components'
4 | import { Center, Container } from './style'
5 | import styled from 'styled-components'
6 | import { landing, front, details, search, issue } from '../assets'
7 | import './style.css'
8 |
9 | const Header = styled.div`
10 | display: grid;
11 | margin: 6rem 0;
12 | grid-template-columns: 50% 50%;
13 | flex-wrap: wrap;
14 | align-items: center;
15 | justify-content: center;
16 | width: 68%;
17 |
18 | @media screen and (max-width: 768px) {
19 | display: flex;
20 | flex-direction: column-reverse;
21 | margin: 0px 15px;
22 | padding: 30px 0px;
23 | width: 100%;
24 | }
25 | `
26 | const HeaderLeft = styled.div`
27 | display: flex;
28 | align-items: flex-start;
29 | justify-content: center;
30 | flex-direction: column;
31 | margin-left: 2rem;
32 |
33 | @media screen and (max-width: 768px) {
34 | margin: 2rem;
35 | align-items: center;
36 | }
37 | `
38 | const HeaderRight = styled.div`
39 | display: flex;
40 | justify-content: center;
41 | align-items: center;
42 | min-height: 50%;
43 | `
44 | const HeroTitle = styled.h1`
45 | font-size: 56px;
46 | font-weight: 700;
47 | color: #222;
48 | margin-bottom: 15px;
49 | text-transform: capitalize;
50 |
51 | @media screen and (max-width: 768px) {
52 | font-size: 25px;
53 | text-align: center;
54 | line-height: 2rem;
55 | }
56 | `
57 | const ButtomTitle = styled.h1`
58 | text-align: center;
59 | font-size: 56px;
60 | font-weight: 700;
61 | color: #222;
62 | margin-bottom: 15px;
63 | text-transform: capitalize;
64 | `
65 | const HeroTitleContent = styled.p`
66 | font-size: 20px;
67 | line-height: 1.4;
68 | color: #555;
69 | margin-bottom: 30px;
70 |
71 | @media screen and (max-width: 768px) {
72 | text-align: justify;
73 | }
74 | `
75 | const ButtonLeft = styled.div`
76 | display: flex;
77 | justify-content: flex-start;
78 | width: 430px;
79 |
80 | @media screen and (max-width: 768px) {
81 | width: 100%;
82 | justify-content: center;
83 | }
84 | `
85 | const CustomButton = styled.button`
86 | padding: 0.5rem 1.5rem;
87 | border-radius: 8px;
88 | font-weight: 600;
89 | border: none;
90 | font-size: 24px;
91 | background-color: #63d0ab;
92 | color: #fff;
93 | transition: all 0.15s;
94 | &:hover {
95 | background-color: #54ac8d;
96 | }
97 | `
98 | const Subdescription = styled.div`
99 | display: flex;
100 | padding: 5rem 0;
101 | align-items: center;
102 | flex-direction: column;
103 | justify-content: flex-start;
104 | margin-top: -2px;
105 | width: 100%;
106 | height: 100%;
107 | background: #ffffff;
108 | background: -webkit-linear-gradient(bottom, #ffffff, #63d0ac);
109 | background: -moz-linear-gradient(bottom, #ffffff, #63d0ac);
110 | background: linear-gradient(to top, #ffffff, #63d0ac);
111 |
112 | @media screen and (max-width: 768px) {
113 | padding: 30px;
114 | }
115 | `
116 | const SubTitle = styled.h1`
117 | font-size: 48px;
118 | font-weight: 700;
119 | color: rgba(0, 0, 0, 60%);
120 | letter-spacing: 2px;
121 | word-spacing: 5px;
122 |
123 | @media screen and (max-width: 768px) {
124 | text-align: center;
125 | font-size: 30px;
126 | }
127 | `
128 | const Descprojectcard = styled.div`
129 | display: flex;
130 | justify-content: space-between;
131 | width: 60%;
132 | margin-top: 8rem;
133 | grid-gap: 20px;
134 |
135 | @media screen and (max-width: 768px) {
136 | margin-top: 3rem;
137 | width: 100%;
138 | flex-direction: column;
139 |
140 | &:nth-child(odd) {
141 | flex-direction: column-reverse;
142 | }
143 | }
144 | `
145 | const DescprojectcardRight = styled.div`
146 | display: flex;
147 | justify-content: flex-start;
148 | align-items: center;
149 | width: 50%;
150 | margin-left: 2rem;
151 |
152 | @media screen and (max-width: 768px) {
153 | width: 100%;
154 | margin-left: 0;
155 | }
156 | `
157 | const DescprojectcardLeft = styled.div`
158 | display: flex;
159 | justify-content: center;
160 | align-items: center;
161 | text-align: start;
162 | width: 50%;
163 |
164 | @media screen and (max-width: 768px) {
165 | width: 100%;
166 | }
167 | `
168 | const Soon = styled.div`
169 | display: flex;
170 | padding-top: 5rem;
171 | align-items: center;
172 | flex-direction: column;
173 | justify-content: flex-start;
174 | margin: 20vh 0;
175 | width: 100%;
176 | height: 100%;
177 | `
178 | const GreenText = styled.span`
179 | text-decoration: underline;
180 | text-decoration-color: #63d0ab;
181 | `
182 | const CardImg = styled.img`
183 | width: auto;
184 | height: 400px;
185 |
186 | @media screen and (max-width: 768px) {
187 | height: 300px;
188 | }
189 | `
190 |
191 | const LandingPage = () => {
192 | return (
193 | <>
194 |
195 |
196 |
197 |
198 |
199 | A project platform for the worlds open source supports
200 |
201 | The platform includes open source projects. You can list all published open-source
202 | projects and also add your project on Github to the platform and your projects make
203 | open source!
204 |
205 |
206 |
207 | Add Project
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 | How It Works
219 |
220 |
221 |
222 |
223 |
224 |
225 | If you want to contribute to any project by your level. You need to search first,
226 | take a look at projects by issue label, project language, and project name.
227 |
228 |
229 |
230 |
231 |
232 |
233 | If you find the correct project for you. You can get more details by clicking the
234 | details button. You will see readme, issues, stats of the project.
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 | At the finally, if you find the best issue for you. Click the issue for start to
248 | solve it (redirect you to GitHub) or find another issue ⚡
249 |
250 |
251 |
252 |
253 |
254 |
255 | Lets fly to open source place
256 |
257 | For us, open source is a life-style.
258 |
259 | Lets fly 🛸
260 |
261 |
262 |
263 |
264 | >
265 | )
266 | }
267 |
268 | export default LandingPage
269 |
--------------------------------------------------------------------------------
/src/app/pages/Login.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect } from 'react'
2 |
3 | const Login = () => {
4 | useEffect(() => {
5 | const clientId = process.env.REACT_APP_GH_CLIENT_ID // Your OAuth ID
6 | const redirect = `https://github.com/login/oauth/authorize?client_id=${clientId}&scope=repo,user`
7 | window.location.replace(redirect)
8 | })
9 |
10 | return (
11 |
12 |
Redirecting to GitHub
13 |
14 | )
15 | }
16 |
17 | export default Login
18 |
--------------------------------------------------------------------------------
/src/app/pages/NotFoundPage.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Link } from 'react-router-dom'
3 | import { NavBar } from '../components'
4 | import styled from 'styled-components'
5 | import { IssuesWarning } from '../assets'
6 |
7 | const Container = styled.div`
8 | display: flex;
9 | flex-direction: column;
10 | align-items: center;
11 | justify-content: center;
12 | width: 100%;
13 | height: 80vh;
14 | `
15 | const HeroTitle = styled.h1`
16 | font-size: 3rem;
17 | background: -webkit-linear-gradient(
18 | 331deg,
19 | rgba(168, 169, 61, 1) 0%,
20 | rgba(84, 172, 152, 1) 73%,
21 | rgba(99, 208, 171, 1) 100%
22 | );
23 | font-weight: 600;
24 | -webkit-background-clip: text;
25 | -webkit-text-fill-color: transparent;
26 | `
27 | const HeroTitleContent = styled.p`
28 | display: flex;
29 | font-size: 1.1rem;
30 | line-height: 1.4;
31 | text-align: center;
32 | background: -webkit-linear-gradient(
33 | 331deg,
34 | rgba(168, 169, 61, 1) 0%,
35 | rgba(84, 172, 152, 1) 73%,
36 | rgba(99, 208, 171, 1) 100%
37 | );
38 | font-weight: 600;
39 | -webkit-background-clip: text;
40 | -webkit-text-fill-color: transparent;
41 | color: rgba(20, 120, 102, 60%);
42 | `
43 | const Icon = styled.img`
44 | width: auto;
45 | height: 200px;
46 | margin-bottom: 1rem;
47 | `
48 | const Go = styled.p`
49 | background-color: #0d0a0b;
50 | background-image: linear-gradient(
51 | 331deg,
52 | rgba(168, 169, 61, 1) 0%,
53 | rgba(84, 172, 152, 1) 73%,
54 | rgba(99, 208, 171, 1) 100%
55 | );
56 | color: white;
57 | font-size: 1.2rem;
58 | padding: 10px 15px;
59 | border-radius: 1rem;
60 | text-decoration: none;
61 | cursor: pointer;
62 | box-shadow: 0px 1px 1px #ccc;
63 | `
64 | const Button = styled.div`
65 | display: flex;
66 | margin: 2rem 1rem;
67 | `
68 |
69 | const NotFoundPage = () => {
70 | return (
71 | <>
72 |
73 |
74 |
75 | OPPS!
76 | This page could not be found
77 |
78 |
79 | Back to the home page
80 |
81 |
82 |
83 | >
84 | )
85 | }
86 | export default NotFoundPage
87 |
--------------------------------------------------------------------------------
/src/app/pages/ProjectDetail.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Footer, NavBar, ProjectDetailsCard } from '../components'
3 | import { MainContainer, Containerx } from './style'
4 |
5 | const ProjectDetail = () => {
6 | return (
7 | <>
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | >
16 | )
17 | }
18 |
19 | export default ProjectDetail
20 |
--------------------------------------------------------------------------------
/src/app/pages/Projects.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { NavBar, Footer, ProjectCard } from '../components/'
3 | import { MainContainer, Containerx } from './style'
4 |
5 | import {
6 | SearchBox,
7 | InstantSearch,
8 | Hits,
9 | RefinementList,
10 | Configure,
11 | Pagination
12 | } from 'react-instantsearch-dom'
13 | import algoliasearch from 'algoliasearch/lite'
14 | import './style.css'
15 |
16 | const searchClient = algoliasearch(
17 | process.env.REACT_APP_ALGOLIA_KEY_ONE,
18 | process.env.REACT_APP_ALGOLIA_KEY_TWO
19 | )
20 |
21 | const Projects = () => {
22 | return (
23 | <>
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | ~ Search by labels name ~
37 |
38 |
44 |
45 |
46 |
47 |
51 |
52 |
53 |
54 |
55 |
56 | >
57 | )
58 | }
59 |
60 | export default Projects
61 |
--------------------------------------------------------------------------------
/src/app/pages/Start.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | import React, { useState } from 'react'
3 | import { NavBar } from '../components'
4 | import axios from 'axios'
5 | import { MainContainer, Containerx } from './style'
6 | import styled from 'styled-components'
7 | import { computer } from '../assets'
8 |
9 | const Background = styled.div`
10 | display: flex;
11 | flex-direction: column;
12 | align-items: center;
13 | width: 100%;
14 | margin-top: 3rem;
15 | padding: 1rem;
16 | `
17 |
18 | const ContentTop = styled.div`
19 | display: flex;
20 | flex-direction: column;
21 | align-items: center;
22 | text-align: center;
23 | @media screen and (max-width: 768px) {
24 | margin-top: 2rem;
25 | }
26 | `
27 |
28 | const HeroTitle = styled.h1`
29 | font-size: 3rem;
30 | background: -webkit-linear-gradient(
31 | 331deg,
32 | rgba(168, 169, 61, 1) 0%,
33 | rgba(84, 172, 152, 1) 73%,
34 | rgba(99, 208, 171, 1) 100%
35 | );
36 | font-weight: 600;
37 | -webkit-background-clip: text;
38 | -webkit-text-fill-color: transparent;
39 | @media screen and (max-width: 768px) {
40 | font-size: 2rem;
41 | }
42 | `
43 | const HeroTitleContent = styled.p`
44 | display: flex;
45 | font-size: 1.1rem;
46 | line-height: 1.4;
47 | color: rgba(20, 120, 102, 60%);
48 | `
49 | const ContentBottom = styled.div`
50 | display: flex;
51 | flex-direction: column;
52 | align-items: center;
53 | width: 100%;
54 | margin-top: 2rem;
55 |
56 | @media screen and (max-width: 768px) {
57 | margin-top: 1rem;
58 | }
59 | `
60 | const CustomButton = styled.button`
61 | margin-top: 2rem;
62 | padding: 0.5rem 1.5rem;
63 | border-radius: 8px;
64 | font-weight: 600;
65 | border: none;
66 | font-size: 24px;
67 | background-color: #63d0ab;
68 | color: #fff;
69 | transition: all 0.15s;
70 | &:hover {
71 | background-color: #54ac8d;
72 | }
73 | @media screen and (max-width: 768px) {
74 | margin-bottom: 1rem;
75 | }
76 | `
77 |
78 | const Input = styled.input`
79 | width: 60%;
80 | background-color: #fff;
81 | padding: 1rem;
82 | border-radius: 0.5rem;
83 | border: 1px solid #63d0ab;
84 | -webkit-transition: all 0.15s;
85 | transition: all 0.15s;
86 | color: #209c85;
87 | ::placeholder,
88 | ::-webkit-input-placeholder {
89 | color: #ccc;
90 | }
91 | `
92 | const HeroTitleContentContainer = styled.div`
93 | display: flex;
94 | justify-content: center;
95 | margin: 4rem 0 2rem 0;
96 |
97 | @media screen and (max-width: 768px) {
98 | flex-direction: column;
99 | }
100 | `
101 |
102 | const HeroTitleContentRight = styled.div`
103 | display: flex;
104 | flex-direction: column;
105 | justify-content: center;
106 | margin-left: 1rem;
107 | width: 60%;
108 | text-align: center;
109 |
110 | @media screen and (max-width: 768px) {
111 | align-items: center;
112 | justify-content: center;
113 | margin: 0;
114 | width: 100%;
115 | }
116 | `
117 |
118 | const HeroTitleContentLeft = styled.div`
119 | display: flex;
120 | width: 40%;
121 |
122 | @media screen and (max-width: 768px) {
123 | align-items: center;
124 | justify-content: center;
125 | margin: 0;
126 | width: 100%;
127 | }
128 | `
129 |
130 | const Start = () => {
131 | const [issue, setIssue] = useState('')
132 | const [loading, setLoading] = useState(false)
133 | const [errors, setErrors] = useState(null)
134 | const [succes, setSucces] = useState(null)
135 |
136 | const addIssue = async (e) => {
137 | const url = process.env.REACT_APP_API_URL
138 | setErrors(null)
139 | setLoading(true)
140 | await axios
141 | .post(`${url}/repository`, {
142 | url: issue
143 | })
144 | .then(() => {
145 | setLoading(false)
146 | window.location.reload(true)
147 | setSucces(true)
148 | })
149 | .catch((err) => {
150 | setErrors('Please fill the empty fields or fill with a valid URL')
151 | setIssue('')
152 | setLoading(false)
153 | console.log({ ...err })
154 | })
155 | setIssue('')
156 | setLoading(false)
157 | }
158 |
159 | return (
160 | <>
161 |
162 |
163 |
164 |
165 |
166 | HOW SHOULD YOU ADD THE PROJECT
167 |
168 |
169 |
170 |
171 |
172 |
173 | 👇 Our recommended repository should be
174 | 🛸 Must have a repository README.md
175 | 🛸 Issues should be opened and labeled
176 |
177 | 🛸The url of the Github repository must be added from below
178 |
179 |
180 |
181 |
182 | {loading ? (
183 |
184 | Loading
185 |
186 | ) : (
187 |
188 | setIssue(e.target.value)}
191 | value={issue}
192 | placeholder="GitHub Repository URL (https://github.com/opensource-place/frontend)"
193 | />
194 |
195 | Add Project
196 |
197 |
198 | )}
199 | {errors ? (
200 |
210 | {errors}
211 |
212 | ) : succes ? (
213 |
223 | You can see your added project on the project page.
224 |
225 | ) : (
226 | ''
227 | )}
228 |
229 |
230 |
231 |
232 | >
233 | )
234 | }
235 |
236 | export default Start
237 |
--------------------------------------------------------------------------------
/src/app/pages/index.js:
--------------------------------------------------------------------------------
1 | export { default as LandingPage } from './LandingPage'
2 | export { default as Login } from './Login'
3 | export { default as Projects } from './Projects'
4 | export { default as Start } from './Start'
5 | export { default as ProjectDetail } from './ProjectDetail'
6 | export { default as Contact } from './Contact'
7 | export { default as NotFoundPage } from './NotFoundPage'
8 |
--------------------------------------------------------------------------------
/src/app/pages/style.css:
--------------------------------------------------------------------------------
1 | @media screen and (max-width: 768px) {
2 | .ais-InstantSearch {
3 | margin-top: 5rem;
4 | display:flex;
5 | align-items:center;
6 | flex-direction:column;
7 | flex-wrap:wrap;
8 | }
9 | .left-panel {
10 | align-items:center;
11 | padding: 0.5rem;
12 | width:100% !important;
13 | }
14 | .right-panel {
15 | align-items:center;
16 | padding: 0.5rem;
17 | width:100% !important;
18 | }
19 | .ais-Hits-list {
20 | padding: 0;
21 | justify-content:center !important;
22 | }
23 | .ais-RefinementList-list {
24 | width: 100% !important;
25 | }
26 | .ais-Pagination-list {
27 | width:100%;
28 | flex-wrap:wrap;
29 | margin-bottom: 0.5rem;
30 | padding: 0px;
31 | }
32 | .ais-Pagination-item {
33 | width: 1.7rem !important;
34 | }
35 | .ais-Pagination-link {
36 | padding: 0.5rem 0.5rem !important;
37 | text-align: center;
38 | }
39 | }
40 |
41 | .ais-InstantSearch {
42 | display: flex;
43 | width: 100%;
44 | justify-content: center;
45 | }
46 |
47 | .right-panel {
48 | display: flex;
49 | flex-direction: column;
50 | width: 70%;
51 | align-items: center;
52 | }
53 |
54 | .ais-Hits-list {
55 | display: flex;
56 | justify-content: flex-start;
57 | list-style-type: none;
58 | flex-wrap: wrap;
59 | }
60 | .ais-RefinementList-showMore {
61 | border: none;
62 | padding: 0.5rem 1rem;
63 | color: #fff;
64 | background-color: #63cfab;
65 | font-weight: 600;
66 | border-radius: 8px;
67 | transition: all 0.18s;
68 | }
69 | .ais-RefinementList-showMore:hover {
70 | background-color: #50a78a;
71 | }
72 |
73 | .ais-SearchBox-input {
74 | padding: 0.5rem 1rem;
75 | border-radius: 8px;
76 | border: 1px solid rgba(0, 0, 0, 0.1);
77 | }
78 |
79 | .ais-SearchBox-submit {
80 | margin-left: 0.5rem;
81 | padding: 0.5rem;
82 | border-radius: 8px;
83 | border: none;
84 | background-color: #63d0ab;
85 | transition: all 0.18s;
86 | }
87 | .ais-SearchBox-submit:hover {
88 | background-color: #54ac8d;
89 | }
90 | .ais-SearchBox-submitIcon {
91 | width: 25px;
92 | height: 15px;
93 | font-weight: 600;
94 | fill: #fff;
95 | }
96 |
97 | .ais-SearchBox-reset {
98 | margin-left: 0.5rem;
99 | padding: 0.5rem;
100 | border-radius: 8px;
101 | border: none;
102 | background-color: #63d0ab;
103 | transition: all 0.18s;
104 | }
105 | .ais-SearchBox-reset:hover {
106 | background-color: #54ac8d;
107 | }
108 | .ais-Pagination-list {
109 | list-style-type: none;
110 | }
111 | .ais-Pagination-item {
112 | font-size: 18px;
113 | margin-right: 8px;
114 | border-radius: 8px;
115 | background-color: #54ac8d;
116 | color: #fff;
117 | font-weight: 600;
118 | width: 100%;
119 | height: 100%;
120 | padding: 0;
121 | }
122 | .ais-Pagination-item--disabled {
123 | opacity: 0.65;
124 | }
125 | .ais-Pagination-link {
126 | color: #fff;
127 | padding: .5rem 1rem;
128 | display: block;
129 | }
130 | .ais-Pagination-link:hover {
131 | color: rgb(243, 243, 243);
132 | }
133 | .ais-Pagination-item--selected {
134 | background-color: #63cfab;
135 | }
136 | .ais-SearchBox-resetIcon {
137 | width: 25px;
138 | height: 15px;
139 | font-weight: 600;
140 | fill: #fff;
141 | }
142 |
143 | .ais-Pagination-list {
144 | display: flex;
145 | flex-direction: row;
146 | }
147 | .left-panel {
148 | display: flex;
149 | flex-direction: column;
150 | width: 30%;
151 | padding: 2rem;
152 | }
153 | .refimentList {
154 | margin-top: 15px;
155 | }
156 | .ais-RefinementList-list {
157 | list-style-type: none;
158 | padding-left: 0;
159 | width: 70%;
160 | }
161 |
162 | .ais-RefinementList-labelText {
163 | margin-left: 1rem;
164 |
165 | color: #63cfab;
166 | }
167 | .ais-RefinementList-item {
168 | margin-bottom: 1rem;
169 | border-radius: 8px;
170 | border: 1px solid rgba(0, 0, 0, 0.1);
171 | padding: 0.5rem 1rem;
172 | cursor: pointer;
173 | }
174 | .ais-RefinementList-label {
175 | display: flex;
176 | justify-content: space-between;
177 | align-items: center;
178 | }
179 |
180 | .ais-RefinementList-labelText:hover {
181 | color: #50a78a;
182 | cursor: pointer;
183 | }
184 | .ais-RefinementList-labelText {
185 | font-size: 16px;
186 | font-weight: 600;
187 | cursor: pointer;
188 | }
189 |
190 | .ais-RefinementList-count {
191 | padding: 0.25rem 0.6rem;
192 | cursor: pointer;
193 | margin-left: auto;
194 | font-weight: 600;
195 | color: white;
196 | border-radius: 8px;
197 | background-color: #63cfab;
198 | }
199 |
200 | a:hover {
201 | color: #206959;;
202 | }
203 |
--------------------------------------------------------------------------------
/src/app/pages/style.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 |
3 | export const Container = styled.div`
4 | justify-content: space-between;
5 | `
6 | export const HeaderUp = styled.div`
7 | display: flex;
8 | flex-direction: column;
9 | align-items: center;
10 | justify-content: center;
11 | @media screen and (min-width: 1024px) {
12 | height: 50%;
13 | }
14 |
15 | @media screen and (min-width: 768px) {
16 | height: 50%;
17 | }
18 |
19 | @media screen and (min-width: 320px) {
20 | height: 50%;
21 | }
22 | background: url('https://image.freepik.com/free-vector/mars-landscape-alien-planet-martian-background_107791-1781.jpg')
23 | no-repeat center/cover;
24 | text-align: center;
25 | `
26 |
27 | export const Invite = styled.div``
28 | export const Description = styled.div`
29 | width: 612px;
30 | height: 200px;
31 | padding: 10px;
32 | display: flex;
33 | justify-content: center;
34 | `
35 |
36 | export const Center = styled.div`
37 | display: flex;
38 | justify-content: center;
39 | align-items: center;
40 |
41 | @media screen and (max-width: 768px) {
42 | flex-direction: column;
43 | }
44 | `
45 |
46 | export const DarkenBackground = styled.div`
47 | width: 100%;
48 | height: 100%;
49 | `
50 |
51 | export const AddSomeMargin = styled.div`
52 | margin: 5em;
53 | padding: 25px;
54 | background: rgba(255, 255, 255, 0.15);
55 | border-radius: 5px;
56 | `
57 | export const MainContainer = styled.div`
58 | display: flex;
59 | justify-content: center;
60 | align-items: center;
61 | max-width: 1440px;
62 | @media screen and (min-width: 1024px) {
63 | width: 100%;
64 | }
65 |
66 | @media screen and (min-width: 768px) {
67 | width: 100%;
68 | }
69 |
70 | @media screen and (min-width: 320px) {
71 | width: 100%;
72 | }
73 | `
74 |
75 | export const Containerx = styled.div`
76 | display: flex;
77 | justify-content: center;
78 | align-items: flex-start;
79 | margin-top: 3rem;
80 |
81 | @media screen and (min-width: 1024px) {
82 | width: 100%;
83 | }
84 |
85 | @media screen and (min-width: 768px) {
86 | width: 100%;
87 | }
88 |
89 | @media screen and (min-width: 320px) {
90 | width: 100%;
91 | }
92 | `
93 |
--------------------------------------------------------------------------------
/src/app/redux/actions/index.js:
--------------------------------------------------------------------------------
1 | const CONSTANTS = {
2 | FETHING_PROJECTS: 'FETHING_PROJECTS',
3 | FETCHED_PROJECTS: 'FETCHED_PROJECTS',
4 | FILTER: 'FILTER',
5 | ERROR: 'ERROR'
6 | }
7 | export default CONSTANTS
8 |
--------------------------------------------------------------------------------
/src/app/redux/index.js:
--------------------------------------------------------------------------------
1 | import { combineReducers } from 'redux'
2 | import projectsReducers from './reducers/projectsReducers'
3 |
4 | export default combineReducers({
5 | projects: projectsReducers
6 | })
7 |
--------------------------------------------------------------------------------
/src/app/redux/reducers/index.js:
--------------------------------------------------------------------------------
1 | import { combineReducers } from 'redux'
2 | import projectReducer from './projectReducer'
3 |
4 | export default combineReducers({
5 | projects: projectReducer
6 | })
7 |
--------------------------------------------------------------------------------
/src/app/redux/reducers/projectReducer.js:
--------------------------------------------------------------------------------
1 | import CONSTANTS from '../actions/index'
2 |
3 | const initialState = {
4 | projects: [],
5 | isLoading: false,
6 | isLoaded: false,
7 | hasError: false,
8 | filter: ''
9 | }
10 |
11 | const projectReducer = (state = initialState, action) => {
12 | switch (action.type) {
13 | case CONSTANTS.FETHING_PROJECTS:
14 | return {
15 | ...state,
16 | isLoading: true
17 | }
18 | case CONSTANTS.FETCHED_PROJECTS:
19 | return {
20 | ...state,
21 | isLoading: false,
22 | isLoaded: true,
23 | projects: action.payload
24 | }
25 | case CONSTANTS.ERROR:
26 | return {
27 | ...state,
28 | isLoading: false,
29 | hasError: true
30 | }
31 | case CONSTANTS.FILTER:
32 | return {
33 | ...state,
34 | filter: action.filter
35 | }
36 |
37 | default:
38 | return state
39 | }
40 | }
41 | export default projectReducer
42 |
--------------------------------------------------------------------------------
/src/app/redux/store/index.js:
--------------------------------------------------------------------------------
1 | import { createStore, applyMiddleware } from 'redux'
2 | import thunkMiddleware from 'redux-thunk'
3 | import rootReducer from '../reducers'
4 | import { createLogger } from 'redux-logger'
5 |
6 | const loggerMiddleware = createLogger()
7 |
8 | const store = createStore(rootReducer, applyMiddleware(thunkMiddleware, loggerMiddleware))
9 | export default store
10 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom'
3 | import './reset.css'
4 | import reportWebVitals from './reportWebVitals'
5 | import Router from './app/Router'
6 | import 'react-circular-progressbar/dist/styles.css'
7 |
8 | ReactDOM.render(
9 |
10 |
11 | ,
12 | document.getElementById('root')
13 | )
14 |
15 | // If you want to start measuring performance in your app, pass a function
16 | // to log results (for example: reportWebVitals(console.log))
17 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
18 | // On page load or when changing themes, best to add inline in `head` to avoid FOUC
19 | reportWebVitals()
20 |
--------------------------------------------------------------------------------
/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry)
5 | getFID(onPerfEntry)
6 | getFCP(onPerfEntry)
7 | getLCP(onPerfEntry)
8 | getTTFB(onPerfEntry)
9 | })
10 | }
11 | }
12 |
13 | export default reportWebVitals
14 |
--------------------------------------------------------------------------------
/src/reset.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css2?family=Lato:wght@300;400;700;900&display=swap');
2 |
3 | html,
4 | body,
5 | #app {
6 | min-width: 100%;
7 | min-height: 100vh;
8 | outline: none;
9 | font-family: 'Lato', sans-serif;
10 | }
11 |
12 | a {
13 | text-decoration: none;
14 | }
15 |
--------------------------------------------------------------------------------