Skip to content

Commit 4fe0d28

Browse files
committed
Update open in chat
1 parent 1ac23c8 commit 4fe0d28

File tree

3 files changed

+101
-250
lines changed

3 files changed

+101
-250
lines changed

apps/docs/app/(docs)/[[...slug]]/page.tsx

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,27 @@
1+
import {
2+
OpenIn,
3+
OpenInChatGPT,
4+
OpenInClaude,
5+
OpenInContent,
6+
OpenInCursor,
7+
OpenInScira,
8+
OpenInSeparator,
9+
OpenInT3,
10+
OpenInTrigger,
11+
OpenInv0,
12+
} from "@repo/elements/open-in-chat";
13+
import { Button } from "@repo/shadcn-ui/components/ui/button";
114
import { createRelativeLink } from "fumadocs-ui/mdx";
215
import {
316
DocsBody,
417
DocsDescription,
518
DocsPage,
619
DocsTitle,
720
} from "fumadocs-ui/page";
21+
import { ChevronDownIcon } from "lucide-react";
822
import type { Metadata } from "next";
923
import { notFound } from "next/navigation";
10-
import { LLMCopyButton, ViewOptions } from "@/components/page-actions";
24+
import { CopyMarkdown } from "@/components/copy-markdown";
1125
import { source } from "@/lib/source";
1226
import { getMDXComponents } from "@/mdx-components";
1327

@@ -22,6 +36,12 @@ export default async function Page(props: PageProps<"/[[...slug]]">) {
2236
const MDXContent = page.data.body;
2337
const parsedUrl = page.url === "/" ? "/index" : page.url;
2438
const markdownUrl = `/elements${parsedUrl}.mdx`;
39+
const protocol = process.env.NODE_ENV === "production" ? "https" : "http";
40+
const fullMarkdownUrl = new URL(
41+
markdownUrl,
42+
`${protocol}://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`
43+
);
44+
const query = `Read ${fullMarkdownUrl}, I want to ask questions about it.`;
2545

2646
return (
2747
<DocsPage
@@ -37,11 +57,30 @@ export default async function Page(props: PageProps<"/[[...slug]]">) {
3757
<DocsTitle>{page.data.title}</DocsTitle>
3858
<DocsDescription>{page.data.description}</DocsDescription>
3959
<div className="-mt-8 mb-8 flex flex-row items-center gap-2">
40-
<LLMCopyButton markdownUrl={markdownUrl} />
41-
<ViewOptions
42-
githubUrl={`https://github.com/vercel/ai-elements/blob/main/apps/docs/content/docs/${page.path}`}
43-
markdownUrl={markdownUrl}
44-
/>
60+
<CopyMarkdown markdownUrl={markdownUrl} />
61+
<OpenIn query={query}>
62+
<OpenInTrigger>
63+
<Button size="sm" type="button" variant="outline">
64+
Open in
65+
<ChevronDownIcon className="size-4" />
66+
</Button>
67+
</OpenInTrigger>
68+
<OpenInContent
69+
align="end"
70+
alignOffset={-36}
71+
collisionPadding={8}
72+
side="bottom"
73+
sideOffset={8}
74+
>
75+
<OpenInv0 />
76+
<OpenInSeparator />
77+
<OpenInChatGPT />
78+
<OpenInClaude />
79+
<OpenInT3 />
80+
<OpenInScira />
81+
<OpenInCursor />
82+
</OpenInContent>
83+
</OpenIn>
4584
</div>
4685
<DocsBody>
4786
<MDXContent
@@ -57,9 +96,9 @@ export default async function Page(props: PageProps<"/[[...slug]]">) {
5796

5897
export const generateStaticParams = () => source.generateParams();
5998

60-
export async function generateMetadata(
99+
export const generateMetadata = async (
61100
props: PageProps<"/[[...slug]]">
62-
): Promise<Metadata> {
101+
): Promise<Metadata> => {
63102
const params = await props.params;
64103
const page = source.getPage(params.slug);
65104

@@ -102,4 +141,4 @@ export async function generateMetadata(
102141
creator: "@vercel",
103142
},
104143
};
105-
}
144+
};
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
"use client";
2+
3+
import { Button } from "@repo/shadcn-ui/components/ui/button";
4+
import { useCopyButton } from "fumadocs-ui/utils/use-copy-button";
5+
import { Check, Copy } from "lucide-react";
6+
import { useState } from "react";
7+
8+
const cache = new Map<string, string>();
9+
10+
type CopyMarkdownProps = {
11+
markdownUrl: string;
12+
};
13+
14+
export const CopyMarkdown = ({ markdownUrl }: CopyMarkdownProps) => {
15+
const [isLoading, setLoading] = useState(false);
16+
const [checked, onClick] = useCopyButton(async () => {
17+
const cached = cache.get(markdownUrl);
18+
if (cached) {
19+
navigator.clipboard.writeText(cached);
20+
return;
21+
}
22+
23+
setLoading(true);
24+
25+
try {
26+
await navigator.clipboard.write([
27+
new ClipboardItem({
28+
"text/plain": fetch(markdownUrl).then(async (res) => {
29+
const content = await res.text();
30+
cache.set(markdownUrl, content);
31+
32+
return content;
33+
}),
34+
}),
35+
]);
36+
} finally {
37+
setLoading(false);
38+
}
39+
});
40+
41+
return (
42+
<Button
43+
className="shadow-none"
44+
disabled={isLoading}
45+
onClick={onClick}
46+
type="button"
47+
variant="secondary"
48+
>
49+
{checked ? <Check /> : <Copy />}
50+
Copy Markdown
51+
</Button>
52+
);
53+
};

apps/docs/components/page-actions.tsx

Lines changed: 0 additions & 241 deletions
This file was deleted.

0 commit comments

Comments
 (0)