Skip to content

Commit a199c3c

Browse files
authored
Merge pull request #393 from mongodb/brooke/login-flow
QOL session improvements
2 parents c19e414 + 47a6fed commit a199c3c

File tree

4 files changed

+45
-13
lines changed

4 files changed

+45
-13
lines changed

src/auth/logout.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
"use server";
1+
'use server';
22

3-
import { signOut } from "@/auth/auth";
3+
import { signOut } from '@/auth/auth';
44

55
export async function logout() {
6-
"use server";
7-
await signOut({ redirectTo: "/" });
6+
'use server';
7+
await signOut({ redirect: true, redirectTo: '/' });
88
}

src/components/global/Search/Search.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import Fuse, { IFuseOptions } from 'fuse.js';
44
import debounce from 'lodash/debounce';
55
// @ts-expect-error
66
import LockIcon from '@leafygreen-ui/icon/dist/Lock';
7+
// @ts-expect-error
8+
import UnlockIcon from '@leafygreen-ui/icon/dist/Unlock';
79
import { SearchInput, SearchResult } from '@leafygreen-ui/search-input';
810
import { useSession } from '@/hooks';
911
import { components } from '@/utils/components';
@@ -52,6 +54,8 @@ export function Search() {
5254
}
5355
}, [searchTerm]);
5456

57+
const PrivateIcon = session?.user ? UnlockIcon : LockIcon;
58+
5559
return (
5660
<SearchInput
5761
aria-label="Search Components"
@@ -73,7 +77,7 @@ export function Search() {
7377
>
7478
<div className={searchResultStyle}>
7579
{item.name}
76-
{item.isPrivate && !session?.user && <LockIcon size="small" />}
80+
{item.isPrivate && <PrivateIcon size="small" />}
7781
</div>
7882
</SearchResult>
7983
))}

src/components/global/SideNavigation/SideNavigation.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import AppsIcon from '@leafygreen-ui/icon/dist/Apps';
1414
import LockIcon from '@leafygreen-ui/icon/dist/Lock';
1515
// @ts-expect-error
1616
import MenuIcon from '@leafygreen-ui/icon/dist/Menu';
17+
// @ts-expect-error
18+
import UnlockIcon from '@leafygreen-ui/icon/dist/Unlock';
1719
import IconButton from '@leafygreen-ui/icon-button';
1820
import {
1921
PortalContextProvider,
@@ -22,7 +24,7 @@ import {
2224
import { MongoDBLogo, SupportedColors } from '@leafygreen-ui/logo';
2325
import { color, spacing } from '@leafygreen-ui/tokens';
2426
import { SIDE_NAV_WIDTH } from '@/constants';
25-
import { useMediaQuery } from '@/hooks';
27+
import { useMediaQuery, useSession } from '@/hooks';
2628
import { ComponentMeta, Group, groupedComponents } from '@/utils/components';
2729
import { Search } from '../Search/Search';
2830
import { Drawer } from './Drawer';
@@ -31,6 +33,7 @@ import { SideNavLabel } from './SideNavLabel';
3133
import { SideNavList } from './SideNavList';
3234

3335
export function SideNavigation() {
36+
const session = useSession();
3437
const navRef = useRef<HTMLElement>(null);
3538
const [open, setOpen] = React.useState(false);
3639
const [isMobile] = useMediaQuery(['(max-width: 640px)'], {
@@ -42,6 +45,8 @@ export function SideNavigation() {
4245
topLevelPage === 'component' ? activeSubDirOrPage : '';
4346
const { darkMode, theme } = useDarkMode();
4447

48+
const PrivateIcon = session?.user ? UnlockIcon : LockIcon;
49+
4550
const navContent = (
4651
<>
4752
<SideNavLabel
@@ -176,7 +181,7 @@ export function SideNavigation() {
176181
>
177182
{component.name}
178183
{component.isPrivate && (
179-
<LockIcon
184+
<PrivateIcon
180185
className={css`
181186
margin-left: ${spacing[400]}px;
182187
`}

src/components/global/UserMenu.tsx

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use client';
2-
2+
import { useEffect, useState } from 'react';
33
import { css } from '@emotion/css';
4+
import { Session } from 'next-auth';
45
import Button from '@leafygreen-ui/button';
56
// @ts-expect-error
67
import CaretDownIcon from '@leafygreen-ui/icon/dist/CaretDown';
@@ -14,8 +15,24 @@ import { LogIn } from './LogIn';
1415

1516
export function UserMenu() {
1617
const session = useSession();
18+
// TODO: use next-auth session when available
19+
// Session does not clear reliably without forcing a state change or a hard refresh
20+
// https://github.com/nextauthjs/next-auth/discussions/4687
21+
const [manualSession, setManualSession] = useState<Session | undefined>(
22+
undefined,
23+
);
24+
25+
useEffect(() => {
26+
if (session?.user) {
27+
setManualSession(session);
28+
}
29+
30+
if (!session?.user) {
31+
setManualSession(undefined);
32+
}
33+
}, [session]);
1734

18-
return session?.user ? (
35+
return manualSession?.user ? (
1936
<div
2037
className={css`
2138
z-index: 1;
@@ -30,15 +47,21 @@ export function UserMenu() {
3047
`}
3148
rightGlyph={<CaretDownIcon />}
3249
>
33-
{session.user.name}
50+
{manualSession.user.name}
3451
</Button>
3552
}
3653
>
3754
<MenuItem>
38-
<Body darkMode>{session.user.name}</Body>
39-
<Description darkMode>{session.user.email}</Description>
55+
<Body darkMode>{manualSession.user.name}</Body>
56+
<Description darkMode>{manualSession.user.email}</Description>
4057
</MenuItem>
41-
<MenuItem glyph={<LogOutIcon />} onClick={() => logout()}>
58+
<MenuItem
59+
glyph={<LogOutIcon />}
60+
onClick={() => {
61+
logout();
62+
setManualSession(undefined);
63+
}}
64+
>
4265
Log out
4366
</MenuItem>
4467
</Menu>

0 commit comments

Comments
 (0)