From 3144d94eb8e456b781109f9f5380ddeee759971f Mon Sep 17 00:00:00 2001 From: Mehul Kiran Chaudhari <55375534+MehulKChaudhari@users.noreply.github.com> Date: Sat, 4 Jan 2025 21:42:46 +0530 Subject: [PATCH 1/6] add: sign in and sign out --- package.json | 1 + pnpm-lock.yaml | 11 +++ src/assets/github-white.png | Bin 0 -> 13669 bytes src/assets/user.png | Bin 0 -> 8167 bytes src/components/Dropdown.tsx | 51 ++++++++++++++ src/components/navbar.tsx | 134 +++++++++++++++++++++++------------- src/config.ts | 2 + src/context/UserContext.tsx | 32 +++++++++ src/main.tsx | 5 +- src/services/api.ts | 9 +++ 10 files changed, 195 insertions(+), 50 deletions(-) create mode 100644 src/assets/github-white.png create mode 100644 src/assets/user.png create mode 100644 src/components/Dropdown.tsx create mode 100644 src/context/UserContext.tsx create mode 100644 src/services/api.ts diff --git a/package.json b/package.json index 9047a96..87898e0 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "framer-motion": "^11.11.17", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-icons": "^5.4.0", "react-router-dom": "^6.28.0" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 824784a..9ce8e4b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ dependencies: react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) + react-icons: + specifier: ^5.4.0 + version: 5.4.0(react@18.3.1) react-router-dom: specifier: ^6.28.0 version: 6.28.0(react-dom@18.3.1)(react@18.3.1) @@ -3654,6 +3657,14 @@ packages: react: 18.3.1 scheduler: 0.23.2 + /react-icons@5.4.0(react@18.3.1): + resolution: {integrity: sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==} + peerDependencies: + react: '*' + dependencies: + react: 18.3.1 + dev: false + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true diff --git a/src/assets/github-white.png b/src/assets/github-white.png new file mode 100644 index 0000000000000000000000000000000000000000..6c3b3cd14aece03ce138e53c6e8ecc4954b17e8a GIT binary patch literal 13669 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 void; + onSignOut: () => void; +} + +const Dropdown: React.FC = ({ isOpen, onClose, onSignOut }) => { + const dropdownRef = useRef(null); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + onClose(); + } + }; + + if (isOpen) { + document.addEventListener('mousedown', handleClickOutside); + } + + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [isOpen, onClose]); + + if (!isOpen) return null; + + return ( +
+
+ +
+
+ ); +}; + +export default Dropdown; \ No newline at end of file diff --git a/src/components/navbar.tsx b/src/components/navbar.tsx index e5b5fd1..d2a8555 100644 --- a/src/components/navbar.tsx +++ b/src/components/navbar.tsx @@ -1,79 +1,115 @@ -import React, { useEffect } from 'react'; -import { getConfig, validateEnv } from '../config'; +import React, { useState, useEffect } from 'react'; +import { getConfig } from '../config'; import RDSLogo from '../assets/rds-logo.svg'; +import GITHUB_LOGO from '../assets/github-white.png'; +import DEFAULT_AVATAR from '../assets/user.png'; +import { useUserContext } from '../context/UserContext'; +import fetchApi from '../services/api'; +import Dropdown from './Dropdown'; +import { FaChevronDown } from 'react-icons/fa'; const Navbar: React.FC = () => { const { welcomeSiteUrl, membersSiteUrl, statusSiteUrl } = getConfig(); + const { user, setUser } = useUserContext(); + const [isLoggedIn, setIsLoggedIn] = useState(false); + const [dropdownOpen, setDropdownOpen] = useState(false); + const { rdsBackendBaseUrl } = getConfig(); + const authUrl = `${rdsBackendBaseUrl}/auth/github/login?redirectURL=${window.location.href}`; useEffect(() => { + const fetchData = async () => { + try { + const responseJson = await fetchApi(`${rdsBackendBaseUrl}/users?profile=true`); + setIsLoggedIn(true); + setUser({ + userName: responseJson.username, + firstName: responseJson.first_name, + profilePicture: responseJson.picture?.url ?? DEFAULT_AVATAR, + }); + } catch (error) { + console.error(error); + setIsLoggedIn(false); + } + }; + + fetchData(); + }, []); + + const handleSignIn = () => { + window.location.href = authUrl; + }; + + const handleSignOut = async () => { try { - validateEnv(); + await fetchApi(`${rdsBackendBaseUrl}/users/signout`, { method: 'POST' }); + setIsLoggedIn(false); + setUser(null); + setDropdownOpen(false); } catch (error) { - console.error('Environment validation error:', error); + console.error('Sign out error:', error); } - }, []); + }; + + const toggleDropdown = () => { + setDropdownOpen(!dropdownOpen); + }; + + const handleCloseDropdown = () => { + setDropdownOpen(false); + }; return ( -