diff options
author | crupest <crupest@outlook.com> | 2021-02-15 01:08:05 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-02-15 01:08:05 +0800 |
commit | 58e23e759d730dd9d9733a64e5f16cc5aafeba35 (patch) | |
tree | 53a050eb3b20506eae7825d0b5a063562144366e /FrontEnd/src/app/views/user/UserCard.tsx | |
parent | da0b49f48a8e18fb19281d03b910342e05ffe649 (diff) | |
download | timeline-58e23e759d730dd9d9733a64e5f16cc5aafeba35.tar.gz timeline-58e23e759d730dd9d9733a64e5f16cc5aafeba35.tar.bz2 timeline-58e23e759d730dd9d9733a64e5f16cc5aafeba35.zip |
refactor: Refactor timeline card.
Diffstat (limited to 'FrontEnd/src/app/views/user/UserCard.tsx')
-rw-r--r-- | FrontEnd/src/app/views/user/UserCard.tsx | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/FrontEnd/src/app/views/user/UserCard.tsx b/FrontEnd/src/app/views/user/UserCard.tsx new file mode 100644 index 00000000..575ca2c1 --- /dev/null +++ b/FrontEnd/src/app/views/user/UserCard.tsx @@ -0,0 +1,107 @@ +import React from "react"; + +import TimelinePageCardTemplate, { + TimelineCardTemplateProps, +} from "../timeline-common/TimelinePageCardTemplate"; +import { TimelinePageCardProps } from "../timeline-common/TimelinePageTemplate"; +import UserAvatar from "../common/user/UserAvatar"; +import ChangeNicknameDialog from "./ChangeNicknameDialog"; +import { getHttpUserClient } from "@/http/user"; +import ChangeAvatarDialog from "./ChangeAvatarDialog"; + +const UserCard: React.FC<TimelinePageCardProps> = (props) => { + const { timeline, onReload } = props; + + const [dialog, setDialog] = React.useState< + "member" | "property" | "avatar" | "nickname" | null + >(null); + + return ( + <> + <TimelinePageCardTemplate + infoArea={ + <> + <h3 className="text-primary d-inline-block align-middle"> + {timeline.title} + <small className="ml-3 text-secondary">{timeline.name}</small> + </h3> + <div className="align-middle"> + <UserAvatar + username={timeline.owner.username} + className="avatar small rounded-circle mr-3" + /> + {timeline.owner.nickname} + </div> + </> + } + manageArea={((): TimelineCardTemplateProps["manageArea"] => { + if (!timeline.manageable) { + return { type: "member" }; + } else { + return { + type: "manage", + items: [ + { + type: "button", + text: "timeline.manageItem.nickname", + onClick: () => setDialog("nickname"), + }, + { + type: "button", + text: "timeline.manageItem.avatar", + onClick: () => setDialog("avatar"), + }, + { + type: "button", + text: "timeline.manageItem.property", + onClick: () => setDialog("property"), + }, + { + type: "button", + text: "timeline.manageItem.member", + onClick: () => setDialog("member"), + }, + ], + }; + } + })()} + dialog={dialog} + setDialog={setDialog} + {...props} + /> + {(() => { + // TODO: Move this two to settings. + if (dialog === "nickname") { + return ( + <ChangeNicknameDialog + open + close={() => setDialog(null)} + onProcess={async (newNickname) => { + await getHttpUserClient().patch(timeline.owner.username, { + nickname: newNickname, + }); + onReload(); + }} + /> + ); + } else if (dialog === "avatar") { + return ( + <ChangeAvatarDialog + open + close={() => setDialog(null)} + process={async (file) => { + await getHttpUserClient().putAvatar( + timeline.owner.username, + file + ); + onReload(); + }} + /> + ); + } + })()} + </> + ); +}; + +export default UserCard; |