From fe2090db57538f99b41974953f7fb54eecd949b6 Mon Sep 17 00:00:00 2001 From: codemystery <937193167@qq.com> Date: Tue, 16 Mar 2021 15:37:49 +0800 Subject: [PATCH] update --- pages/[username]/index.tsx | 7 +- pages/settings/org/members.tsx | 301 +++++++++++++++++++++++++++++++++ pages/settings/org/profile.tsx | 296 ++++++++++++++++++++++++++++++++ pages/settings/orgs.tsx | 3 +- server/internal/api/org.go | 15 ++ server/internal/org/org.go | 11 ++ server/internal/server.go | 1 + src/data/links.tsx | 15 ++ 8 files changed, 647 insertions(+), 2 deletions(-) create mode 100644 pages/settings/org/members.tsx create mode 100644 pages/settings/org/profile.tsx diff --git a/pages/[username]/index.tsx b/pages/[username]/index.tsx index e49997b0..1f65dcb0 100644 --- a/pages/[username]/index.tsx +++ b/pages/[username]/index.tsx @@ -188,6 +188,11 @@ const UserPage = () => { {user.website} } + {user.email && + 联系邮箱: + {user.email} + } + Joined: {moment(user.created).fromNow()} @@ -209,7 +214,7 @@ const UserPage = () => { } {user.rawSkills?.length > 0 && - 擅长技能 + {user.type === IDType.User ? "擅长技术" : "组织技术栈"} { user.rawSkills.map(skill => diff --git a/pages/settings/org/members.tsx b/pages/settings/org/members.tsx new file mode 100644 index 00000000..a14a3caf --- /dev/null +++ b/pages/settings/org/members.tsx @@ -0,0 +1,301 @@ +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, orgSettingLinks, 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 UserProfilePage = () => { + 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 && + + {(props) => ( +
+ + + + + 基本信息 + + {({ field, form }) => ( + + 用户昵称 + + {form.errors.nickname} + + + )} + + + {({ field, form }) => ( + + 联系邮箱 + + {form.errors.email} + + + )} + + validateUrl(v, false)}> + {({ field, form }) => ( + + 头像设置 + + {form.errors.avatar} + {user.avatar && } + + + )} + + validateUrl(v, true)}> + {({ field, form }) => ( + + 封面图片 + + {form.errors.cover} + {user.cover && } + + + )} + + + + + About You + + {({ field, form }) => ( + + 一句话描述自己 + + {form.errors.tagline} + + )} + + + {({ field, form }) => ( + + Location + + {form.errors.location} + + )} + + + {({ field, form }) => ( + + Available for +