@chakra-ui/react#useClipboard TypeScript Examples
The following examples show how to use
@chakra-ui/react#useClipboard.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: CopyButton.tsx From lucide with ISC License | 6 votes |
CopyButton = ({ copyText, buttonText = 'copy', ...props }) => {
const { hasCopied, onCopy } = useClipboard(copyText);
return (
<Button onClick={onCopy} {...props}>
{hasCopied ? 'copied' : buttonText}
</Button>
);
}
Example #2
Source File: CopyLinkShareButton.tsx From coindrop with GNU General Public License v3.0 | 6 votes |
CopyLinkShareButton: FunctionComponent<Props> = (props) => {
const { textToCopy } = props;
const { onCopy, hasCopied } = useClipboard(textToCopy);
return (
<Button
leftIcon={hasCopied ? <CheckIcon /> : <LinkIcon />}
onClick={onCopy}
colorScheme="green"
>
{hasCopied ? "Copied" : "Copy Link"}
</Button>
);
}
Example #3
Source File: ShareEmbedButton.tsx From coindrop with GNU General Public License v3.0 | 6 votes |
ShareEmbedButton: FunctionComponent<Props> = ({ fullPublicUrl }) => {
const imageButtonHtml = `<a href="${fullPublicUrl}" target="_blank"><img src="${fullBaseUrl}embed-button.png" style="border-radius: 10px; height: 57px !important;width: 229px !important;" alt="Coindrop.to me"></img></a>`;
const { onCopy: onCopyImage, hasCopied: hasCopiedImage } = useClipboard(imageButtonHtml);
return (
<Box>
<Flex>
<Box>
<Heading
as="h2"
size="lg"
>
Button
</Heading>
</Box>
</Flex>
<>
<Box textAlign="center" my={3}>
<Image className={styles['coindrop-html-embed-button']} display="block" mx="auto" src="/embed-button.png" />
</Box>
<Box textAlign="center">
<Button
leftIcon={hasCopiedImage ? <CheckIcon /> : <SourceCodeIcon />} // TODO: Fix icon
colorScheme="green"
mb={1}
onClick={onCopyImage}
>
{hasCopiedImage ? 'Copied' : 'Copy Embed Code'}
</Button>
</Box>
</>
</Box>
);
}
Example #4
Source File: CodePanel.tsx From openchakra with MIT License | 5 votes |
CodePanel = () => {
const components = useSelector(getComponents)
const [code, setCode] = useState<string | undefined>(undefined)
useEffect(() => {
const getCode = async () => {
const code = await generateCode(components)
setCode(code)
}
getCode()
}, [components])
const { onCopy, hasCopied } = useClipboard(code!)
return (
<Box
zIndex={5}
p={4}
fontSize="sm"
backgroundColor="#011627"
overflow="auto"
position="absolute"
top={0}
bottom={0}
left={0}
right={0}
>
<Button
onClick={onCopy}
size="sm"
position="absolute"
textTransform="uppercase"
colorScheme="teal"
fontSize="xs"
height="24px"
top={4}
right="1.25em"
>
{hasCopied ? 'copied' : 'copy'}
</Button>
<Highlight
{...defaultProps}
theme={theme}
code={code || '// Formatting code… please wait ✨'}
language="jsx"
>
{({ className, style, tokens, getLineProps, getTokenProps }) => (
<pre className={className} style={style}>
{tokens.map((line, i) => (
<div {...getLineProps({ line, key: i })}>
{line.map((token, key) => (
<span {...getTokenProps({ token, key })} />
))}
</div>
))}
</pre>
)}
</Highlight>
</Box>
)
}
Example #5
Source File: JavascriptEmbedButton.tsx From coindrop with GNU General Public License v3.0 | 5 votes |
JavascriptEmbedButton: FunctionComponent<Props> = ({ publicUrl, piggybankName }) => {
const [customText, setCustomText] = useState(publicUrl);
const scriptButtonHtml = `<script type="text/javascript" src="${fullBaseUrl}embed-button.js" data-id="coindrop-button" data-slug="${piggybankName}" data-customText="${customText}" ></script>`;
const { onCopy: onCopyScript, hasCopied: hasCopiedScript } = useClipboard(scriptButtonHtml);
const initialShuffleTextArray = [publicUrl, ...shuffleCustomTextOptions];
const [shuffleTextArray] = useState(initialShuffleTextArray);
const [shuffleCustomTextIndex, setShuffleCustomTextIndex] = useState(0);
useEffect(() => {
setCustomText(shuffleTextArray[shuffleCustomTextIndex]);
}, [shuffleCustomTextIndex]);
const ButtonPreview: FunctionComponent<ButtonPreviewProps> = ({ text = "coindrop.to me", isHtmlOnly = false }) => (
<a href={`${fullBaseUrl}${piggybankName}`} target="_blank" rel="noreferrer">
<button type="button" className={isHtmlOnly ? `${styles["coindrop-button"]} ${styles["coindrop-html-button"]}` : styles["coindrop-button"]}>
<div className={styles["coindrop-button-content"]}>
<div className={styles["coindrop-svg"]}>{svg}</div>
<div>{text}</div>
</div>
</button>
</a>
);
return (
<Box>
<Box textAlign="center" mt={3}>
<ButtonPreview text={customText} />
</Box>
<Flex justify="center" align="center" textAlign="center" mb={3}>
<Input
variant="flushed"
width="350px"
value={customText}
textAlign="center"
onChange={(e) => setCustomText(e.target.value)}
/>
</Flex>
<Box textAlign="center">
<Flex justify="center" wrap="wrap">
<Button
leftIcon={<RepeatIcon />}
variant="outline"
colorScheme="green"
onClick={() => {
setShuffleCustomTextIndex(shuffleCustomTextIndex === shuffleCustomTextOptions.length - 1 ? 0 : shuffleCustomTextIndex + 1);
}}
mx={1}
mb={1}
>
Shake It Up
</Button>
<Button
leftIcon={hasCopiedScript ? <CheckIcon /> : <SourceCodeIcon />}
colorScheme="green"
mx={1}
mb={1}
onClick={onCopyScript}
>
{hasCopiedScript ? 'Copied' : 'Copy Code'}
</Button>
</Flex>
<Text fontSize="sm">For websites that support JavaScript embed</Text>
</Box>
</Box>
);
}
Example #6
Source File: PaymentMethodButtonModal.tsx From coindrop with GNU General Public License v3.0 | 5 votes |
PaymentMethodButtonModal: FunctionComponent<Props> = ({ isOpen, onClose, paymentMethod, paymentMethodDisplayName, paymentMethodValue }) => {
const { onCopy, hasCopied } = useClipboard(paymentMethodValue);
const { piggybankDbData } = useContext(PublicPiggybankDataContext);
const { name } = piggybankDbData;
const Icon = paymentMethodIcons[paymentMethod];
const addressIsUrl = isUrl(paymentMethodValue, {
require_protocol: true,
require_valid_protocol: true,
protocols: ['http', 'https'],
allow_protocol_relative_urls: false,
});
return (
<Modal isOpen={isOpen} onClose={onClose}>
<ModalOverlay />
<ModalContent mx={6}>
<ModalHeader
textAlign="center"
mt={3}
mx="auto"
>
{name}
{"'s "}
{paymentMethodDisplayName}
{' address'}
</ModalHeader>
<ModalCloseButton />
<ModalBody
pt={0}
mb={3}
mx="auto"
>
<Flex justify="center" align="center">
<Icon
mr={2}
boxSize="48px"
/>
<Text
wordBreak="break-all"
textAlign="center"
>
{paymentMethodValue}
</Text>
</Flex>
<Flex
my={2}
align="center"
justify="center"
>
{addressIsUrl ? (
<Link href={paymentMethodValue} isExternal>
<Button
leftIcon={<ExternalLinkIcon />}
href={paymentMethodValue}
mr={2}
>
Open
</Button>
</Link>
) : (
<Button
leftIcon={hasCopied ? <CheckIcon /> : <CopyIcon />}
onClick={onCopy}
>
{hasCopied ? "Copied" : "Copy"}
</Button>
)}
</Flex>
<Text mb={2} textAlign="center">or scan QR Code:</Text>
<Flex justify="center">
<QRCode
id="payment-method-qr-code"
value={paymentMethodValue}
size={225}
/>
</Flex>
</ModalBody>
</ModalContent>
</Modal>
);
}
Example #7
Source File: FusePoolInfoPage.tsx From rari-dApp with GNU Affero General Public License v3.0 | 4 votes |
OracleAndInterestRates = ({
assets,
name,
totalSuppliedUSD,
totalBorrowedUSD,
totalLiquidityUSD,
comptrollerAddress,
oracleAddress,
oracleModel,
}: {
assets: USDPricedFuseAsset[];
name: string;
totalSuppliedUSD: number;
totalBorrowedUSD: number;
totalLiquidityUSD: number;
comptrollerAddress: string;
oracleAddress: string;
oracleModel: string | undefined;
}) => {
let { poolId } = useParams();
const { t } = useTranslation();
const data = useExtraPoolInfo(comptrollerAddress, oracleAddress);
const defaultOracleIdentity = useIdentifyOracle(data?.defaultOracle);
console.log(data?.defaultOracle, { defaultOracleIdentity });
const { hasCopied, onCopy } = useClipboard(data?.admin ?? "");
return (
<Column
mainAxisAlignment="flex-start"
crossAxisAlignment="flex-start"
height="100%"
width="100%"
>
<Row
mainAxisAlignment="space-between"
crossAxisAlignment="center"
width="100%"
px={4}
height="60px"
flexShrink={0}
>
<Heading size="sm">
{t("Pool {{num}} Info", { num: poolId, name })}
</Heading>
<Link
className="no-underline"
isExternal
ml="auto"
href={`https://metrics.rari.capital/d/HChNahwGk/fuse-pool-details?orgId=1&refresh=10s&var-poolID=${poolId}`}
>
<DashboardBox height="35px">
<Center expand px={2} fontWeight="bold">
{t("Metrics")}
</Center>
</DashboardBox>
</Link>
{data?.isPowerfulAdmin ? (
<Link
/* @ts-ignore */
as={RouterLink}
className="no-underline"
to="../edit"
ml={2}
>
<DashboardBox height="35px">
<Center expand px={2} fontWeight="bold">
{t("Edit")}
</Center>
</DashboardBox>
</Link>
) : null}
</Row>
<ModalDivider />
<Column
mainAxisAlignment="center"
crossAxisAlignment="center"
width="100%"
my={4}
px={4}
>
{assets.length > 0 ? (
<>
<AvatarGroup mt={1} size="xs" max={30}>
{assets.map(({ underlyingToken, cToken }) => {
return <CTokenIcon key={cToken} address={underlyingToken} />;
})}
</AvatarGroup>
<Text mt={3} lineHeight={1} textAlign="center">
{name} (
{assets.map(({ underlyingSymbol }, index, array) => {
return (
underlyingSymbol + (index !== array.length - 1 ? " / " : "")
);
})}
)
</Text>
</>
) : (
<Text>{name}</Text>
)}
</Column>
<ModalDivider />
<Column
mainAxisAlignment="flex-start"
crossAxisAlignment="flex-start"
my={5}
px={4}
width="100%"
>
<StatRow
statATitle={t("Total Supplied")}
statA={shortUsdFormatter(totalSuppliedUSD)}
statBTitle={t("Total Borrowed")}
statB={shortUsdFormatter(totalBorrowedUSD)}
/>
<StatRow
statATitle={t("Available Liquidity")}
statA={shortUsdFormatter(totalLiquidityUSD)}
statBTitle={t("Pool Utilization")}
statB={
totalSuppliedUSD.toString() === "0"
? "0%"
: ((totalBorrowedUSD / totalSuppliedUSD) * 100).toFixed(2) + "%"
}
/>
<StatRow
statATitle={t("Upgradeable")}
statA={data ? (data.upgradeable ? "Yes" : "No") : "?"}
statBTitle={
hasCopied ? t("Admin (copied!)") : t("Admin (click to copy)")
}
statB={data?.admin ? shortAddress(data.admin) : "?"}
onClick={onCopy}
/>
<StatRow
statATitle={t("Platform Fee")}
statA={assets.length > 0 ? assets[0].fuseFee / 1e16 + "%" : "10%"}
statBTitle={t("Average Admin Fee")}
statB={
assets
.reduce(
(a, b, _, { length }) => a + b.adminFee / 1e16 / length,
0
)
.toFixed(1) + "%"
}
/>
<StatRow
statATitle={t("Close Factor")}
statA={
data?.closeFactor
? (data.closeFactor / 1e16).toFixed(2) + "%"
: "?%"
}
statBTitle={t("Liquidation Incentive")}
statB={
data?.liquidationIncentive
? data.liquidationIncentive / 1e16 - 100 + "%"
: "?%"
}
/>
<StatRow
statATitle={t("Oracle")}
statA={data ? oracleModel ?? t("Unrecognized Oracle") : "?"}
statBTitle={t("Whitelist")}
statB={data ? (data.enforceWhitelist ? "Yes" : "No") : "?"}
/>
</Column>
</Column>
);
}
Example #8
Source File: EditRewardsDistributorModal.tsx From rari-dApp with GNU Affero General Public License v3.0 | 4 votes |
EditRewardsDistributorModal = ({
rewardsDistributor,
pool,
isOpen,
onClose,
}: {
rewardsDistributor: RewardsDistributor;
pool: FusePoolData;
isOpen: boolean;
onClose: () => any;
}) => {
const { t } = useTranslation();
const { address, fuse } = useRari();
const rewardsDistributorInstance = useRewardsDistributorInstance(
rewardsDistributor.address
);
const tokenData = useTokenData(rewardsDistributor.rewardToken);
const isAdmin = address === rewardsDistributor.admin;
// Balances
const { data: balanceERC20 } = useTokenBalance(
rewardsDistributor.rewardToken,
rewardsDistributor.address
);
const { data: myBalance } = useTokenBalance(rewardsDistributor.rewardToken);
const toast = useToast();
// Inputs
const [sendAmt, setSendAmt] = useState<number>(0);
const [supplySpeed, setSupplySpeed] = useState<number>(0.001);
const [borrowSpeed, setBorrowSpeed] = useState<number>(0.001);
// Loading states
const [fundingDistributor, setFundingDistributor] = useState(false);
const [seizing, setSeizing] = useState(false);
const [changingSpeed, setChangingSpeed] = useState(false);
const [changingBorrowSpeed, setChangingBorrowSpeed] = useState(false);
const [selectedAsset, setSelectedAsset] = useState<
USDPricedFuseAsset | undefined
>(pool?.assets[0] ?? undefined);
// RewardsSpeeds
const [supplySpeedForCToken, borrowSpeedForCToken] = useRewardSpeedsOfCToken(
rewardsDistributor.address,
selectedAsset?.cToken
);
const { hasCopied, onCopy } = useClipboard(rewardsDistributor?.address ?? "");
// Sends tokens to distributor
const fundDistributor = async () => {
// Create ERC20 instance of rewardToken
const token = new fuse.web3.eth.Contract(
JSON.parse(
fuse.compoundContracts["contracts/EIP20Interface.sol:EIP20Interface"]
.abi
),
rewardsDistributor.rewardToken
);
setFundingDistributor(true);
try {
await token.methods
.transfer(
rewardsDistributor.address,
Fuse.Web3.utils
.toBN(sendAmt)
.mul(
Fuse.Web3.utils
.toBN(10)
.pow(Fuse.Web3.utils.toBN(tokenData?.decimals ?? 18))
)
)
.send({
from: address,
});
setFundingDistributor(false);
} catch (err) {
handleGenericError(err, toast);
setFundingDistributor(false);
}
};
// Adds LM to supply side of a CToken in this fuse pool
const changeSupplySpeed = async () => {
try {
if (!isAdmin) throw new Error("User is not admin of this Distributor!");
setChangingSpeed(true);
await rewardsDistributorInstance.methods
._setCompSupplySpeed(
selectedAsset?.cToken,
Fuse.Web3.utils.toBN(supplySpeed * 10 ** (tokenData?.decimals ?? 18)) // set supplySpeed to 0.001e18 for now
)
.send({ from: address });
setChangingSpeed(false);
} catch (err) {
handleGenericError(err, toast);
setChangingSpeed(false);
}
};
// Adds LM to supply side of a CToken in this fuse pool
const changeBorrowSpeed = async () => {
try {
if (!isAdmin) throw new Error("User is not admin of this Distributor!");
setChangingBorrowSpeed(true);
await rewardsDistributorInstance.methods
._setCompBorrowSpeed(
selectedAsset?.cToken,
Fuse.Web3.utils.toBN(borrowSpeed * 10 ** (tokenData?.decimals ?? 18)) // set supplySpeed to 0.001e18 for now
)
.send({ from: address });
setChangingBorrowSpeed(false);
} catch (err) {
handleGenericError(err, toast);
setChangingBorrowSpeed(false);
}
};
const handleSeizeTokens = async () => {
setSeizing(true);
if (isAdmin) {
await rewardsDistributorInstance.methods._grantComp(
address,
balanceERC20
);
} else {
toast({
title: "Admin Only!",
description: "Only admin can seize tokens!",
status: "error",
duration: 9000,
isClosable: true,
position: "top-right",
});
}
setSeizing(false);
};
return (
<Modal
motionPreset="slideInBottom"
isOpen={isOpen}
onClose={onClose}
isCentered
>
<ModalOverlay />
<ModalContent {...MODAL_PROPS}>
<Heading fontSize="27px" my={4} textAlign="center">
{t("Edit Rewards Distributor")}
</Heading>
<ModalDivider />
{/* RewardToken data */}
<Column
mainAxisAlignment="flex-start"
crossAxisAlignment="center"
p={4}
>
<>
{tokenData?.logoURL ? (
<Image
mt={4}
src={tokenData.logoURL}
boxSize="50px"
borderRadius="50%"
backgroundImage={`url(${SmallWhiteCircle})`}
backgroundSize="100% auto"
/>
) : null}
<Heading
my={tokenData?.symbol ? 3 : 6}
fontSize="22px"
color={tokenData?.color ?? "#FFF"}
>
{tokenData ? tokenData.name ?? "Invalid Address!" : "Loading..."}
</Heading>
<Text>
{balanceERC20 && tokenData && tokenData.decimals
? (
parseFloat(balanceERC20?.toString()) /
10 ** tokenData.decimals
).toFixed(3)
: 0}{" "}
{tokenData?.symbol}
</Text>
<Text onClick={onCopy}>
Contract: {shortAddress(rewardsDistributor.address)}{" "}
{hasCopied && "Copied!"}
</Text>
</>
</Column>
<AdminAlert
isAdmin={isAdmin}
mt={2}
isNotAdminText="You are not the admin of this RewardsDistributor. Only the admin can configure rewards."
/>
{/* Basic Info */}
<Column
mainAxisAlignment="flex-start"
crossAxisAlignment="flex-start"
py={4}
>
{/* <Row mainAxisAlignment="flex-start" crossAxisAlignment="center">
<Text>Address: {rewardsDistributor.address}</Text>
</Row>
<Row mainAxisAlignment="flex-start" crossAxisAlignment="center">
<Text>Admin: {rewardsDistributor.admin}</Text>
</Row>
<Row mainAxisAlignment="flex-start" crossAxisAlignment="center">
<Text>
Balance:{" "}
{balanceERC20 ? parseFloat(balanceERC20?.toString()) / 1e18 : 0}{" "}
{tokenData?.symbol}
</Text>
</Row> */}
<ModalDivider />
{/* Fund distributor */}
<Column
mainAxisAlignment="flex-start"
crossAxisAlignment="flex-start"
p={4}
>
<Heading fontSize={"lg"}> Fund Distributor </Heading>
<Row
mainAxisAlignment="flex-start"
crossAxisAlignment="center"
mt={1}
>
<NumberInput
step={0.1}
min={0}
onChange={(valueString) => {
console.log({ valueString });
setSendAmt(parseFloat(valueString));
}}
>
<NumberInputField
width="100%"
textAlign="center"
placeholder={"0 " + tokenData?.symbol}
/>
<NumberInputStepper>
<NumberIncrementStepper />
<NumberDecrementStepper />
</NumberInputStepper>
</NumberInput>
<Button
onClick={fundDistributor}
bg="black"
disabled={fundingDistributor}
>
{fundingDistributor ? <Spinner /> : "Send"}
</Button>
{isAdmin && (!balanceERC20?.isZero() ?? false) && (
<Button onClick={handleSeizeTokens} bg="red" disabled={seizing}>
{seizing ? <Spinner /> : "Withdraw Tokens"}
</Button>
)}
</Row>
<Text mt={1}>
Your balance:{" "}
{myBalance
? (
parseFloat(myBalance?.toString()) /
10 ** (tokenData?.decimals ?? 18)
).toFixed(2)
: 0}{" "}
{tokenData?.symbol}
</Text>
</Column>
{/* Add or Edit a CToken to the Distributor */}
{pool.assets.length ? (
<Column
mainAxisAlignment="flex-start"
crossAxisAlignment="flex-start"
p={4}
>
<Heading fontSize={"lg"}> Manage CToken Rewards </Heading>
{/* Select Asset */}
<Row
mainAxisAlignment="flex-start"
crossAxisAlignment="center"
mt={1}
>
{pool.assets.map(
(asset: USDPricedFuseAsset, index: number, array: any[]) => {
return (
<Box
pr={index === array.length - 1 ? 4 : 2}
key={asset.cToken}
flexShrink={0}
>
<DashboardBox
as="button"
onClick={() => setSelectedAsset(asset)}
{...(asset.cToken === selectedAsset?.cToken
? activeStyle
: noop)}
>
<Center expand px={4} py={1} fontWeight="bold">
{asset.underlyingSymbol}
</Center>
</DashboardBox>
</Box>
);
}
)}
</Row>
{/* Change Supply Speed */}
<Column
mainAxisAlignment="flex-start"
crossAxisAlignment="flex-start"
py={3}
>
<Row
mainAxisAlignment="flex-start"
crossAxisAlignment="flex-start"
>
<NumberInput
step={0.1}
min={0}
onChange={(supplySpeed) => {
console.log({ supplySpeed });
setSupplySpeed(parseFloat(supplySpeed));
}}
>
<NumberInputField
width="100%"
textAlign="center"
placeholder={"0 " + tokenData?.symbol}
/>
<NumberInputStepper>
<NumberIncrementStepper />
<NumberDecrementStepper />
</NumberInputStepper>
</NumberInput>
<Button
onClick={changeSupplySpeed}
bg="black"
disabled={changingSpeed || !isAdmin}
>
{changingSpeed ? <Spinner /> : "Set"}
</Button>
</Row>
<Row
mainAxisAlignment="flex-start"
crossAxisAlignment="flex-start"
>
<Text>
Supply Speed:{" "}
{(parseFloat(supplySpeedForCToken) / 1e18).toFixed(4)}
</Text>
</Row>
</Column>
{/* Change Borrow Speed */}
<Column
mainAxisAlignment="flex-start"
crossAxisAlignment="flex-start"
py={3}
>
<Row
mainAxisAlignment="flex-start"
crossAxisAlignment="flex-start"
>
<NumberInput
step={0.1}
min={0}
onChange={(borrowSpeed) => {
console.log({ borrowSpeed });
setBorrowSpeed(parseFloat(borrowSpeed));
}}
>
<NumberInputField
width="100%"
textAlign="center"
placeholder={"0 " + tokenData?.symbol}
/>
<NumberInputStepper>
<NumberIncrementStepper />
<NumberDecrementStepper />
</NumberInputStepper>
</NumberInput>
<Button
onClick={changeBorrowSpeed}
bg="black"
disabled={changingBorrowSpeed || !isAdmin}
>
{changingBorrowSpeed ? <Spinner /> : "Set"}
</Button>
</Row>
<Row
mainAxisAlignment="flex-start"
crossAxisAlignment="flex-start"
>
<Text>
Borrow Speed:{" "}
{(parseFloat(borrowSpeedForCToken) / 1e18).toFixed(2)}
</Text>
</Row>
</Column>
</Column>
) : (
<Center p={4}>
<Text fontWeight="bold">
Add CTokens to this pool to configure their rewards.
</Text>
</Center>
)}
</Column>
</ModalContent>
</Modal>
);
}