Skip to content

Commit c04f073

Browse files
committed
feat: add copy button to mobile code examples
1 parent 4e89a0d commit c04f073

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

src/components/Homepage/useHome.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { GITHUB_REPO_URL } from "@/lib/constants"
2727
import SimpleDomainRegistryContent from "!!raw-loader!@/data/SimpleDomainRegistry.sol"
2828
import SimpleTokenContent from "!!raw-loader!@/data/SimpleToken.sol"
2929
import SimpleWalletContent from "!!raw-loader!@/data/SimpleWallet.sol"
30+
import { useClipboard, type UseClipboardReturn } from "@/hooks/useClipboard"
3031
import { useRtlFlip } from "@/hooks/useRtlFlip"
3132

3233
export const useHome = () => {
@@ -45,14 +46,15 @@ export const useHome = () => {
4546
setModalOpen(true)
4647
}
4748

48-
const codeExamples: CodeExample[] = [
49+
const codeExamples: (CodeExample & { clipboard: UseClipboardReturn })[] = [
4950
{
5051
title: t("page-index:page-index-developers-code-example-title-0"),
5152
description: t(
5253
"page-index:page-index-developers-code-example-description-0"
5354
),
5455
codeLanguage: "language-solidity",
5556
code: SimpleWalletContent,
57+
clipboard: useClipboard(SimpleWalletContent),
5658
},
5759
{
5860
title: t("page-index:page-index-developers-code-example-title-1"),
@@ -61,6 +63,7 @@ export const useHome = () => {
6163
),
6264
codeLanguage: "language-solidity",
6365
code: SimpleTokenContent,
66+
clipboard: useClipboard(SimpleTokenContent),
6467
},
6568
{
6669
title: t("page-index:page-index-developers-code-example-title-2"),
@@ -69,6 +72,7 @@ export const useHome = () => {
6972
),
7073
codeLanguage: "language-javascript",
7174
code: CreateWalletContent,
75+
clipboard: useClipboard(CreateWalletContent),
7276
},
7377
{
7478
title: t("page-index:page-index-developers-code-example-title-3"),
@@ -77,6 +81,7 @@ export const useHome = () => {
7781
),
7882
codeLanguage: "language-solidity",
7983
code: SimpleDomainRegistryContent,
84+
clipboard: useClipboard(SimpleDomainRegistryContent),
8085
},
8186
]
8287

src/hooks/useClipboard.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { useState } from "react"
22
import { useCopyToClipboard } from "usehooks-ts"
33

4-
type UseClipboardOptions = {
4+
export type UseClipboardOptions = {
55
/**
66
* timeout delay (in ms) to switch back to initial state once copied.
77
*/
88
timeout?: number
99
}
1010

11-
type UseClipboardReturn = {
11+
export type UseClipboardReturn = {
1212
value: string
1313
setValue: React.Dispatch<React.SetStateAction<string>>
1414
onCopy: () => void

src/pages/index.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { Fragment, lazy, Suspense } from "react"
22
import type { GetStaticProps, InferGetStaticPropsType } from "next"
33
import { serverSideTranslations } from "next-i18next/serverSideTranslations"
44
import { FaDiscord, FaGithub } from "react-icons/fa6"
5+
import { IoMdCopy } from "react-icons/io"
6+
import { MdCheck } from "react-icons/md"
57

68
import type {
79
AllMetricData,
@@ -25,7 +27,7 @@ import MainArticle from "@/components/MainArticle"
2527
import PageMetadata from "@/components/PageMetadata"
2628
import Swiper from "@/components/Swiper"
2729
import { TranslatathonBanner } from "@/components/Translatathon/TranslatathonBanner"
28-
import { ButtonLink } from "@/components/ui/buttons/Button"
30+
import { Button, ButtonLink } from "@/components/ui/buttons/Button"
2931
import {
3032
Card,
3133
CardBanner,
@@ -409,8 +411,12 @@ const HomePage = ({
409411
{/* Mobile */}
410412
<Accordion type="single" collapsible className="md:hidden">
411413
{codeExamples.map(
412-
({ title, description, code, codeLanguage }) => (
413-
<AccordionItem key={title} value={title}>
414+
({ title, description, code, codeLanguage, clipboard }) => (
415+
<AccordionItem
416+
key={title}
417+
value={title}
418+
className="relative"
419+
>
414420
<AccordionTrigger className="flex border-t px-6 py-4 hover:bg-background-highlight">
415421
<div className="flex flex-col items-start gap-y-0.5">
416422
<p className="text-md font-bold text-body">
@@ -431,6 +437,12 @@ const HomePage = ({
431437
>
432438
{code}
433439
</Codeblock>
440+
<Button
441+
onClick={clipboard.onCopy}
442+
className="absolute end-4 top-24"
443+
>
444+
{clipboard.hasCopied ? <MdCheck /> : <IoMdCopy />}
445+
</Button>
434446
</Suspense>
435447
</AccordionContent>
436448
</AccordionItem>

0 commit comments

Comments
 (0)