Skip to content

Commit 70110a4

Browse files
authored
refactor: convert buttons in sidebar to anchors (#3517)
1 parent e4061c9 commit 70110a4

File tree

4 files changed

+38
-27
lines changed

4 files changed

+38
-27
lines changed

packages/shared/src/components/sidebar/ClickableNavItem.tsx

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
import React, { HTMLAttributes, ReactElement, ReactNode } from 'react';
1+
import React, {
2+
HTMLAttributes,
3+
ReactElement,
4+
ReactNode,
5+
useCallback,
6+
} from 'react';
27
import classNames from 'classnames';
38
import Link from '../utilities/Link';
49
import { navBtnClass, SidebarMenuItem } from './common';
10+
import { combinedClicks } from '../../lib/click';
511

612
interface ClickableNavItemProps
713
extends HTMLAttributes<HTMLButtonElement | HTMLAnchorElement> {
@@ -18,25 +24,24 @@ export function ClickableNavItem({
1824
children,
1925
...props
2026
}: ClickableNavItemProps): ReactElement {
21-
if (showLogin) {
22-
return (
23-
<button
24-
{...props}
25-
type="button"
26-
className={classNames(navBtnClass, props.className)}
27-
onClick={showLogin}
28-
>
29-
{children}
30-
</button>
31-
);
32-
}
27+
const onClick = useCallback(
28+
(event: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>) => {
29+
if (showLogin) {
30+
event.preventDefault();
31+
showLogin();
32+
} else {
33+
item.action?.();
34+
}
35+
},
36+
[showLogin, item],
37+
);
3338

3439
if (!isButton && (!item.action || item.path)) {
3540
return (
3641
<Link href={item.path} passHref prefetch={false}>
3742
<a
38-
{...(item.action && { onClick: item.action })}
3943
{...props}
44+
{...combinedClicks(onClick)}
4045
target={item?.target}
4146
className={classNames(navBtnClass, props.className)}
4247
rel="noopener noreferrer"
@@ -48,12 +53,7 @@ export function ClickableNavItem({
4853
}
4954

5055
return (
51-
<button
52-
{...props}
53-
type="button"
54-
className={navBtnClass}
55-
onClick={item.action}
56-
>
56+
<button {...props} type="button" className={navBtnClass} onClick={onClick}>
5757
{children}
5858
</button>
5959
);

packages/shared/src/components/sidebar/SquadSection.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { SquadImage } from '../squads/SquadImage';
99

1010
export function SquadSection(props: SectionCommonProps): ReactElement {
1111
const { squads } = useContext(AuthContext);
12-
const { openNewSquad } = useSquadNavigation();
12+
const { openNewSquad, newSquadUrl } = useSquadNavigation();
1313

1414
const squadMenuItems: SidebarMenuItem[] = [
1515
{
@@ -40,6 +40,8 @@ export function SquadSection(props: SectionCommonProps): ReactElement {
4040
icon: () => <NewSquadIcon />,
4141
title: 'New Squad',
4242
action: () => openNewSquad({ origin: Origin.Sidebar }),
43+
path: newSquadUrl,
44+
requiresLogin: true,
4345
});
4446

4547
return (

packages/shared/src/components/squads/SquadsDirectoryHeader.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ interface SquadsDirectoryHeaderProps {
1313
export const SquadsDirectoryHeader = ({
1414
className,
1515
}: SquadsDirectoryHeaderProps): ReactElement => {
16-
const { openNewSquad } = useSquadNavigation();
16+
const { openNewSquad, newSquadUrl } = useSquadNavigation();
1717

1818
return (
1919
<div
@@ -41,8 +41,13 @@ export const SquadsDirectoryHeader = ({
4141
className="mb-6"
4242
variant={ButtonVariant.Primary}
4343
tag="a"
44-
onClick={() => openNewSquad({ origin: Origin.SquadDirectory })}
44+
onClick={(event) =>
45+
openNewSquad({ event, origin: Origin.SquadDirectory })
46+
}
4547
data-testid="squad-directory-join-waitlist"
48+
href={`${newSquadUrl}?origin=${Origin.SquadDirectory}`}
49+
title="Create a new squad"
50+
aria-label="Create a new squad"
4651
>
4752
New Squad
4853
</Button>

packages/shared/src/hooks/useSquadNavigation.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,30 @@ import { AuthTriggers } from '../lib/auth';
55
import AuthContext from '../contexts/AuthContext';
66
import { webappUrl } from '../lib/constants';
77

8-
type OpenNewSquadProps = { origin: Origin };
8+
type OpenNewSquadProps = { event?: React.MouseEvent; origin: Origin };
99
type EditSquadProps = { handle: string };
1010
interface UseSquadNavigation {
1111
openNewSquad: (props?: OpenNewSquadProps) => void;
1212
editSquad: (props: EditSquadProps) => void;
13+
newSquadUrl: string;
1314
}
1415

1516
export const useSquadNavigation = (): UseSquadNavigation => {
1617
const { user, showLogin } = useContext(AuthContext);
1718
const router = useRouter();
1819

20+
const newSquadUrl = `${webappUrl}squads/new`;
21+
1922
const openNewSquad = useCallback(
2023
(props: OpenNewSquadProps) => {
2124
if (!user) {
25+
props?.event?.preventDefault();
2226
showLogin({ trigger: AuthTriggers.CreateSquad });
2327
return;
2428
}
25-
router.push(`${webappUrl}squads/new?origin=${props.origin}`);
29+
router.push(`${newSquadUrl}?origin=${props.origin}`);
2630
},
27-
[router, user, showLogin],
31+
[user, router, newSquadUrl, showLogin],
2832
);
2933

3034
const editSquad = useCallback(
@@ -48,5 +52,5 @@ export const useSquadNavigation = (): UseSquadNavigation => {
4852
// eslint-disable-next-line react-hooks/exhaustive-deps
4953
}, [router.pathname]);
5054

51-
return { openNewSquad, editSquad };
55+
return { openNewSquad, editSquad, newSquadUrl };
5256
};

0 commit comments

Comments
 (0)