@turnkey/react-wallet-kit
Version:
The easiest and most powerful way to integrate Turnkey's Embedded Wallets into your React applications.
133 lines (129 loc) • 5 kB
JavaScript
'use strict';
var jsxRuntime = require('react/jsx-runtime');
var react$1 = require('@headlessui/react');
var core = require('@turnkey/core');
var sdkTypes = require('@turnkey/sdk-types');
var Buttons = require('../design/Buttons.js');
var reactFontawesome = require('@fortawesome/react-fontawesome');
var freeSolidSvgIcons = require('@fortawesome/free-solid-svg-icons');
var react = require('react');
var Hook$1 = require('../../providers/modal/Hook.js');
var Hook = require('../../providers/client/Hook.js');
var Success = require('../design/Success.js');
var clsx = require('clsx');
function SignMessageModal(props) {
const {
message,
walletAccount,
subText = "Use your wallet to sign this message",
stampWith,
successPageDuration,
organizationId,
onSuccess,
onError
} = props;
const {
signMessage
} = Hook.useTurnkey();
const {
pushPage,
closeModal,
isMobile
} = Hook$1.useModal();
const [loading, setLoading] = react.useState(false);
const textareaRef = react.useRef(null);
react.useEffect(() => {
const textarea = textareaRef.current;
if (textarea) {
textarea.style.height = "auto"; // reset height
textarea.style.height = `${Math.min(textarea.scrollHeight, 288)}px`; // max-h-72 = 288px
}
}, [message]);
const handleSign = async () => {
try {
setLoading(true);
const result = await signMessage({
message,
walletAccount,
...(props?.encoding && {
encoding: props.encoding
}),
...(props?.hashFunction && {
hashFunction: props.hashFunction
}),
...(props?.addEthereumPrefix && {
addEthereumPrefix: props.addEthereumPrefix
}),
...(stampWith && {
stampWith
}),
...(organizationId && {
organizationId
})
});
handleSuccess(result);
} catch (error) {
if (error instanceof sdkTypes.TurnkeyError) onError(error);else {
const tkError = new sdkTypes.TurnkeyError("Failed to sign message", sdkTypes.TurnkeyErrorCodes.SIGN_MESSAGE_ERROR);
onError(tkError);
}
} finally {
setLoading(false);
}
};
const handleSuccess = result => {
onSuccess(result); // Run the success callback first before showing the success page.
if (!successPageDuration) {
closeModal();
return;
}
pushPage({
key: "success",
content: jsxRuntime.jsx(Success.SuccessPage, {
text: "Message signed successfully!",
duration: successPageDuration,
onComplete: () => {
closeModal();
}
}),
preventBack: true,
showTitle: false
});
};
return jsxRuntime.jsxs("div", {
className: clsx("flex flex-col items-center", isMobile ? "w-full py-4" : "w-80 p-4"),
children: [jsxRuntime.jsx("p", {
className: "mt-3 text-sm text-icon-text-light/70 dark:text-icon-text-dark/70",
children: subText
}), jsxRuntime.jsxs("div", {
className: "w-full flex flex-row items-center mt-1 gap-1.5 text-sm text-icon-text-light/70 dark:text-icon-text-dark/70",
children: [jsxRuntime.jsx("div", {
className: "flex items-center justify-center w-7 h-7 rounded-full bg-icon-background-light dark:bg-icon-background-dark text-icon-text-light dark:text-icon-text-dark",
children: jsxRuntime.jsx(reactFontawesome.FontAwesomeIcon, {
icon: freeSolidSvgIcons.faWallet
})
}), walletAccount.address?.length > 8 ? `${walletAccount.address.slice(0, 4)}...${walletAccount.address.slice(-4)}` : walletAccount.address, walletAccount.source === core.WalletSource.Connected && jsxRuntime.jsx("div", {
className: "rounded-full py-1 px-2 flex border border-primary-light/50 dark:border-primary-dark/50 text-primary-light dark:text-primary-dark text-xs font-medium",
children: "External"
})]
}), jsxRuntime.jsx("div", {
className: "w-full flex flex-col mt-2 px-3 space-y-2",
children: jsxRuntime.jsx(react$1.Textarea, {
ref: textareaRef,
className: "p-2 min-h-12 max-h-72 rounded-md tk-scrollbar border border-modal-background-dark/10 dark:border-modal-background-light/10 bg-icon-background-light dark:bg-icon-background-dark text-icon-text-light dark:text-icon-text-dark focus:outline-none resize-none overflow-y-auto",
value: message,
readOnly: true
})
}), jsxRuntime.jsx(Buttons.ActionButton, {
onClick: handleSign,
name: "sign-button",
spinnerClassName: "text-primary-text-light dark:text-primary-text-dark",
loading: loading,
loadingText: walletAccount.source === core.WalletSource.Connected ? "Check your external wallet!" : "Signing...",
className: "mt-4 bg-primary-light dark:bg-primary-dark text-primary-text-light dark:text-primary-text-dark w-full",
children: "Sign"
})]
});
}
exports.SignMessageModal = SignMessageModal;
//# sourceMappingURL=Message.js.map