diff --git a/pages/[username]/index.tsx b/pages/[username]/index.tsx index cfdf1eac..39c593c3 100644 --- a/pages/[username]/index.tsx +++ b/pages/[username]/index.tsx @@ -21,11 +21,13 @@ import { Tag } from "src/types/tag" import { IDType } from "src/types/id" import UserCard from "components/users/user-card" import userCustomTheme from "theme/user-custom" +import SearchFilters from "components/search-filters" const UserPage = () => { const { isOpen, onOpen, onClose } = useDisclosure() const router = useRouter() const username = router.query.username + const nav = router.query.nav const session = useSession() const [user, setUser]: [User, any] = useState(null) const [rawPosts, setRawPosts]: [Story[], any] = useState([]) @@ -85,7 +87,7 @@ const UserPage = () => { const res0 = await requestApi.get(`/interaction/following/${user.id}?type=${IDType.User}`) const ids = [] for (const f of res0.data) { - ids.push(f.id) + ids.push(f.id) } @@ -100,6 +102,9 @@ const UserPage = () => { } } + const isSubNavActive = (id) => { + return id === nav + } return ( <> { - + {user.nickname} {user.tagline && {user.tagline}} - - {/* */} - viewFollowers(0)}>Followers - {/* */} - viewFollowers(1)}>Following - + + + + + HOME + + + + + + REACT + + + + + {session?.user.id === user.id ? : } + + + + + + Followers + viewFollowers(0)}> + + + + Following + viewFollowers(1)}> + + + {user.about && <> @@ -184,8 +214,8 @@ const UserPage = () => { { tags.map(tag => - ) } @@ -201,8 +231,8 @@ const UserPage = () => { : - - + + } diff --git a/pages/interaction/followers.tsx b/pages/interaction/followers.tsx index 1f4ed173..a51271ba 100644 --- a/pages/interaction/followers.tsx +++ b/pages/interaction/followers.tsx @@ -37,7 +37,7 @@ const FollowersPage = () => { } > {users.map(user => - + )} } diff --git a/pages/interaction/following-tags.tsx b/pages/interaction/following-tags.tsx index 69c93e69..16dff4eb 100644 --- a/pages/interaction/following-tags.tsx +++ b/pages/interaction/following-tags.tsx @@ -53,7 +53,7 @@ const TagsPage = () => { {tags.map(tag => - + )} diff --git a/pages/interaction/following-users.tsx b/pages/interaction/following-users.tsx index 0ee491d4..4522c919 100644 --- a/pages/interaction/following-users.tsx +++ b/pages/interaction/following-users.tsx @@ -44,7 +44,7 @@ const UsersPage = () => { } > {users.map(user => - + )} } diff --git a/pages/settings/navbar.tsx b/pages/settings/navbar.tsx new file mode 100644 index 00000000..7ab1d9fc --- /dev/null +++ b/pages/settings/navbar.tsx @@ -0,0 +1,112 @@ +import { Text, Box, Heading, Image, Center, Button, Flex, VStack, Divider, useToast, FormControl, FormLabel, FormHelperText, Input, FormErrorMessage, HStack, Wrap, useMediaQuery, Avatar, Textarea, } from "@chakra-ui/react" +import Card from "components/card" +import Nav from "layouts/nav/nav" +import PageContainer from "layouts/page-container" +import Sidebar from "layouts/sidebar/sidebar" +import React, { useEffect, useState } from "react" +import { adminLinks, settingLinks } from "src/data/links" +import { requestApi } from "utils/axios/request" +import { useRouter } from "next/router" +import { Field, Form, Formik } from "formik" +import { config } from "configs/config" +import Tags from "components/tags/tags" +var validator = require('validator'); + +const UserNavbarPage = () => { + const [user, setUser] = useState(null) + const [skills, setSkills] = useState([]) + const [isLargerThan1280] = useMediaQuery("(min-width: 768px)") + useEffect(() => { + requestApi.get("/user/self").then(res => setUser(res.data)) + }, []) + const router = useRouter() + const toast = useToast() + + const submitUser = async (values, _) => { + await requestApi.post(`/user/update`, values) + setUser(values) + toast({ + description: "更新成功", + status: "success", + duration: 2000, + isClosable: true, + }) + } + + function validateNickname(value) { + let error + if (!value?.trim()) { + error = "昵称不能为空" + } + + if (value?.length > config.user.nicknameMaxLen) { + error = `长度不能超过${config.user.nicknameMaxLen}` + } + + return error + } + + function validateEmail(value) { + let email = value?.trim() + let error + + if (email?.length > config.user.usernameMaxLen) { + error = `长度不能超过${config.user.usernameMaxLen}` + return error + } + + if (email) { + if (!validator.isEmail(email)) { + error = "Email格式不合法" + return error + } + } + return error + } + + + function validateUrl(value, canBeEmpty = true) { + let url = value?.trim() + let error + if (!canBeEmpty) { + if (!url) { + error = "url不能为空" + return error + } + } + + if (url) { + if (!validator.isURL(value)) { + error = "URL格式不合法" + return error + } + } + + return error + } + + function validateLen(value) { + let error + if (value?.length > config.commonMaxlen) { + error = `长度不能超过${config.commonMaxlen}` + } + + return error + } + + const Layout = isLargerThan1280 ? HStack : VStack + return ( + <> + + + + {user && + + } + + + + ) +} +export default UserNavbarPage + diff --git a/pages/settings/profile.tsx b/pages/settings/profile.tsx index 0b5cfbd3..28946a74 100644 --- a/pages/settings/profile.tsx +++ b/pages/settings/profile.tsx @@ -99,7 +99,7 @@ const UserProfilePage = () => { <> - + {user && t[j].Weight +} + +func ValidNavbarType(tp int) bool { + if tp == NavbarTypeLink || tp == NavbarTypeSeries { + return true + } + + return false +} diff --git a/src/components/search-filters.tsx b/src/components/search-filters.tsx index 6267a3ab..42edf44b 100644 --- a/src/components/search-filters.tsx +++ b/src/components/search-filters.tsx @@ -22,7 +22,7 @@ export const SearchFilters = (props:Props) => { { filters.map(f => - ) } diff --git a/src/components/svg-icon.tsx b/src/components/svg-icon.tsx index f6adb3b8..afe0a4ab 100644 --- a/src/components/svg-icon.tsx +++ b/src/components/svg-icon.tsx @@ -49,6 +49,9 @@ export function getSvgIcon(name, height = "1.4rem") { case "edit": svg = break + case "navbar": + svg = + break default: break; } diff --git a/src/components/user-menu.tsx b/src/components/user-menu.tsx index d6f6022f..bbd7d848 100644 --- a/src/components/user-menu.tsx +++ b/src/components/user-menu.tsx @@ -58,9 +58,9 @@ export const UserMenu = () => { {isEditor(session.user.role) && } >创作中心} }>书签收藏 }>我的关注 - {isAdmin(session.user.role) && } >管理员} - }>偏好设置 + {isAdmin(session.user.role) && } >管理员} + }>博客设置 logout()} icon={}>账号登出 : diff --git a/src/data/links.tsx b/src/data/links.tsx index a9b55b28..dc0739a0 100644 --- a/src/data/links.tsx +++ b/src/data/links.tsx @@ -40,11 +40,6 @@ export const interactionLinks: any[] = [ path: `${ReserveUrls.Interaction}/followers`, disabled: false }, - { - title: 'Followers', - path: `${ReserveUrls.Interaction}/followers`, - disabled: false - }, ] export const searchLinks: any[] = [{ @@ -72,11 +67,18 @@ export const adminLinks: Route[] = [{ export const settingLinks: Route[] = [{ - title: '用户设置', + title: '用户信息', path: `${ReserveUrls.Settings}/profile`, icon: , disabled: false -}] +}, +{ + title: '博客菜单', + path: `${ReserveUrls.Settings}/navbar`, + icon: getSvgIcon("navbar"), + disabled: false +}, +] export const navLinks = [{