icns-frontend/components/final-check-modal/index.tsx

344 lines
7.9 KiB
TypeScript
Raw Normal View History

2022-12-19 08:30:00 +00:00
import Image from "next/image";
import { useRouter } from "next/router";
2022-12-17 16:51:29 +00:00
import { FunctionComponent } from "react";
import ReactModal from "react-modal";
import styled from "styled-components";
2022-12-19 08:30:00 +00:00
import { MINIMUM_OSMO_FEE } from "../../constants/wallet";
import color from "../../styles/color";
2022-12-17 16:51:29 +00:00
import { PrimaryButton } from "../primary-button";
import { SecondaryButton } from "../secondary-button";
import { Tooltip } from "react-tooltip";
2022-12-17 16:51:29 +00:00
interface Props {
twitterUserName: string | undefined;
walletInfo:
| { name: string; pubKey: Uint8Array; bech32Address: string }
| undefined;
isModalOpen: boolean;
onCloseModal: () => void;
onClickRegisterButton: () => Promise<void>;
isLoadingRegistration?: boolean;
2022-12-17 16:51:29 +00:00
}
export const FinalCheckModal: FunctionComponent<Props> = (props) => {
const {
twitterUserName,
walletInfo,
isModalOpen,
onCloseModal,
onClickRegisterButton,
isLoadingRegistration,
2022-12-17 16:51:29 +00:00
} = props;
const router = useRouter();
return (
<ReactModal
isOpen={isModalOpen}
onRequestClose={onCloseModal}
ariaHideApp={false}
style={{
overlay: { background: "#121212cc" },
content: {
top: "50%",
left: "50%",
right: "auto",
bottom: "auto",
padding: 0,
marginRight: "-50%",
transform: "translate(-50%, -50%)",
background: color.grey["800"],
border: 0,
},
}}
>
<ModalContainer>
<ModalTitle>Final Checks</ModalTitle>
2022-12-19 10:46:52 +00:00
<ModalDescription>{`You are claiming the ICNS name "${twitterUserName}" on Keplr account`}</ModalDescription>
2022-12-18 13:47:24 +00:00
<NameBox
marginTop="3.875rem"
icon={
2022-12-17 16:51:29 +00:00
<Image
2022-12-18 13:47:24 +00:00
src={require("../../public/images/icons/twitter-small.png")}
alt="twitter"
width={24}
height={24}
style={{
marginRight: "4px",
}}
2022-12-17 16:51:29 +00:00
/>
2022-12-18 13:47:24 +00:00
}
2022-12-19 10:46:52 +00:00
title="Your Twitter Handle"
2022-12-20 07:58:21 +00:00
content={`@${twitterUserName}`}
2022-12-18 13:47:24 +00:00
/>
<div
style={{
width: "100%",
2022-12-19 10:46:52 +00:00
height: "3.25rem",
2022-12-18 13:47:24 +00:00
display: "flex",
alignItems: "center",
justifyContent: "center",
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="48"
height="48"
fill="none"
viewBox="0 0 48 48"
>
<path
stroke="#EBEBEB"
strokeLinecap="round"
strokeWidth="2"
d="M18.44 19.008h-2.656a5.162 5.162 0 00-5.162 5.162v0a5.162 5.162 0 005.162 5.162h2.655M29.305 28.988h2.655a5.162 5.162 0 005.162-5.162v0a5.162 5.162 0 00-5.162-5.162h-2.655M19.295 24.242h9.155"
/>
</svg>
</div>
<NameBox
marginTop="0"
icon={
<Image
src={require("../../public/images/icons/keplr-small.png")}
alt="twitter"
width={20}
height={20}
style={{
marginRight: "8px",
}}
/>
}
2022-12-20 07:58:21 +00:00
title="Keplr Account"
content={walletInfo?.name || "Keplr Account"}
contentTooltip={{
id: "address-tooltip",
content: walletInfo?.bech32Address || "",
}}
2022-12-18 13:47:24 +00:00
/>
2022-12-17 16:51:29 +00:00
2022-12-18 13:47:24 +00:00
<SubTextsContainer>
2022-12-19 10:46:52 +00:00
<SubTextList>
<SubTextListItem>
ICNS name can only be claimed once per Twitter account.
</SubTextListItem>
<SubTextListItem>
ICNS name cant be transferred at this time.
</SubTextListItem>
<SubTextListItem>
Please make sure youve selected the right account on your wallet.
</SubTextListItem>
2022-12-20 07:58:21 +00:00
<SubTextListItem>
This is an irreversible onchain trasaction.
</SubTextListItem>
2022-12-19 10:46:52 +00:00
</SubTextList>
2022-12-18 13:47:24 +00:00
<SubText>
2022-12-19 10:46:52 +00:00
{MINIMUM_OSMO_FEE} will be spent as a spam-prevention fee.
2022-12-18 13:47:24 +00:00
</SubText>
</SubTextsContainer>
2022-12-17 16:51:29 +00:00
<ButtonContainer>
<RegisterButton>
<PrimaryButton
onClick={onClickRegisterButton}
isLoading={isLoadingRegistration}
>
2022-12-17 16:51:29 +00:00
Register
</PrimaryButton>
</RegisterButton>
2022-12-18 13:47:24 +00:00
<CancelButton>
<SecondaryButton
onClick={async () => {
await router.push("/");
}}
>
Use a different account
</SecondaryButton>
</CancelButton>
2022-12-17 16:51:29 +00:00
</ButtonContainer>
</ModalContainer>
</ReactModal>
);
};
const ModalContainer = styled.div`
display: flex;
flex-direction: column;
2022-12-19 10:46:52 +00:00
max-width: 37.5rem;
2022-12-17 16:51:29 +00:00
2022-12-18 13:47:24 +00:00
padding: 2rem 2.25rem;
2022-12-17 16:51:29 +00:00
font-family: "Inter", serif;
font-style: normal;
2022-12-18 13:47:24 +00:00
`;
2022-12-17 16:51:29 +00:00
2022-12-18 13:47:24 +00:00
const ModalTitle = styled.div`
font-weight: 600;
font-size: 1.625rem;
line-height: 1.94rem;
2022-12-17 16:51:29 +00:00
color: ${color.white};
2022-12-20 05:52:38 +00:00
margin-bottom: 1rem;
2022-12-17 16:51:29 +00:00
`;
2022-12-18 13:47:24 +00:00
const ModalDescription = styled.div`
2022-12-19 10:46:52 +00:00
font-weight: 400;
font-size: 0.875rem;
2022-12-18 13:47:24 +00:00
line-height: 1.18rem;
2022-12-17 16:51:29 +00:00
2022-12-18 13:47:24 +00:00
color: ${color.grey["100"]};
2022-12-17 16:51:29 +00:00
`;
2022-12-18 13:47:24 +00:00
const SubTextsContainer = styled.div`
margin-top: 1.75rem;
2022-12-17 16:51:29 +00:00
2022-12-19 10:46:52 +00:00
padding: 1rem 1.75rem;
2022-12-18 13:47:24 +00:00
background-color: ${color.grey["700"]};
2022-12-17 16:51:29 +00:00
`;
2022-12-19 10:46:52 +00:00
const SubTextList = styled.ul`
margin: 0 0 1rem;
padding: 0 0.75rem;
`;
const SubTextListItem = styled.li`
font-weight: 400;
font-size: 0.815rem;
2022-12-17 16:51:29 +00:00
line-height: 1.5rem;
color: ${color.grey["300"]};
`;
2022-12-19 10:46:52 +00:00
const SubText = styled.div`
font-weight: 600;
font-size: 13px;
line-height: 1.5rem;
color: ${color.grey["200"]};
2022-12-17 16:51:29 +00:00
`;
2022-12-18 13:47:24 +00:00
const ButtonContainer = styled.div`
display: flex;
flex-direction: column;
align-items: center;
margin-top: 1.75rem;
`;
2022-12-17 16:51:29 +00:00
2022-12-18 13:47:24 +00:00
const RegisterButton = styled.div`
width: 60%;
height: 4.125rem;
`;
const CancelButton = styled.div`
width: 80%;
2022-12-19 10:46:52 +00:00
margin-top: 0.75rem;
2022-12-17 16:51:29 +00:00
`;
2022-12-18 13:47:24 +00:00
const NameBox: FunctionComponent<{
title: string;
content: string;
contentTooltip?: {
id: string;
content: string;
};
2022-12-18 13:47:24 +00:00
icon?: React.ReactElement;
marginTop: string;
}> = ({ icon, title, content, contentTooltip, marginTop }) => {
2022-12-18 13:47:24 +00:00
return (
<NameBoxContainer
style={{
marginTop,
}}
>
<NameBoxTitleContainer>
{icon ? <NameBoxIconContainer>{icon}</NameBoxIconContainer> : null}
<NameBoxTitle>{title}</NameBoxTitle>
</NameBoxTitleContainer>
<NameBoxContentContainer
style={{
textDecoration: contentTooltip ? "underline" : undefined,
}}
>
<div
id={contentTooltip?.id}
data-tooltip-content={contentTooltip?.content}
data-tooltip-place="top"
>
{content}
</div>
{contentTooltip ? (
<Tooltip
anchorId={contentTooltip.id}
style={{
backgroundColor: color.grey["400"],
color: color.white,
fontStyle: "normal",
fontWeight: 400,
fontSize: "14px",
lineHeight: "17px",
}}
/>
) : null}
</NameBoxContentContainer>
2022-12-18 13:47:24 +00:00
</NameBoxContainer>
);
};
const NameBoxContainer = styled.div`
position: relative;
2022-12-17 16:51:29 +00:00
2022-12-18 13:47:24 +00:00
display: flex;
flex-direction: column;
2022-12-17 16:51:29 +00:00
2022-12-18 13:47:24 +00:00
font-family: "Inter", serif;
font-style: normal;
2022-12-17 16:51:29 +00:00
`;
2022-12-18 13:47:24 +00:00
const NameBoxTitleContainer = styled.div`
position: absolute;
top: -1.9rem;
2022-12-17 16:51:29 +00:00
display: flex;
flex-direction: row;
2022-12-18 13:47:24 +00:00
align-items: center;
`;
2022-12-17 16:51:29 +00:00
2022-12-18 13:47:24 +00:00
const NameBoxIconContainer = styled.div`
display: flex;
align-items: center;
2022-12-17 16:51:29 +00:00
2022-12-18 13:47:24 +00:00
height: 1px;
2022-12-17 16:51:29 +00:00
`;
2022-12-18 13:47:24 +00:00
const NameBoxTitle = styled.div`
2022-12-19 10:46:52 +00:00
font-weight: 500;
2022-12-20 05:52:38 +00:00
font-size: 0.875rem;
line-height: 1.05rem;
2022-12-18 13:47:24 +00:00
2022-12-19 10:46:52 +00:00
color: ${color.grey["100"]};
2022-12-18 13:47:24 +00:00
`;
const NameBoxContentContainer = styled.div`
display: flex;
align-items: center;
justify-content: center;
2022-12-19 10:46:52 +00:00
padding: 2rem 0;
2022-12-18 13:47:24 +00:00
2022-12-19 10:46:52 +00:00
background-color ${color.grey["600"]};
2022-12-18 13:47:24 +00:00
border: 1px solid ${color.grey["300"]};
font-weight: 600;
2022-12-19 10:46:52 +00:00
font-size: 1.375rem;
line-height: 1.6875rem;
2022-12-18 13:47:24 +00:00
color: ${color.white}
2022-12-17 16:51:29 +00:00
`;