Skip to content

Commit 78d5d17

Browse files
committed
dropdown menu on url bar for profile actions
1 parent c1d18fe commit 78d5d17

File tree

4 files changed

+105
-8
lines changed

4 files changed

+105
-8
lines changed

ui/src/components/navbar/NavAuthLinks.tsx

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,34 @@ import URLS from "../../helpers/URLS";
33
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
44
import {faUserCircle} from "@fortawesome/free-solid-svg-icons/faUserCircle";
55
import pocketbase from "../../libraries/Pocketbase";
6-
import React from "preact/compat";
76
import NavBarLink from "./NavBarLink";
7+
import NavBarDropdownLink, {
8+
NavBarDropdownItem,
9+
NavBarDropdownItemContainer,
10+
NavBarDropdownLinkText
11+
} from "./NavBarDropdownLink";
812

913
export default function NavAuthLinks() {
1014
const authValid = useAuthValid();
1115

1216
if (authValid) {
13-
return <>
14-
<NavBarLink href={URLS.DASHBOARD}>
17+
return <NavBarDropdownLink>
18+
<NavBarDropdownLinkText>
1519
<FontAwesomeIcon
1620
icon={faUserCircle}/>&nbsp;{pocketbase.authStore?.model?.username}
17-
</NavBarLink>
18-
<NavBarLink href={URLS.LOGOUT}>Logout</NavBarLink>
19-
</>;
21+
</NavBarDropdownLinkText>
22+
<NavBarDropdownItemContainer>
23+
<NavBarDropdownItem>
24+
<NavBarLink href={URLS.DASHBOARD}>Dashboard</NavBarLink>
25+
</NavBarDropdownItem>
26+
<NavBarDropdownItem>
27+
<NavBarLink href={URLS.USER_SETTINGS}>Account</NavBarLink>
28+
</NavBarDropdownItem>
29+
<NavBarDropdownItem>
30+
<NavBarLink href={URLS.LOGOUT}>Logout</NavBarLink>
31+
</NavBarDropdownItem>
32+
</NavBarDropdownItemContainer>
33+
</NavBarDropdownLink>;
2034
}
2135

2236
return <>
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import {ComponentChildren} from "preact";
2+
import {PropsWithChildren, useState} from "preact/compat";
3+
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
4+
import {faCaretDown} from "@fortawesome/free-solid-svg-icons/faCaretDown";
5+
6+
export default function NavBarDropdownLink(props: { children: ComponentChildren }) {
7+
const [isOpen, setIsOpen] = useState(false);
8+
9+
return <button onClick={() => setIsOpen(!isOpen)}
10+
className={`navbar-link navbar-link-dropdown navbar-link__animated ${isOpen ? 'navbar-link-dropdown__active' : ''}`}>
11+
{props.children}
12+
</button>
13+
}
14+
15+
export function NavBarDropdownLinkText(props: PropsWithChildren) {
16+
return <span className="navbar-link__text">{props.children} <FontAwesomeIcon icon={faCaretDown} />
17+
</span>
18+
}
19+
20+
export function NavBarDropdownItemContainer(props: PropsWithChildren) {
21+
return <span className={"navbar-link-dropdown-items"}>{props.children}</span>
22+
}
23+
24+
export function NavBarDropdownItem(props: PropsWithChildren) {
25+
return <span className={"navbar-link-dropdown-items-item"}>{props.children}</span>
26+
}

ui/src/helpers/URLS.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const URLS: { [key: string]: string } = {
88
FORGOT_PASSWORD: "/auth/forgot-password",
99
RESET_PASSWORD: "/auth/reset-password/:token",
1010
CHANGE_PASSWORD: "/auth/change-password",
11+
USER_SETTINGS: "/dashboard/user",
1112
}
1213

1314
export default URLS;

ui/src/styles/style.scss

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,62 @@ nav.navbar {
253253
}
254254
}
255255

256+
.navbar-link.navbar-link-dropdown {
257+
background: none;
258+
border: none;
259+
position: relative;
260+
overflow: visible;
261+
262+
.navbar-link__text {
263+
margin-top: auto;
264+
margin-bottom: auto;
265+
}
266+
267+
&:hover, & {
268+
>.navbar-link__text, >.navbar-link__text:hover {
269+
margin-top: auto;
270+
margin-bottom: auto;
271+
}
272+
}
273+
274+
.navbar-link-dropdown-items {
275+
position: absolute;
276+
top: calc(100% - 10px);
277+
padding-top: 10px;
278+
width: 100%;
279+
height: auto;
280+
display: none;
281+
282+
background-color: $celadon-blue;
283+
284+
border-bottom-left-radius: 5px;
285+
border-bottom-right-radius: 5px;
286+
}
287+
288+
&.navbar-link-dropdown__active, &:hover {
289+
.navbar-link-dropdown-items {
290+
display: block;
291+
}
292+
293+
.navbar-link {
294+
height: calc($nav-height - 20px);
295+
296+
border-top: 1px solid white;
297+
298+
.navbar-link__text {
299+
margin-top: 32px;
300+
margin-bottom: 0;
301+
}
302+
303+
&:hover {
304+
.navbar-link__text {
305+
margin-top: 8px;
306+
}
307+
}
308+
}
309+
}
310+
}
311+
256312
.navbar-link {
257313
height: 100%;
258314
padding: 7px 10px;
@@ -303,11 +359,11 @@ nav.navbar {
303359
}
304360

305361
&:hover {
306-
.navbar-link__text {
362+
>.navbar-link__text {
307363
margin-top: 0;
308364
}
309365

310-
.navbar-link__decoration {
366+
>.navbar-link__decoration {
311367
margin-top: 0;
312368
opacity: 1;
313369
}

0 commit comments

Comments
 (0)