Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { cookieToInitialState } from "wagmi";

import HypercertExchangeClientProvider from "@/components/providers/HypercertExchangeClientProvider";
import { ModalProvider } from "@/components/ui/modal/context";
import { TooltipProvider } from "@/components/ui/tooltip";
import { Toaster } from "@/components/ui/sonner";
import { siteConfig } from "@/config/site";
import { config } from "@/config/wagmi";
Expand Down Expand Up @@ -144,6 +145,11 @@ export default function RootLayout({
<HypercertExchangeClientProvider>
<PriceFeedProvider>
<ModalProvider modalVariants={[]}>
<TooltipProvider>
<Header />
<div className="flex-1">{children}</div>
<Footer />
</TooltipProvider>
<Header />
<div className="flex-1">{children}</div>
<Footer />
Expand Down
32 changes: 14 additions & 18 deletions components/ui/quicktooltip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,28 +22,24 @@ const QuickTooltip = ({

if (openOnClick) {
return (
<TooltipProvider>
<Tooltip open={open} onOpenChange={setOpen}>
<TooltipTrigger
onClick={() => setOpen(true)}
// onBlur={() => setOpen(false)}
<Tooltip open={open} onOpenChange={setOpen}>
<TooltipTrigger
onClick={() => setOpen(true)}
// onBlur={() => setOpen(false)}

asChild={asChild}
>
{children}
</TooltipTrigger>
<TooltipContent className="text-center">{content}</TooltipContent>
</Tooltip>
</TooltipProvider>
asChild={asChild}
>
{children}
</TooltipTrigger>
<TooltipContent className="text-center">{content}</TooltipContent>
</Tooltip>
);
}
return (
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild={asChild}>{children}</TooltipTrigger>
<TooltipContent className="text-center">{content}</TooltipContent>
</Tooltip>
</TooltipProvider>
<Tooltip>
<TooltipTrigger asChild={asChild}>{children}</TooltipTrigger>
<TooltipContent className="text-center">{content}</TooltipContent>
</Tooltip>
);
};

Expand Down
20 changes: 11 additions & 9 deletions components/ui/tooltip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,17 @@ const TooltipContent = React.forwardRef<
React.ElementRef<typeof TooltipPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
>(({ className, sideOffset = 4, ...props }, ref) => (
<TooltipPrimitive.Content
ref={ref}
sideOffset={sideOffset}
className={cn(
"fade-in-0 zoom-in-95 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 origin-[--radix-tooltip-content-transform-origin] animate-in overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-popover-foreground text-sm shadow-md data-[state=closed]:animate-out",
className,
)}
{...props}
/>
<TooltipPrimitive.Portal>
<TooltipPrimitive.Content
ref={ref}
sideOffset={sideOffset}
className={cn(
"fade-in-0 zoom-in-95 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 origin-[--radix-tooltip-content-transform-origin] animate-in overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-popover-foreground text-sm shadow-md data-[state=closed]:animate-out",
className,
)}
{...props}
/>
</TooltipPrimitive.Portal>
));
TooltipContent.displayName = TooltipPrimitive.Content.displayName;

Expand Down
132 changes: 80 additions & 52 deletions components/user-chip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { useEnsName } from "wagmi";
import { Button } from "./ui/button";
import ENSName from "./ui/ens-name";
import EthAvatar from "./ui/eth-avatar";
import QuickTooltip from "./ui/quicktooltip";

const UserChip = ({
address,
Expand Down Expand Up @@ -123,65 +124,92 @@ const UserChip = ({
: ensName ?? address;

return (
<li
className={cn(
"group/user-chip inline-flex items-center justify-between gap-1.5 rounded-full border border-transparent bg-muted/80 p-2 text-sm hover:border-border hover:bg-muted",
className,
)}
<QuickTooltip
content={
<div className="flex min-w-40 flex-col items-center gap-2 font-sans">
<div className="flex items-center gap-2 p-2">
<EthAvatar address={address} size={40} />
<div className="flex flex-col items-start">
<span className="w-36 truncate font-bold">
{ensName ?? address}
</span>
<Link
href={`/profile/${address}`}
className="text-primary focus:underline hover:underline"
>
View Profile
</Link>
</div>
</div>
{/* <hr className="border-t-border w-full" />
<div className="w-full flex items-center gap-1">
<div className="h-12 bg-muted flex-1 rounded-lg"></div>
<div className="h-12 bg-muted flex-1 rounded-lg"></div>
</div> */}
</div>
}
asChild
>
<div
className="flex flex-1 items-center justify-center"
style={{ gap: `${avatarAndLabelGap}px` }}
<li
className={cn(
"group/user-chip inline-flex items-center justify-between gap-1.5 rounded-full border border-transparent bg-muted/80 p-2 text-sm hover:border-border hover:bg-muted",
className,
)}
>
{showAvatar && <EthAvatar address={address} size={avatarSize} />}
<Link
href={`/profile/${address}`}
style={{ flex: 1, minWidth: 0 }}
className="group/user-chip-link focus:outline-none"
tabIndex={0}
<div
className="flex flex-1 items-center justify-center"
style={{ gap: `${avatarAndLabelGap}px` }}
>
<input
ref={inputRef}
{showAvatar && <EthAvatar address={address} size={avatarSize} />}
<Link
href={`/profile/${address}`}
style={{ flex: 1, minWidth: 0 }}
className="group/user-chip-link focus:outline-none"
tabIndex={0}
>
<input
ref={inputRef}
className={cn(
"min-w-0 flex-1 cursor-pointer border-none bg-transparent outline-none focus:outline-none focus:ring-0",
ellipsisLocation === "end" ? "truncate" : "",
"group-focus/user-chip-link:text-primary group-hover/user-chip-link:text-primary group-focus/user-chip-link:underline group-hover/user-chip-link:underline",
)}
value={displayValue}
size={ellipsisLocation === "middle" ? 16 : 12}
readOnly
disabled
style={{
pointerEvents: "none",
width: "100%",
background: "transparent",
}}
/>
</Link>
</div>
{showCopyButton !== "never" && (
<button
type="button"
className={cn(
"min-w-0 flex-1 cursor-pointer border-none bg-transparent outline-none focus:outline-none focus:ring-0",
ellipsisLocation === "end" ? "truncate" : "",
"group-focus/user-chip-link:text-primary group-hover/user-chip-link:text-primary group-focus/user-chip-link:underline group-hover/user-chip-link:underline",
showCopyButton === "hover" ? "opacity-0" : "opacity-50",
"flex shrink-0 items-center justify-center rounded-full p-0 focus:opacity-100 group-hover/user-chip:opacity-100",
)}
value={displayValue}
size={ellipsisLocation === "middle" ? 16 : 12}
readOnly
disabled
style={{
pointerEvents: "none",
width: "100%",
background: "transparent",
height: `${avatarSize}px`,
width: `${avatarSize}px`,
}}
/>
</Link>
</div>
{showCopyButton !== "never" && (
<button
type="button"
className={cn(
showCopyButton === "hover" ? "opacity-0" : "opacity-50",
"flex shrink-0 items-center justify-center rounded-full p-0 focus:opacity-100 group-hover/user-chip:opacity-100",
)}
style={{
height: `${avatarSize}px`,
width: `${avatarSize}px`,
}}
onClick={() => {
copy(address);
}}
>
{isCopied ? (
<Check size={avatarSize / 1.75} />
) : (
<Copy size={avatarSize / 1.75} />
)}
</button>
)}
</li>
onClick={() => {
copy(address);
}}
>
{isCopied ? (
<Check size={avatarSize / 1.75} />
) : (
<Copy size={avatarSize / 1.75} />
)}
</button>
)}
</li>
</QuickTooltip>
);
};

Expand Down