From 2c5c403da1926727f03a78e2600e987e22f2adc5 Mon Sep 17 00:00:00 2001 From: Raul Almeida <haltsimog@gmail.com> Date: Fri, 28 Aug 2020 13:48:56 -0300 Subject: [PATCH] wip --- package-lock.json | 208 ++++++++++++++++++++++- package.json | 9 +- public/index.html | 4 + src/Components/LoginContainerFunction.js | 22 +-- src/Store.js | 6 + src/env.js | 3 + src/index.js | 16 +- src/redux-token-auth-config.js | 27 +++ src/redux/initial-state.js | 14 ++ 9 files changed, 288 insertions(+), 21 deletions(-) create mode 100644 src/redux-token-auth-config.js create mode 100644 src/redux/initial-state.js diff --git a/package-lock.json b/package-lock.json index 72d8e321..1333ee0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1268,6 +1268,24 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@reduxjs/toolkit": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.4.0.tgz", + "integrity": "sha512-hkxQwVx4BNVRsYdxjNF6cAseRmtrkpSlcgJRr3kLUcHPIAMZAmMJkXmHh/eUEGTMqPzsYpJLM7NN2w9fxQDuGw==", + "requires": { + "immer": "^7.0.3", + "redux": "^4.0.0", + "redux-thunk": "^2.3.0", + "reselect": "^4.0.0" + }, + "dependencies": { + "immer": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/immer/-/immer-7.0.8.tgz", + "integrity": "sha512-XnpIN8PXBBaOD43U8Z17qg6RQiKQYGDGGCIbz1ixmLGwBkSWwmrmx5X7d+hTtXDM8ur7m5OdLE0PiO+y5RB3pw==" + } + } + }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", @@ -1529,6 +1547,28 @@ "csstype": "^2.2.0" } }, + "@types/react-redux": { + "version": "5.0.21", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-5.0.21.tgz", + "integrity": "sha512-ewkOW4GjnyXq5L++T31utI8yRmwj8iCIahZohYi1Ef7Xkrw0V/q92ao7x20rm38FKgImDaCCsaRGWfCJmF/Ukg==", + "requires": { + "@types/react": "*", + "redux": "^3.6.0" + }, + "dependencies": { + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" + } + } + } + }, "@types/react-transition-group": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.4.tgz", @@ -4514,6 +4554,16 @@ "sha.js": "^2.4.8" } }, + "create-react-class": { + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", + "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", + "requires": { + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -6675,6 +6725,35 @@ "bser": "2.1.1" } }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + } + } + }, "fecha": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", @@ -9168,6 +9247,15 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -10224,6 +10312,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash-es": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", @@ -10682,9 +10775,9 @@ } }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.25.3.tgz", + "integrity": "sha512-PuYv0PHxZvzc15Sp8ybUCoQ+xpyPWvjOuK72a5ovzp2LI32rJXOiIfyoFoYvG3s6EwwrdkMyWuRiEHSZRLJNdg==" }, "moo-server": { "version": "1.3.0", @@ -14299,6 +14392,14 @@ "scheduler": "^0.19.1" } }, + "react-dropdown": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/react-dropdown/-/react-dropdown-1.7.0.tgz", + "integrity": "sha512-zFZ73pgLA32hArpE4j/7DtOEhOMg240XG5QvbAb0/VinGekkHDVIakMyAFUKC5jDz8jqXEltgriqFW9R5iCtPQ==", + "requires": { + "classnames": "^2.2.3" + } + }, "react-easy-crop": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-2.1.1.tgz", @@ -14323,9 +14424,9 @@ "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==" }, "react-google-login": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/react-google-login/-/react-google-login-5.1.3.tgz", - "integrity": "sha512-QMNzjekgJWA5T0iwDa4ZwhZBRMX5vwaaeo9bzyaj89P+JJyXrPR039PuotX6BdV5cyJAKBiloMxcbgnQgaPqcw==", + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/react-google-login/-/react-google-login-5.1.21.tgz", + "integrity": "sha512-z5LtNOc9FZgrkwnqpnzN/hWqG/Tg5+9gKDz0hIHx82U48TkcXvD3HjhhbAzM5OsyFGRE39GnaC4SdB3mpWGX6A==", "requires": { "@types/react": "*", "prop-types": "^15.6.0" @@ -14361,11 +14462,30 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, "react-recaptcha": { "version": "2.3.10", "resolved": "https://registry.npmjs.org/react-recaptcha/-/react-recaptcha-2.3.10.tgz", "integrity": "sha512-IyanbozsYCuHvTYDuskZTIEcRAMG/sdvAu5b29iQWoC8Kd3Zk9WGCv2oNxh6RfGHvSvgHAyaLjmC6ei/yMsJ7g==" }, + "react-redux": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.1.2.tgz", + "integrity": "sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q==", + "requires": { + "@babel/runtime": "^7.1.2", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.2.4", + "loose-envify": "^1.1.0", + "prop-types": "^15.6.1", + "react-is": "^16.6.0", + "react-lifecycles-compat": "^3.0.0" + } + }, "react-responsive-carousel": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/react-responsive-carousel/-/react-responsive-carousel-3.2.3.tgz", @@ -14872,6 +14992,67 @@ "minimatch": "3.0.4" } }, + "redux": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "requires": { + "loose-envify": "^1.4.0", + "symbol-observable": "^1.2.0" + } + }, + "redux-thunk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", + "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" + }, + "redux-token-auth": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/redux-token-auth/-/redux-token-auth-0.19.0.tgz", + "integrity": "sha512-z+/WX/RIImGZWn/aUIId2D92ULH2bII7tkc9YyBXGKriinyf9zMHjGE5TGHZkSMFjjXmeGzybCsWCJDq7cwmRw==", + "requires": { + "@types/react": "^16.0.5", + "@types/react-redux": "^5.0.9", + "axios": "^0.16.2", + "react": "^15.6.1", + "react-redux": "^5.0.6", + "redux": "^3.7.2" + }, + "dependencies": { + "axios": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.16.2.tgz", + "integrity": "sha1-uk+S8XFn37q0CYN4VFS5rBScPG0=", + "requires": { + "follow-redirects": "^1.2.3", + "is-buffer": "^1.1.5" + } + }, + "react": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", + "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", + "requires": { + "create-react-class": "^15.6.0", + "fbjs": "^0.8.9", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0", + "prop-types": "^15.5.10" + } + }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" + } + } + } + }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -15090,6 +15271,11 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "reselect": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", + "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" + }, "resolve": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", @@ -16566,6 +16752,11 @@ } } }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -16924,6 +17115,11 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==" }, + "ua-parser-js": { + "version": "0.7.21", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", + "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" + }, "uglify-js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.3.5.tgz", diff --git a/package.json b/package.json index f1406e90..0c6c8b76 100644 --- a/package.json +++ b/package.json @@ -7,17 +7,19 @@ "@material-ui/icons": "^4.5.1", "@material-ui/lab": "^4.0.0-alpha.40", "@material-ui/styles": "^4.9.0", + "@reduxjs/toolkit": "^1.4.0", "axios": "^0.19.2", "base64-img": "^1.0.4", "binary-extensions": "^2.0.0", "build": "^0.1.4", "image-to-base64": "^2.0.1", "material-design-icons": "^3.0.1", - "moment": "^2.24.0", + "moment": "^2.25.3", "react": "^16.12.0", "react-dom": "^16.12.0", + "react-dropdown": "^1.7.0", "react-easy-crop": "^2.1.0", - "react-google-login": "^5.0.7", + "react-google-login": "^5.1.21", "react-grid-system": "^4.4.11", "react-icons": "^3.8.0", "react-input-mask": "^2.0.4", @@ -26,6 +28,9 @@ "react-router-dom": "^5.1.2", "react-scripts": "^2.1.8", "react-star-ratings": "^2.3.0", + "redux": "^4.0.5", + "redux-thunk": "^2.3.0", + "redux-token-auth": "^0.19.0", "styled-components": "^4.4.1", "typescript": "^3.7.5" }, diff --git a/public/index.html b/public/index.html index 2e5c176d..abb624ca 100755 --- a/public/index.html +++ b/public/index.html @@ -20,6 +20,10 @@ along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/> <html lang="pt-br"> <head> <meta charset="utf-8" /> + <!-- google sign-in --> + <meta name="google-signin-client_id" content="288460085642-k4veg4fo8kddvjer8b055n9da5qtgha7.apps.googleusercontent.com"> + <script src="https://apis.google.com/js/platform.js" async defer></script> + <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Portal MEC</title> </head> diff --git a/src/Components/LoginContainerFunction.js b/src/Components/LoginContainerFunction.js index 3aef0866..43bfdbeb 100644 --- a/src/Components/LoginContainerFunction.js +++ b/src/Components/LoginContainerFunction.js @@ -96,6 +96,8 @@ export default function LoginContainer (props) { //arrumar isso const responseGoogle = (response) => { console.log(response); + let profile = response.getBasicProfile(); + } return ( @@ -111,16 +113,15 @@ export default function LoginContainer (props) { </DialogHeaderStyled> <DialogContentDiv> - {/*<SocialConnectDiv> + <SocialConnectDiv> <StyledGoogleLoginButton - clientId="658977310896-knrl3gka66fldh83dao2rhgbblmd4un9.apps.googleusercontent.com" - onSuccess={responseGoogle} - onFailure={responseGoogle} - cookiePolicy={'single_host_origin'} - > - <span style={{textTransform:"none", fontSize:"13px", color : "#666"}}>Usando o Google</span> - </StyledGoogleLoginButton> - </SocialConnectDiv>*/} + clientId="288460085642-k4veg4fo8kddvjer8b055n9da5qtgha7.apps.googleusercontent.com" + buttonText="Entrar com o Google" + onSuccess={responseGoogle} + onFailure={responseGoogle} + cookiePolicy={'single_host_origin'} + /> + </SocialConnectDiv> <H3Div> <H3Styled> @@ -239,7 +240,8 @@ export default function LoginContainer (props) { border : 1px solid rgb(66, 133, 244); box-shadow: 0 0 0 1px #4285f4 !important; :hover { - background-color: #f4f4f4 !important; + background-color: #f4f4f4 !important; + cursor: pointer; } ` diff --git a/src/Store.js b/src/Store.js index 8a8c0e96..12cfe744 100644 --- a/src/Store.js +++ b/src/Store.js @@ -17,9 +17,15 @@ You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ import React from 'react' +import { combineReducers } from 'redux' +import { reduxTokenAuthReducer } from 'redux-token-auth' export const Store = React.createContext() +export const rootReducer = combineReducers({ + reduxTokenAuth: reduxTokenAuthReducer, +}) + const initialState = { searchOpen: false, userIsLoggedIn : false, diff --git a/src/env.js b/src/env.js index 1f221ee7..a38b4456 100644 --- a/src/env.js +++ b/src/env.js @@ -25,6 +25,9 @@ var simcaqAPIDomain = 'https://www.simcaq.c3sl.ufpr.br/api', apiVersion = 'v1', simcaqAPIurl = simcaqAPIDomain + '/' + apiVersion +var authUrl = '288460085642-k4veg4fo8kddvjer8b055n9da5qtgha7.apps.googleusercontent.com'; + export {apiUrl}; export {apiDomain}; export {simcaqAPIurl} +export {authUrl}; diff --git a/src/index.js b/src/index.js index 7759fd80..a72c1a9a 100755 --- a/src/index.js +++ b/src/index.js @@ -24,11 +24,21 @@ import './index.css'; import App from './App.js' import { StoreProvider } from './Store'; +import { configureStore } from '@reduxjs/toolkit'; +import { verifyCredentials } from './redux-token-auth-config'; +import { Provider } from 'react-redux' +import { rootReducer } from './Store'; + +const redux_store = configureStore({reducer: rootReducer}); +verifyCredentials(redux_store); + ReactDOM.render( - <StoreProvider> - <App /> - </StoreProvider> + <Provider store={redux_store}> + <StoreProvider> + <App /> + </StoreProvider> + </Provider> , document.getElementById('root')); // If you want your app to work offline and load faster, you can change diff --git a/src/redux-token-auth-config.js b/src/redux-token-auth-config.js new file mode 100644 index 00000000..9e4e94cd --- /dev/null +++ b/src/redux-token-auth-config.js @@ -0,0 +1,27 @@ +import { generateAuthActions } from 'redux-token-auth' +import { authUrl } from './env' + +const config = { + authUrl, + userAttributes: { + firstName: 'first_name', + imageUrl: 'image', + }, + userRegistrationAttributes: { + firstName: 'first_name', + }, +} + +const { + registerUser, + signInUser, + signOutUser, + verifyCredentials, +} = generateAuthActions(config) + +export { + registerUser, + signInUser, + signOutUser, + verifyCredentials, +} diff --git a/src/redux/initial-state.js b/src/redux/initial-state.js new file mode 100644 index 00000000..fd3e9011 --- /dev/null +++ b/src/redux/initial-state.js @@ -0,0 +1,14 @@ +const initialState = { + reduxTokenAuth: { + currentUser: { + isLoading: false, + isSignedIn: false, + attributes: { + firstName: null, // <-- Just an example. Attributes are whatever you specify in your cofig (below). + }, + }, + }, + // All your other state +} + +export default initialState -- GitLab