Skip to content

Commit 09f4cb3

Browse files
cursoragentmsukkari
andcommitted
fix: use Next.js Link for symbol nav buttons to support Cmd+click on Mac
- Replace anchor elements with Next.js Link components for proper Cmd+click (Mac) / Ctrl+click (Windows) support to open in new tabs - Revert LoadingButton asChild changes since we now use Link directly - Buttons now properly support native browser behavior for opening links Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
1 parent 7ebf6b5 commit 09f4cb3

File tree

2 files changed

+45
-64
lines changed

2 files changed

+45
-64
lines changed

packages/web/src/components/ui/loading-button.tsx

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,43 +2,28 @@
22

33
// @note: this is not a original Shadcn component.
44

5-
import { buttonVariants } from "@/components/ui/button";
6-
import { cn } from "@/lib/utils";
7-
import { Slot } from "@radix-ui/react-slot";
8-
import { VariantProps } from "class-variance-authority";
5+
import { Button, ButtonProps } from "@/components/ui/button";
96
import { Loader2 } from "lucide-react";
107
import React from "react";
118

12-
export interface LoadingButtonProps
13-
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
14-
VariantProps<typeof buttonVariants> {
9+
export interface LoadingButtonProps extends ButtonProps {
1510
loading?: boolean;
16-
asChild?: boolean;
1711
}
1812

19-
const LoadingButton = React.forwardRef<HTMLButtonElement, LoadingButtonProps>(
20-
({ children, loading, className, variant, size, asChild = false, disabled, ...props }, ref) => {
21-
const Comp = asChild ? Slot : "button";
22-
const isDisabled = loading || disabled;
23-
24-
return (
25-
<Comp
26-
className={cn(buttonVariants({ variant, size, className }))}
27-
ref={ref}
28-
disabled={isDisabled}
29-
aria-disabled={isDisabled}
30-
{...props}
31-
>
32-
<>
33-
{loading && (
34-
<Loader2 className="w-4 h-4 mr-2 animate-spin" />
35-
)}
36-
{children}
37-
</>
38-
</Comp>
39-
);
40-
}
41-
);
13+
const LoadingButton = React.forwardRef<HTMLButtonElement, LoadingButtonProps>(({ children, loading, ...props }, ref) => {
14+
return (
15+
<Button
16+
{...props}
17+
ref={ref}
18+
disabled={loading || props.disabled}
19+
>
20+
{loading && (
21+
<Loader2 className="w-4 h-4 mr-2 animate-spin" />
22+
)}
23+
{children}
24+
</Button>
25+
)
26+
});
4227

4328
LoadingButton.displayName = "LoadingButton";
4429

packages/web/src/ee/features/codeNav/components/symbolHoverPopup/index.tsx

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useBrowseNavigation } from "@/app/[domain]/browse/hooks/useBrowseNavigation";
22
import { KeyboardShortcutHint } from "@/app/components/keyboardShortcutHint";
33
import { useToast } from "@/components/hooks/use-toast";
4-
import { Button } from "@/components/ui/button";
4+
import { buttonVariants } from "@/components/ui/button";
55
import { LoadingButton } from "@/components/ui/loading-button";
66
import { Separator } from "@/components/ui/separator";
77
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
@@ -11,6 +11,7 @@ import { cn } from "@/lib/utils";
1111
import { computePosition, flip, offset, shift, VirtualElement } from "@floating-ui/react";
1212
import { ReactCodeMirrorRef } from "@uiw/react-codemirror";
1313
import { Loader2 } from "lucide-react";
14+
import Link from "next/link";
1415
import { useCallback, useEffect, useMemo, useRef, useState, MouseEvent } from "react";
1516
import { createPortal } from "react-dom";
1617
import { useHotkeys } from "react-hotkeys-hook";
@@ -379,26 +380,24 @@ export const SymbolHoverPopup: React.FC<SymbolHoverPopupProps> = ({
379380
<div className="flex flex-row gap-2 mt-2">
380381
<Tooltip delayDuration={500}>
381382
<TooltipTrigger asChild>
382-
<LoadingButton
383-
loading={symbolInfo.isSymbolDefinitionsLoading}
384-
disabled={!previewedSymbolDefinition}
385-
variant="outline"
386-
size="sm"
387-
asChild={!symbolInfo.isSymbolDefinitionsLoading && !!previewedSymbolDefinition}
388-
>
389-
{!symbolInfo.isSymbolDefinitionsLoading && previewedSymbolDefinition ? (
390-
<a
391-
href={gotoDefinitionHref}
392-
onClick={onGotoDefinitionClick}
393-
>
394-
{`Go to ${symbolInfo.symbolDefinitions && symbolInfo.symbolDefinitions.length > 1 ? "definitions" : "definition"}`}
395-
</a>
396-
) : (
397-
<span>
398-
{symbolInfo.isSymbolDefinitionsLoading ? "Loading..." : "No definition found"}
399-
</span>
400-
)}
401-
</LoadingButton>
383+
{!symbolInfo.isSymbolDefinitionsLoading && previewedSymbolDefinition && gotoDefinitionHref ? (
384+
<Link
385+
href={gotoDefinitionHref}
386+
onClick={onGotoDefinitionClick}
387+
className={cn(buttonVariants({ variant: "outline", size: "sm" }))}
388+
>
389+
{`Go to ${symbolInfo.symbolDefinitions && symbolInfo.symbolDefinitions.length > 1 ? "definitions" : "definition"}`}
390+
</Link>
391+
) : (
392+
<LoadingButton
393+
loading={symbolInfo.isSymbolDefinitionsLoading}
394+
disabled={!previewedSymbolDefinition}
395+
variant="outline"
396+
size="sm"
397+
>
398+
{symbolInfo.isSymbolDefinitionsLoading ? "Loading..." : "No definition found"}
399+
</LoadingButton>
400+
)}
402401
</TooltipTrigger>
403402
<TooltipContent
404403
side="bottom"
@@ -411,19 +410,16 @@ export const SymbolHoverPopup: React.FC<SymbolHoverPopupProps> = ({
411410
</Tooltip>
412411
<Tooltip delayDuration={500}>
413412
<TooltipTrigger asChild>
414-
<Button
415-
variant="outline"
416-
size="sm"
417-
asChild
413+
<Link
414+
href={findReferencesHref ?? "#"}
415+
onClick={onFindReferencesClick}
416+
className={cn(
417+
buttonVariants({ variant: "outline", size: "sm" }),
418+
!findReferencesHref && "pointer-events-none opacity-50"
419+
)}
418420
>
419-
<a
420-
href={findReferencesHref}
421-
onClick={onFindReferencesClick}
422-
className={cn(!symbolInfo && "pointer-events-none opacity-50")}
423-
>
424-
Find references
425-
</a>
426-
</Button>
421+
Find references
422+
</Link>
427423
</TooltipTrigger>
428424
<TooltipContent
429425
side="bottom"

0 commit comments

Comments
 (0)