update #56, show user tags as moderator role

pull/82/head
sunface 4 years ago
parent f5a93bc8bd
commit 4392b8dfbc

@ -0,0 +1,64 @@
import {Text, Box, Heading, Image, Center, Button, Flex, VStack, Divider, useToast, Wrap, WrapItem, useColorModeValue, StackDivider } 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 {dashboardLinks} from "src/data/links"
import { requestApi } from "utils/axios/request"
import PageContainer1 from "layouts/page-container1"
import Empty from "components/empty"
import { IDType } from "src/types/id"
import UserCard from "components/users/user-card"
import userCustomTheme from "theme/user-custom"
import TagCard from "components/tags/tag-card"
import SimpleTagCard from "components/tags/simple-tag-card"
const FollowersPage = () => {
const [tags, setTags] = useState([])
const borderColor = useColorModeValue(userCustomTheme.borderColor.light, userCustomTheme.borderColor.dark)
const getTags = async () => {
const res = await requestApi.get(`/tag/list/byUserModeratorRole`)
console.log(res)
setTags(res.data)
}
useEffect(() => {
getTags()
}, [])
return (
<>
<PageContainer1>
<Box display="flex">
<Sidebar routes={dashboardLinks} title="dashboard" />
<Card ml="4" p="6" width="100%">
<Text fontSize=".95rem" fontWeight="600">You are a moderator of these tags, you can modify the tag and manage the posts.</Text>
<Divider my="6" />
{
tags.length === 0 ?
<Empty />
:
<>
<VStack mt="4">
{tags.map(tag =>
<Box width="100%" key={tag.id}>
<SimpleTagCard tag={tag} mt="4" />
<Divider mt="5" />
</Box>
)}
</VStack>
<Center><Text layerStyle="textSecondary" fontSize="sm" mt="5"></Text></Center>
</>
}
</Card>
</Box>
</PageContainer1>
</>
)
}
export default FollowersPage

@ -17,8 +17,6 @@ import PageContainer1 from "layouts/page-container1"
import React, { useEffect, useState } from "react"
import { requestApi } from "utils/axios/request"
import StoryFilters from "components/story/story-filter"
import { concat } from "lodash"
import useInfiniteScroll from 'src/hooks/use-infinite-scroll'
import { HomeSidebar } from "src/types/misc"
import Link from "next/link"
import { ReserveUrls } from "src/data/reserve-urls"

@ -139,7 +139,10 @@ const UserPage = () => {
</Card>
{moderators.length > 0 && <Card mt="4">
<Heading size="sm">Tag moderators</Heading>
<HStack>
<Heading size="sm">Tag moderators</Heading>
{isAdmin(session.user.role) && <Box cursor="pointer" onClick={() => router.push(`/admin/tags`)}>{getSvgIcon('edit','.9rem')}</Box>}
</HStack>
<VStack alignItems="left" mt="4">
{moderators.map(m => <a href={`/${m.username}`} target="_blank">
<HStack cursor="pointer">

@ -223,3 +223,15 @@ func RemoveTagStory(c *gin.Context) {
c.JSON(http.StatusOK, common.RespSuccess(nil))
}
func GetTagListByUserModeratorRole(c *gin.Context) {
user := user.CurrentUser(c)
res, err := tags.GetTagListByUserModeratorRole(user.ID)
if err != nil {
c.JSON(err.Status, common.RespError(err.Message))
return
}
c.JSON(http.StatusOK, common.RespSuccess(res))
}

@ -198,3 +198,7 @@ func UserRegister(c *gin.Context) {
user.Register(c, req.Code, req.Nickname, req.Username)
}
func GetUserModerators(c *gin.Context) {
}

@ -105,7 +105,7 @@ func (s *Server) Start() error {
r.POST("/tag/moderator", IsLogin(), api.AddModerator)
r.DELETE("/tag/moderator/:tagID/:userID", IsLogin(), api.DeleteModerator)
r.DELETE("/tag/story/:tagID/:storyID", IsLogin(), api.RemoveTagStory)
r.GET("/tag/list/byUserModeratorRole", IsLogin(), api.GetTagListByUserModeratorRole)
// user apis
r.GET("/user/all", api.GetUsers)
r.POST("/user/ids", api.GetUsersByIDs)
@ -125,6 +125,7 @@ func (s *Server) Start() error {
r.GET("/user/email/exist/:email", api.UserEmailExist)
r.GET("/user/email/byCode", api.GetUserEmailByCode)
r.POST("/user/register", api.UserRegister)
// interaction apis
r.POST("/interaction/like/:id", IsLogin(), api.Like)
r.POST("/interaction/follow/:id", IsLogin(), api.Follow)

@ -335,3 +335,26 @@ func RemoveTagStory(tagID, storyID string) *e.Error {
return nil
}
func GetTagListByUserModeratorRole(userID string) ([]*models.Tag, *e.Error) {
tags := make([]*models.Tag, 0)
rows, err := db.Conn.Query("SELECT tag_id FROM tag_moderators WHERE user_id=?", userID)
if err != nil {
logger.Warn("get tag moderators error", "error", err)
return nil, e.New(http.StatusInternalServerError, e.Internal)
}
for rows.Next() {
var tid string
rows.Scan(&tid)
t, err := GetTag(tid, "")
if err != nil {
logger.Warn("query tag error", "error", err)
continue
}
tags = append(tags, t)
}
return tags, nil
}

@ -0,0 +1,29 @@
import React from "react"
import {chakra, Heading, Image, Text, HStack,Button, Flex,PropsOf, Box, Tooltip, Tag as ChakraTag, useColorModeValue} from "@chakra-ui/react"
import { Tag } from "src/types/tag"
import { ReserveUrls } from "src/data/reserve-urls"
import NextLink from "next/link"
type Props = PropsOf<typeof chakra.div> & {
tag: Tag
}
export const SimpleTagCard= (props:Props) =>{
const {tag} = props
return (
<Flex justifyContent="space-between" alignItems="center" className="hover-bg" p="2">
<NextLink href={`${ReserveUrls.Tags}/${tag.name}`}>
<HStack cursor="pointer">
<Image src={tag.icon} width="43px" mr="2" borderWidth="1px" className="bordered"/>
<Box>
<Heading size="sm">{tag.title}</Heading>
<Tooltip openDelay={300} label={tag.md}><Text layerStyle="textSecondary" fontSize=".85rem" mt="1" overflow="hidden" textOverflow="ellipsis" whiteSpace="nowrap" width={["100px","100px","200px","300px"]}>{tag.md}</Text></Tooltip>
</Box>
</HStack>
</NextLink>
</Flex>
)
}
export default SimpleTagCard

@ -45,6 +45,11 @@ export const dashboardLinks: any[] = [
path: `${ReserveUrls.Dashboard}/followers`,
disabled: false
},
{
title: 'Tag Moderator',
path: `${ReserveUrls.Dashboard}/tag-moderator`,
disabled: false
},
]
export const searchLinks: any[] = [{

Loading…
Cancel
Save