diff options
| author | Maze Winther <mazewinther@gmail.com> | 2026-04-15 02:05:41 +0200 |
|---|---|---|
| committer | Maze Winther <mazewinther@gmail.com> | 2026-04-15 02:05:41 +0200 |
| commit | 370944f443cb997ef71dda0c8ef6f4e92bea87d7 (patch) | |
| tree | 7a841c0291adb7c261f692121b81a3e9d1a9c615 /apps/web/src/app/changelog/components/copy-markdown-button.tsx | |
| parent | c839db92341b9058eac3ff92cc586df060b768da (diff) | |
| download | opencut-370944f443cb997ef71dda0c8ef6f4e92bea87d7.tar.gz | |
feat: new-release notice and colocate changelog under domain
Diffstat (limited to 'apps/web/src/app/changelog/components/copy-markdown-button.tsx')
| -rw-r--r-- | apps/web/src/app/changelog/components/copy-markdown-button.tsx | 98 |
1 files changed, 0 insertions, 98 deletions
diff --git a/apps/web/src/app/changelog/components/copy-markdown-button.tsx b/apps/web/src/app/changelog/components/copy-markdown-button.tsx deleted file mode 100644 index bc7e94bf..00000000 --- a/apps/web/src/app/changelog/components/copy-markdown-button.tsx +++ /dev/null @@ -1,98 +0,0 @@ -"use client"; - -import { useState } from "react"; -import { CheckIcon, ClipboardIcon } from "lucide-react"; -import { - getSectionTitle, - groupAndOrderChanges, - isSectionCollapsible, -} from "../utils"; -import type { Change } from "../utils"; -import { cn } from "@/utils/ui"; -import { Button } from "@/components/ui/button"; - -function buildMarkdown({ - description, - changes, -}: { - description?: string; - changes: Change[]; -}): string { - const lines: string[] = []; - - if (description) { - lines.push(description, ""); - } - - const { grouped, orderedTypes } = groupAndOrderChanges({ changes }); - - for (const type of orderedTypes) { - if (isSectionCollapsible({ type })) { - lines.push( - buildCollapsibleMarkdownSection({ - title: getSectionTitle({ type }), - changes: grouped[type], - }), - "", - ); - continue; - } - - lines.push(`## ${getSectionTitle({ type })}`); - for (const change of grouped[type]) { - lines.push(`- ${change.text}`); - } - lines.push(""); - } - - return lines.join("\n").trimEnd(); -} - -function buildCollapsibleMarkdownSection({ - title, - changes, -}: { - title: string; - changes: Change[]; -}): string { - const bulletLines = changes.map((change) => `- ${change.text}`).join("\n"); - - return `<details>\n<summary>${title}</summary>\n\n${bulletLines}\n\n</details>`; -} - -export function CopyMarkdownButton({ - description, - changes, -}: { - description?: string; - changes: Change[]; -}) { - const [copied, setCopied] = useState(false); - - const handleCopy = async () => { - const markdown = buildMarkdown({ description, changes }); - await navigator.clipboard.writeText(markdown); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - }; - - return ( - <Button - size="sm" - variant="text" - onClick={handleCopy} - className={cn( - "flex items-center gap-1.5", - copied && "pointer-events-none", - )} - title="Copy as markdown" - > - {copied ? ( - <CheckIcon className="size-4" /> - ) : ( - <ClipboardIcon className="size-4" /> - )} - {copied ? "Copied!" : "Copy markdown"} - </Button> - ); -} |
