import { Text, Box, Heading, Image, Center, Button, Flex, VStack, Divider, useToast, FormControl, FormLabel, FormHelperText, Input, FormErrorMessage, HStack, Wrap, useMediaQuery, Avatar, Textarea, Table, Thead, Tr, Th, Tbody, Td, IconButton, useDisclosure, Modal, ModalOverlay, ModalContent, ModalHeader, ModalBody, ModalFooter, Select, NumberInput, NumberInputField, NumberInputStepper, NumberIncrementStepper, NumberDecrementStepper,AlertDialog, AlertDialogOverlay, AlertDialogContent, AlertDialogHeader, AlertDialogBody, AlertDialogFooter } from "@chakra-ui/react"
import Card from "components/card"
import PageContainer from "layouts/page-container"
import Sidebar from "layouts/sidebar/sidebar"
import React, { useEffect, useState } from "react"
import { settingLinks } from "src/data/links"
import { requestApi } from "utils/axios/request"
import { config } from "configs/config"
import { getSvgIcon } from "components/svg-icon"
import { Navbar, NavbarType } from "src/types/user"
import { cloneDeep } from "lodash"
import { IDType } from "src/types/id"
import { Story } from "src/types/story"
const UserNavbarPage = () => {
return (
<>
>
)
}
export default UserNavbarPage
export const NavbarEditor = ({ orgID = "" }) => {
const [navbars, setNavbars]: [Navbar[], any] = useState([])
const [series, setSeries]: [Story[], any] = useState([])
const [currentNavbar, setCurrentNavbar]: [Navbar, any] = useState(null)
const { isOpen, onOpen, onClose } = useDisclosure()
const toast = useToast()
useEffect(() => {
getNavbars()
getSeries()
}, [])
const getNavbars = async () => {
const res = await requestApi.get(`/user/navbars/${orgID ? orgID : 0}`)
setNavbars(res.data)
}
const getSeries = async () => {
let res
if (orgID) {
res = await requestApi.get(`/story/posts/org/${orgID}?type=${IDType.Series}`)
} else {
res = await requestApi.get(`/story/posts/editor?type=${IDType.Series}`)
}
setSeries(res.data)
}
const submitNavbar = async () => {
if (!currentNavbar.label || !currentNavbar.value) {
toast({
description: "值不能为空",
status: "error",
duration: 2000,
isClosable: true,
})
return
}
if (currentNavbar.label.length > config.user.navbarMaxLen) {
toast({
description: `Label长度不能超过${config.user.navbarMaxLen}`,
status: "error",
duration: 2000,
isClosable: true,
})
return
}
if (orgID) {
await requestApi.post(`/org/navbar/${orgID}`, currentNavbar)
} else {
await requestApi.post(`/user/navbar`, currentNavbar)
}
setCurrentNavbar(null)
onClose()
getNavbars()
}
const onAddNavbar = () => {
setCurrentNavbar({ weight: 0, type: NavbarType.Link, label: "", value: "https://" })
onOpen()
}
const onEditNavbar = nav => {
setCurrentNavbar(nav)
onOpen()
}
const onNavbarChange = () => {
const nv = cloneDeep(currentNavbar)
setCurrentNavbar(nv)
}
const onNvTypeChange = v => {
const tp = parseInt(v);
currentNavbar.type = tp
if (tp === NavbarType.Link) {
currentNavbar.value = ""
} else {
currentNavbar.value = series[0].id
}
onNavbarChange()
}
const getSeriesTitle = id => {
for (const s of series) {
if (s.id === id) {
return s.title
}
}
return ""
}
const onDeleteNavbar = async id => {
await requestApi.delete(`/${orgID ? 'org' : 'user'}/navbar/${id}`)
getNavbars()
}
return (
<>
菜单设置
Label |
Type |
Value |
Weight |
|
{
navbars.map((nv, i) => )
}
{currentNavbar &&
{currentNavbar.label ? "编辑菜单项" : "新建菜单项"}
Label
{ currentNavbar.label = e.currentTarget.value; onNavbarChange() }}>
Type
Value
{currentNavbar.type === NavbarType.Link ? { currentNavbar.value = e.currentTarget.value; onNavbarChange() }} /> :
}
Weight
{ currentNavbar.weight = parseInt(e); onNavbarChange() }}>
}
>
)
}
const NV = ({ nv, onEdit, onDelete, getSeriesTitle }) => {
const [isOpen, setIsOpen] = React.useState(false)
const onClose = () => setIsOpen(false)
const cancelRef = React.useRef()
return (
<>
{nv.label} |
{nv.type === NavbarType.Link ? "link" : "series"} |
{nv.type === NavbarType.Link ? nv.value : getSeriesTitle(nv.value)} |
{nv.weight} |
onEdit(nv)} />
setIsOpen(true)} />
|
删除菜单 - {nv.label}
Are you sure? You can't undo this action afterwards.
>
)
}