mirror of https://github.com/sunface/rust-course
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
5.2 KiB
136 lines
5.2 KiB
import { useRouter } from "next/router"
|
|
import React, { useEffect, useState } from "react"
|
|
import { requestApi } from "utils/axios/request"
|
|
import { saveToken } from "utils/axios/getToken"
|
|
import storage from "utils/localStorage"
|
|
import { Avatar, Box, Button, Center, Flex, Heading, HStack, Input, Text, useToast, VStack, Wrap } from "@chakra-ui/react"
|
|
import Card from "components/card"
|
|
import { config } from "configs/config"
|
|
import Link from "next/link"
|
|
import { ReserveUrls } from "src/data/reserve-urls"
|
|
import { Tag } from "src/types/tag"
|
|
import Follow from "components/interaction/follow"
|
|
import { validateUsername } from "utils/user"
|
|
|
|
const OnboardPage = () => {
|
|
const [step,setStep] = useState(1)
|
|
const [email,setEmail] = useState('')
|
|
const [nickname,setNickname] = useState('')
|
|
const [username,setUsername] = useState('')
|
|
const [tags,setTags]:[Tag[],any] = useState([])
|
|
const router = useRouter()
|
|
const toast = useToast()
|
|
const code = router.query.code
|
|
useEffect(() => {
|
|
if (code) {
|
|
getEmailByCode(code)
|
|
}
|
|
}, [code])
|
|
|
|
const getEmailByCode = async (code) => {
|
|
const res = await requestApi.get(`/user/email/byCode?code=${code}`)
|
|
if (!res.data) {
|
|
toast({
|
|
description: "code不存在或者已失效",
|
|
status: "error",
|
|
duration: 2000,
|
|
isClosable: true,
|
|
})
|
|
setTimeout(() => router.push('/login'),2000)
|
|
}
|
|
setEmail(res.data)
|
|
}
|
|
|
|
const register = async () => {
|
|
if (nickname === "" || username === "") {
|
|
toast({
|
|
description: "nickname or username can't be empty",
|
|
status: "error",
|
|
duration: 2000,
|
|
isClosable: true,
|
|
})
|
|
return
|
|
}
|
|
const res0 = await validateUsername(username)
|
|
if (res0) {
|
|
toast({
|
|
description: res0,
|
|
status: "error",
|
|
duration: 2000,
|
|
isClosable: true,
|
|
})
|
|
return
|
|
}
|
|
const res = await requestApi.post("/user/register", { code: code, nickname: nickname,username: username })
|
|
saveToken(res.data.token)
|
|
storage.set('session', res.data)
|
|
|
|
setStep(2)
|
|
const res1 = await requestApi.get(`/tag/all`)
|
|
setTags(res1.data)
|
|
}
|
|
|
|
const finish = async () => {
|
|
const oldPage = storage.get('current-page')
|
|
if (oldPage) {
|
|
storage.remove('current-page')
|
|
router.push(oldPage)
|
|
} else {
|
|
router.push('/')
|
|
}
|
|
}
|
|
|
|
return (
|
|
<Center h="100vh" mt="-8">
|
|
<Card p="6" width="800px">
|
|
{step === 1 ? <>
|
|
<Text layerStyle="textSecondary" fontWeight="bold">CREATE YOUR ACCOUNT</Text>
|
|
<Heading size="md" mt="2">🤘 Let's start your {config.appName} journey</Heading>
|
|
|
|
<VStack alignItems="left" mt="8" spacing="4">
|
|
<HStack>
|
|
<Text width="150px">Nick name</Text>
|
|
<Input value={nickname} onChange={e => setNickname(e.currentTarget.value)} size="lg" width="auto" placeholder="enter your nick name" _focus={null}></Input>
|
|
</HStack>
|
|
<HStack>
|
|
<Text width="150px">User name</Text>
|
|
<Input value={username} onChange={e => setUsername(e.currentTarget.value)} size="lg" width="auto" placeholder="user name is unique, and cant be changed anymore" _focus={null}></Input>
|
|
</HStack>
|
|
<HStack>
|
|
<Text width="150px">Email address</Text>
|
|
<Input size="lg" width="auto" value={email} _focus={null} disabled></Input>
|
|
</HStack>
|
|
</VStack>
|
|
|
|
<Button colorScheme="teal" size="lg" mt="6" float="right" onClick={register}>Next</Button>
|
|
</> :
|
|
<>
|
|
<Text layerStyle="textSecondary" fontWeight="bold">(OPTIONAL) PERSONALIZE YOUR HASHNODE FEED</Text>
|
|
<Heading size="md" mt="2">Follow technologies you care about.</Heading>
|
|
<Text mt="2" layerStyle="textSecondary" fontSize=".9rem">Hashnode is a platform for independent bloggers. By following the right tags you can personalize your feed and discover content you care about.</Text>
|
|
<Wrap mt="4" p="1">
|
|
{
|
|
tags.map(tag =>
|
|
<HStack key={tag.id} mr="4" mb="4">
|
|
<HStack spacing="1" mr="3" cursor="pointer" width="120px">
|
|
<Avatar src={tag.icon} size="sm" />
|
|
<Text>{tag.title}</Text>
|
|
</HStack>
|
|
|
|
<Follow targetID={tag.id} followed={false} buttonIcon={false}/>
|
|
</HStack>)
|
|
}
|
|
</Wrap>
|
|
|
|
<Button colorScheme="teal" size="lg" mt="6" float="right" onClick={finish}>Finish</Button>
|
|
</>
|
|
}
|
|
</Card>
|
|
</Center>
|
|
)
|
|
}
|
|
|
|
export default OnboardPage
|
|
|
|
|