diff --git a/digital-course-file/Capture.JPG b/digital-course-file/Capture.JPG new file mode 100644 index 0000000000000000000000000000000000000000..0178f1ef2087b67b3311d44faf2cc83f5aaf8afd Binary files /dev/null and b/digital-course-file/Capture.JPG differ diff --git a/digital-course-file/package-lock.json b/digital-course-file/package-lock.json index ad82d933a6845413350877d80fc4e519432391ef..566586a14156438fdfc06bf14c0d6d18686ff017 100644 --- a/digital-course-file/package-lock.json +++ b/digital-course-file/package-lock.json @@ -11,8 +11,11 @@ "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^12.7.1", "firebase": "^8.2.9", + "firebaseui": "^4.7.3", "react": "^17.0.1", "react-dom": "^17.0.1", + "react-github-login-button": "^1.0.1", + "react-google-button": "^0.7.2", "react-icons": "^4.2.0", "react-router-dom": "^5.2.0", "react-scripts": "4.0.2", @@ -6934,6 +6937,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "node_modules/dialog-polyfill": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/dialog-polyfill/-/dialog-polyfill-0.4.10.tgz", + "integrity": "sha512-j5yGMkP8T00UFgyO+78OxiN5vC5dzRQF3BEio+LhNvDbyfxWBsi3sfPArDm54VloaJwy2hm3erEiDWqHRC8rzw==" + }, "node_modules/diff-sequences": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", @@ -8858,6 +8866,18 @@ "node": "^8.13.0 || >=10.10.0" } }, + "node_modules/firebaseui": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/firebaseui/-/firebaseui-4.7.3.tgz", + "integrity": "sha512-KKeZQS2fO2SrZFIsEmG6GrTm/+Na8Vk+OM9wnNgP8FtUw6h4S5oCPtebBREr9ETlDFvIK88gaHvp5bvF96yogA==", + "dependencies": { + "dialog-polyfill": "^0.4.7", + "material-design-lite": "^1.2.0" + }, + "peerDependencies": { + "firebase": ">=8.2.4" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -13290,6 +13310,14 @@ "node": ">=0.10.0" } }, + "node_modules/material-design-lite": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/material-design-lite/-/material-design-lite-1.3.0.tgz", + "integrity": "sha1-0ATOP+6Zoe63Sni4oyUTSl8RcdM=", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -16524,6 +16552,28 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" }, + "node_modules/react-github-login-button": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-github-login-button/-/react-github-login-button-1.0.1.tgz", + "integrity": "sha512-HXtYwgy8EwR9i+W5HgP1d/Ndf28AXLgc2l7TQwDQfn3Tf6PeS7xD0vqF+xGAfvqKOx6rFWP5E5wpAaoC8wzirw==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-google-button": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/react-google-button/-/react-google-button-0.7.2.tgz", + "integrity": "sha512-LPIqU2hIlc212kqks8MtKjRstquVkP3SIjxlK5B1nIfg2R7YqSusJAxZUkJA5dv/z6QeSuGyI9ujwV/VWMTyAA==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-icons": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.2.0.tgz", @@ -27507,6 +27557,11 @@ } } }, + "dialog-polyfill": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/dialog-polyfill/-/dialog-polyfill-0.4.10.tgz", + "integrity": "sha512-j5yGMkP8T00UFgyO+78OxiN5vC5dzRQF3BEio+LhNvDbyfxWBsi3sfPArDm54VloaJwy2hm3erEiDWqHRC8rzw==" + }, "diff-sequences": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", @@ -29015,6 +29070,15 @@ "@firebase/util": "0.3.4" } }, + "firebaseui": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/firebaseui/-/firebaseui-4.7.3.tgz", + "integrity": "sha512-KKeZQS2fO2SrZFIsEmG6GrTm/+Na8Vk+OM9wnNgP8FtUw6h4S5oCPtebBREr9ETlDFvIK88gaHvp5bvF96yogA==", + "requires": { + "dialog-polyfill": "^0.4.7", + "material-design-lite": "^1.2.0" + } + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -32380,6 +32444,11 @@ "object-visit": "^1.0.0" } }, + "material-design-lite": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/material-design-lite/-/material-design-lite-1.3.0.tgz", + "integrity": "sha1-0ATOP+6Zoe63Sni4oyUTSl8RcdM=" + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -34971,6 +35040,22 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" }, + "react-github-login-button": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-github-login-button/-/react-github-login-button-1.0.1.tgz", + "integrity": "sha512-HXtYwgy8EwR9i+W5HgP1d/Ndf28AXLgc2l7TQwDQfn3Tf6PeS7xD0vqF+xGAfvqKOx6rFWP5E5wpAaoC8wzirw==", + "requires": { + "prop-types": "^15.7.2" + } + }, + "react-google-button": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/react-google-button/-/react-google-button-0.7.2.tgz", + "integrity": "sha512-LPIqU2hIlc212kqks8MtKjRstquVkP3SIjxlK5B1nIfg2R7YqSusJAxZUkJA5dv/z6QeSuGyI9ujwV/VWMTyAA==", + "requires": { + "prop-types": "^15.7.2" + } + }, "react-icons": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.2.0.tgz", diff --git a/digital-course-file/package.json b/digital-course-file/package.json index 466e1ca0f0270a9e078a153fcaed7e6d6209ce26..3da98cbde53417bea4fa831c876b2362718cd63f 100644 --- a/digital-course-file/package.json +++ b/digital-course-file/package.json @@ -7,8 +7,11 @@ "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^12.7.1", "firebase": "^8.2.9", + "firebaseui": "^4.7.3", "react": "^17.0.1", "react-dom": "^17.0.1", + "react-github-login-button": "^1.0.1", + "react-google-button": "^0.7.2", "react-icons": "^4.2.0", "react-router-dom": "^5.2.0", "react-scripts": "4.0.2", diff --git a/digital-course-file/src/App.css b/digital-course-file/src/App.css index 3b4fd8cf8146bde8a51dafb5934c3d7c38fc4bcf..4b3da7d64ff0ff3ba777561f5ae0d6c8fcde9957 100644 --- a/digital-course-file/src/App.css +++ b/digital-course-file/src/App.css @@ -123,3 +123,8 @@ button { padding: 8px 0; background: #3a2b58; } + +.Google { + padding-top: 10px; + text-align: center; +} diff --git a/digital-course-file/src/user/Login.js b/digital-course-file/src/user/Login.js index 70361d07a4d6a1e3603a041f7ae6b017113f438d..579d82dc63d2593313109b376345e0ad6fbb0037 100644 --- a/digital-course-file/src/user/Login.js +++ b/digital-course-file/src/user/Login.js @@ -1,4 +1,6 @@ import React from 'react' +import GoogleButton from 'react-google-button' +import GithubButton from 'react-github-login-button' const Login = (props) => { const { @@ -12,36 +14,64 @@ const Login = (props) => { setHasAccount, emailError, passwordError, + googlesignin, + githubsignin, } = props return ( - <section className='login'> - <div className="loginContainer"> - <label>UserName</label> - <input type="text" autoFocus required value={email} onChange={(e)=>setEmail(e.target.value)}> - </input> - <p className="errorMsg">{emailError}</p> - <label>Password</label> - <input type="password" required value={password} onChange={(e)=>setPassword(e.target.value)}/> - <p className="errorMsg">{passwordError}</p> - <div className="btnContainer"> - {hasAccount?( - <> - <button onClick={handleLogin}> - Sign In - </button> - <p>Don't have an account ? <span onClick={()=>setHasAccount(!hasAccount)}>Sign up</span></p> - </> - ):( - <> - <button onClick={handleSignup}> - Sign up - </button> - <p>Have an account ? <span onClick={()=>setHasAccount(!hasAccount)}>Sign in</span></p> - </> - )} - </div> + <section className='login'> + <div className='loginContainer'> + <label>UserName</label> + <input + type='text' + autoFocus + required + value={email} + onChange={(e) => setEmail(e.target.value)} + ></input> + <p className='errorMsg'>{emailError}</p> + <label>Password</label> + <input + type='password' + required + value={password} + onChange={(e) => setPassword(e.target.value)} + /> + <p className='errorMsg'>{passwordError}</p> + <div className='btnContainer'> + {hasAccount ? ( + <> + <button onClick={handleLogin}>Sign In</button> + <p> + Don't have an account ?{' '} + <span onClick={() => setHasAccount(!hasAccount)}>Sign up</span> + </p> + <p></p> + <GoogleButton onClick={googlesignin} /> + <p></p> + + <GithubButton + onClick={githubsignin} + /> + </> + ) : ( + <> + <button onClick={handleSignup}>Sign up</button> + <p> + Have an account ?{' '} + <span onClick={() => setHasAccount(!hasAccount)}>Sign in</span> + </p> + <p></p> + <GoogleButton onClick={googlesignin} /> + <p></p> + + <GithubButton + onClick={githubsignin} + /> + </> + )} + </div> </div> - </section> + </section> ) } export default Login diff --git a/digital-course-file/src/user/Signin.js b/digital-course-file/src/user/Signin.js index 78e6357e75c33d0af2dab04921a5607cb18641ad..1cc6cbbd3842368cfcf7c3cf4552a2f33f92bc03 100644 --- a/digital-course-file/src/user/Signin.js +++ b/digital-course-file/src/user/Signin.js @@ -3,6 +3,7 @@ import '../App.css' import fire from '../fire' import Login from './Login' import Hero from './Hero' +import firebase from 'firebase' const Signin = () => { const [user, setUser] = useState('') @@ -12,6 +13,64 @@ const Signin = () => { const [passwordError, setPasswordError] = useState('') const [hasAccount, setHasAccount] = useState(false) + const githubsignin = () => { + var provider = new firebase.auth.GithubAuthProvider() + firebase + .auth() + .signInWithPopup(provider) + .then((result) => { + /** @type {firebase.auth.OAuthCredential} */ + var credential = result.credential + + // This gives you a GitHub Access Token. You can use it to access the GitHub API. + var token = credential.accessToken + + // The signed-in user info. + setUser(result.user) + // ... + }) + .catch((error) => { + // Handle Errors here. + var errorCode = error.code + var errorMessage = error.message + // The email of the user's account used. + var email = error.email + // The firebase.auth.AuthCredential type that was used. + var credential = error.credential + setEmailError(error.message) + // ... + }) + } + + const googlesignin = () => { + clearErrors() + var provider = new firebase.auth.GoogleAuthProvider() + firebase + .auth() + .signInWithPopup(provider) + .then((result) => { + /** @type {firebase.auth.OAuthCredential} */ + var credential = result.credential + + // This gives you a Google Access Token. You can use it to access the Google API. + var token = credential.accessToken + // The signed-in user info. + setUser(result.user) + // ... + }) + .catch((error) => { + // Handle Errors here. + var errorCode = error.code + var errorMessage = error.message + // The email of the user's account used. + var email = error.email + // The firebase.auth.AuthCredential type that was used. + var credential = error.credential + setEmailError(error.message) + // ... + }) + } + const clearInputs = () => { setEmail('') setPassword('') @@ -80,22 +139,24 @@ const Signin = () => { return ( <div className='App'> - {user?( - <Hero handleLogout={handleLogout}/> - ):( - <Login - email={email} - setEmail={setEmail} - password={password} - setPassword={setPassword} - handleLogin={handleLogin} - handleSignup={handleSignup} - hasAccount={hasAccount} - setHasAccount={setHasAccount} - emailError={emailError} - passwordError={passwordError} - /> - )} + {user ? ( + <Hero handleLogout={handleLogout} /> + ) : ( + <Login + email={email} + setEmail={setEmail} + password={password} + setPassword={setPassword} + handleLogin={handleLogin} + handleSignup={handleSignup} + hasAccount={hasAccount} + setHasAccount={setHasAccount} + emailError={emailError} + passwordError={passwordError} + googlesignin={googlesignin} + githubsignin={githubsignin} + /> + )} </div> ) }