2022-12-17 14:45:50 +00:00
import * as amplitude from "@amplitude/analytics-browser" ;
2022-12-12 08:16:16 +00:00
import Image from "next/image" ;
2022-12-19 14:19:30 +00:00
import styled , { keyframes } from "styled-components" ;
2022-12-12 08:16:16 +00:00
2022-12-12 08:40:36 +00:00
import Typed from "react-typed" ;
2022-12-12 08:16:16 +00:00
import { Logo } from "../../components/logo" ;
import color from "../../styles/color" ;
import AlertCircleOutlineIcon from "../../public/images/svg/alert-circle-outline.svg" ;
2022-12-20 08:15:23 +00:00
2022-12-14 07:52:05 +00:00
import { useRouter } from "next/router" ;
2022-12-15 15:43:18 +00:00
import { useEffect , useState } from "react" ;
2022-12-14 07:52:05 +00:00
import { TendermintTxTracer } from "@keplr-wallet/cosmos" ;
2022-12-15 15:43:18 +00:00
import { queryAddressesFromTwitterName } from "../../queries" ;
import { RegisteredAddresses } from "../../types" ;
import { SHARE_URL } from "../../constants/twitter" ;
2022-12-19 12:59:59 +00:00
import { RPC_URL } from "../../constants/icns" ;
2022-12-12 08:16:16 +00:00
export default function CompletePage() {
2022-12-14 07:52:05 +00:00
const router = useRouter ( ) ;
2022-12-15 15:43:18 +00:00
const [ registeredAddressed , setRegisteredAddressed ] =
useState < RegisteredAddresses [ ] > ( ) ;
const [ availableAddress , setAvailableAddress ] = useState ( "" ) ;
2022-12-16 16:57:10 +00:00
const [ isSuccess , setIsSuccess ] = useState < boolean > ( false ) ;
2022-12-14 07:52:05 +00:00
useEffect ( ( ) = > {
2022-12-15 15:43:18 +00:00
const { txHash , twitterUsername } = router . query ;
if ( txHash && twitterUsername ) {
initialize ( txHash as string , twitterUsername as string ) ;
2022-12-14 07:52:05 +00:00
}
2022-12-15 15:43:18 +00:00
} , [ router . query ] ) ;
2022-12-14 07:52:05 +00:00
2022-12-15 15:43:18 +00:00
const initialize = async ( txHash : string , twitterUserName : string ) = > {
2022-12-19 12:59:59 +00:00
const txTracer = new TendermintTxTracer ( RPC_URL , "/websocket" ) ;
2022-12-14 07:52:05 +00:00
2022-12-16 16:57:10 +00:00
try {
const result : { code? : number } = await txTracer . traceTx (
Buffer . from ( txHash , "hex" ) ,
) ;
2022-12-14 07:52:05 +00:00
2022-12-16 16:57:10 +00:00
if ( ! result . code || result . code === 0 ) {
2022-12-17 14:45:50 +00:00
amplitude . track ( "complete registration" ) ;
2022-12-16 16:57:10 +00:00
const addresses = await queryAddressesFromTwitterName ( twitterUserName ) ;
setRegisteredAddressed ( addresses . data . addresses ) ;
setIsSuccess ( true ) ;
}
} catch ( e ) {
console . log ( "error" , e ) ;
2022-12-15 15:43:18 +00:00
}
} ;
2022-12-15 10:06:44 +00:00
2022-12-15 15:43:18 +00:00
const onClickShareButton = ( ) = > {
2022-12-17 14:45:50 +00:00
amplitude . track ( "click share button" ) ;
2022-12-15 15:43:18 +00:00
const { twitterUsername } = router . query ;
2022-12-19 15:10:37 +00:00
const shareMessage = ` 👨🚀 To the Interchain... And Beyond!%0a%0aHey frens, I just minted my name for the interchain on @icns_xyz: ${ twitterUsername } %0a%0aClaim yours now ▶ ` ;
2022-12-16 16:57:10 +00:00
2022-12-15 15:43:18 +00:00
const width = 500 ;
const height = 700 ;
window . open (
2022-12-20 08:15:23 +00:00
` ${ SHARE_URL } ?url=https://app.icns.xyz?referral= ${ twitterUsername } &text= ${ shareMessage } ` ,
2022-12-15 15:43:18 +00:00
"Share Twitter" ,
` top= ${ ( window . screen . height - height ) / 2 } , left= ${
( window . screen . width - width ) / 2
} , width = $ { width } , height = $ { height } , status = no , menubar = no , toolbar = no , resizable = no ` ,
) ;
2022-12-14 07:52:05 +00:00
} ;
2022-12-12 08:16:16 +00:00
return (
< Container >
< Logo / >
< MainContainer >
< ContentContainer >
2022-12-19 14:19:30 +00:00
< TitleContainer >
{ isSuccess ? (
2022-12-19 14:48:43 +00:00
< div > Your name has been claimed ! < / div >
2022-12-19 14:19:30 +00:00
) : (
< SpinnerWrapper >
< Spinner / >
< Spinner / >
< Spinner / >
< Spinner / >
< / SpinnerWrapper >
) }
< / TitleContainer >
2022-12-12 08:16:16 +00:00
< RecipentContainer >
< RecipentTitle > Recipent < / RecipentTitle >
2022-12-12 08:40:36 +00:00
< AddressContainer >
2022-12-15 15:43:18 +00:00
{ ` ${ router . query . twitterUsername } . ` }
{ registeredAddressed && (
< Typed
strings = { registeredAddressed . map (
( address ) = > address . bech32_prefix ,
) }
typeSpeed = { 150 }
backSpeed = { 150 }
backDelay = { 1000 }
loop
smartBackspace
onStringTyped = { ( arrayPos : number ) = > {
setAvailableAddress ( registeredAddressed [ arrayPos ] . address ) ;
} }
/ >
) }
2022-12-12 08:40:36 +00:00
< / AddressContainer >
2022-12-15 15:43:18 +00:00
< AvailableAddressText > { availableAddress } < / AvailableAddressText >
2022-12-12 08:16:16 +00:00
< / RecipentContainer >
< / ContentContainer >
< DescriptionContainer >
< AlertIcon >
2022-12-19 08:30:00 +00:00
< AlertCircleOutlineIcon / >
2022-12-12 08:16:16 +00:00
< / AlertIcon >
< DescriptionText >
2022-12-19 14:19:30 +00:00
ICNS name will stay the same even if your twitter handle changes in
the future .
2022-12-12 08:16:16 +00:00
< / DescriptionText >
< / DescriptionContainer >
2022-12-20 08:15:23 +00:00
< ShareButtonContainer onClick = { onClickShareButton } >
< Image
src = "/images/icons/twitter-small.png"
alt = "twitter icon"
width = { 28 }
height = { 28 }
/ >
< ShareButtonText > SHARE MY NAME < / ShareButtonText >
< / ShareButtonContainer >
2022-12-12 08:16:16 +00:00
< / MainContainer >
< / Container >
) ;
}
const Container = styled . div `
width : 100vw ;
height : 100vh ;
` ;
const MainContainer = styled . div `
display : flex ;
flex - direction : column ;
align - items : center ;
2022-12-19 14:19:30 +00:00
padding - top : 15.1rem ;
2022-12-12 08:16:16 +00:00
color : white ;
` ;
2022-12-20 08:15:23 +00:00
const MainTitle = styled . h1 `
text - overflow : ;
` ;
2022-12-19 14:19:30 +00:00
const ContentContainer = styled . div `
2022-12-20 08:15:23 +00:00
width : 31rem ;
2022-12-15 15:43:18 +00:00
2022-12-20 08:15:23 +00:00
padding : 2.625rem 3 rem ;
2022-12-12 08:16:16 +00:00
2022-12-19 14:19:30 +00:00
background - color : $ { color . grey [ "900" ] } ;
2022-12-12 08:16:16 +00:00
` ;
2022-12-19 14:19:30 +00:00
const TitleContainer = styled . div `
height : 1.52rem ;
2022-12-12 08:16:16 +00:00
2022-12-19 14:19:30 +00:00
display : flex ;
flex - direction : column ;
align - items : center ;
justify - content : center ;
2022-12-12 08:16:16 +00:00
2022-12-19 14:19:30 +00:00
font - weight : 700 ;
font - size : 1.5rem ;
line - height : 1.52rem ;
letter - spacing : 0.07em ;
color : $ { color . white } ;
margin - bottom : 2.625rem ;
2022-12-12 08:16:16 +00:00
` ;
const RecipentContainer = styled . div `
display : flex ;
flex - direction : column ;
2022-12-20 08:15:23 +00:00
margin : 0 1 rem ;
2022-12-12 08:16:16 +00:00
gap : 0.5rem ;
` ;
const RecipentTitle = styled . div `
font - family : "Inter" , serif ;
font - style : normal ;
font - weight : 500 ;
font - size : 1rem ;
line - height : 1rem ;
color : $ { color . grey [ "400" ] } ;
` ;
const AddressContainer = styled . div `
font - family : "Inter" , serif ;
font - style : normal ;
font - weight : 600 ;
font - size : 0.9rem ;
line - height : 0.9rem ;
color : $ { color . white } ;
padding : 1rem ;
background - color : $ { color . grey [ "600" ] } ;
` ;
const AvailableAddressText = styled . div `
font - family : "Inter" , serif ;
font - style : normal ;
font - weight : 400 ;
font - size : 0.75rem ;
line - height : 0.75rem ;
2022-12-15 15:43:18 +00:00
min - height : 0.75rem ;
2022-12-12 08:16:16 +00:00
color : $ { color . blue } ;
` ;
const DescriptionContainer = styled . div `
display : flex ;
flex - direction : row ;
2022-12-15 15:43:18 +00:00
align - items : center ;
2022-12-12 08:16:16 +00:00
gap : 1rem ;
2022-12-20 08:15:23 +00:00
width : 31rem ;
2022-12-12 08:16:16 +00:00
margin - top : 1.5rem ;
2022-12-15 15:43:18 +00:00
padding : 1.25rem 2 rem ;
2022-12-12 08:16:16 +00:00
background - color : $ { color . grey [ "900" ] } ;
` ;
const AlertIcon = styled . div `
position : relative ;
width : 1.5rem ;
height : 1.5rem ;
` ;
const DescriptionText = styled . div `
width : 100 % ;
font - family : "Inter" , serif ;
font - style : normal ;
font - weight : 400 ;
font - size : 0.8rem ;
2022-12-15 15:43:18 +00:00
line - height : 140 % ;
2022-12-12 08:16:16 +00:00
color : $ { color . grey [ "400" ] } ;
` ;
2022-12-19 14:19:30 +00:00
const SpinnerWrapper = styled . div `
display : flex ;
position : relative ;
2022-12-20 08:15:23 +00:00
width : 28px ;
height : 28px ;
2022-12-19 14:19:30 +00:00
` ;
const spinAnimation = keyframes `
from {
transform : rotate ( 0 deg ) ;
}
to {
transform : rotate ( 360 deg ) ;
}
` ;
const Spinner = styled . div < { animationDelay? : string } > `
display : block ;
position : absolute ;
top : 0 ;
left : 0 ;
width : 100 % ;
height : 100 % ;
2022-12-20 08:15:23 +00:00
animation : $ { spinAnimation } 1.2 s cubic - bezier ( 0.5 , 0 , 0.5 , 1 ) infinite ;
2022-12-19 14:19:30 +00:00
$ { ( { animationDelay } ) = >
animationDelay ? ` animation-delay: ${ animationDelay } ; ` : "" }
border - radius : 100 % ;
border - style : solid ;
2022-12-20 08:15:23 +00:00
border - width : 5px ;
2022-12-19 14:19:30 +00:00
border - color : white transparent transparent transparent ;
` ;
2022-12-12 08:16:16 +00:00
const ShareButtonContainer = styled . div `
display : flex ;
flex - direction : row ;
justify - content : center ;
align - items : center ;
gap : 0.625rem ;
width : 20rem ;
height : 5rem ;
2022-12-20 08:15:23 +00:00
margin - top : 0.75rem ;
2022-12-12 08:16:16 +00:00
cursor : pointer ;
user - select : none ;
background - color : $ { color . grey [ "700" ] } ;
` ;
const ShareButtonText = styled . div `
font - family : "Inter" , serif ;
font - style : normal ;
font - weight : 700 ;
font - size : 1.25rem ;
line - height : 1.25rem ;
2022-12-20 08:15:23 +00:00
letter - spacing : 0.07em ;
2022-12-12 08:16:16 +00:00
color : $ { color . grey [ "100" ] } ;
` ;