diff --git a/src/common/component/BlankPlaceholder.tsx b/src/common/component/BlankPlaceholder.tsx index 78911e08..d7ac7e04 100644 --- a/src/common/component/BlankPlaceholder.tsx +++ b/src/common/component/BlankPlaceholder.tsx @@ -1,13 +1,17 @@ import { FC, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { NavLink } from "react-router-dom"; +import Linkify from "linkify-react"; + import ChannelModal from "./ChannelModal"; import InviteModal from "./InviteModal"; +import IconEdit from "../../assets/icons/edit.svg"; import IconChat from "../../assets/icons/placeholder.chat.svg"; import IconAsk from "../../assets/icons/placeholder.question.svg"; import IconInvite from "../../assets/icons/placeholder.invite.svg"; import IconDownload from "../../assets/icons/placeholder.download.svg"; import UsersModal from "./UsersModal"; import { useAppSelector } from "../../app/store"; -import { useTranslation } from "react-i18next"; interface Props { @@ -20,7 +24,7 @@ const classes = { }; const BlankPlaceholder: FC = ({ type = "chat" }) => { const { t } = useTranslation("welcome"); - const server = useAppSelector((store) => store.server); + const { server, isAdmin } = useAppSelector((store) => { return { server: store.server, isAdmin: store.authData.user?.is_admin }; }); const [inviteModalVisible, setInviteModalVisible] = useState(false); const [createChannelVisible, setCreateChannelVisible] = useState(false); const [userListVisible, setUserListVisible] = useState(false); @@ -39,10 +43,29 @@ const BlankPlaceholder: FC = ({ type = "chat" }) => { return ( <>
-
+

{t("title", { name: server.name })}

-

- {t("desc")} +

+ { + // console.log("attr", link); + // if (!url) return <>{content}; + return <> + + {content} + + ; + }, + } + } + }> + {server.description ?? t("desc")} + + {isAdmin && + + }

diff --git a/src/routes/setting/Overview/Server.tsx b/src/routes/setting/Overview/Server.tsx new file mode 100644 index 00000000..86c6b3a2 --- /dev/null +++ b/src/routes/setting/Overview/Server.tsx @@ -0,0 +1,113 @@ +import { ChangeEvent, useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import toast from "react-hot-toast"; +import { useUpdateLogoMutation, useUpdateServerMutation } from '../../../app/services/server'; +import LogoUploader from "../../../common/component/AvatarUploader"; +import Input from "../../../common/component/styled/Input"; +import Label from "../../../common/component/styled/Label"; +import Textarea from "../../../common/component/styled/Textarea"; +import SaveTip from '../../../common/component/SaveTip'; +import { useAppSelector } from '../../../app/store'; + +const Index = () => { + const { t } = useTranslation("setting"); + const { t: ct } = useTranslation(); + const { loginUser, server } = useAppSelector((store) => { + return { loginUser: store.authData.user, server: store.server }; + }); + + const [uploadLogo, { isSuccess: uploadSuccess }] = useUpdateLogoMutation(); + const [updateServer] = useUpdateServerMutation(); + const [changed, setChanged] = useState(false); + const [serverValues, setServerValues] = useState(server); + const handleChange = (evt: ChangeEvent) => { + const newValue = evt.target.value; + const { type = "" } = evt.target.dataset; + setServerValues((prev) => { + return { ...prev, [type]: newValue }; + }); + }; + const handleUpdateServer = () => { + const { name, description } = serverValues; + updateServer({ name, description }); + }; + + const handleReset = () => { + setServerValues(server); + }; + useEffect(() => { + if (server) { + setServerValues(server); + } + }, [server]); + useEffect(() => { + if (uploadSuccess) { + toast.success(ct("tip.update")); + } + }, [uploadSuccess]); + useEffect(() => { + if (server && serverValues) { + const { name, description } = serverValues; + const { name: oName, description: oDescription } = server; + if (oName !== name || oDescription !== description) { + setChanged(true); + } else { + setChanged(false); + } + } + }, [server, serverValues]); + const { name, description, logo } = serverValues; + const isAdmin = loginUser?.is_admin; + if (!loginUser || !serverValues) return null; + return ( + <> +
+
+ +
+ {isAdmin && ( +
+
+ {t("overview.upload_desc")} +
+
+ )} +
+
+
+ + +
+
+ +