Skip to content

Commit 4a92fb7

Browse files
committed
Add copy to clipboard on the links page
1 parent fd62570 commit 4a92fb7

1 file changed

Lines changed: 28 additions & 2 deletions

File tree

apps/web/app/app.dub.co/(dashboard)/[slug]/links/[...link]/page-client.tsx

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,19 @@ import { TagSelect } from "@/ui/links/link-builder/tag-select";
2626
import { useLinkBuilderSubmit } from "@/ui/links/link-builder/use-link-builder-submit";
2727
import { useMetatags } from "@/ui/links/link-builder/use-metatags";
2828
import { LinkControls } from "@/ui/links/link-controls";
29-
import { useKeyboardShortcut, useMediaQuery } from "@dub/ui";
29+
import {
30+
Button,
31+
CircleCheck,
32+
Copy,
33+
useCopyToClipboard,
34+
useKeyboardShortcut,
35+
useMediaQuery,
36+
} from "@dub/ui";
3037
import { cn } from "@dub/utils";
3138
import { notFound, useParams, useRouter } from "next/navigation";
3239
import { memo, useEffect, useRef, useState } from "react";
3340
import { useFormContext, useFormState } from "react-hook-form";
41+
import { toast } from "sonner";
3442

3543
export function LinkPageClient() {
3644
const params = useParams<{ link: string | string[] }>();
@@ -78,7 +86,8 @@ function LinkBuilder({ link }: { link: ExpandedLinkProps }) {
7886
const router = useRouter();
7987
const workspace = useWorkspace();
8088

81-
const { isDesktop } = useMediaQuery();
89+
const { isDesktop, isMobile } = useMediaQuery();
90+
const [copied, copyToClipboard] = useCopyToClipboard();
8291

8392
const { control, handleSubmit, reset, getValues } =
8493
useFormContext<LinkFormData>();
@@ -155,6 +164,23 @@ function LinkBuilder({ link }: { link: ExpandedLinkProps }) {
155164
<div className="shrink-0">
156165
<LinkAnalyticsBadge link={link} />
157166
</div>
167+
<Button
168+
variant="secondary"
169+
className="h-7 w-fit px-2"
170+
text={isMobile ? undefined : "Copy"}
171+
icon={
172+
copied ? (
173+
<CircleCheck className="size-4" />
174+
) : (
175+
<Copy className="size-4" />
176+
)
177+
}
178+
onClick={() =>
179+
toast.promise(copyToClipboard(link.shortLink), {
180+
success: "Copied to clipboard!",
181+
})
182+
}
183+
/>
158184
<Controls link={link} />
159185
</div>
160186
</LinkBuilderHeader>

0 commit comments

Comments
 (0)