با کلیک بر روی React Component، متن را در کلیپ بورد کپی کنید

✨ در یوتیوب تماشا کنید | 🐙 گیت هاب | 🎮 نسخه ی نمایشی
بیایید یک کامپوننت React زیبا بسازیم که با کلیک کردن، متن را در کلیپ بورد کپی می کند. یک نماد کپی را در پایان نشان می دهد که نشان می دهد می توانید با متن تعامل داشته باشید، هنگامی که ماوس را نگه دارید روشن تر می شود و با کلیک کردن، نماد کپی به یک نماد بررسی تبدیل می شود.
این CopyText کامپوننت همان خصوصیات را دریافت می کند Text جزء پلاس content ویژگی که باید حاوی متنی برای کپی باشد. برای کسب اطلاعات بیشتر در مورد قابل استفاده مجدد Text جزء، این پست را بررسی کنید.
import { Text } from "lib/ui/Text"
import { CopyIcon } from "./icons/CopyIcon"
import styled from "styled-components"
import { getColor } from "./theme/getters"
import copy from "copy-to-clipboard"
import { defaultTransitionCSS } from "./animations/transitions"
import { useState } from "react"
import { Match } from "./Match"
import { CheckIcon } from "./icons/CheckIcon"
interface CopyTextProps extends React.ComponentProps<typeof Text> {
content: string
}
const IconWr = styled(Text)`
margin-left: 4px;
${defaultTransitionCSS};
color: ${getColor("textSupporting3")};
`
const Container = styled(Text)`
cursor: pointer;
&:hover ${IconWr} {
color: ${getColor("contrast")};
}
`
type IconToShow = "copy" | "copied"
export const CopyText = ({ content, children, ...rest }: CopyTextProps) => {
const [iconToShow, setIconToShow] = useState<IconToShow>("copy")
return (
<Container
onMouseLeave={() => setIconToShow("copy")}
onTouchEnd={() => setIconToShow("copy")}
onClick={() => {
copy(content)
setIconToShow("copied")
}}
{...rest}
>
{children}
<IconWr as="span">
<Match
value={iconToShow}
copy={() => <CopyIcon />}
copied={() => <CheckIcon />}
/>
</IconWr>
</Container>
)
}
این Container کامپوننت استایل های را تغییر می دهد Text جزء با اضافه کردن نشانگر به همراه افکت شناور که رنگ آن را تغییر می دهد IconWr جزء. داخل از Container ما بچه ها و IconWr مؤلفه ای که بسته به آن نماد کپی یا علامت چک را نشان می دهد iconToShow حالت. این Match کامپوننت یک کمک کننده ساده است که محتوا را بر اساس value ویژگی. جایگزین بهتری برای switch بیانیه.
import { ReactNode } from "react"
type MatchProps<T extends string | number | symbol> = Record<
T,
() => ReactNode
> & {
value: T
}
export function Match<T extends string | number | symbol>(
props: MatchProps<T>
) {
const render = props[props.value]
return <>{render()}</>
}
برای تجربه کاربری بهتر، ما آیکون کپی را به نماد چک در هنگام کلیک تغییر میدهیم و زمانی که کاربر ماوس را روی انگشت خود از صفحه لمسی خارج میکند، آن را به نماد کپی بازنشانی میکنیم.



