From 14ee538d7dd7ef489b004b699a64ade447dd5841 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 10:42:43 -0300 Subject: [PATCH 01/63] Added Global styles --- package.json | 4 + src/App.tsx | 8 +- src/index.tsx | 2 +- src/styles/globalStyles.ts | 23 ++++++ yarn.lock | 161 ++++++++++++++++++++++++++++++++++++- 5 files changed, 193 insertions(+), 5 deletions(-) create mode 100644 src/styles/globalStyles.ts diff --git a/package.json b/package.json index 23c714c..3b6cb1a 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { + "@clayui/css": "^3.25.3", "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", @@ -10,9 +11,12 @@ "@types/node": "^12.0.0", "@types/react": "^17.0.0", "@types/react-dom": "^17.0.0", + "@types/styled-components": "^5.1.9", + "axios": "^0.21.1", "react": "^17.0.2", "react-dom": "^17.0.2", "react-scripts": "4.0.3", + "styled-components": "^5.2.3", "typescript": "^4.1.2", "web-vitals": "^1.0.1" }, diff --git a/src/App.tsx b/src/App.tsx index 4cd93c8..ccf8af5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,12 @@ import React from 'react'; import Home from './pages/Home'; +import GlobalStyle from './styles/globalStyles'; -const App = () => () +const App: React.FC = () => ( + <> + + + +); export default App; diff --git a/src/index.tsx b/src/index.tsx index c1f31c5..e978020 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -6,5 +6,5 @@ ReactDOM.render( , - document.getElementById('root') + document.getElementById('root'), ); diff --git a/src/styles/globalStyles.ts b/src/styles/globalStyles.ts new file mode 100644 index 0000000..a87d8f5 --- /dev/null +++ b/src/styles/globalStyles.ts @@ -0,0 +1,23 @@ +import { createGlobalStyle } from 'styled-components'; + +export default createGlobalStyle` + * { + margin: 0; + padding: 0; + box-sizing: border-box; + outline: none; + } + body { + background-color: #F7F8F9; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; + } +`; diff --git a/yarn.lock b/yarn.lock index aab628d..ca869e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -80,7 +80,16 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13": +"@babel/generator@^7.13.9": + version "7.13.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" + integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== + dependencies: + "@babel/types" "^7.13.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== @@ -278,6 +287,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.17.tgz#bc85d2d47db38094e5bb268fc761716e7d693848" integrity sha512-r1yKkiUTYMQ8LiEI0UcQx5ETw5dpTLn9wijn9hk6KkTtOK95FndDN10M+8/s6k/Ymlbivw0Av9q4SlgF80PtHg== +"@babel/parser@^7.13.15": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.15.tgz#8e66775fb523599acb6a289e12929fa5ab0954d8" + integrity sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ== + "@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5" @@ -1129,6 +1143,20 @@ globals "^11.1.0" lodash "^4.17.19" +"@babel/traverse@^7.4.5": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.15.tgz#c38bf7679334ddd4028e8e1f7b3aa5019f0dada7" + integrity sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.9" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.13.15" + "@babel/types" "^7.13.14" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.12.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.17.tgz#9d711eb807e0934c90b8b1ca0eb1f7230d150963" @@ -1138,11 +1166,25 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.13.0", "@babel/types@^7.13.14": + version "7.13.14" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.14.tgz#c35a4abb15c7cd45a2746d78ab328e362cbace0d" + integrity sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@clayui/css@^3.25.3": + version "3.25.3" + resolved "https://registry.yarnpkg.com/@clayui/css/-/css-3.25.3.tgz#5c68e4f98ddf40664d06e8517fbdcf65493ca3d0" + integrity sha512-BWMkPn0nMpqhog3iCc9ktazoKKG3oChoNr2zzAzF9LusDGZVVo2pamQjdlAZfkfD/daAC5Bo5rlOLazHc45oKg== + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -1161,6 +1203,28 @@ resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== +"@emotion/is-prop-valid@^0.8.8": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/stylis@^0.8.4": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + +"@emotion/unitless@^0.7.4": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + "@eslint/eslintrc@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" @@ -1724,6 +1788,14 @@ dependencies: "@types/node" "*" +"@types/hoist-non-react-statics@*": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + "@types/html-minifier-terser@^5.0.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" @@ -1844,6 +1916,15 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== +"@types/styled-components@^5.1.9": + version "5.1.9" + resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.9.tgz#00d3d84b501420521c4db727e3c195459f87a6cf" + integrity sha512-kbEG6YlwK8rucITpKEr6pA4Ho9KSQHUUOzZ9lY3va1mtcjvS3D0wDciFyHEiNHKLL/npZCKDQJqm0x44sPO9oA== + dependencies: + "@types/hoist-non-react-statics" "*" + "@types/react" "*" + csstype "^3.0.2" + "@types/tapable@*", "@types/tapable@^1.0.5": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" @@ -2609,6 +2690,13 @@ axe-core@^4.0.2: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.1.2.tgz#7cf783331320098bfbef620df3b3c770147bc224" integrity sha512-V+Nq70NxKhYt89ArVcaNL9FDryB3vQOd+BFXZIfO3RP6rwtj+2yqqqdHEkacutglPaZLkJeuXKCjCJDMGPtPqg== +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" @@ -2700,6 +2788,21 @@ babel-plugin-named-asset-import@^0.3.7: resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz#156cd55d3f1228a5765774340937afc8398067dd" integrity sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw== +"babel-plugin-styled-components@>= 1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.12.0.tgz#1dec1676512177de6b827211e9eda5a30db4f9b9" + integrity sha512-FEiD7l5ZABdJPpLssKXjBUJMYqzbcNzBowfXDCdJhOpbhWiewapUaY+LZGT8R4Jg2TwOjGjG4RKeyrO5p9sBkA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-module-imports" "^7.0.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.11" + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" @@ -3176,6 +3279,11 @@ camelcase@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== +camelize@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= + caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -3714,6 +3822,11 @@ css-blank-pseudo@^0.1.4: dependencies: postcss "^7.0.5" +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= + css-color-names@0.0.4, css-color-names@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" @@ -3775,6 +3888,15 @@ css-select@^2.0.0, css-select@^2.0.2: domutils "^1.7.0" nth-check "^1.0.2" +css-to-react-native@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" + integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" @@ -5230,6 +5352,11 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147" integrity sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA== +follow-redirects@^1.10.0: + version "1.13.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" + integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -5642,6 +5769,13 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + hoopy@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" @@ -9220,7 +9354,7 @@ react-error-overlay@^6.0.9: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== -react-is@^16.8.1: +react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -9991,6 +10125,11 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -10494,6 +10633,22 @@ style-loader@1.3.0: loader-utils "^2.0.0" schema-utils "^2.7.0" +styled-components@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.2.3.tgz#752669fd694aac10de814d96efc287dde0d11385" + integrity sha512-BlR+KrLW3NL1yhvEB+9Nu9Dt51CuOnHoxd+Hj+rYPdtyR8X11uIW9rvhpy3Dk4dXXBsiW1u5U78f00Lf/afGoA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^0.8.8" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" + stylehacks@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" @@ -10503,7 +10658,7 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" -supports-color@^5.3.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== From 3e69b1eb1114a8eddd1cbd362737414d3c9e1bf0 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 16:55:26 -0300 Subject: [PATCH 02/63] Added Dependencies --- package.json | 4 ++ src/App.tsx | 2 +- yarn.lock | 118 +++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 120 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 3b6cb1a..4cc5abe 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,9 @@ "private": true, "dependencies": { "@clayui/css": "^3.25.3", + "@clayui/drop-down": "^3.25.1", + "@clayui/form": "^3.14.4", + "@clayui/management-toolbar": "^3.3.0", "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", @@ -15,6 +18,7 @@ "axios": "^0.21.1", "react": "^17.0.2", "react-dom": "^17.0.2", + "react-icons": "^4.2.0", "react-scripts": "4.0.3", "styled-components": "^5.2.3", "typescript": "^4.1.2", diff --git a/src/App.tsx b/src/App.tsx index ccf8af5..8ffc057 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,7 @@ import React from 'react'; import Home from './pages/Home'; import GlobalStyle from './styles/globalStyles'; - +import '@clayui/css/lib/css/atlas.css'; const App: React.FC = () => ( <> diff --git a/yarn.lock b/yarn.lock index ca869e9..3a58a7f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1112,7 +1112,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.12.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.13.10" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d" integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw== @@ -1180,11 +1180,83 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@clayui/button@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@clayui/button/-/button-3.6.0.tgz#ee9b53984abe0eb72ec9889db7aa644fc41212ad" + integrity sha512-ihijKf+Tqz750fJg5A56j1y1ibePjqFLotWOFK2r9xfagsAPb0TUxGuwJhg7RjMnvhgBmoNUZ06XO1BUThX3tA== + dependencies: + "@clayui/icon" "^3.1.0" + classnames "^2.2.6" + "@clayui/css@^3.25.3": version "3.25.3" resolved "https://registry.yarnpkg.com/@clayui/css/-/css-3.25.3.tgz#5c68e4f98ddf40664d06e8517fbdcf65493ca3d0" integrity sha512-BWMkPn0nMpqhog3iCc9ktazoKKG3oChoNr2zzAzF9LusDGZVVo2pamQjdlAZfkfD/daAC5Bo5rlOLazHc45oKg== +"@clayui/drop-down@^3.25.1": + version "3.25.1" + resolved "https://registry.yarnpkg.com/@clayui/drop-down/-/drop-down-3.25.1.tgz#33cf55885de9982ea10321fb96c1ade71cbcf239" + integrity sha512-teIMLEvs8CZY7oYwJuaTsUQIu7/veyqDhMqhi0oYxk0mwTkstJZEsAbyQCX50veXu11armincjxjqo/fcn3eMQ== + dependencies: + "@clayui/button" "^3.6.0" + "@clayui/form" "^3.14.4" + "@clayui/icon" "^3.1.0" + "@clayui/link" "^3.2.0" + "@clayui/shared" "^3.5.1" + classnames "^2.2.6" + dom-align "^1.10.2" + react-transition-group "^4.4.1" + warning "^4.0.3" + +"@clayui/form@^3.14.4": + version "3.14.4" + resolved "https://registry.yarnpkg.com/@clayui/form/-/form-3.14.4.tgz#50725d4647a3e1fba3fc5449429f8baec694b2df" + integrity sha512-R5pm55qw0ooH5ItepehAebUwLrJoebe1xnbA5Pkk/rbL+SzbJRtXv1igMNjvT1hUhjbSG7s2ZKKnXnVdhnmm3w== + dependencies: + "@clayui/button" "^3.6.0" + "@clayui/icon" "^3.1.0" + "@clayui/shared" "^3.5.1" + classnames "^2.2.6" + +"@clayui/icon@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@clayui/icon/-/icon-3.1.0.tgz#9e600f87194f8dacfb49ace121fbab25a2e82f03" + integrity sha512-rxFih7ktNoYx7jJMYWA5GiEh6bJ5W3mB5fWRlSAw8sVyDvSH8rIdaqR77SmvAJDTygfKuKJlyeHnhTmWZgJbCg== + dependencies: + classnames "^2.2.6" + warning "^4.0.3" + +"@clayui/layout@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@clayui/layout/-/layout-3.3.0.tgz#89b54741787b2d9efaced088e5478fd7c0cb935e" + integrity sha512-bIOt0zAyWpg0YHDVc52cMaCS75q3CkZRmvgzj/h9wq4xVbUvogesm8OD1iwHc+ILJzfkKqzgujCrDGZvzOBf+w== + dependencies: + classnames "^2.2.6" + warning "^4.0.3" + +"@clayui/link@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@clayui/link/-/link-3.2.0.tgz#1d5fc80f574f18d3880bc3584cd2d83761b6ec78" + integrity sha512-UjuEGGwE3X/XnB3Ul+JPPAveHj3d76OyRu8rwhKuw5VwyfQVadb7p8owqpohOPaD29ytljOfce8a6X0vGoXJig== + dependencies: + classnames "^2.2.6" + +"@clayui/management-toolbar@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@clayui/management-toolbar/-/management-toolbar-3.3.0.tgz#bedf513b56e5b5756e0287149c1cd90f8b8f3043" + integrity sha512-O0pAmcyWxP+j80TZtCokyPL88sfNzq9mzBHqsnKlc+nsCgMMZlxTPmR7O/T4nrA3jWaIsQH4lsRBQReCz00IHQ== + dependencies: + "@clayui/layout" "^3.3.0" + classnames "^2.2.6" + +"@clayui/shared@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@clayui/shared/-/shared-3.5.1.tgz#6daee67b300f346381dd126472802f0a83472c4c" + integrity sha512-p7vDmc+AcUnk7R/3+Xr+WNm7A5sUcmLbYlgK0GkXHUDwe+aVWwWYH1/mBL9aHCt9RFKc6WyM3zZv8cvOzlhFLA== + dependencies: + "@clayui/button" "^3.6.0" + "@clayui/link" "^3.2.0" + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -3430,6 +3502,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classnames@^2.2.6: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + clean-css@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" @@ -4310,6 +4387,11 @@ dom-accessibility-api@^0.5.4: resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz#b06d059cdd4a4ad9a79275f9d414a5c126241166" integrity sha512-TvrjBckDy2c6v6RLxPv5QXOnU+SmF9nBII5621Ve5fu6Z/BDrENurBEvlC1f44lKEUVqOpK4w9E5Idc5/EgkLQ== +dom-align@^1.10.2: + version "1.12.0" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.0.tgz#56fb7156df0b91099830364d2d48f88963f5a29c" + integrity sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA== + dom-converter@^0.2: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -4317,6 +4399,14 @@ dom-converter@^0.2: dependencies: utila "~0.4" +dom-helpers@^5.0.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.0.tgz#57fd054c5f8f34c52a3eeffdb7e7e93cd357d95b" + integrity sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + dom-serializer@0: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -7292,7 +7382,7 @@ loglevel@^1.6.8: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== -loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -9134,7 +9224,7 @@ prompts@2.4.0, prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.7.2: +prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -9354,6 +9444,11 @@ react-error-overlay@^6.0.9: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== +react-icons@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.2.0.tgz#6dda80c8a8f338ff96a1851424d63083282630d0" + integrity sha512-rmzEDFt+AVXRzD7zDE21gcxyBizD/3NqjbX6cmViAgdqfJ2UiLer8927/QhhrXQV7dEj/1EGuOTPp7JnLYVJKQ== + react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -9435,6 +9530,16 @@ react-scripts@4.0.3: optionalDependencies: fsevents "^2.1.3" +react-transition-group@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" + integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" @@ -11329,6 +11434,13 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" +warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + watchpack-chokidar2@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" From 26b0a08e50dcbad6ca13cae37d47c7cf2db73597 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 16:55:52 -0300 Subject: [PATCH 03/63] Created Filter DropDown component --- src/components/FilterDropDown/index.tsx | 41 +++++++++++++++++++++++++ src/components/FilterDropDown/styles.ts | 24 +++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/components/FilterDropDown/index.tsx create mode 100644 src/components/FilterDropDown/styles.ts diff --git a/src/components/FilterDropDown/index.tsx b/src/components/FilterDropDown/index.tsx new file mode 100644 index 0000000..f34749b --- /dev/null +++ b/src/components/FilterDropDown/index.tsx @@ -0,0 +1,41 @@ +import React, { useState } from 'react'; + +import ClayDropDown from '@clayui/drop-down'; +import { IoMdArrowDropdown, IoMdArrowDropup } from 'react-icons/io'; +import { Container } from './styles'; +const FilterDropDown: React.FC = () => { + const [openDropdown, setOpenDropdown] = useState(false); + return ( + + + {`Filter and order `} + {!openDropdown ? ( + + ) : ( + + )} + + } + > + + + setOpenDropdown(false)}> + Stars + + Forks + Open Issues + Age + Last commit + + + + + ); +}; + +export default FilterDropDown; diff --git a/src/components/FilterDropDown/styles.ts b/src/components/FilterDropDown/styles.ts new file mode 100644 index 0000000..603fc41 --- /dev/null +++ b/src/components/FilterDropDown/styles.ts @@ -0,0 +1,24 @@ +import styled from 'styled-components'; + +export const Container = styled.section` + .dropdown-trigger { + background: transparent; + border: 1px solid #fff; + border-radius: 4px; + padding: 8px 12px; + color: var(--secondary); + font-size: 14px; + font-weight: 500; + margin-bottom: 2px; + transition: 200ms all ease; + display: flex; + align-items: center; + :hover { + background: #f1f2f5; + border: 1px solid #cdced9; + } + .icon { + margin-left: 10px; + } + } +`; From 4fba7b315a294806808c0b672be1b9ac580e2b01 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 16:56:03 -0300 Subject: [PATCH 04/63] Created NavBar Component --- src/components/NavBar/index.tsx | 46 +++++++++++++++++++++++++++ src/components/NavBar/styles.ts | 56 +++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 src/components/NavBar/index.tsx create mode 100644 src/components/NavBar/styles.ts diff --git a/src/components/NavBar/index.tsx b/src/components/NavBar/index.tsx new file mode 100644 index 0000000..ac46055 --- /dev/null +++ b/src/components/NavBar/index.tsx @@ -0,0 +1,46 @@ +import React from 'react'; + +import { Container, Button } from './styles'; + +import { FaGithub, FaAdjust } from 'react-icons/fa'; +import { BsFillGridFill } from 'react-icons/bs'; + +import SearchBar from '../SearchBar'; +import FilterDropDown from '../FilterDropDown'; +import StarFilter from '../StarFilter'; +import NewRepositoryForm from '../NewRepositoryForm'; + +const NavBar: React.FC = () => { + return ( + +
+ + +
+ +
+ +
+ +
+ ); +}; + +export default NavBar; diff --git a/src/components/NavBar/styles.ts b/src/components/NavBar/styles.ts new file mode 100644 index 0000000..ea52612 --- /dev/null +++ b/src/components/NavBar/styles.ts @@ -0,0 +1,56 @@ +import styled from 'styled-components'; + +export const Container = styled.div` + width: 100%; + display: flex; + align-items: center; + justify-content: space-evenly; + background: #fff; + height: 64px; + padding: 0px 40px 0px 40px; + + section { + display: flex; + align-items: center; + justify-content: center; + label { + margin-left: 28px; + } + } + + #brand { + color: var(--secondary); + font-weight: 500; + font-size: 14px; + } + + #menu-button { + width: 20%; + margin-left: 20px; + display: flex; + align-items: center; + flex-direction: row; + justify-content: space-evenly; + li { + display: flex; + align-items: center; + } + } +`; + +export const Button = styled.button` + height: 32px; + width: 32px; + display: flex; + border: 1px solid #fff; + align-items: center; + justify-content: center; + background-color: transparent; + transition: 200ms all ease; + border-radius: 4px; + color: var(--secondary); + :hover { + background: #f1f2f5; + border: 1px solid #cdced9; + } +`; From 3e2dedbceaf255e62b4066559af33cd40c613fbb Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 16:56:17 -0300 Subject: [PATCH 05/63] Created New Repository Popup --- src/components/NewRepositoryForm/index.tsx | 43 +++++++++++++ src/components/NewRepositoryForm/styles.ts | 71 ++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 src/components/NewRepositoryForm/index.tsx create mode 100644 src/components/NewRepositoryForm/styles.ts diff --git a/src/components/NewRepositoryForm/index.tsx b/src/components/NewRepositoryForm/index.tsx new file mode 100644 index 0000000..7faa136 --- /dev/null +++ b/src/components/NewRepositoryForm/index.tsx @@ -0,0 +1,43 @@ +import React, { useState } from 'react'; + +import { Button, Container, Content } from './styles'; +import ClayForm, { ClayInput } from '@clayui/form'; +import { FiPlus } from 'react-icons/fi'; + +const NewRepositoryForm: React.FC = () => { + const [openDropdown, setOpenDropdown] = useState(false); + + return ( + + + {openDropdown && ( + console.log('SUBMITED FORM')}> + +

New repository

+ + +
+
+
+ + +
+
+ )} +
+ ); +}; + +export default NewRepositoryForm; diff --git a/src/components/NewRepositoryForm/styles.ts b/src/components/NewRepositoryForm/styles.ts new file mode 100644 index 0000000..b637b34 --- /dev/null +++ b/src/components/NewRepositoryForm/styles.ts @@ -0,0 +1,71 @@ +import styled from 'styled-components'; + +export const Container = styled.div` + position: relative; + display: flex; + flex-direction: column; +`; + +export const Button = styled.button` + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + background: var(--primary); + border: 0; + border-radius: 4px; + color: #fff; +`; + +export const Content = styled.form` + h4 { + font-size: 18px; + } + @keyframes FadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + border-radius: 4px; + background: #fff; + width: 448px; + position: absolute; + top: 40px; + right: 0px; + z-index: 9999; + -webkit-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.12); + -moz-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.12); + box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.12); + animation-name: FadeIn; + animation-duration: 300ms; + + .input-group { + padding: 9px 24px; + margin-top: 16px; + display: flex; + flex-direction: column; + + label { + font-size: 14px; + color: var(--dark); + font-weight: 400; + span { + color: var(--warning); + } + } + } + footer { + padding: 9px 24px; + display: flex; + align-items: center; + justify-content: flex-end; + button + button { + margin-left: 16px; + } + } +`; From 9e842ecf33353f63dceb0635eaf551e4a1a276b0 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 16:56:31 -0300 Subject: [PATCH 06/63] Created Search bar component --- src/components/SearchBar/index.tsx | 32 ++++++++++++++++++++++++++++++ src/components/SearchBar/style.ts | 15 ++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 src/components/SearchBar/index.tsx create mode 100644 src/components/SearchBar/style.ts diff --git a/src/components/SearchBar/index.tsx b/src/components/SearchBar/index.tsx new file mode 100644 index 0000000..e05bb37 --- /dev/null +++ b/src/components/SearchBar/index.tsx @@ -0,0 +1,32 @@ +import React from 'react'; + +import { Container, Button } from './style'; +import { ClayInput } from '@clayui/form'; + +import ClayManagementToolbar from '@clayui/management-toolbar'; +import { FiSearch } from 'react-icons/fi'; +const SearchBar: React.FC = () => { + return ( + + + + + + + + + + + + + ); +}; + +export default SearchBar; diff --git a/src/components/SearchBar/style.ts b/src/components/SearchBar/style.ts new file mode 100644 index 0000000..79573c7 --- /dev/null +++ b/src/components/SearchBar/style.ts @@ -0,0 +1,15 @@ +import styled from 'styled-components'; + +export const Container = styled.div` + width: 419px; +`; + +export const Button = styled.button` + border: 0; + padding: 0px 12px 0px 12px; + display: flex; + height: 100%; + background-color: transparent; + align-items: center; + justify-content: center; +`; From aa2d70c35062224e3f5aa65ae28a5bbc9a9a9dc7 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 16:56:48 -0300 Subject: [PATCH 07/63] Created Star button Filter --- src/components/StarFilter/index.tsx | 15 +++++++++++++++ src/components/StarFilter/styles.ts | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/components/StarFilter/index.tsx create mode 100644 src/components/StarFilter/styles.ts diff --git a/src/components/StarFilter/index.tsx b/src/components/StarFilter/index.tsx new file mode 100644 index 0000000..91a4bde --- /dev/null +++ b/src/components/StarFilter/index.tsx @@ -0,0 +1,15 @@ +import React, { useState } from 'react'; + +import { Button } from './styles'; +import { MdStar, MdStarBorder } from 'react-icons/md'; + +const StarFilter: React.FC = () => { + const [active, setActive] = useState(false); + return ( + + ); +}; + +export default StarFilter; diff --git a/src/components/StarFilter/styles.ts b/src/components/StarFilter/styles.ts new file mode 100644 index 0000000..854d1d6 --- /dev/null +++ b/src/components/StarFilter/styles.ts @@ -0,0 +1,18 @@ +import styled from 'styled-components'; + +export const Button = styled.button` + height: 32px; + width: 32px; + display: flex; + border: 1px solid #fff; + align-items: center; + justify-content: center; + background-color: transparent; + transition: 200ms all ease; + border-radius: 4px; + color: var(--secondary); + :hover { + background: #f1f2f5; + border: 1px solid #cdced9; + } +`; From 5f036fdd39cb4b896c51b8311c5263acfcd86a71 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 16:57:10 -0300 Subject: [PATCH 08/63] Properly rendering Home --- src/pages/Home/index.tsx | 9 +++++++-- src/pages/Home/styles.ts | 8 ++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 src/pages/Home/styles.ts diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index b105224..e756472 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -1,9 +1,14 @@ import React from 'react'; -// import { Container } from './styles'; +import { Container } from './styles'; +import NavBar from '../../components/NavBar'; const Home: React.FC = () => { - return

Git-Hub compare

; + return ( + + + + ); }; export default Home; diff --git a/src/pages/Home/styles.ts b/src/pages/Home/styles.ts new file mode 100644 index 0000000..9d8bac7 --- /dev/null +++ b/src/pages/Home/styles.ts @@ -0,0 +1,8 @@ +import styled from 'styled-components'; + +export const Container = styled.div` + display: flex; + flex-direction: column; + width: 100%; + position: relative; +`; From 4f3da2bfad7557b76f78b335ee9603ad05045cb4 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 16:57:17 -0300 Subject: [PATCH 09/63] Added new styles --- src/styles/globalStyles.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/styles/globalStyles.ts b/src/styles/globalStyles.ts index a87d8f5..c49ee67 100644 --- a/src/styles/globalStyles.ts +++ b/src/styles/globalStyles.ts @@ -12,12 +12,24 @@ export default createGlobalStyle` font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + ul { + list-style: none; + margin: 0; + } + #root { + position: relative; } - code { font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; } + + --secondary: #6B6C7E; + --primary: #0B5FFF; + --dark: #272833; + --warning: #B95000; `; From a83622d72715b2b95e1a40c729cd08b3425c9543 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 20:19:50 -0300 Subject: [PATCH 10/63] Added new Dependencies --- package.json | 2 ++ yarn.lock | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/package.json b/package.json index 4cc5abe..0383978 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,11 @@ "version": "0.1.0", "private": true, "dependencies": { + "@clayui/card": "^3.25.1", "@clayui/css": "^3.25.3", "@clayui/drop-down": "^3.25.1", "@clayui/form": "^3.14.4", + "@clayui/label": "^3.4.1", "@clayui/management-toolbar": "^3.3.0", "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", diff --git a/yarn.lock b/yarn.lock index 3a58a7f..bdad340 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1188,6 +1188,22 @@ "@clayui/icon" "^3.1.0" classnames "^2.2.6" +"@clayui/card@^3.25.1": + version "3.25.1" + resolved "https://registry.yarnpkg.com/@clayui/card/-/card-3.25.1.tgz#e42cdd1a42295795f831b2188b3098f1aa7459d6" + integrity sha512-p9onzrFE9cGfX4BvD0IgXhKgfiQ1zWWlehaTyoaEDDBBLAMf1J6J8td23oNFnRXatHqdPLA9XLNlHH89ji4Axg== + dependencies: + "@clayui/button" "^3.6.0" + "@clayui/drop-down" "^3.25.1" + "@clayui/form" "^3.14.4" + "@clayui/icon" "^3.1.0" + "@clayui/label" "^3.4.1" + "@clayui/layout" "^3.3.0" + "@clayui/link" "^3.2.0" + "@clayui/shared" "^3.5.1" + "@clayui/sticker" "^3.3.0" + classnames "^2.2.6" + "@clayui/css@^3.25.3": version "3.25.3" resolved "https://registry.yarnpkg.com/@clayui/css/-/css-3.25.3.tgz#5c68e4f98ddf40664d06e8517fbdcf65493ca3d0" @@ -1226,6 +1242,15 @@ classnames "^2.2.6" warning "^4.0.3" +"@clayui/label@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@clayui/label/-/label-3.4.1.tgz#af235c32c006e0d12d3bb3a3556706033aef9608" + integrity sha512-ReGAldU4JkNzvAO0GkmdRy6JIKVVxMF2/L2caG2RxQDVyLsWVB3uituqHCOp3PC3va4KVR0KYQJ7hb317vN15g== + dependencies: + "@clayui/icon" "^3.1.0" + "@clayui/link" "^3.2.0" + classnames "^2.2.6" + "@clayui/layout@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@clayui/layout/-/layout-3.3.0.tgz#89b54741787b2d9efaced088e5478fd7c0cb935e" @@ -1257,6 +1282,13 @@ "@clayui/button" "^3.6.0" "@clayui/link" "^3.2.0" +"@clayui/sticker@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@clayui/sticker/-/sticker-3.3.0.tgz#77fa3606688050bf9e731b49f319320c3718f00b" + integrity sha512-Qmu3jarLiyeQmTZYikIAk9g/npl8bPxN1xhaMWP4C95yUZJgCbvqwzDCSEPHYCR+QiedKizBVKG9kQMoqdmcPA== + dependencies: + classnames "^2.2.6" + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" From 517028cfea7e403db52f7bc5cb2f74c4b5a0d8a7 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 20:20:02 -0300 Subject: [PATCH 11/63] Icon assets --- src/assets/logo.png | Bin 0 -> 3087 bytes src/assets/logo.svg | 15 +++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 src/assets/logo.png create mode 100644 src/assets/logo.svg diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bb17c8b5caea2a468c9fec8c6363e0c194e71675 GIT binary patch literal 3087 zcmeHJc~H|y8vP}q00k3{EpZe=JW6B)MMQ#f1w{@EMF$WCBBv_?F(QU25CV80B7!@! z9J;{FATSsSAV-u;5@kRb!y#f44nsILAmjof2_%GU)S0Q>+GT2st^IHQ=&G-}`>XEv z_3QV(tmDT#*R9>S765>C-d^rs0RSlPN0hatHZ@Iai)a5qC zSQIzuPwF3HozocduxAHKx|ocDpn?pLx`x_+ftRA37=r~?7tA2RwnkWqgJSOJ)HJbS z7+l7}@ysx80Ku-R`C`fxKIK6Bz-mfdzlj#WOXZT>O272@)W)!XDayZ4@b$_-Y>(NMY} zY$3WGDV;kiF!bX?AEr|nj~q$rz9b#f+ag&3Px)o+6)|dKVOL5-hVOZ{s=J1P9DzoK zVN2zOEH#D(fp#jQhg8Eo2XFE<(@2%LVP4w-r6;K#UDNTpnL->|yYTi$inayf8VR17 zkvvMo&|--aX7)@*K~Qal%ADL zSZ>{iLD5_87Y>T(aK#vf;`(PEwv;P7pd6Nvm0@0B+dZzO#KrGfb(0Sk`IwqI35R>u zT;ChD!6(~SY~JFsV6%EGD`)0qowf?hW^YQ(Cd@1vpor&btP?;_p z{*vb7Q(Z3!PPsj7o)D~0~|RC+#83qs|~?#0M|tM?a5dR@Y@2CGfs`qDeDt^M+xVky#j z<;tyI=6id0J5s_R_BLlkKUOWpf{zICnmS^hRy3U=PTxUCPC|&#YC_p)*Js zA#!qQ&o)p|$@qiQXhNOoMBmtQ%UsxEU!UMK8dq-08!i1MyCT*(ECyaedsK~l{$0{% z{)tx<<=K~hOsYBER3FCGf4q3@dSi&0sQK&7yR0NZ8vY3AWEW+2XMYc`U(VeN zGlDV$PZ|4Bxtv3xAu?IJP${baE>~HVqgu)#m}eeFZJ(Hw?hb7@AWPZHh{Fke&k858 zLZyQhxFswo#nxq8q$@F!*IsF{5>NgYS1BrNyVMv>8%_8H(RxskMu((NS#{>cG$+hI z-^O-NV>cZ;Yl$OvVx~%Agm=D}UoUFw+>WeoRz&RYtZY-=;J=uwtmM=;PaoM2A1jo{ zecpvY3qXF-8DRj127h>AZD2;j-{+Ic z(0JR{8xnLjKPH~bVO5*BDTf8!N^z0SnoRyqE06L|)L#(&O8w8j7Mh)A^W}e#8qKqe z)C8qmQX9zj*#AFhZ{TrOV{Jj$1#8(0o~~}$lOimfazIvAUrt%Ma2_-fW{Ig23C zmBpi)*^r8f(E-w662$ZoXVN#MPy6rC)psRPR|IUx2iim#G?E%!{L7=@?r0ZLNptNE3@dbd`EQW0e`I@OZuySh(9v_rMp&}0DxNU Yp22QOKYMLf)93@ + + + + + + + + + + + + + + From 7238beb3187bf90723ebacf9b82abf0b82fd1f24 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 20:20:15 -0300 Subject: [PATCH 12/63] Created New Card Component --- src/components/Card/index.tsx | 71 +++++++++++++++++++++++++++++++++++ src/components/Card/styles.ts | 45 ++++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 src/components/Card/index.tsx create mode 100644 src/components/Card/styles.ts diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx new file mode 100644 index 0000000..c7c868e --- /dev/null +++ b/src/components/Card/index.tsx @@ -0,0 +1,71 @@ +import React from 'react'; + +import { CardHeader, CardBody } from './styles'; +import ClayCard from '@clayui/card'; +import { MdStarBorder /*, MdStar */ } from 'react-icons/md'; +import { FiTrash2 } from 'react-icons/fi'; +import logo from '../../assets/logo.png'; +import ClayLabel from '@clayui/label'; +const Card: React.FC = () => { + return ( +
+ + +
+ +

liferay/liferay-portal

+
+
+ + +
+
+ +
    +
  • +

    + Stars 150 +

    +
  • + +
  • +

    + Forks 442 +

    +
  • + +
  • +

    + Open Issues 0 +

    +
  • +
  • +

    + Age 11 years ago +

    +
  • +
  • +

    + Last commit 7 hours ago +

    +
  • +
  • +

    + License N/A +

    +
  • +
  • + JAVASCRIPT +
  • +
+
+
+
+ ); +}; + +export default Card; diff --git a/src/components/Card/styles.ts b/src/components/Card/styles.ts new file mode 100644 index 0000000..3c09960 --- /dev/null +++ b/src/components/Card/styles.ts @@ -0,0 +1,45 @@ +import styled from 'styled-components'; + +export const CardHeader = styled.div` + display: flex; + align-items: center; + border-bottom: 1px solid #e5e5e5; + padding-top: 5px; + padding-bottom: 5px; + padding-right: 5px; + h4 { + margin-left: 4px; + font-weight: 600; + } + section { + margin-left: auto; + display: flex; + align-items: center; + button { + width: 32px; + height: 32px; + background: transparent; + border: 0px; + border-radius: 4px; + transition: all 200ms ease; + :hover { + background: rgba(39, 40, 51, 0.04); + } + } + } +`; + +export const CardBody = styled.div` + padding: 12px 16px; + ul { + li { + p { + font-weight: 600; + + span { + font-weight: 400; + } + } + } + } +`; From f0fb7be0964a7891cfbc29b7f25d017e77b0008f Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 20:20:44 -0300 Subject: [PATCH 13/63] removed style redudancy --- src/components/FilterDropDown/styles.ts | 2 +- src/components/NavBar/styles.ts | 2 +- src/components/NewRepositoryForm/styles.ts | 2 +- src/styles/globalStyles.ts | 19 +++++++++++++++++++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/components/FilterDropDown/styles.ts b/src/components/FilterDropDown/styles.ts index 603fc41..b305c96 100644 --- a/src/components/FilterDropDown/styles.ts +++ b/src/components/FilterDropDown/styles.ts @@ -7,7 +7,7 @@ export const Container = styled.section` border-radius: 4px; padding: 8px 12px; color: var(--secondary); - font-size: 14px; + font-weight: 500; margin-bottom: 2px; transition: 200ms all ease; diff --git a/src/components/NavBar/styles.ts b/src/components/NavBar/styles.ts index ea52612..037298d 100644 --- a/src/components/NavBar/styles.ts +++ b/src/components/NavBar/styles.ts @@ -21,7 +21,7 @@ export const Container = styled.div` #brand { color: var(--secondary); font-weight: 500; - font-size: 14px; + } #menu-button { diff --git a/src/components/NewRepositoryForm/styles.ts b/src/components/NewRepositoryForm/styles.ts index b637b34..b4b0d0a 100644 --- a/src/components/NewRepositoryForm/styles.ts +++ b/src/components/NewRepositoryForm/styles.ts @@ -51,7 +51,7 @@ export const Content = styled.form` flex-direction: column; label { - font-size: 14px; + color: var(--dark); font-weight: 400; span { diff --git a/src/styles/globalStyles.ts b/src/styles/globalStyles.ts index c49ee67..656d501 100644 --- a/src/styles/globalStyles.ts +++ b/src/styles/globalStyles.ts @@ -14,20 +14,39 @@ export default createGlobalStyle` sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + font-size: 14px; } ul { list-style: none; margin: 0; } + h4, p { + margin: 0; + } #root { position: relative; + overflow-y: hidden; + overflow-x: hidden; } code { font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; } + ::-webkit-scrollbar { + width: 4px; +} +::-webkit-scrollbar-track { + background: #fff; +} +::-webkit-scrollbar-thumb { + background: #6B6C7E; +} +::-webkit-scrollbar-thumb:hover { + width: 3px; +} + --secondary: #6B6C7E; --primary: #0B5FFF; --dark: #272833; From cbfa58522d276aefefbb872af05f13c716cfdd3b Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 20:20:56 -0300 Subject: [PATCH 14/63] Calling List Component --- src/components/RepositoryList/index.tsx | 28 +++++++++++++++++++++++++ src/components/RepositoryList/styles.ts | 3 +++ src/pages/Home/index.tsx | 7 +++++-- src/pages/Home/styles.ts | 10 +++++++++ 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/components/RepositoryList/index.tsx create mode 100644 src/components/RepositoryList/styles.ts diff --git a/src/components/RepositoryList/index.tsx b/src/components/RepositoryList/index.tsx new file mode 100644 index 0000000..b2532b0 --- /dev/null +++ b/src/components/RepositoryList/index.tsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import { Container } from './styles'; +import Card from '../Card'; +const RepositoryList: React.FC = () => { + return ( + + + + + + + + + + + + + + + + + + + ); +}; + +export default RepositoryList; diff --git a/src/components/RepositoryList/styles.ts b/src/components/RepositoryList/styles.ts new file mode 100644 index 0000000..c338983 --- /dev/null +++ b/src/components/RepositoryList/styles.ts @@ -0,0 +1,3 @@ +import styled from 'styled-components'; + +export const Container = styled.div``; diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index e756472..914fafa 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -1,12 +1,15 @@ import React from 'react'; -import { Container } from './styles'; +import { Container, Content } from './styles'; import NavBar from '../../components/NavBar'; - +import RepositoryList from '../../components/RepositoryList'; const Home: React.FC = () => { return ( + + + ); }; diff --git a/src/pages/Home/styles.ts b/src/pages/Home/styles.ts index 9d8bac7..3b75953 100644 --- a/src/pages/Home/styles.ts +++ b/src/pages/Home/styles.ts @@ -5,4 +5,14 @@ export const Container = styled.div` flex-direction: column; width: 100%; position: relative; + height: 100vh; +`; + +export const Content = styled.div` + display: flex; + height: 100%; + margin-top: 1px; + height: 100%; + padding: 30px 64px; + overflow-y: auto; `; From e2d15e33408b65cf32f9f16a15b048c38816c1dc Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 20:46:37 -0300 Subject: [PATCH 15/63] Warpping Section children --- src/components/Card/styles.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Card/styles.ts b/src/components/Card/styles.ts index 3c09960..44c4194 100644 --- a/src/components/Card/styles.ts +++ b/src/components/Card/styles.ts @@ -15,6 +15,7 @@ export const CardHeader = styled.div` margin-left: auto; display: flex; align-items: center; + flex-wrap: wrap; button { width: 32px; height: 32px; From 9f1e707369d6d503b30045ddb118dcb9abdd74e9 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 20:47:01 -0300 Subject: [PATCH 16/63] Created CardRow component --- src/components/CardRow/index.tsx | 71 ++++++++++++++++++++++++++++++++ src/components/CardRow/styles.ts | 54 ++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 src/components/CardRow/index.tsx create mode 100644 src/components/CardRow/styles.ts diff --git a/src/components/CardRow/index.tsx b/src/components/CardRow/index.tsx new file mode 100644 index 0000000..17730ce --- /dev/null +++ b/src/components/CardRow/index.tsx @@ -0,0 +1,71 @@ +import React from 'react'; + +import { CardHeader, CardBody } from './styles'; +import ClayCard from '@clayui/card'; +import { MdStarBorder /*, MdStar */ } from 'react-icons/md'; +import { FiTrash2 } from 'react-icons/fi'; +import logo from '../../assets/logo.png'; +import ClayLabel from '@clayui/label'; +const Card: React.FC = () => { + return ( +
+ + +
+ +

liferay/liferay-portal

+
+
+ + +
+
+ +
    +
  • +

    + Stars 150 +

    +
  • + +
  • +

    + Forks 442 +

    +
  • + +
  • +

    + Open Issues 0 +

    +
  • +
  • +

    + Age 11 years ago +

    +
  • +
  • +

    + Last commit 7 hours ago +

    +
  • +
  • +

    + License N/A +

    +
  • +
  • + JAVA +
  • +
+
+
+
+ ); +}; + +export default Card; diff --git a/src/components/CardRow/styles.ts b/src/components/CardRow/styles.ts new file mode 100644 index 0000000..99cf8f9 --- /dev/null +++ b/src/components/CardRow/styles.ts @@ -0,0 +1,54 @@ +import styled from 'styled-components'; + +export const CardHeader = styled.div` + display: flex; + align-items: center; + border-bottom: 1px solid #e5e5e5; + padding-top: 5px; + padding-bottom: 5px; + padding-right: 5px; + h4 { + margin-left: 4px; + font-weight: 600; + } + section { + display: flex; + align-items: center; + } + #btn-section { + margin-left: auto; + display: flex; + align-items: center; + button { + width: 32px; + height: 32px; + background: transparent; + border: 0px; + border-radius: 4px; + transition: all 200ms ease; + :hover { + background: rgba(39, 40, 51, 0.04); + } + } + } +`; + +export const CardBody = styled.div` + padding: 12px 16px; + display: flex; + ul { + display: flex; + flex-wrap: wrap; + max-width: 778px; + li { + margin-left: 30px; + p { + font-weight: 500; + color: var(--secondary); + span { + font-weight: 400; + } + } + } + } +`; From e8cab30cff791a9cd6af39e83cd015d5ee759dbe Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 20:47:30 -0300 Subject: [PATCH 17/63] added width size --- src/components/RepositoryList/styles.ts | 4 +++- src/components/SearchBar/style.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/RepositoryList/styles.ts b/src/components/RepositoryList/styles.ts index c338983..3f87d34 100644 --- a/src/components/RepositoryList/styles.ts +++ b/src/components/RepositoryList/styles.ts @@ -1,3 +1,5 @@ import styled from 'styled-components'; -export const Container = styled.div``; +export const Container = styled.div` + width: 100%; +`; diff --git a/src/components/SearchBar/style.ts b/src/components/SearchBar/style.ts index 79573c7..6bab292 100644 --- a/src/components/SearchBar/style.ts +++ b/src/components/SearchBar/style.ts @@ -1,7 +1,7 @@ import styled from 'styled-components'; export const Container = styled.div` - width: 419px; + max-width: 419px; `; export const Button = styled.button` From 5c91035a874d5900ada79fe4fc22a25bbfe09c31 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sat, 10 Apr 2021 20:47:44 -0300 Subject: [PATCH 18/63] Fixed NavBar style --- src/components/SearchBar/index.tsx | 38 +++++++++++++++++------------- src/styles/globalStyles.ts | 1 + 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/components/SearchBar/index.tsx b/src/components/SearchBar/index.tsx index e05bb37..6ee4640 100644 --- a/src/components/SearchBar/index.tsx +++ b/src/components/SearchBar/index.tsx @@ -8,23 +8,27 @@ import { FiSearch } from 'react-icons/fi'; const SearchBar: React.FC = () => { return ( - - - - - - - - - - + + + + + + + + + + + + + + ); }; diff --git a/src/styles/globalStyles.ts b/src/styles/globalStyles.ts index 656d501..550f48a 100644 --- a/src/styles/globalStyles.ts +++ b/src/styles/globalStyles.ts @@ -6,6 +6,7 @@ export default createGlobalStyle` padding: 0; box-sizing: border-box; outline: none; + } body { background-color: #F7F8F9; From 3bc7517661a7ceef9ed2581c965535f8a43a5408 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sun, 11 Apr 2021 09:14:24 -0300 Subject: [PATCH 19/63] Prettier fixes --- src/components/FilterDropDown/styles.ts | 2 +- src/components/NavBar/styles.ts | 1 - src/components/NewRepositoryForm/styles.ts | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/FilterDropDown/styles.ts b/src/components/FilterDropDown/styles.ts index b305c96..8a0d1bf 100644 --- a/src/components/FilterDropDown/styles.ts +++ b/src/components/FilterDropDown/styles.ts @@ -7,7 +7,7 @@ export const Container = styled.section` border-radius: 4px; padding: 8px 12px; color: var(--secondary); - + font-weight: 500; margin-bottom: 2px; transition: 200ms all ease; diff --git a/src/components/NavBar/styles.ts b/src/components/NavBar/styles.ts index 037298d..26f88ca 100644 --- a/src/components/NavBar/styles.ts +++ b/src/components/NavBar/styles.ts @@ -21,7 +21,6 @@ export const Container = styled.div` #brand { color: var(--secondary); font-weight: 500; - } #menu-button { diff --git a/src/components/NewRepositoryForm/styles.ts b/src/components/NewRepositoryForm/styles.ts index b4b0d0a..992d8a1 100644 --- a/src/components/NewRepositoryForm/styles.ts +++ b/src/components/NewRepositoryForm/styles.ts @@ -51,7 +51,6 @@ export const Content = styled.form` flex-direction: column; label { - color: var(--dark); font-weight: 400; span { From d6ecc0b02b94b9f0985c96a3fd086a8c97e54296 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sun, 11 Apr 2021 09:47:42 -0300 Subject: [PATCH 20/63] Created Delete Modal --- package.json | 2 ++ src/components/DeleteModal/index.tsx | 54 ++++++++++++++++++++++++++++ src/components/DeleteModal/styles.ts | 13 +++++++ 3 files changed, 69 insertions(+) create mode 100644 src/components/DeleteModal/index.tsx create mode 100644 src/components/DeleteModal/styles.ts diff --git a/package.json b/package.json index 0383978..8f557ed 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,14 @@ "version": "0.1.0", "private": true, "dependencies": { + "@clayui/button": "^3.6.0", "@clayui/card": "^3.25.1", "@clayui/css": "^3.25.3", "@clayui/drop-down": "^3.25.1", "@clayui/form": "^3.14.4", "@clayui/label": "^3.4.1", "@clayui/management-toolbar": "^3.3.0", + "@clayui/modal": "^3.8.5", "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", diff --git a/src/components/DeleteModal/index.tsx b/src/components/DeleteModal/index.tsx new file mode 100644 index 0000000..ad35738 --- /dev/null +++ b/src/components/DeleteModal/index.tsx @@ -0,0 +1,54 @@ +import React, { useState } from 'react'; + +import { Button } from './styles'; +import { FiTrash2, FiAlertTriangle } from 'react-icons/fi'; +import ClayModal, { useModal } from '@clayui/modal'; +import ClayButton from '@clayui/button'; + +const DeleteModal: React.FC = () => { + const [visible, setVisible] = useState(false); + const { observer, onClose } = useModal({ + onClose: () => setVisible(false), + }); + + return ( + <> + {visible && ( + + + Delete Repository + + +

+ Are you sure you want to delete liferay/senna.js{' '} + repository? +

+
+ + + Cancel + + { + console.log('DELETED BUTTON CLICKED'); + onClose(); + }} + > + Delete + + + } + /> +
+ )} + + + ); +}; + +export default DeleteModal; diff --git a/src/components/DeleteModal/styles.ts b/src/components/DeleteModal/styles.ts new file mode 100644 index 0000000..7f1020e --- /dev/null +++ b/src/components/DeleteModal/styles.ts @@ -0,0 +1,13 @@ +import styled from 'styled-components'; + +export const Button = styled.button` + width: 32px; + height: 32px; + background: transparent; + border: 0px; + border-radius: 4px; + transition: all 200ms ease; + :hover { + background: rgba(39, 40, 51, 0.04); + } +`; From c50b57048b742152970e98de03b1e66661da7335 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sun, 11 Apr 2021 09:47:51 -0300 Subject: [PATCH 21/63] Calling Delete Modal --- src/components/Card/index.tsx | 7 +++---- src/components/CardRow/index.tsx | 6 ++---- yarn.lock | 11 +++++++++++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index c7c868e..975400b 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -3,9 +3,10 @@ import React from 'react'; import { CardHeader, CardBody } from './styles'; import ClayCard from '@clayui/card'; import { MdStarBorder /*, MdStar */ } from 'react-icons/md'; -import { FiTrash2 } from 'react-icons/fi'; import logo from '../../assets/logo.png'; import ClayLabel from '@clayui/label'; +import DeleteModal from '../DeleteModal'; + const Card: React.FC = () => { return (
@@ -19,9 +20,7 @@ const Card: React.FC = () => { - + diff --git a/src/components/CardRow/index.tsx b/src/components/CardRow/index.tsx index 17730ce..b5872ad 100644 --- a/src/components/CardRow/index.tsx +++ b/src/components/CardRow/index.tsx @@ -3,9 +3,9 @@ import React from 'react'; import { CardHeader, CardBody } from './styles'; import ClayCard from '@clayui/card'; import { MdStarBorder /*, MdStar */ } from 'react-icons/md'; -import { FiTrash2 } from 'react-icons/fi'; import logo from '../../assets/logo.png'; import ClayLabel from '@clayui/label'; +import DeleteModal from '../DeleteModal'; const Card: React.FC = () => { return (
@@ -19,9 +19,7 @@ const Card: React.FC = () => { - + diff --git a/yarn.lock b/yarn.lock index bdad340..89bac97 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1274,6 +1274,17 @@ "@clayui/layout" "^3.3.0" classnames "^2.2.6" +"@clayui/modal@^3.8.5": + version "3.8.5" + resolved "https://registry.yarnpkg.com/@clayui/modal/-/modal-3.8.5.tgz#6eacec122c9ecd8af0b100d34cb30c884d33e5cd" + integrity sha512-U8o4eub5ujCUeFrVcfAgkxXv4ZX14LyUT5yYj/lDr7ihOE1LRXREnGmEWnINgP18TkUYobeQSj5F3YFnPXXnEg== + dependencies: + "@clayui/button" "^3.6.0" + "@clayui/icon" "^3.1.0" + "@clayui/shared" "^3.5.1" + classnames "^2.2.6" + warning "^4.0.3" + "@clayui/shared@^3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@clayui/shared/-/shared-3.5.1.tgz#6daee67b300f346381dd126472802f0a83472c4c" From 50194f87abbe32bb614d72f62605b656f61f747e Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sun, 11 Apr 2021 10:37:54 -0300 Subject: [PATCH 22/63] Created Delete modal test --- .eslintrc.json | 3 +- package.json | 19 +++++---- src/__tests__/components/DeleteModal.spec.tsx | 10 +++++ yarn.lock | 41 ++++++++++++++++++- 4 files changed, 61 insertions(+), 12 deletions(-) create mode 100644 src/__tests__/components/DeleteModal.spec.tsx diff --git a/.eslintrc.json b/.eslintrc.json index a911dc8..fe483a0 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,7 +1,8 @@ { "env": { "browser": true, - "es2021": true + "es2021": true, + "jest": true }, "extends": [ "plugin:react/recommended", diff --git a/package.json b/package.json index 8f557ed..e4fc55c 100644 --- a/package.json +++ b/package.json @@ -11,14 +11,6 @@ "@clayui/label": "^3.4.1", "@clayui/management-toolbar": "^3.3.0", "@clayui/modal": "^3.8.5", - "@testing-library/jest-dom": "^5.11.4", - "@testing-library/react": "^11.1.0", - "@testing-library/user-event": "^12.1.10", - "@types/jest": "^26.0.15", - "@types/node": "^12.0.0", - "@types/react": "^17.0.0", - "@types/react-dom": "^17.0.0", - "@types/styled-components": "^5.1.9", "axios": "^0.21.1", "react": "^17.0.2", "react-dom": "^17.0.2", @@ -53,6 +45,14 @@ ] }, "devDependencies": { + "@types/jest": "^26.0.15", + "@types/node": "^12.0.0", + "@types/react": "^17.0.0", + "@types/react-dom": "^17.0.0", + "@types/styled-components": "^5.1.9", + "@testing-library/jest-dom": "^5.11.4", + "@testing-library/react": "^11.2.6", + "@testing-library/user-event": "^12.1.10", "@typescript-eslint/eslint-plugin": "^4.21.0", "@typescript-eslint/parser": "^4.21.0", "eslint": "^7.12.1", @@ -64,6 +64,7 @@ "eslint-plugin-prettier": "^3.3.1", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-react": "^7.23.2", - "prettier": "^2.2.1" + "prettier": "^2.2.1", + "ts-node": "^9.1.1" } } diff --git a/src/__tests__/components/DeleteModal.spec.tsx b/src/__tests__/components/DeleteModal.spec.tsx new file mode 100644 index 0000000..fb4bacb --- /dev/null +++ b/src/__tests__/components/DeleteModal.spec.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import DeleteModal from '../../components/DeleteModal'; + +describe('Delete Confirmation Modal', () => { + it('should test if DeleteModal renders', function () { + const { debug } = render(); + debug(); + }); +}); diff --git a/yarn.lock b/yarn.lock index 89bac97..3b34346 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1812,7 +1812,7 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react@^11.1.0": +"@testing-library/react@^11.2.6": version "11.2.6" resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.6.tgz#586a23adc63615985d85be0c903f374dab19200b" integrity sha512-TXMCg0jT8xmuU8BkKMtp8l7Z50Ykew5WNX8UoIKTaLFwKkP2+1YDhOLA2Ga3wY4x29jyntk7EWfum0kjlYiSjQ== @@ -2593,6 +2593,11 @@ aproba@^1.1.1: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -3893,6 +3898,11 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -4367,6 +4377,11 @@ diff-sequences@^26.6.2: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -7480,6 +7495,11 @@ make-dir@^3.0.0, make-dir@^3.0.2: dependencies: semver "^6.0.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -10434,7 +10454,7 @@ source-map-resolve@^0.6.0: atob "^2.1.2" decode-uri-component "^0.2.0" -source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19: +source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -11086,6 +11106,18 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +ts-node@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== + dependencies: + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + ts-pnp@1.2.0, ts-pnp@^1.1.6: version "1.2.0" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" @@ -11989,6 +12021,11 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 9528323667d47f56a5795cc4e2a704c84e19ca1f Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sun, 11 Apr 2021 13:35:02 -0300 Subject: [PATCH 23/63] created test files --- package.json | 2 +- src/__tests__/components/Card.spec.tsx | 10 ++++++++++ src/__tests__/components/FilterDropDown.spec.tsx | 10 ++++++++++ src/components/DeleteModal/index.tsx | 7 +++++-- 4 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 src/__tests__/components/Card.spec.tsx create mode 100644 src/__tests__/components/FilterDropDown.spec.tsx diff --git a/package.json b/package.json index e4fc55c..35c855c 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "scripts": { "start": "react-scripts start", "build": "react-scripts build", - "test": "react-scripts test", + "test": "react-scripts test --runInBand", "eject": "react-scripts eject" }, "eslintConfig": { diff --git a/src/__tests__/components/Card.spec.tsx b/src/__tests__/components/Card.spec.tsx new file mode 100644 index 0000000..9035265 --- /dev/null +++ b/src/__tests__/components/Card.spec.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import Card from '../../components/Card'; + +describe('Card Component', () => { + it('should test if Card renders', function () { + const { debug } = render(); + debug(); + }); +}); diff --git a/src/__tests__/components/FilterDropDown.spec.tsx b/src/__tests__/components/FilterDropDown.spec.tsx new file mode 100644 index 0000000..7f7a05f --- /dev/null +++ b/src/__tests__/components/FilterDropDown.spec.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import FilterDropDown from '../../components/FilterDropDown'; + +describe('Filter Dropdown Component', () => { + it('should test if FilterDropDown renders', function () { + const { debug } = render(); + debug(); + }); +}); diff --git a/src/components/DeleteModal/index.tsx b/src/components/DeleteModal/index.tsx index ad35738..0bb6f9b 100644 --- a/src/components/DeleteModal/index.tsx +++ b/src/components/DeleteModal/index.tsx @@ -33,7 +33,6 @@ const DeleteModal: React.FC = () => { { - console.log('DELETED BUTTON CLICKED'); onClose(); }} > @@ -44,7 +43,11 @@ const DeleteModal: React.FC = () => { /> )} - From 32baea7b66ce384bd6c8360b9a133da87eedbcad Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sun, 11 Apr 2021 13:49:44 -0300 Subject: [PATCH 24/63] passing props to Card components --- src/__tests__/components/Card.spec.tsx | 19 +++++++-- src/__tests__/components/CardRow.spec.tsx | 23 ++++++++++ src/components/Card/index.tsx | 51 ++++++++++++++++++----- src/components/CardRow/index.tsx | 50 +++++++++++++++++----- 4 files changed, 119 insertions(+), 24 deletions(-) create mode 100644 src/__tests__/components/CardRow.spec.tsx diff --git a/src/__tests__/components/Card.spec.tsx b/src/__tests__/components/Card.spec.tsx index 9035265..85aac70 100644 --- a/src/__tests__/components/Card.spec.tsx +++ b/src/__tests__/components/Card.spec.tsx @@ -3,8 +3,21 @@ import { render } from '@testing-library/react'; import Card from '../../components/Card'; describe('Card Component', () => { - it('should test if Card renders', function () { - const { debug } = render(); - debug(); + it('should test if Card renders', async function () { + const { findByText } = render( + , + ); + + await findByText('liferay/liferay-portal'); }); }); diff --git a/src/__tests__/components/CardRow.spec.tsx b/src/__tests__/components/CardRow.spec.tsx new file mode 100644 index 0000000..01fb814 --- /dev/null +++ b/src/__tests__/components/CardRow.spec.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import CardRow from '../../components/CardRow'; + +describe('CardRow Component', () => { + it('should test if CardRow renders', async function () { + const { findByText } = render( + , + ); + + await findByText('liferay/liferay-portal'); + }); +}); diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index 975400b..4d46934 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -2,23 +2,48 @@ import React from 'react'; import { CardHeader, CardBody } from './styles'; import ClayCard from '@clayui/card'; -import { MdStarBorder /*, MdStar */ } from 'react-icons/md'; +import { MdStarBorder, MdStar } from 'react-icons/md'; import logo from '../../assets/logo.png'; import ClayLabel from '@clayui/label'; import DeleteModal from '../DeleteModal'; -const Card: React.FC = () => { +interface Props { + name: string; + stars: number; + forks: number; + openIssues: number; + age: string; + lastCommit: string; + license: string; + techs: Array; + starred: boolean; +} +const Card: React.FC = ({ + name, + stars, + forks, + openIssues, + age, + lastCommit, + license, + techs, + starred, +}) => { return (
-

liferay/liferay-portal

+

{name}

@@ -27,38 +52,42 @@ const Card: React.FC = () => {
  • - Stars 150 + Stars {stars}

  • - Forks 442 + Forks {forks}

  • - Open Issues 0 + Open Issues {openIssues}

  • - Age 11 years ago + Age {age}

  • - Last commit 7 hours ago + Last commit {lastCommit}

  • - License N/A + License {license}

  • - JAVASCRIPT + {techs.map((t, index) => ( + + {t} + + ))}
diff --git a/src/components/CardRow/index.tsx b/src/components/CardRow/index.tsx index b5872ad..df372b6 100644 --- a/src/components/CardRow/index.tsx +++ b/src/components/CardRow/index.tsx @@ -2,11 +2,33 @@ import React from 'react'; import { CardHeader, CardBody } from './styles'; import ClayCard from '@clayui/card'; -import { MdStarBorder /*, MdStar */ } from 'react-icons/md'; +import { MdStarBorder, MdStar } from 'react-icons/md'; import logo from '../../assets/logo.png'; import ClayLabel from '@clayui/label'; import DeleteModal from '../DeleteModal'; -const Card: React.FC = () => { + +interface Props { + name: string; + stars: number; + forks: number; + openIssues: number; + age: string; + lastCommit: string; + license: string; + techs: Array; + starred: boolean; +} +const Card: React.FC = ({ + name, + stars, + forks, + openIssues, + age, + lastCommit, + license, + techs, + starred, +}) => { return (
@@ -17,7 +39,11 @@ const Card: React.FC = () => {
@@ -26,38 +52,42 @@ const Card: React.FC = () => {
  • - Stars 150 + Stars {stars}

  • - Forks 442 + Forks {forks}

  • - Open Issues 0 + Open Issues {openIssues}

  • - Age 11 years ago + Age {age}

  • - Last commit 7 hours ago + Last commit {lastCommit}

  • - License N/A + License {license}

  • - JAVA + {techs.map((t, index) => ( + + {t} + + ))}
From 8eb84307f232b860666b046a06e16e271f14d0d1 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sun, 11 Apr 2021 16:35:24 -0300 Subject: [PATCH 25/63] Created Common Global style file --- src/components/NavBar/styles.ts | 17 ----------------- src/components/StarFilter/index.tsx | 2 +- .../styles.ts => commons/GlobalComponents.ts} | 0 3 files changed, 1 insertion(+), 18 deletions(-) rename src/components/{StarFilter/styles.ts => commons/GlobalComponents.ts} (100%) diff --git a/src/components/NavBar/styles.ts b/src/components/NavBar/styles.ts index 26f88ca..37cc043 100644 --- a/src/components/NavBar/styles.ts +++ b/src/components/NavBar/styles.ts @@ -36,20 +36,3 @@ export const Container = styled.div` } } `; - -export const Button = styled.button` - height: 32px; - width: 32px; - display: flex; - border: 1px solid #fff; - align-items: center; - justify-content: center; - background-color: transparent; - transition: 200ms all ease; - border-radius: 4px; - color: var(--secondary); - :hover { - background: #f1f2f5; - border: 1px solid #cdced9; - } -`; diff --git a/src/components/StarFilter/index.tsx b/src/components/StarFilter/index.tsx index 91a4bde..c474644 100644 --- a/src/components/StarFilter/index.tsx +++ b/src/components/StarFilter/index.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; -import { Button } from './styles'; +import { Button } from '../commons/GlobalComponents'; import { MdStar, MdStarBorder } from 'react-icons/md'; const StarFilter: React.FC = () => { diff --git a/src/components/StarFilter/styles.ts b/src/components/commons/GlobalComponents.ts similarity index 100% rename from src/components/StarFilter/styles.ts rename to src/components/commons/GlobalComponents.ts From bf85e8bea895e841a331a7e02c653d23ac59816d Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sun, 11 Apr 2021 16:46:09 -0300 Subject: [PATCH 26/63] [Hotifx] Fixed DropDown shadow --- src/components/NewRepositoryForm/styles.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/NewRepositoryForm/styles.ts b/src/components/NewRepositoryForm/styles.ts index 992d8a1..6947e53 100644 --- a/src/components/NewRepositoryForm/styles.ts +++ b/src/components/NewRepositoryForm/styles.ts @@ -38,9 +38,7 @@ export const Content = styled.form` top: 40px; right: 0px; z-index: 9999; - -webkit-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.12); - -moz-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.12); - box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.12); + box-shadow: 0 1px 5px -1px rgb(0 0 0 / 30%); animation-name: FadeIn; animation-duration: 300ms; From 301c22c8d7e54313508e662deda1d0154a83486b Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sun, 11 Apr 2021 16:46:27 -0300 Subject: [PATCH 27/63] Created List Type toggle --- src/components/ListType/index.tsx | 24 +++++++++ src/components/NavBar/index.tsx | 9 ++-- src/components/RepositoryList/index.tsx | 71 +++++++++++++++++++------ 3 files changed, 83 insertions(+), 21 deletions(-) create mode 100644 src/components/ListType/index.tsx diff --git a/src/components/ListType/index.tsx b/src/components/ListType/index.tsx new file mode 100644 index 0000000..b77155a --- /dev/null +++ b/src/components/ListType/index.tsx @@ -0,0 +1,24 @@ +import React, { useState } from 'react'; + +import { Button } from '../commons/GlobalComponents'; +// import { Container } from './styles'; +import { BsFillGridFill } from 'react-icons/bs'; +import { FaThList } from 'react-icons/fa'; +const ListType: React.FC = () => { + const [listType, setListType] = useState<'grid' | 'row'>('grid'); + return ( + <> + {listType === 'grid' ? ( + + ) : ( + + )} + + ); +}; + +export default ListType; diff --git a/src/components/NavBar/index.tsx b/src/components/NavBar/index.tsx index ac46055..0329571 100644 --- a/src/components/NavBar/index.tsx +++ b/src/components/NavBar/index.tsx @@ -1,14 +1,15 @@ import React from 'react'; -import { Container, Button } from './styles'; +import { Container } from './styles'; +import { Button } from '../commons/GlobalComponents'; import { FaGithub, FaAdjust } from 'react-icons/fa'; -import { BsFillGridFill } from 'react-icons/bs'; import SearchBar from '../SearchBar'; import FilterDropDown from '../FilterDropDown'; import StarFilter from '../StarFilter'; import NewRepositoryForm from '../NewRepositoryForm'; +import ListType from '../ListType'; const NavBar: React.FC = () => { return ( @@ -31,9 +32,7 @@ const NavBar: React.FC = () => {
  • - +
  • diff --git a/src/components/RepositoryList/index.tsx b/src/components/RepositoryList/index.tsx index b2532b0..3fdc0b9 100644 --- a/src/components/RepositoryList/index.tsx +++ b/src/components/RepositoryList/index.tsx @@ -5,22 +5,61 @@ import Card from '../Card'; const RepositoryList: React.FC = () => { return ( - - - - - - - - - - - - - - - - + + + + + ); }; From 1f72a1410f8b9557e3d1749b44c50770ae40e00b Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Sun, 11 Apr 2021 16:55:48 -0300 Subject: [PATCH 28/63] finished List type Toggle Button --- .../components/ListTypeToggleButton.spec.tsx | 11 +++++++++++ .../{ListType => ListTypeToggleButton}/index.tsx | 12 ++++++++++-- src/components/NavBar/index.tsx | 4 ++-- 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 src/__tests__/components/ListTypeToggleButton.spec.tsx rename src/components/{ListType => ListTypeToggleButton}/index.tsx (68%) diff --git a/src/__tests__/components/ListTypeToggleButton.spec.tsx b/src/__tests__/components/ListTypeToggleButton.spec.tsx new file mode 100644 index 0000000..6713d3d --- /dev/null +++ b/src/__tests__/components/ListTypeToggleButton.spec.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { render, fireEvent } from '@testing-library/react'; +import ListTypeToggleButton from '../../components/ListTypeToggleButton'; + +describe('List Type Toggle Button', () => { + it('should test if Button fires event', function () { + const { getByTestId } = render(); + fireEvent.click(getByTestId('btn-grid')); + expect(getByTestId('btn-row')).not.toBeNull(); + }); +}); diff --git a/src/components/ListType/index.tsx b/src/components/ListTypeToggleButton/index.tsx similarity index 68% rename from src/components/ListType/index.tsx rename to src/components/ListTypeToggleButton/index.tsx index b77155a..5c49799 100644 --- a/src/components/ListType/index.tsx +++ b/src/components/ListTypeToggleButton/index.tsx @@ -9,11 +9,19 @@ const ListType: React.FC = () => { return ( <> {listType === 'grid' ? ( - ) : ( - )} diff --git a/src/components/NavBar/index.tsx b/src/components/NavBar/index.tsx index 0329571..b5c7055 100644 --- a/src/components/NavBar/index.tsx +++ b/src/components/NavBar/index.tsx @@ -9,7 +9,7 @@ import SearchBar from '../SearchBar'; import FilterDropDown from '../FilterDropDown'; import StarFilter from '../StarFilter'; import NewRepositoryForm from '../NewRepositoryForm'; -import ListType from '../ListType'; +import ListTypeToggleButton from '../ListTypeToggleButton'; const NavBar: React.FC = () => { return ( @@ -32,7 +32,7 @@ const NavBar: React.FC = () => {
  • - +
  • From f5fde4ef76030b70fafb9067fee7b61b0854a87d Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Mon, 12 Apr 2021 19:09:37 -0300 Subject: [PATCH 29/63] Created Request functions --- .eslintrc.json | 3 ++- src/@types/repository.d.ts | 16 ++++++++++++++++ src/api/index.ts | 5 +++++ src/api/repository.ts | 13 +++++++++++++ tsconfig.json | 3 ++- 5 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 src/@types/repository.d.ts create mode 100644 src/api/index.ts create mode 100644 src/api/repository.ts diff --git a/.eslintrc.json b/.eslintrc.json index fe483a0..e4dbb58 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -27,7 +27,8 @@ "prettier/prettier":"error", "no-use-before-define": "off", "@typescript-eslint/no-use-before-define": ["error"], - "react/prop-types": "off" + "react/prop-types": "off", + "camelcase": "off" }, "settings": { "import/resolver": "eslint-import-resolver-typescript" diff --git a/src/@types/repository.d.ts b/src/@types/repository.d.ts new file mode 100644 index 0000000..3c5438b --- /dev/null +++ b/src/@types/repository.d.ts @@ -0,0 +1,16 @@ +interface ILicense { + name: string; +} +interface IRepository { + full_name: string; + stargazers_count: number; + forks: number; + open_issues: number; + created_at: string; + pushed_at: string; + license: ILicense | null; +} + +interface IRepositoryList { + iterms: IRepository[]; +} diff --git a/src/api/index.ts b/src/api/index.ts new file mode 100644 index 0000000..667911a --- /dev/null +++ b/src/api/index.ts @@ -0,0 +1,5 @@ +import axios from 'axios'; + +export default axios.create({ + baseURL: 'https://api.github.com/', +}); diff --git a/src/api/repository.ts b/src/api/repository.ts new file mode 100644 index 0000000..773477d --- /dev/null +++ b/src/api/repository.ts @@ -0,0 +1,13 @@ +import Api from '.'; + +export const getRepository = async (term: string): Promise => { + const response = await Api.get(`repos/${term}`); + return response.data; +}; + +export const getAllUserRepositories = async ( + user: string, +): Promise => { + const response = await Api.get(`search/repositories?q=${user}`); + return response.data; +}; diff --git a/tsconfig.json b/tsconfig.json index a273b0c..f8c1abc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,8 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - "jsx": "react-jsx" + "jsx": "react-jsx", + "typeRoots": ["./src/@types"] }, "include": [ "src" From 0b11c068d27a3291538f8176642ff1a86589986e Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Mon, 12 Apr 2021 19:45:30 -0300 Subject: [PATCH 30/63] API getRepository tests --- package.json | 11 ++++++----- src/__tests__/api/api.spec.ts | 16 ++++++++++++++++ tsconfig.json | 3 +-- yarn.lock | 15 ++++++++++----- 4 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 src/__tests__/api/api.spec.ts diff --git a/package.json b/package.json index 35c855c..b44fabc 100644 --- a/package.json +++ b/package.json @@ -45,14 +45,15 @@ ] }, "devDependencies": { - "@types/jest": "^26.0.15", - "@types/node": "^12.0.0", - "@types/react": "^17.0.0", - "@types/react-dom": "^17.0.0", - "@types/styled-components": "^5.1.9", "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.2.6", "@testing-library/user-event": "^12.1.10", + "@types/jest": "^26.0.22", + "@types/mocha": "^8.2.2", + "@types/node": "^14.14.37", + "@types/react": "^17.0.0", + "@types/react-dom": "^17.0.0", + "@types/styled-components": "^5.1.9", "@typescript-eslint/eslint-plugin": "^4.21.0", "@typescript-eslint/parser": "^4.21.0", "eslint": "^7.12.1", diff --git a/src/__tests__/api/api.spec.ts b/src/__tests__/api/api.spec.ts new file mode 100644 index 0000000..8d6f525 --- /dev/null +++ b/src/__tests__/api/api.spec.ts @@ -0,0 +1,16 @@ +import * as Api from '../../api/repository'; + +describe('API Repository Requests', () => { + it('should return a single repository object', async () => { + const response = await Api.getRepository('filipemelo2002/gama-bank'); + expect(response).toHaveProperty('id'); + }); + + it('should return an error message', async () => { + try { + await Api.getRepository('filipemelo2002/invalid-repo'); + } catch (err) { + expect(err.response.status).toBe(404); + } + }); +}); diff --git a/tsconfig.json b/tsconfig.json index f8c1abc..a273b0c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,8 +18,7 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - "jsx": "react-jsx", - "typeRoots": ["./src/@types"] + "jsx": "react-jsx" }, "include": [ "src" diff --git a/yarn.lock b/yarn.lock index 3b34346..e4d913d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1935,7 +1935,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@*", "@types/jest@^26.0.15": +"@types/jest@*", "@types/jest@^26.0.22": version "26.0.22" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.22.tgz#8308a1debdf1b807aa47be2838acdcd91e88fbe6" integrity sha512-eeWwWjlqxvBxc4oQdkueW5OF/gtfSceKk4OnOAGlUSwS/liBRtZppbJuz1YkgbrbfGOoeBHun9fOvXnjNwrSOw== @@ -1958,15 +1958,20 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/mocha@^8.2.2": + version "8.2.2" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0" + integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw== + "@types/node@*": version "14.14.31" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.31.tgz#72286bd33d137aa0d152d47ec7c1762563d34055" integrity sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g== -"@types/node@^12.0.0": - version "12.20.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.7.tgz#1cb61fd0c85cb87e728c43107b5fd82b69bc9ef8" - integrity sha512-gWL8VUkg8VRaCAUgG9WmhefMqHmMblxe2rVpMF86nZY/+ZysU+BkAp+3cz03AixWDSSz0ks5WX59yAhv/cDwFA== +"@types/node@^14.14.37": + version "14.14.37" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e" + integrity sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 997687216cdb3406e90f1a92b91c5cf1c93b8bfd Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Mon, 12 Apr 2021 20:17:31 -0300 Subject: [PATCH 31/63] Fixed Repositories List type --- src/@types/repository.d.ts | 2 +- src/__tests__/api/api.spec.ts | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/@types/repository.d.ts b/src/@types/repository.d.ts index 3c5438b..330c3ad 100644 --- a/src/@types/repository.d.ts +++ b/src/@types/repository.d.ts @@ -12,5 +12,5 @@ interface IRepository { } interface IRepositoryList { - iterms: IRepository[]; + items: IRepository[]; } diff --git a/src/__tests__/api/api.spec.ts b/src/__tests__/api/api.spec.ts index 8d6f525..d05eab5 100644 --- a/src/__tests__/api/api.spec.ts +++ b/src/__tests__/api/api.spec.ts @@ -2,7 +2,7 @@ import * as Api from '../../api/repository'; describe('API Repository Requests', () => { it('should return a single repository object', async () => { - const response = await Api.getRepository('filipemelo2002/gama-bank'); + const response = await Api.getRepository('filipemelo2002/filipemelo2002'); expect(response).toHaveProperty('id'); }); @@ -13,4 +13,14 @@ describe('API Repository Requests', () => { expect(err.response.status).toBe(404); } }); + + it("should return all user's repositories", async () => { + const response = await Api.getAllUserRepositories('filipemelo2002'); + expect(response.items.length).toBeGreaterThan(0); + }); + + it("should fail fetching for user's repositories", async () => { + const response = await Api.getAllUserRepositories('filipemelo2002INVALID'); + expect(response.items.length).toBe(0); + }); }); From 4427b8d99341918c744d829dbf52c1df505ac792 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Mon, 12 Apr 2021 21:48:35 -0300 Subject: [PATCH 32/63] Fixed Repository types --- src/@types/redux.d.ts | 14 ++++++++++++++ src/@types/repository.d.ts | 1 + src/api/repository.ts | 8 +++++--- 3 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 src/@types/redux.d.ts diff --git a/src/@types/redux.d.ts b/src/@types/redux.d.ts new file mode 100644 index 0000000..aab102e --- /dev/null +++ b/src/@types/redux.d.ts @@ -0,0 +1,14 @@ +interface IRepositoryState { + data: IRepository[]; + loading: boolean; + error: boolean; + filter: { + name: string; + data: IRepository[]; + starred: boolean; + }; +} + +interface State { + repository: IRepositoryState; +} diff --git a/src/@types/repository.d.ts b/src/@types/repository.d.ts index 330c3ad..f83d40f 100644 --- a/src/@types/repository.d.ts +++ b/src/@types/repository.d.ts @@ -9,6 +9,7 @@ interface IRepository { created_at: string; pushed_at: string; license: ILicense | null; + starred?: boolean; } interface IRepositoryList { diff --git a/src/api/repository.ts b/src/api/repository.ts index 773477d..6bf6215 100644 --- a/src/api/repository.ts +++ b/src/api/repository.ts @@ -7,7 +7,9 @@ export const getRepository = async (term: string): Promise => { export const getAllUserRepositories = async ( user: string, -): Promise => { - const response = await Api.get(`search/repositories?q=${user}`); - return response.data; +): Promise => { + const response = await Api.get( + `search/repositories?q=${user}`, + ); + return response.data.items; }; From d7ed62a487da7e81a84df5d232f2ff2ae79ae10d Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Mon, 12 Apr 2021 21:48:56 -0300 Subject: [PATCH 33/63] Repository Redux --- package.json | 3 ++ src/redux/action/repository.ts | 43 +++++++++++++++++++++ src/redux/reducer/repository.ts | 68 +++++++++++++++++++++++++++++++++ yarn.lock | 48 +++++++++++++++++++++-- 4 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 src/redux/action/repository.ts create mode 100644 src/redux/reducer/repository.ts diff --git a/package.json b/package.json index b44fabc..bb10181 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,10 @@ "react": "^17.0.2", "react-dom": "^17.0.2", "react-icons": "^4.2.0", + "react-redux": "^7.2.3", "react-scripts": "4.0.3", + "redux": "^4.0.5", + "redux-thunk": "^2.3.0", "styled-components": "^5.2.3", "typescript": "^4.1.2", "web-vitals": "^1.0.1" diff --git a/src/redux/action/repository.ts b/src/redux/action/repository.ts new file mode 100644 index 0000000..4a2012a --- /dev/null +++ b/src/redux/action/repository.ts @@ -0,0 +1,43 @@ +import Redux from 'redux'; +import * as Api from '../../api/repository'; +const TEMPLATE_NAME = 'REPOSITORY'; + +export const getRepository = (term: string) => { + return async (dispatch: Redux.Dispatch): Promise => { + try { + dispatch({ + type: `${TEMPLATE_NAME}_PENDING`, + }); + const response = await Api.getRepository(term); + dispatch({ + type: `${TEMPLATE_NAME}_SUCCESS`, + payload: response, + }); + } catch (err) { + dispatch({ + type: `${TEMPLATE_NAME}_REJECTED`, + payload: err, + }); + } + }; +}; + +export const getAllUserRepositories = (term: string) => { + return async (dispatch: Redux.Dispatch): Promise => { + try { + dispatch({ + type: `${TEMPLATE_NAME}_PENDING`, + }); + const response = await Api.getAllUserRepositories(term); + dispatch({ + type: `${TEMPLATE_NAME}_FULFILLED`, + payload: response, + }); + } catch (err) { + dispatch({ + type: `${TEMPLATE_NAME}_REJECTED`, + payload: err, + }); + } + }; +}; diff --git a/src/redux/reducer/repository.ts b/src/redux/reducer/repository.ts new file mode 100644 index 0000000..061e884 --- /dev/null +++ b/src/redux/reducer/repository.ts @@ -0,0 +1,68 @@ +const TEMPLATE_NAME = 'REPOSITORY'; + +const initialState = (): IRepositoryState => ({ + data: [], + loading: false, + error: false, + filter: { + name: '', + data: [], + starred: false, + }, +}); + +interface ActionGetRepositorySuccess { + type: string; + payload: IRepository; +} + +interface ActionListRepositoriesSuccess { + type: string; + payload: IRepository[]; +} + +type Action = ActionGetRepositorySuccess | ActionListRepositoriesSuccess; +const reducer = (state = initialState(), action: Action): IRepositoryState => { + switch (action.type) { + case `${TEMPLATE_NAME}_PENDING`: { + return { + ...state, + loading: true, + error: false, + }; + } + case `${TEMPLATE_NAME}_REJECTED`: { + return { + ...state, + loading: false, + error: true, + }; + } + case `${TEMPLATE_NAME}_FULFILLED`: { + return { + ...state, + data: action.payload as IRepository[], + loading: false, + error: false, + }; + } + case `${TEMPLATE_NAME}_SUCCESS`: { + const repository = action.payload as IRepository; + const newData = state.data; + newData.unshift(repository); + return { + ...state, + data: newData, + loading: false, + error: false, + }; + } + case 'RESET': { + return initialState(); + } + default: + return state; + } +}; + +export default reducer; diff --git a/yarn.lock b/yarn.lock index e4d913d..69a0dc7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1112,7 +1112,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.13.10" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d" integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw== @@ -1903,7 +1903,7 @@ dependencies: "@types/node" "*" -"@types/hoist-non-react-statics@*": +"@types/hoist-non-react-statics@*", "@types/hoist-non-react-statics@^3.3.0": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== @@ -2005,6 +2005,16 @@ dependencies: "@types/react" "*" +"@types/react-redux@^7.1.16": + version "7.1.16" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.16.tgz#0fbd04c2500c12105494c83d4a3e45c084e3cb21" + integrity sha512-f/FKzIrZwZk7YEO9E1yoxIuDNRiDducxkFlkw/GNMGEnK9n4K8wJzlJBghpSuOVDgEUHoDkDF7Gi9lHNQR4siw== + dependencies: + "@types/hoist-non-react-statics" "^3.3.0" + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + redux "^4.0.0" + "@types/react@*", "@types/react@^17.0.0": version "17.0.3" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.3.tgz#ba6e215368501ac3826951eef2904574c262cc79" @@ -5922,7 +5932,7 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -9517,7 +9527,7 @@ react-icons@^4.2.0: resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.2.0.tgz#6dda80c8a8f338ff96a1851424d63083282630d0" integrity sha512-rmzEDFt+AVXRzD7zDE21gcxyBizD/3NqjbX6cmViAgdqfJ2UiLer8927/QhhrXQV7dEj/1EGuOTPp7JnLYVJKQ== -react-is@^16.7.0, react-is@^16.8.1: +react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -9527,6 +9537,18 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== +react-redux@^7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.3.tgz#4c084618600bb199012687da9e42123cca3f0be9" + integrity sha512-ZhAmQ1lrK+Pyi0ZXNMUZuYxYAZd59wFuVDGUt536kSGdD0ya9Q7BfsE95E3TsFLE3kOSFp5m6G5qbatE+Ic1+w== + dependencies: + "@babel/runtime" "^7.12.1" + "@types/react-redux" "^7.1.16" + hoist-non-react-statics "^3.3.2" + loose-envify "^1.4.0" + prop-types "^15.7.2" + react-is "^16.13.1" + react-refresh@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" @@ -9705,6 +9727,19 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redux-thunk@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" + integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== + +redux@^4.0.0, redux@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" + integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== + dependencies: + loose-envify "^1.4.0" + symbol-observable "^1.2.0" + regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -10884,6 +10919,11 @@ svgo@^1.0.0, svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" +symbol-observable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" From 7ecd76a87cab2dae19fea698d0e01617b817b658 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Mon, 12 Apr 2021 21:53:24 -0300 Subject: [PATCH 34/63] Created Redux store --- package.json | 2 ++ src/redux/reducer/index.ts | 6 ++++++ src/redux/store.ts | 13 +++++++++++++ yarn.lock | 19 +++++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 src/redux/reducer/index.ts create mode 100644 src/redux/store.ts diff --git a/package.json b/package.json index bb10181..ffea748 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "@types/node": "^14.14.37", "@types/react": "^17.0.0", "@types/react-dom": "^17.0.0", + "@types/redux-logger": "^3.0.8", "@types/styled-components": "^5.1.9", "@typescript-eslint/eslint-plugin": "^4.21.0", "@typescript-eslint/parser": "^4.21.0", @@ -69,6 +70,7 @@ "eslint-plugin-promise": "^4.2.1", "eslint-plugin-react": "^7.23.2", "prettier": "^2.2.1", + "redux-logger": "^3.0.6", "ts-node": "^9.1.1" } } diff --git a/src/redux/reducer/index.ts b/src/redux/reducer/index.ts new file mode 100644 index 0000000..6b83024 --- /dev/null +++ b/src/redux/reducer/index.ts @@ -0,0 +1,6 @@ +import { combineReducers } from 'redux'; +import repository from './repository'; + +export default combineReducers({ + repository, +}); diff --git a/src/redux/store.ts b/src/redux/store.ts new file mode 100644 index 0000000..18e8757 --- /dev/null +++ b/src/redux/store.ts @@ -0,0 +1,13 @@ +import { createStore, applyMiddleware } from 'redux'; +import { createLogger } from 'redux-logger'; + +import thunk from 'redux-thunk'; +import rootReducer from './reducer'; + +const middlewares = []; +middlewares.push(thunk); +middlewares.push(createLogger({ collapsed: true, duration: true, diff: true })); + +const store = createStore(rootReducer, applyMiddleware(...middlewares)); + +export default store; diff --git a/yarn.lock b/yarn.lock index 69a0dc7..74c4551 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2024,6 +2024,13 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/redux-logger@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@types/redux-logger/-/redux-logger-3.0.8.tgz#1fb6d26917bb198792bb1cf57feb31cae1532c5d" + integrity sha512-zM+cxiSw6nZtRbxpVp9SE3x/X77Z7e7YAfHD1NkxJyJbAGSXJGF0E9aqajZfPOa/sTYnuwutmlCldveExuCeLw== + dependencies: + redux "^4.0.0" + "@types/resolve@0.0.8": version "0.0.8" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" @@ -4274,6 +4281,11 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= +deep-diff@^0.3.5: + version "0.3.8" + resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84" + integrity sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ= + deep-equal@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" @@ -9727,6 +9739,13 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redux-logger@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/redux-logger/-/redux-logger-3.0.6.tgz#f7555966f3098f3c88604c449cf0baf5778274bf" + integrity sha1-91VZZvMJjzyIYExEnPC69XeCdL8= + dependencies: + deep-diff "^0.3.5" + redux-thunk@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" From 25b5670334acea1d18f329bbfc16d5d8205ff3df Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Mon, 12 Apr 2021 22:54:54 -0300 Subject: [PATCH 35/63] New dependencies --- package.json | 2 ++ yarn.lock | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/package.json b/package.json index ffea748..9a140b2 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "@types/react": "^17.0.0", "@types/react-dom": "^17.0.0", "@types/redux-logger": "^3.0.8", + "@types/redux-mock-store": "^1.0.2", "@types/styled-components": "^5.1.9", "@typescript-eslint/eslint-plugin": "^4.21.0", "@typescript-eslint/parser": "^4.21.0", @@ -71,6 +72,7 @@ "eslint-plugin-react": "^7.23.2", "prettier": "^2.2.1", "redux-logger": "^3.0.6", + "redux-mock-store": "^1.5.4", "ts-node": "^9.1.1" } } diff --git a/yarn.lock b/yarn.lock index 74c4551..c6b4ac0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2031,6 +2031,13 @@ dependencies: redux "^4.0.0" +"@types/redux-mock-store@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/redux-mock-store/-/redux-mock-store-1.0.2.tgz#c27d5deadfb29d8514bdb0fc2cadae6feea1922d" + integrity sha512-6LBtAQBN34i7SI5X+Qs4zpTEZO1tTDZ6sZ9fzFjYwTl3nLQXaBtwYdoV44CzNnyKu438xJ1lSIYyw0YMvunESw== + dependencies: + redux "^4.0.5" + "@types/resolve@0.0.8": version "0.0.8" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" @@ -7427,6 +7434,11 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -9746,6 +9758,13 @@ redux-logger@^3.0.6: dependencies: deep-diff "^0.3.5" +redux-mock-store@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.5.4.tgz#90d02495fd918ddbaa96b83aef626287c9ab5872" + integrity sha512-xmcA0O/tjCLXhh9Fuiq6pMrJCwFRaouA8436zcikdIpYWWCjU76CRk+i2bHx8EeiSiMGnB85/lZdU3wIJVXHTA== + dependencies: + lodash.isplainobject "^4.0.6" + redux-thunk@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" From 266a58426a2de563c59562894632a29587ff3220 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Mon, 12 Apr 2021 22:55:01 -0300 Subject: [PATCH 36/63] Testing repository actions --- src/__tests__/action/repository.spec.ts | 65 +++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/__tests__/action/repository.spec.ts diff --git a/src/__tests__/action/repository.spec.ts b/src/__tests__/action/repository.spec.ts new file mode 100644 index 0000000..fdf9ab0 --- /dev/null +++ b/src/__tests__/action/repository.spec.ts @@ -0,0 +1,65 @@ +import configureMockStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import * as actions from '../../redux/action/repository'; +import Api from '../../api/index'; +import axios from 'axios'; + +jest.mock('../../api/index'); +const mockedAxios = Api as jest.Mocked; +const middlewares = [thunk]; +const mockStore = configureMockStore(middlewares); + +describe('Repository actions', () => { + const repository: IRepository = { + full_name: 'filipemelo2002/filipemelo2002', + stargazers_count: 79, + forks: 0, + open_issues: 0, + created_at: '', + pushed_at: '', + license: { + name: 'MIT', + }, + }; + it('should dispatch a new Repository', async () => { + mockedAxios.get.mockResolvedValue({ + data: repository, + }); + + const expectedActions = [ + { type: 'REPOSITORY_PENDING' }, + { + type: 'REPOSITORY_SUCCESS', + payload: repository, + }, + ]; + + const store = mockStore({ repository: { data: [] } }); + await store.dispatch( + actions.getRepository('filipemelo2002/filipemelo2002'), + ); + + expect(store.getActions()).toEqual(expectedActions); + }); + + it('should dispatch a few new Repositories', async () => { + mockedAxios.get.mockResolvedValue({ + data: { + items: [repository], + }, + }); + + const expectedActions = [ + { type: 'REPOSITORY_PENDING' }, + { + type: 'REPOSITORY_FULFILLED', + payload: [repository], + }, + ]; + + const store = mockStore({ repository: { data: [] } }); + await store.dispatch(actions.getAllUserRepositories('filipemelo2002')); + + expect(store.getActions()).toEqual(expectedActions); + }); +}); From 1f318e6dfc1636d52b05c7fedc336eece45de5de Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Mon, 12 Apr 2021 23:04:04 -0300 Subject: [PATCH 37/63] Added Filter actions --- src/__tests__/action/repository.spec.ts | 26 +++++++++++++++++++++---- src/redux/action/repository.ts | 22 +++++++++++++++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/__tests__/action/repository.spec.ts b/src/__tests__/action/repository.spec.ts index fdf9ab0..ec84a88 100644 --- a/src/__tests__/action/repository.spec.ts +++ b/src/__tests__/action/repository.spec.ts @@ -9,6 +9,8 @@ const mockedAxios = Api as jest.Mocked; const middlewares = [thunk]; const mockStore = configureMockStore(middlewares); +const TEMPLATE_NAME = 'REPOSITORY'; + describe('Repository actions', () => { const repository: IRepository = { full_name: 'filipemelo2002/filipemelo2002', @@ -27,9 +29,9 @@ describe('Repository actions', () => { }); const expectedActions = [ - { type: 'REPOSITORY_PENDING' }, + { type: `${TEMPLATE_NAME}_PENDING` }, { - type: 'REPOSITORY_SUCCESS', + type: `${TEMPLATE_NAME}_SUCCESS`, payload: repository, }, ]; @@ -50,9 +52,9 @@ describe('Repository actions', () => { }); const expectedActions = [ - { type: 'REPOSITORY_PENDING' }, + { type: `${TEMPLATE_NAME}_PENDING` }, { - type: 'REPOSITORY_FULFILLED', + type: `${TEMPLATE_NAME}_FULFILLED`, payload: [repository], }, ]; @@ -62,4 +64,20 @@ describe('Repository actions', () => { expect(store.getActions()).toEqual(expectedActions); }); + + it('should search by repository name', () => { + const response = actions.search('filipemelo2002'); + expect(response).toEqual({ + type: `${TEMPLATE_NAME}_SEARCH`, + payload: 'filipemelo2002', + }); + }); + + it('should filter by starred', () => { + const response = actions.filterByStar(true); + expect(response).toEqual({ + type: `${TEMPLATE_NAME}_FILTER_STARRED`, + payload: true, + }); + }); }); diff --git a/src/redux/action/repository.ts b/src/redux/action/repository.ts index 4a2012a..b70eea8 100644 --- a/src/redux/action/repository.ts +++ b/src/redux/action/repository.ts @@ -41,3 +41,25 @@ export const getAllUserRepositories = (term: string) => { } }; }; + +interface SearchAction { + type: string; + payload: string; +} +export const search = (term: string): SearchAction => { + return { + type: `${TEMPLATE_NAME}_SEARCH`, + payload: term, + }; +}; + +interface FilterStarAction { + type: string; + payload: boolean; +} +export const filterByStar = (shouldFilterByStar: boolean): FilterStarAction => { + return { + type: `${TEMPLATE_NAME}_FILTER_STARRED`, + payload: shouldFilterByStar, + }; +}; From 78f71b6827c06efea0561b37f09587645c577682 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Mon, 12 Apr 2021 23:08:59 -0300 Subject: [PATCH 38/63] creating filter functions --- src/services/filter.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/services/filter.ts diff --git a/src/services/filter.ts b/src/services/filter.ts new file mode 100644 index 0000000..89140b2 --- /dev/null +++ b/src/services/filter.ts @@ -0,0 +1,18 @@ +const filterStars = () => {}; + +const filterForks = () => {}; + +const filterOpenIssues = () => {}; + +const filterAge = () => {}; + +const filterLastCommit = () => {}; + +const filters = { + stars: filterStars, + forks: filterForks, + openIssues: filterOpenIssues, + age: filterAge, + lastCommit: filterLastCommit, +}; +export default filters; From 05ad61d3bdc5d7e5a5f9aa779246df9d79fc5ae1 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Mon, 12 Apr 2021 23:41:31 -0300 Subject: [PATCH 39/63] Sort Service functions created --- src/__tests__/services/sort.spec.ts | 75 +++++++++++++++++++++++++++++ src/services/filter.ts | 18 ------- src/services/sort.ts | 38 +++++++++++++++ 3 files changed, 113 insertions(+), 18 deletions(-) create mode 100644 src/__tests__/services/sort.spec.ts delete mode 100644 src/services/filter.ts create mode 100644 src/services/sort.ts diff --git a/src/__tests__/services/sort.spec.ts b/src/__tests__/services/sort.spec.ts new file mode 100644 index 0000000..7a0b468 --- /dev/null +++ b/src/__tests__/services/sort.spec.ts @@ -0,0 +1,75 @@ +import sort from '../../services/sort'; + +describe('Sort functions', () => { + const repositories = [ + { + full_name: 'filipemelo2002/STARS', + stargazers_count: 79, + forks: 45, + open_issues: 2, + created_at: '2021-04-12T21:37:12Z', + pushed_at: '2021-04-12T21:37:12Z', + license: { + name: 'MIT', + }, + }, + { + full_name: 'filipemelo2002/FORKS', + stargazers_count: 79, + forks: 759, + open_issues: 0, + created_at: '2021-04-12T21:37:12Z', + pushed_at: '2021-04-12T21:37:12Z', + license: { + name: 'MIT', + }, + }, + { + full_name: 'filipemelo2002/AGE', + stargazers_count: 759, + forks: 0, + open_issues: 0, + created_at: '2014-07-29T11:07:36Z', + pushed_at: '2021-04-12T21:37:12Z', + license: { + name: 'MIT', + }, + }, + { + full_name: 'filipemelo2002/COMMIT', + stargazers_count: 79, + forks: 0, + open_issues: 45, + created_at: '2021-04-12T21:37:12Z', + pushed_at: '2014-07-29T11:07:36Z', + license: { + name: 'MIT', + }, + }, + ]; + + it('should sort by stars', () => { + const response = sort.stars(repositories); + expect(response[0].full_name).toBe('filipemelo2002/AGE'); + }); + + it('should sort by forks', () => { + const response = sort.forks(repositories); + expect(response[0].full_name).toBe('filipemelo2002/FORKS'); + }); + + it('should sort by Open Issues', () => { + const response = sort.openIssues(repositories); + expect(response[1].full_name).toBe('filipemelo2002/STARS'); + }); + + it('should sort by age', () => { + const response = sort.age(repositories); + expect(response[0].full_name).toBe('filipemelo2002/AGE'); + }); + + it('should sort by last commit', () => { + const response = sort.lastCommit(repositories); + expect(response[0].full_name).toBe('filipemelo2002/COMMIT'); + }); +}); diff --git a/src/services/filter.ts b/src/services/filter.ts deleted file mode 100644 index 89140b2..0000000 --- a/src/services/filter.ts +++ /dev/null @@ -1,18 +0,0 @@ -const filterStars = () => {}; - -const filterForks = () => {}; - -const filterOpenIssues = () => {}; - -const filterAge = () => {}; - -const filterLastCommit = () => {}; - -const filters = { - stars: filterStars, - forks: filterForks, - openIssues: filterOpenIssues, - age: filterAge, - lastCommit: filterLastCommit, -}; -export default filters; diff --git a/src/services/sort.ts b/src/services/sort.ts new file mode 100644 index 0000000..4a832a7 --- /dev/null +++ b/src/services/sort.ts @@ -0,0 +1,38 @@ +const sortStars = (arr: IRepository[]): IRepository[] => { + return arr.sort( + (current, next) => next.stargazers_count - current.stargazers_count, + ); +}; + +const sortForks = (arr: IRepository[]): IRepository[] => { + return arr.sort((next, current) => current.forks - next.forks); +}; + +const sortOpenIssues = (arr: IRepository[]): IRepository[] => { + return arr.sort((next, current) => current.open_issues - next.open_issues); +}; + +const sortAge = (arr: IRepository[]): IRepository[] => { + return arr.sort((next, current) => { + const currentDate = new Date(current.created_at); + const nextDate = new Date(next.created_at); + return nextDate.getTime() - currentDate.getTime(); + }); +}; + +const sortLastCommit = (arr: IRepository[]): IRepository[] => { + return arr.sort((next, current) => { + const currentDate = new Date(current.pushed_at); + const nextDate = new Date(next.pushed_at); + return nextDate.getTime() - currentDate.getTime(); + }); +}; + +const sorts = { + stars: sortStars, + forks: sortForks, + openIssues: sortOpenIssues, + age: sortAge, + lastCommit: sortLastCommit, +}; +export default sorts; From 61e34b2cf7edca6f4dd654b788cd63f1508bf3bc Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 00:20:27 -0300 Subject: [PATCH 40/63] Added Filter Actions --- src/@types/repository.d.ts | 6 ++++ src/redux/action/repository.ts | 7 +++++ src/redux/reducer/repository.ts | 53 ++++++++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/@types/repository.d.ts b/src/@types/repository.d.ts index f83d40f..b0b8e42 100644 --- a/src/@types/repository.d.ts +++ b/src/@types/repository.d.ts @@ -15,3 +15,9 @@ interface IRepository { interface IRepositoryList { items: IRepository[]; } +type Sort = 'stars' | 'forks' | 'openIssues' | 'age' | 'lastCommit'; + +interface FilterActionSort { + type: string; + payload: Sort; +} diff --git a/src/redux/action/repository.ts b/src/redux/action/repository.ts index b70eea8..8c5c8e2 100644 --- a/src/redux/action/repository.ts +++ b/src/redux/action/repository.ts @@ -63,3 +63,10 @@ export const filterByStar = (shouldFilterByStar: boolean): FilterStarAction => { payload: shouldFilterByStar, }; }; + +export const sort = (sortBy: Sort): FilterActionSort => { + return { + type: `${TEMPLATE_NAME}_SORT`, + payload: sortBy, + }; +}; diff --git a/src/redux/reducer/repository.ts b/src/redux/reducer/repository.ts index 061e884..533f319 100644 --- a/src/redux/reducer/repository.ts +++ b/src/redux/reducer/repository.ts @@ -1,3 +1,4 @@ +import sort from '../../services/sort'; const TEMPLATE_NAME = 'REPOSITORY'; const initialState = (): IRepositoryState => ({ @@ -21,7 +22,22 @@ interface ActionListRepositoriesSuccess { payload: IRepository[]; } -type Action = ActionGetRepositorySuccess | ActionListRepositoriesSuccess; +interface SearchAction { + type: string; + payload: string; +} + +interface FilterStarAction { + type: string; + payload: boolean; +} + +type Action = + | ActionGetRepositorySuccess + | ActionListRepositoriesSuccess + | FilterActionSort + | FilterStarAction + | SearchAction; const reducer = (state = initialState(), action: Action): IRepositoryState => { switch (action.type) { case `${TEMPLATE_NAME}_PENDING`: { @@ -57,6 +73,41 @@ const reducer = (state = initialState(), action: Action): IRepositoryState => { error: false, }; } + case `${TEMPLATE_NAME}_SEARCH`: { + const term = action.payload as string; + + return { + ...state, + filter: { + ...state.filter, + name: term, + data: state.filter.data.filter(d => d.full_name.includes(term)), + }, + }; + } + case `${TEMPLATE_NAME}_FILTER_STARRED`: { + const starred = action.payload as boolean; + return { + ...state, + filter: { + ...state.filter, + data: state.filter.data.filter(d => d.starred === starred), + starred, + }, + }; + } + case `${TEMPLATE_NAME}_SORT`: { + const { payload } = action as FilterActionSort; + const sortFunc = sort[payload]; + const newData = sortFunc(state.filter.data); + return { + ...state, + filter: { + ...state.filter, + data: newData, + }, + }; + } case 'RESET': { return initialState(); } From 96712e3569be39159c0fb107eca0243748e5b052 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 00:47:15 -0300 Subject: [PATCH 41/63] Fixed Repository types --- src/@types/redux.d.ts | 1 + src/@types/repository.d.ts | 2 ++ src/components/Card/index.tsx | 10 +++------- src/components/CardRow/index.tsx | 12 ++++-------- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/@types/redux.d.ts b/src/@types/redux.d.ts index aab102e..4cbe6f8 100644 --- a/src/@types/redux.d.ts +++ b/src/@types/redux.d.ts @@ -6,6 +6,7 @@ interface IRepositoryState { name: string; data: IRepository[]; starred: boolean; + sortBy: Sort; }; } diff --git a/src/@types/repository.d.ts b/src/@types/repository.d.ts index b0b8e42..82bfd5f 100644 --- a/src/@types/repository.d.ts +++ b/src/@types/repository.d.ts @@ -2,6 +2,7 @@ interface ILicense { name: string; } interface IRepository { + id: string; full_name: string; stargazers_count: number; forks: number; @@ -10,6 +11,7 @@ interface IRepository { pushed_at: string; license: ILicense | null; starred?: boolean; + language: string; } interface IRepositoryList { diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index 4d46934..131cdea 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -15,8 +15,8 @@ interface Props { age: string; lastCommit: string; license: string; - techs: Array; starred: boolean; + language: string; } const Card: React.FC = ({ name, @@ -26,7 +26,7 @@ const Card: React.FC = ({ age, lastCommit, license, - techs, + language, starred, }) => { return ( @@ -83,11 +83,7 @@ const Card: React.FC = ({

  • - {techs.map((t, index) => ( - - {t} - - ))} + {language}
  • diff --git a/src/components/CardRow/index.tsx b/src/components/CardRow/index.tsx index df372b6..261efd6 100644 --- a/src/components/CardRow/index.tsx +++ b/src/components/CardRow/index.tsx @@ -15,8 +15,8 @@ interface Props { age: string; lastCommit: string; license: string; - techs: Array; starred: boolean; + language: string; } const Card: React.FC = ({ name, @@ -26,7 +26,7 @@ const Card: React.FC = ({ age, lastCommit, license, - techs, + language, starred, }) => { return ( @@ -35,7 +35,7 @@ const Card: React.FC = ({
    -

    liferay/liferay-portal

    +

    {name}

    -
    +
    {openDropdown && ( - console.log('SUBMITED FORM')}> +

    New repository

    - + setTerm(e.target.value)} + /> + {error &&

    This is an API-feedback-error

    }

    @@ -31,7 +56,7 @@ const NewRepositoryForm: React.FC = () => { Cancel
    diff --git a/src/components/RepositoryList/index.tsx b/src/components/RepositoryList/index.tsx index 3fdc0b9..8dc158f 100644 --- a/src/components/RepositoryList/index.tsx +++ b/src/components/RepositoryList/index.tsx @@ -1,65 +1,29 @@ import React from 'react'; +import { useSelector } from 'react-redux'; import { Container } from './styles'; import Card from '../Card'; + const RepositoryList: React.FC = () => { + const repository = useSelector( + (state: State) => state.repository.filter.data, + ); return ( - - - - - + {repository.map(repo => ( + + ))} ); }; diff --git a/src/redux/reducer/repository.ts b/src/redux/reducer/repository.ts index 533f319..d025b14 100644 --- a/src/redux/reducer/repository.ts +++ b/src/redux/reducer/repository.ts @@ -9,6 +9,7 @@ const initialState = (): IRepositoryState => ({ name: '', data: [], starred: false, + sortBy: 'stars', }, }); @@ -55,43 +56,84 @@ const reducer = (state = initialState(), action: Action): IRepositoryState => { }; } case `${TEMPLATE_NAME}_FULFILLED`: { + const data = [...state.data, ...(action.payload as IRepository[])]; + let newData = []; + if (state.filter.sortBy) { + const sortFunc = sort[state.filter.sortBy]; + newData = sortFunc(data); + } else { + newData = data; + } + return { ...state, - data: action.payload as IRepository[], + data: data, loading: false, + filter: { + ...state.filter, + data: newData, + }, error: false, }; } case `${TEMPLATE_NAME}_SUCCESS`: { const repository = action.payload as IRepository; - const newData = state.data; - newData.unshift(repository); + const data = [...state.data]; + data.unshift(repository); + let newData = []; + if (state.filter.sortBy) { + const sortFunc = sort[state.filter.sortBy]; + newData = sortFunc(data); + } else { + newData = data; + } + return { ...state, - data: newData, + data: data, loading: false, error: false, + filter: { + ...state.filter, + data: newData, + }, }; } case `${TEMPLATE_NAME}_SEARCH`: { const term = action.payload as string; - + const data = state.filter.data.filter(d => d.full_name.includes(term)); + let newData = []; + if (state.filter.sortBy) { + const sortFunc = sort[state.filter.sortBy]; + newData = sortFunc(data); + } else { + newData = data; + } return { ...state, filter: { ...state.filter, name: term, - data: state.filter.data.filter(d => d.full_name.includes(term)), + data: newData, }, }; } case `${TEMPLATE_NAME}_FILTER_STARRED`: { const starred = action.payload as boolean; + const data = state.filter.data.filter(d => d.starred === starred); + let newData = []; + if (state.filter.sortBy) { + const sortFunc = sort[state.filter.sortBy]; + newData = sortFunc(data); + } else { + newData = data; + } + return { ...state, filter: { ...state.filter, - data: state.filter.data.filter(d => d.starred === starred), + data: newData, starred, }, }; @@ -105,6 +147,7 @@ const reducer = (state = initialState(), action: Action): IRepositoryState => { filter: { ...state.filter, data: newData, + sortBy: payload, }, }; } diff --git a/yarn.lock b/yarn.lock index c6b4ac0..21a3e31 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1266,6 +1266,13 @@ dependencies: classnames "^2.2.6" +"@clayui/loading-indicator@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@clayui/loading-indicator/-/loading-indicator-3.2.0.tgz#7a5565c5543b345d9e57d8b94b72b7ba83c4667f" + integrity sha512-c0R4NEa+5gITbsAgf3IxP6O4TjMzaWCT7rv3N4EFWT23lbChRFE/XCq5utXbQIM1M6b+1lYX2qoqsn9o4+63SA== + dependencies: + classnames "^2.2.6" + "@clayui/management-toolbar@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@clayui/management-toolbar/-/management-toolbar-3.3.0.tgz#bedf513b56e5b5756e0287149c1cd90f8b8f3043" From 7c048a316e3a598513627e8101d114fa4229c94e Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 01:28:40 -0300 Subject: [PATCH 45/63] Added error feedback --- src/components/NewRepositoryForm/index.tsx | 10 +++++++++- src/styles/globalStyles.ts | 9 +++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/components/NewRepositoryForm/index.tsx b/src/components/NewRepositoryForm/index.tsx index ab73bdc..92de6cf 100644 --- a/src/components/NewRepositoryForm/index.tsx +++ b/src/components/NewRepositoryForm/index.tsx @@ -6,6 +6,7 @@ import { FiPlus } from 'react-icons/fi'; import { useDispatch, useSelector } from 'react-redux'; import ClayLoadingIndicator from '@clayui/loading-indicator'; import * as Actions from '../../redux/action/repository'; +import { AiFillInfoCircle } from 'react-icons/ai'; const NewRepositoryForm: React.FC = () => { const dispatch = useDispatch(); @@ -20,9 +21,11 @@ const NewRepositoryForm: React.FC = () => { } if (term.split('/').length > 1) { dispatch(Actions.getRepository(term)); + setTerm(''); return true; } dispatch(Actions.getAllUserRepositories(term)); + setTerm(''); return true; }; return ( @@ -44,7 +47,12 @@ const NewRepositoryForm: React.FC = () => { value={term} onChange={e => setTerm(e.target.value)} /> - {error &&

    This is an API-feedback-error

    } + {error && ( +

    + + This is an API-feedback-error +

    + )}
    diff --git a/src/styles/globalStyles.ts b/src/styles/globalStyles.ts index 550f48a..f803089 100644 --- a/src/styles/globalStyles.ts +++ b/src/styles/globalStyles.ts @@ -35,6 +35,15 @@ export default createGlobalStyle` monospace; } + #errorLabel { + color: #DA1414; + font-weight: 600; + margin-top: 7px; + span { + margin-left: 7px; + } + } + ::-webkit-scrollbar { width: 4px; } From bcdf67ff46297f5c297a686137511f56c9aec433 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 09:57:48 -0300 Subject: [PATCH 46/63] Star filter integrated --- src/components/StarFilter/index.tsx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/components/StarFilter/index.tsx b/src/components/StarFilter/index.tsx index c474644..abe2a92 100644 --- a/src/components/StarFilter/index.tsx +++ b/src/components/StarFilter/index.tsx @@ -1,13 +1,19 @@ -import React, { useState } from 'react'; +import React from 'react'; import { Button } from '../commons/GlobalComponents'; import { MdStar, MdStarBorder } from 'react-icons/md'; +import { useSelector, useDispatch } from 'react-redux'; +import * as Actions from '../../redux/action/repository'; const StarFilter: React.FC = () => { - const [active, setActive] = useState(false); + const dispatch = useDispatch(); + const filter = useSelector((state: State) => state.repository.filter); return ( - ); }; From 42224f49d33eb31f0bf8b13bb4d5bd880450bc14 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 10:43:59 -0300 Subject: [PATCH 47/63] added an empty sort initial state --- src/@types/repository.d.ts | 2 +- src/redux/reducer/repository.ts | 78 +++++++++++++++++---------------- src/services/sort.ts | 2 + 3 files changed, 43 insertions(+), 39 deletions(-) diff --git a/src/@types/repository.d.ts b/src/@types/repository.d.ts index 82bfd5f..4aaa858 100644 --- a/src/@types/repository.d.ts +++ b/src/@types/repository.d.ts @@ -17,7 +17,7 @@ interface IRepository { interface IRepositoryList { items: IRepository[]; } -type Sort = 'stars' | 'forks' | 'openIssues' | 'age' | 'lastCommit'; +type Sort = 'stars' | 'forks' | 'openIssues' | 'age' | 'lastCommit' | ''; interface FilterActionSort { type: string; diff --git a/src/redux/reducer/repository.ts b/src/redux/reducer/repository.ts index d025b14..4d90d2d 100644 --- a/src/redux/reducer/repository.ts +++ b/src/redux/reducer/repository.ts @@ -9,7 +9,7 @@ const initialState = (): IRepositoryState => ({ name: '', data: [], starred: false, - sortBy: 'stars', + sortBy: '', }, }); @@ -39,6 +39,15 @@ type Action = | FilterActionSort | FilterStarAction | SearchAction; + +const applyFilter = (arr: IRepository[], filter: Sort) => { + if (filter) { + const sortFunc = sort[filter]; + const filteredArray = sortFunc(arr); + return filteredArray; + } + return arr; +}; const reducer = (state = initialState(), action: Action): IRepositoryState => { switch (action.type) { case `${TEMPLATE_NAME}_PENDING`: { @@ -56,22 +65,14 @@ const reducer = (state = initialState(), action: Action): IRepositoryState => { }; } case `${TEMPLATE_NAME}_FULFILLED`: { - const data = [...state.data, ...(action.payload as IRepository[])]; - let newData = []; - if (state.filter.sortBy) { - const sortFunc = sort[state.filter.sortBy]; - newData = sortFunc(data); - } else { - newData = data; - } - + const data = [...(action.payload as IRepository[]), ...state.data]; return { ...state, data: data, loading: false, filter: { ...state.filter, - data: newData, + data: data, }, error: false, }; @@ -80,14 +81,8 @@ const reducer = (state = initialState(), action: Action): IRepositoryState => { const repository = action.payload as IRepository; const data = [...state.data]; data.unshift(repository); - let newData = []; - if (state.filter.sortBy) { - const sortFunc = sort[state.filter.sortBy]; - newData = sortFunc(data); - } else { - newData = data; - } - + const newData = [...state.filter.data]; + newData.unshift(repository); return { ...state, data: data, @@ -102,13 +97,7 @@ const reducer = (state = initialState(), action: Action): IRepositoryState => { case `${TEMPLATE_NAME}_SEARCH`: { const term = action.payload as string; const data = state.filter.data.filter(d => d.full_name.includes(term)); - let newData = []; - if (state.filter.sortBy) { - const sortFunc = sort[state.filter.sortBy]; - newData = sortFunc(data); - } else { - newData = data; - } + const newData = applyFilter(data, state.filter.sortBy); return { ...state, filter: { @@ -120,34 +109,47 @@ const reducer = (state = initialState(), action: Action): IRepositoryState => { } case `${TEMPLATE_NAME}_FILTER_STARRED`: { const starred = action.payload as boolean; - const data = state.filter.data.filter(d => d.starred === starred); - let newData = []; - if (state.filter.sortBy) { - const sortFunc = sort[state.filter.sortBy]; - newData = sortFunc(data); - } else { - newData = data; - } + const data = state.data.filter(d => d.starred === starred); + const newData = applyFilter(data, state.filter.sortBy); return { ...state, filter: { ...state.filter, - data: newData, + data: starred ? newData : state.data, starred, }, }; } case `${TEMPLATE_NAME}_SORT`: { - const { payload } = action as FilterActionSort; - const sortFunc = sort[payload]; + const orderBy = action.payload as Sort; + const sortFunc = sort[orderBy]; const newData = sortFunc(state.filter.data); return { ...state, filter: { ...state.filter, data: newData, - sortBy: payload, + sortBy: orderBy, + }, + }; + } + case `${TEMPLATE_NAME}_TOGGLE_FAVORITE_REPOSITORY`: { + const id = action.payload as string; + const [newFavouriteRepository] = state.data.filter( + repo => repo.id === id, + ); + newFavouriteRepository.starred = !newFavouriteRepository.starred; + const newData = state.data.map(repo => + repo.id === id ? newFavouriteRepository : repo, + ); + const newFilterData = applyFilter(newData, state.filter.sortBy); + return { + ...state, + data: newData, + filter: { + ...state.filter, + data: newFilterData, }, }; } diff --git a/src/services/sort.ts b/src/services/sort.ts index 4a832a7..33de8ee 100644 --- a/src/services/sort.ts +++ b/src/services/sort.ts @@ -28,11 +28,13 @@ const sortLastCommit = (arr: IRepository[]): IRepository[] => { }); }; +const empySort = (arr: IRepository[]): IRepository[] => arr; const sorts = { stars: sortStars, forks: sortForks, openIssues: sortOpenIssues, age: sortAge, lastCommit: sortLastCommit, + '': empySort, }; export default sorts; From 14aeba499c039acc181fda42e4c420219d4ae318 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 10:45:00 -0300 Subject: [PATCH 48/63] Added Filter by Favourite Action --- src/components/Card/index.tsx | 11 +++++++++-- src/redux/action/repository.ts | 7 +++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index f121483..0dd6517 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -6,8 +6,10 @@ import { MdStarBorder, MdStar } from 'react-icons/md'; import logo from '../../assets/logo.png'; import ClayLabel from '@clayui/label'; import DeleteModal from '../DeleteModal'; - +import { useDispatch } from 'react-redux'; +import * as Actions from '../../redux/action/repository'; interface Props { + id: string; name: string; stars: number; forks: number; @@ -19,6 +21,7 @@ interface Props { language: string; } const Card: React.FC = ({ + id, name, stars, forks, @@ -29,6 +32,7 @@ const Card: React.FC = ({ language, starred, }) => { + const dispatch = useDispatch(); return (
    @@ -38,7 +42,10 @@ const Card: React.FC = ({

    {name}

    -
    diff --git a/src/components/CardRow/styles.ts b/src/components/CardRow/styles.ts index 99cf8f9..0385113 100644 --- a/src/components/CardRow/styles.ts +++ b/src/components/CardRow/styles.ts @@ -14,6 +14,8 @@ export const CardHeader = styled.div` section { display: flex; align-items: center; + flex-wrap: wrap; + max-width: 90%; } #btn-section { margin-left: auto; @@ -34,14 +36,16 @@ export const CardHeader = styled.div` `; export const CardBody = styled.div` - padding: 12px 16px; + padding: 12px 30px; display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; ul { display: flex; flex-wrap: wrap; - max-width: 778px; + max-width: 90%; li { - margin-left: 30px; p { font-weight: 500; color: var(--secondary); @@ -50,5 +54,8 @@ export const CardBody = styled.div` } } } + li + li { + margin-left: 30px; + } } `; From 83e5b04ee22214cf25c35c914e23b25fdea0ba35 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 16:26:58 -0300 Subject: [PATCH 56/63] [Hotfix] Fixed id Type --- src/@types/repository.d.ts | 2 +- src/components/Card/index.tsx | 4 ++-- src/components/CardRow/index.tsx | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/@types/repository.d.ts b/src/@types/repository.d.ts index 4534dda..720eaf1 100644 --- a/src/@types/repository.d.ts +++ b/src/@types/repository.d.ts @@ -2,7 +2,7 @@ interface ILicense { name: string; } interface IRepository { - id: string; + id: number; full_name: string; stargazers_count: number; forks: number; diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index a96f469..16a9d13 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -9,7 +9,7 @@ import DeleteModal from '../DeleteModal'; import { useDispatch } from 'react-redux'; import * as Actions from '../../redux/action/repository'; interface Props { - id: string; + id: number; name: string; stars: number; forks: number; @@ -55,7 +55,7 @@ const Card: React.FC = ({ )} - +
    diff --git a/src/components/CardRow/index.tsx b/src/components/CardRow/index.tsx index 3903976..4a0fcfa 100644 --- a/src/components/CardRow/index.tsx +++ b/src/components/CardRow/index.tsx @@ -10,7 +10,7 @@ import { useDispatch } from 'react-redux'; import * as Actions from '../../redux/action/repository'; interface Props { - id: string; + id: number; name: string; stars: number; forks: number; @@ -56,7 +56,7 @@ const Card: React.FC = ({ )} - + From 376dcaf4db2e26948335b302951304cdb34e497d Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 16:27:56 -0300 Subject: [PATCH 57/63] Added Remove repository actions --- src/components/DeleteModal/index.tsx | 9 ++++++++- src/redux/action/repository.ts | 15 ++++++++++++++- src/redux/reducer/repository.ts | 24 +++++++++++++++++++++--- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/components/DeleteModal/index.tsx b/src/components/DeleteModal/index.tsx index 0bb6f9b..9309588 100644 --- a/src/components/DeleteModal/index.tsx +++ b/src/components/DeleteModal/index.tsx @@ -4,8 +4,14 @@ import { Button } from './styles'; import { FiTrash2, FiAlertTriangle } from 'react-icons/fi'; import ClayModal, { useModal } from '@clayui/modal'; import ClayButton from '@clayui/button'; +import { useDispatch } from 'react-redux'; +import * as Actions from '../../redux/action/repository'; +interface Props { + id: number; +} +const DeleteModal: React.FC = ({ id }) => { + const dispatch = useDispatch(); -const DeleteModal: React.FC = () => { const [visible, setVisible] = useState(false); const { observer, onClose } = useModal({ onClose: () => setVisible(false), @@ -33,6 +39,7 @@ const DeleteModal: React.FC = () => { { + dispatch(Actions.deleteRepository(id)); onClose(); }} > diff --git a/src/redux/action/repository.ts b/src/redux/action/repository.ts index c604728..4d049a9 100644 --- a/src/redux/action/repository.ts +++ b/src/redux/action/repository.ts @@ -71,7 +71,20 @@ export const sort = (sortBy: Sort): FilterActionSort => { }; }; -export const toggleFavortiteRepository = (id: string): SearchAction => { +interface DeleteAction { + type: string; + payload: number; +} + +type ToggleStarAction = DeleteAction; +export const deleteRepository = (id: number): DeleteAction => { + return { + type: `${TEMPLATE_NAME}_REMOVE_REPOSITORY`, + payload: id, + }; +}; + +export const toggleFavortiteRepository = (id: number): ToggleStarAction => { return { type: `${TEMPLATE_NAME}_TOGGLE_FAVORITE_REPOSITORY`, payload: id, diff --git a/src/redux/reducer/repository.ts b/src/redux/reducer/repository.ts index 3086892..9ad2681 100644 --- a/src/redux/reducer/repository.ts +++ b/src/redux/reducer/repository.ts @@ -28,7 +28,10 @@ interface SearchAction { type: string; payload: string; } - +interface DeleteAction { + type: string; + payload: number; +} interface FilterStarAction { type: string; payload: boolean; @@ -39,7 +42,8 @@ type Action = | ActionListRepositoriesSuccess | FilterActionSort | FilterStarAction - | SearchAction; + | SearchAction + | DeleteAction; const applyFilter = (arr: IRepository[], filter: Sort) => { if (filter) { @@ -136,7 +140,7 @@ const reducer = (state = initialState(), action: Action): IRepositoryState => { }; } case `${TEMPLATE_NAME}_TOGGLE_FAVORITE_REPOSITORY`: { - const id = action.payload as string; + const id = action.payload as number; const [newFavouriteRepository] = state.data.filter( repo => repo.id === id, ); @@ -154,6 +158,20 @@ const reducer = (state = initialState(), action: Action): IRepositoryState => { }, }; } + case `${TEMPLATE_NAME}_REMOVE_REPOSITORY`: { + const newData = state.data.filter( + repository => repository.id !== (action.payload as number), + ); + const newFilterData = applyFilter(newData, state.filter.sortBy); + return { + ...state, + data: newData, + filter: { + ...state.filter, + data: newFilterData, + }, + }; + } case `${TEMPLATE_NAME}_CHANGE_LIST_TYPE`: { return { ...state, From e0898b0f14446dbfc06ced263377f1c7546eacb4 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 18:02:07 -0300 Subject: [PATCH 58/63] Added Search Filter --- package.json | 2 ++ src/components/CardRow/index.tsx | 8 +++++--- src/components/SearchBar/index.tsx | 23 +++++++++++++++++++++-- src/redux/reducer/repository.ts | 15 +++++++++++++-- src/services/debounce.ts | 15 +++++++++++++++ yarn.lock | 17 +++++++++++++++++ 6 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 src/services/debounce.ts diff --git a/package.json b/package.json index 53b4823..b620214 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@clayui/management-toolbar": "^3.3.0", "@clayui/modal": "^3.8.5", "axios": "^0.21.1", + "lodash.debounce": "^4.0.8", "react": "^17.0.2", "react-dom": "^17.0.2", "react-icons": "^4.2.0", @@ -53,6 +54,7 @@ "@testing-library/react": "^11.2.6", "@testing-library/user-event": "^12.1.10", "@types/jest": "^26.0.22", + "@types/lodash.debounce": "^4.0.6", "@types/mocha": "^8.2.2", "@types/node": "^14.14.37", "@types/react": "^17.0.0", diff --git a/src/components/CardRow/index.tsx b/src/components/CardRow/index.tsx index 4a0fcfa..934131f 100644 --- a/src/components/CardRow/index.tsx +++ b/src/components/CardRow/index.tsx @@ -94,9 +94,11 @@ const Card: React.FC = ({

    - - {language} - + {language && ( + + {language} + + )}
    diff --git a/src/components/SearchBar/index.tsx b/src/components/SearchBar/index.tsx index 6ee4640..96d4743 100644 --- a/src/components/SearchBar/index.tsx +++ b/src/components/SearchBar/index.tsx @@ -1,11 +1,28 @@ -import React from 'react'; +import React, { useState, useCallback } from 'react'; import { Container, Button } from './style'; import { ClayInput } from '@clayui/form'; import ClayManagementToolbar from '@clayui/management-toolbar'; import { FiSearch } from 'react-icons/fi'; +import debounce from 'lodash.debounce'; +import * as Actions from '../../redux/action/repository'; +import { useDispatch } from 'react-redux'; const SearchBar: React.FC = () => { + const dispatch = useDispatch(); + const [term, setTerm] = useState(''); + + const debounceSearch = useCallback( + debounce(value => { + dispatch(Actions.search(value)); + }, 200), + [], + ); + + function onChangeTerm(value: string) { + setTerm(value); + debounceSearch(value); + } return ( @@ -18,9 +35,11 @@ const SearchBar: React.FC = () => { className="form-control input-group-inset input-group-inset-after" type="text" placeholder="Search" + onChange={e => onChangeTerm(e.target.value)} + value={term} /> - diff --git a/src/redux/reducer/repository.ts b/src/redux/reducer/repository.ts index 9ad2681..f812f44 100644 --- a/src/redux/reducer/repository.ts +++ b/src/redux/reducer/repository.ts @@ -53,6 +53,18 @@ const applyFilter = (arr: IRepository[], filter: Sort) => { } return arr; }; + +const applySearch = (term: string, state: IRepositoryState) => { + const data = applyFilter(state.data, state.filter.sortBy); + if (term) { + const searchedTerm = data.filter(repository => + repository.full_name.includes(term), + ); + return searchedTerm; + } + return data; +}; + const reducer = (state = initialState(), action: Action): IRepositoryState => { switch (action.type) { case `${TEMPLATE_NAME}_PENDING`: { @@ -101,8 +113,7 @@ const reducer = (state = initialState(), action: Action): IRepositoryState => { } case `${TEMPLATE_NAME}_SEARCH`: { const term = action.payload as string; - const data = state.filter.data.filter(d => d.full_name.includes(term)); - const newData = applyFilter(data, state.filter.sortBy); + const newData = applySearch(term, state); return { ...state, filter: { diff --git a/src/services/debounce.ts b/src/services/debounce.ts new file mode 100644 index 0000000..fd21cbb --- /dev/null +++ b/src/services/debounce.ts @@ -0,0 +1,15 @@ +const debounce = any>( + func: F, + waitFor: number, +) => { + let timeout: NodeJS.Timeout; + + const debounced = (...args: any) => { + clearTimeout(timeout); + timeout = setTimeout(() => func(...args), waitFor); + }; + + return debounced as (...args: Parameters) => ReturnType; +}; + +export default debounce; diff --git a/yarn.lock b/yarn.lock index 21a3e31..fd8b463 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1960,6 +1960,18 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/lodash.debounce@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.6.tgz#c5a2326cd3efc46566c47e4c0aa248dc0ee57d60" + integrity sha512-4WTmnnhCfDvvuLMaF3KV4Qfki93KebocUF45msxhYyjMttZDQYzHkO639ohhk8+oco2cluAFL3t5+Jn4mleylQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.168" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" + integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -7441,6 +7453,11 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" From 7b620b88b5397a62af6c388c56c4a0227ff07a26 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 18:22:35 -0300 Subject: [PATCH 59/63] Created Empty list component --- src/assets/emptyList.svg | 9 +++++++++ src/components/EmptyList/index.tsx | 16 ++++++++++++++++ src/components/EmptyList/styles.ts | 21 +++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 src/assets/emptyList.svg create mode 100644 src/components/EmptyList/index.tsx create mode 100644 src/components/EmptyList/styles.ts diff --git a/src/assets/emptyList.svg b/src/assets/emptyList.svg new file mode 100644 index 0000000..eae0bb6 --- /dev/null +++ b/src/assets/emptyList.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/components/EmptyList/index.tsx b/src/components/EmptyList/index.tsx new file mode 100644 index 0000000..97d6f6f --- /dev/null +++ b/src/components/EmptyList/index.tsx @@ -0,0 +1,16 @@ +import React from 'react'; + +import { Container } from './styles'; +import emptyImg from '../../assets/emptyList.svg'; + +const EmptyList: React.FC = () => { + return ( + + +

    There is still nothing here

    +

    Add some repositories by clicking add new repository

    +
    + ); +}; + +export default EmptyList; diff --git a/src/components/EmptyList/styles.ts b/src/components/EmptyList/styles.ts new file mode 100644 index 0000000..e8b4768 --- /dev/null +++ b/src/components/EmptyList/styles.ts @@ -0,0 +1,21 @@ +import styled from 'styled-components'; + +export const Container = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + h4 { + margin-top: 40px; + font-size: 20px; + color: var(--dark); + } + p { + font-size: 16px; + line-height: 30px; + color: var(--secondary); + max-width: 340px; + text-align: center; + } +`; From ebfb11c4786924a90a17190eaedacd46a17b4705 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 18:22:47 -0300 Subject: [PATCH 60/63] Calling Empty list when there's nothing to show --- src/components/RepositoryList/index.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/RepositoryList/index.tsx b/src/components/RepositoryList/index.tsx index bfd5aa4..9643c23 100644 --- a/src/components/RepositoryList/index.tsx +++ b/src/components/RepositoryList/index.tsx @@ -4,6 +4,7 @@ import { useSelector } from 'react-redux'; import { Container } from './styles'; import Card from '../Card'; import CardRow from '../CardRow'; +import EmptyList from '../EmptyList'; const RepositoryList: React.FC = () => { const listType = useSelector((state: State) => state.repository.listType); const repository = useSelector( @@ -53,6 +54,11 @@ const RepositoryList: React.FC = () => {
    ); }; + + if (repository.length === 0) { + return ; + } + return listType === 'grid' ? renderGridList() : renderRowList(); }; From d6728d9e57bdbee6bc2135b026ed229bcfdce794 Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 20:50:29 -0300 Subject: [PATCH 61/63] Added "Time ago" library --- package.json | 5 ++++- src/components/Card/index.tsx | 6 ++++-- src/components/CardRow/index.tsx | 6 ++++-- yarn.lock | 15 +++++++++++++++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b620214..ab5bce5 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,10 @@ "@clayui/loading-indicator": "^3.2.0", "@clayui/management-toolbar": "^3.3.0", "@clayui/modal": "^3.8.5", + "add": "^2.0.6", "axios": "^0.21.1", "lodash.debounce": "^4.0.8", + "moment": "^2.29.1", "react": "^17.0.2", "react-dom": "^17.0.2", "react-icons": "^4.2.0", @@ -23,7 +25,8 @@ "redux-thunk": "^2.3.0", "styled-components": "^5.2.3", "typescript": "^4.1.2", - "web-vitals": "^1.0.1" + "web-vitals": "^1.0.1", + "yarn": "^1.22.10" }, "scripts": { "start": "react-scripts start", diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index 16a9d13..3142779 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -1,5 +1,6 @@ import React from 'react'; +import moment from 'moment'; import { CardHeader, CardBody } from './styles'; import ClayCard from '@clayui/card'; import { MdStarBorder, MdStar } from 'react-icons/md'; @@ -79,12 +80,13 @@ const Card: React.FC = ({
  • - Age {age} + Age {moment(new Date(age)).fromNow()}

  • - Last commit {lastCommit} + Last commit + {moment(new Date(lastCommit)).fromNow()}

  • diff --git a/src/components/CardRow/index.tsx b/src/components/CardRow/index.tsx index 934131f..648e4d2 100644 --- a/src/components/CardRow/index.tsx +++ b/src/components/CardRow/index.tsx @@ -1,5 +1,6 @@ import React from 'react'; +import moment from 'moment'; import { CardHeader, CardBody } from './styles'; import ClayCard from '@clayui/card'; import { MdStarBorder, MdStar } from 'react-icons/md'; @@ -80,12 +81,13 @@ const Card: React.FC = ({
  • - Age {age} + Age {moment(new Date(age)).fromNow()}

  • - Last commit {lastCommit} + Last commit + {moment(new Date(lastCommit)).fromNow()}

  • diff --git a/yarn.lock b/yarn.lock index fd8b463..c048f29 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2513,6 +2513,11 @@ acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +add@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/add/-/add-2.0.6.tgz#248f0a9f6e5a528ef2295dbeec30532130ae2235" + integrity sha1-JI8Kn25aUo7yKV2+7DBTITCuIjU= + address@1.1.2, address@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" @@ -7818,6 +7823,11 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +moment@^2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -12128,6 +12138,11 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yarn@^1.22.10: + version "1.22.10" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.10.tgz#c99daa06257c80f8fa2c3f1490724e394c26b18c" + integrity sha512-IanQGI9RRPAN87VGTF7zs2uxkSyQSrSPsju0COgbsKQOOXr5LtcVPeyXWgwVa0ywG3d8dg6kSYKGBuYK021qeA== + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" From 79e97dd85d1c59440457290410b620b5cd2c5ace Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 20:57:18 -0300 Subject: [PATCH 62/63] [Hotfix] Fixed Filters problem --- src/redux/reducer/repository.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/redux/reducer/repository.ts b/src/redux/reducer/repository.ts index f812f44..f8cfe7e 100644 --- a/src/redux/reducer/repository.ts +++ b/src/redux/reducer/repository.ts @@ -152,20 +152,19 @@ const reducer = (state = initialState(), action: Action): IRepositoryState => { } case `${TEMPLATE_NAME}_TOGGLE_FAVORITE_REPOSITORY`: { const id = action.payload as number; - const [newFavouriteRepository] = state.data.filter( + const [newFavouriteRepository] = state.filter.data.filter( repo => repo.id === id, ); newFavouriteRepository.starred = !newFavouriteRepository.starred; - const newData = state.data.map(repo => + const newData = state.filter.data.map(repo => repo.id === id ? newFavouriteRepository : repo, ); - const newFilterData = applyFilter(newData, state.filter.sortBy); + return { ...state, - data: newData, filter: { ...state.filter, - data: newFilterData, + data: newData, }, }; } From cf355cbaf626cebe25025c5978fbf99df40cd44d Mon Sep 17 00:00:00 2001 From: Filipe Melo Date: Tue, 13 Apr 2021 23:07:41 -0300 Subject: [PATCH 63/63] Documentation finished --- README.md | 96 ++++++++++++++++++++++++------- public/favicon.ico | Bin 3870 -> 3636 bytes public/index.html | 26 +-------- public/logo192.png | Bin 5347 -> 3087 bytes public/logo512.png | Bin 9664 -> 3087 bytes public/manifest.json | 25 -------- public/robots.txt | 3 - src/components/CardRow/styles.ts | 3 +- 8 files changed, 79 insertions(+), 74 deletions(-) delete mode 100644 public/manifest.json delete mode 100644 public/robots.txt diff --git a/README.md b/README.md index b58e0af..feb6876 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,31 @@ -# Getting Started with Create React App -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). +# [🐙Github Compare](https://github.com/filipemelo2002/github-compare) +Github Compare is a web application that allows users to show comparisons of repositories selected by them on Github. -## Available Scripts +This App uses github [**GitHub API V3**](https://docs.github.com/en/rest) -In the project directory, you can run: +## 📦 Packages +### Configuration +* [ESlint](https://eslint.org/) +* [Prettier](https://prettier.io/) +* [Typescript](https://www.typescriptlang.org/) +### CSS +* [ClayUI](https://clayui.com/) +* [styled-components](https://styled-components.com/) +## Tests +* [Jest](https://jestjs.io/) +* [Testing Library](https://testing-library.com/) -### `yarn start` +## ⚙️Getting started + + +Clone this project and install the dependencies: +```bash +git clone https://github.com/filipemelo2002/github-compare.git +cd github-compare +npm install # or yarn install +``` +### `npm run start` Runs the app in the development mode.\ Open [http://localhost:3000](http://localhost:3000) to view it in the browser. @@ -29,18 +48,55 @@ Your app is ready to be deployed! See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. -### `yarn eject` - -**Note: this is a one-way operation. Once you `eject`, you can’t go back!** - -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. - -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. - -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. - -## Learn More - -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). +## 📸Screenshots +![Screenshot github-compare](https://i.imgur.com/N8J3cdz.png) + +![Screenshot github-compare](https://i.imgur.com/RKhMNqE.png) + +![Screenshot github-compare](https://i.imgur.com/xE6loky.png) + +![Screenshot github-compare](https://i.imgur.com/gBXkS8p.png) + +![Screenshot github-compare](https://i.imgur.com/Q3AjysV.png) + +## 🧑‍🏭Architecture +Below, you can see how the files are organized: +```bash +github-compare/ +┣ public/ +┃ ┣ favicon.ico +┃ ┣ index.html +┃ ┣ logo192.png +┃ ┗ logo512.png +┣ src/ +┃ ┣ @types/ +┃ ┣ __tests__/ +┃ ┣ api/ +┃ ┣ assets/ +┃ ┣ components/ +┃ ┣ pages/ +┃ ┣ redux/ +┃ ┣ services/ +┃ ┣ styles/ +┃ ┣ App.tsx +┃ ┣ index.tsx +┃ ┗ react-app-env.d.ts +┣ .eslintrc.json +┣ .gitignore +┣ .prettierrc +┣ README.md +┣ package.json +┣ tsconfig.json +┗ yarn.lock +``` +### Components +Are inside components folder and each of them work individually. + +### Pages +currently, there's only one page, Home, which is responsible for rendering all components. + +### Tests +Are declared inside *\_\_tests\_\_* folder. + +## 📃 License +The MIT License (MIT) \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico index a11777cc471a4344702741ab1c8a588998b1311a..d4d51ffa31392d73c7db2c45f30a8d7780455ac0 100644 GIT binary patch literal 3636 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/public/index.html b/public/index.html index aa069f2..711f256 100644 --- a/public/index.html +++ b/public/index.html @@ -10,34 +10,10 @@ content="Web site created using create-react-app" /> - - - - React App + Github Compare
    - diff --git a/public/logo192.png b/public/logo192.png index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..bb17c8b5caea2a468c9fec8c6363e0c194e71675 100644 GIT binary patch literal 3087 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 X@eDJUQo;Ye2mwlRs+GT2st^IHQ=&G-}`>XEv z_3QV(tmDT#*R9>S765>C-d^rs0RSlPN0hatHZ@Iai)a5qC zSQIzuPwF3HozocduxAHKx|ocDpn?pLx`x_+ftRA37=r~?7tA2RwnkWqgJSOJ)HJbS z7+l7}@ysx80Ku-R`C`fxKIK6Bz-mfdzlj#WOXZT>O272@)W)!XDayZ4@b$_-Y>(NMY} zY$3WGDV;kiF!bX?AEr|nj~q$rz9b#f+ag&3Px)o+6)|dKVOL5-hVOZ{s=J1P9DzoK zVN2zOEH#D(fp#jQhg8Eo2XFE<(@2%LVP4w-r6;K#UDNTpnL->|yYTi$inayf8VR17 zkvvMo&|--aX7)@*K~Qal%ADL zSZ>{iLD5_87Y>T(aK#vf;`(PEwv;P7pd6Nvm0@0B+dZzO#KrGfb(0Sk`IwqI35R>u zT;ChD!6(~SY~JFsV6%EGD`)0qowf?hW^YQ(Cd@1vpor&btP?;_p z{*vb7Q(Z3!PPsj7o)D~0~|RC+#83qs|~?#0M|tM?a5dR@Y@2CGfs`qDeDt^M+xVky#j z<;tyI=6id0J5s_R_BLlkKUOWpf{zICnmS^hRy3U=PTxUCPC|&#YC_p)*Js zA#!qQ&o)p|$@qiQXhNOoMBmtQ%UsxEU!UMK8dq-08!i1MyCT*(ECyaedsK~l{$0{% z{)tx<<=K~hOsYBER3FCGf4q3@dSi&0sQK&7yR0NZ8vY3AWEW+2XMYc`U(VeN zGlDV$PZ|4Bxtv3xAu?IJP${baE>~HVqgu)#m}eeFZJ(Hw?hb7@AWPZHh{Fke&k858 zLZyQhxFswo#nxq8q$@F!*IsF{5>NgYS1BrNyVMv>8%_8H(RxskMu((NS#{>cG$+hI z-^O-NV>cZ;Yl$OvVx~%Agm=D}UoUFw+>WeoRz&RYtZY-=;J=uwtmM=;PaoM2A1jo{ zecpvY3qXF-8DRj127h>AZD2;j-{+Ic z(0JR{8xnLjKPH~bVO5*BDTf8!N^z0SnoRyqE06L|)L#(&O8w8j7Mh)A^W}e#8qKqe z)C8qmQX9zj*#AFhZ{TrOV{Jj$1#8(0o~~}$lOimfazIvAUrt%Ma2_-fW{Ig23C zmBpi)*^r8f(E-w662$ZoXVN#MPy6rC)psRPR|IUx2iim#G?E%!{L7=@?r0ZLNptNE3@dbd`EQW0e`I@OZuySh(9v_rMp&}0DxNU Yp22QOKYMLf)93@?y0|+_a0zY+Zo%Dkae}+MySoIppb75o?vUW_?)>@g{U2`ERQIXV zeY$JrWnMZ$QC<=ii4X|@0H8`si75jB(ElJb00HAB%>SlLR{!zO|C9P3zxw_U8?1d8uRZ=({Ga4shyN}3 zAK}WA(ds|``G4jA)9}Bt2Hy0+f3rV1E6b|@?hpGA=PI&r8)ah|)I2s(P5Ic*Ndhn^ z*T&j@gbCTv7+8rpYbR^Ty}1AY)YH;p!m948r#%7x^Z@_-w{pDl|1S4`EM3n_PaXvK z1JF)E3qy$qTj5Xs{jU9k=y%SQ0>8E$;x?p9ayU0bZZeo{5Z@&FKX>}s!0+^>C^D#z z>xsCPvxD3Z=dP}TTOSJhNTPyVt14VCQ9MQFN`rn!c&_p?&4<5_PGm4a;WS&1(!qKE z_H$;dDdiPQ!F_gsN`2>`X}$I=B;={R8%L~`>RyKcS$72ai$!2>d(YkciA^J0@X%G4 z4cu!%Ps~2JuJ8ex`&;Fa0NQOq_nDZ&X;^A=oc1&f#3P1(!5il>6?uK4QpEG8z0Rhu zvBJ+A9RV?z%v?!$=(vcH?*;vRs*+PPbOQ3cdPr5=tOcLqmfx@#hOqX0iN)wTTO21jH<>jpmwRIAGw7`a|sl?9y9zRBh>(_%| zF?h|P7}~RKj?HR+q|4U`CjRmV-$mLW>MScKnNXiv{vD3&2@*u)-6P@h0A`eeZ7}71 zK(w%@R<4lLt`O7fs1E)$5iGb~fPfJ?WxhY7c3Q>T-w#wT&zW522pH-B%r5v#5y^CF zcC30Se|`D2mY$hAlIULL%-PNXgbbpRHgn<&X3N9W!@BUk@9g*P5mz-YnZBb*-$zMM z7Qq}ic0mR8n{^L|=+diODdV}Q!gwr?y+2m=3HWwMq4z)DqYVg0J~^}-%7rMR@S1;9 z7GFj6K}i32X;3*$SmzB&HW{PJ55kT+EI#SsZf}bD7nW^Haf}_gXciYKX{QBxIPSx2Ma? zHQqgzZq!_{&zg{yxqv3xq8YV+`S}F6A>Gtl39_m;K4dA{pP$BW0oIXJ>jEQ!2V3A2 zdpoTxG&V=(?^q?ZTj2ZUpDUdMb)T?E$}CI>r@}PFPWD9@*%V6;4Ag>D#h>!s)=$0R zRXvdkZ%|c}ubej`jl?cS$onl9Tw52rBKT)kgyw~Xy%z62Lr%V6Y=f?2)J|bZJ5(Wx zmji`O;_B+*X@qe-#~`HFP<{8$w@z4@&`q^Q-Zk8JG3>WalhnW1cvnoVw>*R@c&|o8 zZ%w!{Z+MHeZ*OE4v*otkZqz11*s!#s^Gq>+o`8Z5 z^i-qzJLJh9!W-;SmFkR8HEZJWiXk$40i6)7 zZpr=k2lp}SasbM*Nbn3j$sn0;rUI;%EDbi7T1ZI4qL6PNNM2Y%6{LMIKW+FY_yF3) zSKQ2QSujzNMSL2r&bYs`|i2Dnn z=>}c0>a}>|uT!IiMOA~pVT~R@bGlm}Edf}Kq0?*Af6#mW9f9!}RjW7om0c9Qlp;yK z)=XQs(|6GCadQbWIhYF=rf{Y)sj%^Id-ARO0=O^Ad;Ph+ z0?$eE1xhH?{T$QI>0JP75`r)U_$#%K1^BQ8z#uciKf(C701&RyLQWBUp*Q7eyn76} z6JHpC9}R$J#(R0cDCkXoFSp;j6{x{b&0yE@P7{;pCEpKjS(+1RQy38`=&Yxo%F=3y zCPeefABp34U-s?WmU#JJw23dcC{sPPFc2#J$ZgEN%zod}J~8dLm*fx9f6SpO zn^Ww3bt9-r0XaT2a@Wpw;C23XM}7_14#%QpubrIw5aZtP+CqIFmsG4`Cm6rfxl9n5 z7=r2C-+lM2AB9X0T_`?EW&Byv&K?HS4QLoylJ|OAF z`8atBNTzJ&AQ!>sOo$?^0xj~D(;kS$`9zbEGd>f6r`NC3X`tX)sWgWUUOQ7w=$TO&*j;=u%25ay-%>3@81tGe^_z*C7pb9y*Ed^H3t$BIKH2o+olp#$q;)_ zfpjCb_^VFg5fU~K)nf*d*r@BCC>UZ!0&b?AGk_jTPXaSnCuW110wjHPPe^9R^;jo3 zwvzTl)C`Zl5}O2}3lec=hZ*$JnkW#7enKKc)(pM${_$9Hc=Sr_A9Biwe*Y=T?~1CK z6eZ9uPICjy-sMGbZl$yQmpB&`ouS8v{58__t0$JP%i3R&%QR3ianbZqDs<2#5FdN@n5bCn^ZtH992~5k(eA|8|@G9u`wdn7bnpg|@{m z^d6Y`*$Zf2Xr&|g%sai#5}Syvv(>Jnx&EM7-|Jr7!M~zdAyjt*xl;OLhvW-a%H1m0 z*x5*nb=R5u><7lyVpNAR?q@1U59 zO+)QWwL8t zyip?u_nI+K$uh{y)~}qj?(w0&=SE^8`_WMM zTybjG=999h38Yes7}-4*LJ7H)UE8{mE(6;8voE+TYY%33A>S6`G_95^5QHNTo_;Ao ztIQIZ_}49%{8|=O;isBZ?=7kfdF8_@azfoTd+hEJKWE!)$)N%HIe2cplaK`ry#=pV z0q{9w-`i0h@!R8K3GC{ivt{70IWG`EP|(1g7i_Q<>aEAT{5(yD z=!O?kq61VegV+st@XCw475j6vS)_z@efuqQgHQR1T4;|-#OLZNQJPV4k$AX1Uk8Lm z{N*b*ia=I+MB}kWpupJ~>!C@xEN#Wa7V+7{m4j8c?)ChV=D?o~sjT?0C_AQ7B-vxqX30s0I_`2$in86#`mAsT-w?j{&AL@B3$;P z31G4(lV|b}uSDCIrjk+M1R!X7s4Aabn<)zpgT}#gE|mIvV38^ODy@<&yflpCwS#fRf9ZX3lPV_?8@C5)A;T zqmouFLFk;qIs4rA=hh=GL~sCFsXHsqO6_y~*AFt939UYVBSx1s(=Kb&5;j7cSowdE;7()CC2|-i9Zz+_BIw8#ll~-tyH?F3{%`QCsYa*b#s*9iCc`1P1oC26?`g<9))EJ3%xz+O!B3 zZ7$j~To)C@PquR>a1+Dh>-a%IvH_Y7^ys|4o?E%3`I&ADXfC8++hAdZfzIT#%C+Jz z1lU~K_vAm0m8Qk}K$F>|>RPK%<1SI0(G+8q~H zAsjezyP+u!Se4q3GW)`h`NPSRlMoBjCzNPesWJwVTY!o@G8=(6I%4XHGaSiS3MEBK zhgGFv6Jc>L$4jVE!I?TQuwvz_%CyO!bLh94nqK11C2W$*aa2ueGopG8DnBICVUORP zgytv#)49fVXDaR$SukloYC3u7#5H)}1K21=?DKj^U)8G;MS)&Op)g^zR2($<>C*zW z;X7`hLxiIO#J`ANdyAOJle4V%ppa*(+0i3w;8i*BA_;u8gOO6)MY`ueq7stBMJTB; z-a0R>hT*}>z|Gg}@^zDL1MrH+2hsR8 zHc}*9IvuQC^Ju)^#Y{fOr(96rQNPNhxc;mH@W*m206>Lo<*SaaH?~8zg&f&%YiOEG zGiz?*CP>Bci}!WiS=zj#K5I}>DtpregpP_tfZtPa(N<%vo^#WCQ5BTv0vr%Z{)0q+ z)RbfHktUm|lg&U3YM%lMUM(fu}i#kjX9h>GYctkx9Mt_8{@s%!K_EI zScgwy6%_fR?CGJQtmgNAj^h9B#zmaMDWgH55pGuY1Gv7D z;8Psm(vEPiwn#MgJYu4Ty9D|h!?Rj0ddE|&L3S{IP%H4^N!m`60ZwZw^;eg4sk6K{ ziA^`Sbl_4~f&Oo%n;8Ye(tiAdlZKI!Z=|j$5hS|D$bDJ}p{gh$KN&JZYLUjv4h{NY zBJ>X9z!xfDGY z+oh_Z&_e#Q(-}>ssZfm=j$D&4W4FNy&-kAO1~#3Im;F)Nwe{(*75(p=P^VI?X0GFakfh+X-px4a%Uw@fSbmp9hM1_~R>?Z8+ ziy|e9>8V*`OP}4x5JjdWp}7eX;lVxp5qS}0YZek;SNmm7tEeSF*-dI)6U-A%m6YvCgM(}_=k#a6o^%-K4{`B1+}O4x zztDT%hVb;v#?j`lTvlFQ3aV#zkX=7;YFLS$uIzb0E3lozs5`Xy zi~vF+%{z9uLjKvKPhP%x5f~7-Gj+%5N`%^=yk*Qn{`> z;xj&ROY6g`iy2a@{O)V(jk&8#hHACVDXey5a+KDod_Z&}kHM}xt7}Md@pil{2x7E~ zL$k^d2@Ec2XskjrN+IILw;#7((abu;OJii&v3?60x>d_Ma(onIPtcVnX@ELF0aL?T zSmWiL3(dOFkt!x=1O!_0n(cAzZW+3nHJ{2S>tgSK?~cFha^y(l@-Mr2W$%MN{#af8J;V*>hdq!gx=d0h$T7l}>91Wh07)9CTX zh2_ZdQCyFOQ)l(}gft0UZG`Sh2`x-w`5vC2UD}lZs*5 zG76$akzn}Xi))L3oGJ75#pcN=cX3!=57$Ha=hQ2^lwdyU#a}4JJOz6ddR%zae%#4& za)bFj)z=YQela(F#Y|Q#dp}PJghITwXouVaMq$BM?K%cXn9^Y@g43$=O)F&ZlOUom zJiad#dea;-eywBA@e&D6Pdso1?2^(pXiN91?jvcaUyYoKUmvl5G9e$W!okWe*@a<^ z8cQQ6cNSf+UPDx%?_G4aIiybZHHagF{;IcD(dPO!#=u zWfqLcPc^+7Uu#l(Bpxft{*4lv#*u7X9AOzDO z1D9?^jIo}?%iz(_dwLa{ex#T}76ZfN_Z-hwpus9y+4xaUu9cX}&P{XrZVWE{1^0yw zO;YhLEW!pJcbCt3L8~a7>jsaN{V3>tz6_7`&pi%GxZ=V3?3K^U+*ryLSb)8^IblJ0 zSRLNDvIxt)S}g30?s_3NX>F?NKIGrG_zB9@Z>uSW3k2es_H2kU;Rnn%j5qP)!XHKE zPB2mHP~tLCg4K_vH$xv`HbRsJwbZMUV(t=ez;Ec(vyHH)FbfLg`c61I$W_uBB>i^r z&{_P;369-&>23R%qNIULe=1~T$(DA`ev*EWZ6j(B$(te}x1WvmIll21zvygkS%vwG zzkR6Z#RKA2!z!C%M!O>!=Gr0(J0FP=-MN=5t-Ir)of50y10W}j`GtRCsXBakrKtG& zazmITDJMA0C51&BnLY)SY9r)NVTMs);1<=oosS9g31l{4ztjD3#+2H7u_|66b|_*O z;Qk6nalpqdHOjx|K&vUS_6ITgGll;TdaN*ta=M_YtyC)I9Tmr~VaPrH2qb6sd~=AcIxV+%z{E&0@y=DPArw zdV7z(G1hBx7hd{>(cr43^WF%4Y@PXZ?wPpj{OQ#tvc$pABJbvPGvdR`cAtHn)cSEV zrpu}1tJwQ3y!mSmH*uz*x0o|CS<^w%&KJzsj~DU0cLQUxk5B!hWE>aBkjJle8z~;s z-!A=($+}Jq_BTK5^B!`R>!MulZN)F=iXXeUd0w5lUsE5VP*H*oCy(;?S$p*TVvTxwAeWFB$jHyb0593)$zqalVlDX=GcCN1gU0 zlgU)I$LcXZ8Oyc2TZYTPu@-;7<4YYB-``Qa;IDcvydIA$%kHhJKV^m*-zxcvU4viy&Kr5GVM{IT>WRywKQ9;>SEiQD*NqplK-KK4YR`p0@JW)n_{TU3bt0 zim%;(m1=#v2}zTps=?fU5w^(*y)xT%1vtQH&}50ZF!9YxW=&7*W($2kgKyz1mUgfs zfV<*XVVIFnohW=|j+@Kfo!#liQR^x>2yQdrG;2o8WZR+XzU_nG=Ed2rK?ntA;K5B{ z>M8+*A4!Jm^Bg}aW?R?6;@QG@uQ8&oJ{hFixcfEnJ4QH?A4>P=q29oDGW;L;= z9-a0;g%c`C+Ai!UmK$NC*4#;Jp<1=TioL=t^YM)<<%u#hnnfSS`nq63QKGO1L8RzX z@MFDqs1z ztYmxDl@LU)5acvHk)~Z`RW7=aJ_nGD!mOSYD>5Odjn@TK#LY{jf?+piB5AM-CAoT_ z?S-*q7}wyLJzK>N%eMPuFgN)Q_otKP;aqy=D5f!7<=n(lNkYRXVpkB{TAYLYg{|(jtRqYmg$xH zjmq?B(RE4 zQx^~Pt}gxC2~l=K$$-sYy_r$CO(d=+b3H1MB*y_5g6WLaWTXn+TKQ|hNY^>Mp6k*$ zwkovomhu776vQATqT4blf~g;TY(MWCrf^^yfWJvSAB$p5l;jm@o#=!lqw+Lqfq>X= z$6~kxfm7`3q4zUEB;u4qa#BdJxO!;xGm)wwuisj{0y2x{R(IGMrsIzDY9LW>m!Y`= z04sx3IjnYvL<4JqxQ8f7qYd0s2Ig%`ytYPEMKI)s(LD}D@EY>x`VFtqvnADNBdeao zC96X+MxnwKmjpg{U&gP3HE}1=s!lv&D{6(g_lzyF3A`7Jn*&d_kL<;dAFx!UZ>hB8 z5A*%LsAn;VLp>3${0>M?PSQ)9s3}|h2e?TG4_F{}{Cs>#3Q*t$(CUc}M)I}8cPF6% z=+h(Kh^8)}gj(0}#e7O^FQ6`~fd1#8#!}LMuo3A0bN`o}PYsm!Y}sdOz$+Tegc=qT z8x`PH$7lvnhJp{kHWb22l;@7B7|4yL4UOOVM0MP_>P%S1Lnid)+k9{+3D+JFa#Pyf zhVc#&df87APl4W9X)F3pGS>@etfl=_E5tBcVoOfrD4hmVeTY-cj((pkn%n@EgN{0f zwb_^Rk0I#iZuHK!l*lN`ceJn(sI{$Fq6nN& zE<-=0_2WN}m+*ivmIOxB@#~Q-cZ>l136w{#TIJe478`KE7@=a{>SzPHsKLzYAyBQO zAtuuF$-JSDy_S@6GW0MOE~R)b;+0f%_NMrW(+V#c_d&U8Z9+ec4=HmOHw?gdjF(Lu zzra83M_BoO-1b3;9`%&DHfuUY)6YDV21P$C!Rc?mv&{lx#f8oc6?0?x zK08{WP65?#>(vPfA-c=MCY|%*1_<3D4NX zeVTi-JGl2uP_2@0F{G({pxQOXt_d{g_CV6b?jNpfUG9;8yle-^4KHRvZs-_2siata zt+d_T@U$&t*xaD22(fH(W1r$Mo?3dc%Tncm=C6{V9y{v&VT#^1L04vDrLM9qBoZ4@ z6DBN#m57hX7$C(=#$Y5$bJmwA$T8jKD8+6A!-IJwA{WOfs%s}yxUw^?MRZjF$n_KN z6`_bGXcmE#5e4Ym)aQJ)xg3Pg0@k`iGuHe?f(5LtuzSq=nS^5z>vqU0EuZ&75V%Z{ zYyhRLN^)$c6Ds{f7*FBpE;n5iglx5PkHfWrj3`x^j^t z7ntuV`g!9Xg#^3!x)l*}IW=(Tz3>Y5l4uGaB&lz{GDjm2D5S$CExLT`I1#n^lBH7Y zDgpMag@`iETKAI=p<5E#LTkwzVR@=yY|uBVI1HG|8h+d;G-qfuj}-ZR6fN>EfCCW z9~wRQoAPEa#aO?3h?x{YvV*d+NtPkf&4V0k4|L=uj!U{L+oLa(z#&iuhJr3-PjO3R z5s?=nn_5^*^Rawr>>Nr@K(jwkB#JK-=+HqwfdO<+P5byeim)wvqGlP-P|~Nse8=XF zz`?RYB|D6SwS}C+YQv+;}k6$-%D(@+t14BL@vM z2q%q?f6D-A5s$_WY3{^G0F131bbh|g!}#BKw=HQ7mx;Dzg4Z*bTLQSfo{ed{4}NZW zfrRm^Ca$rlE{Ue~uYv>R9{3smwATcdM_6+yWIO z*ZRH~uXE@#p$XTbCt5j7j2=86e{9>HIB6xDzV+vAo&B?KUiMP|ttOElepnl%|DPqL b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/public/manifest.json b/public/manifest.json deleted file mode 100644 index 080d6c7..0000000 --- a/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "React App", - "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index e9e57dc..0000000 --- a/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/src/components/CardRow/styles.ts b/src/components/CardRow/styles.ts index 0385113..e4b1aa3 100644 --- a/src/components/CardRow/styles.ts +++ b/src/components/CardRow/styles.ts @@ -8,8 +8,9 @@ export const CardHeader = styled.div` padding-bottom: 5px; padding-right: 5px; h4 { + font-size: 14px; margin-left: 4px; - font-weight: 600; + font-weight: 500; } section { display: flex;