diff options
Diffstat (limited to 'FrontEnd/src/app/views/user')
-rw-r--r-- | FrontEnd/src/app/views/user/UserCard.tsx | 107 | ||||
-rw-r--r-- | FrontEnd/src/app/views/user/UserInfoCard.tsx | 70 | ||||
-rw-r--r-- | FrontEnd/src/app/views/user/UserPageUI.tsx | 18 | ||||
-rw-r--r-- | FrontEnd/src/app/views/user/index.tsx | 44 |
4 files changed, 112 insertions, 127 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; diff --git a/FrontEnd/src/app/views/user/UserInfoCard.tsx b/FrontEnd/src/app/views/user/UserInfoCard.tsx deleted file mode 100644 index 24b7b979..00000000 --- a/FrontEnd/src/app/views/user/UserInfoCard.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React from "react"; - -import TimelineCardTemplate, { - TimelineCardTemplateProps, -} from "../timeline-common/TimelineCardTemplate"; -import { TimelineCardComponentProps } from "../timeline-common/TimelinePageTemplateUI"; -import UserAvatar from "../common/user/UserAvatar"; - -export type PersonalTimelineManageItem = "avatar" | "nickname"; - -export type UserInfoCardProps = TimelineCardComponentProps<PersonalTimelineManageItem>; - -const UserInfoCard: React.FC<UserInfoCardProps> = (props) => { - const { timeline, operations } = props; - const { onManage, onMember } = operations; - - return ( - <TimelineCardTemplate - 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 (onManage == null) { - return { type: "member", onMember }; - } else { - return { - type: "manage", - items: [ - { - type: "button", - text: "timeline.manageItem.nickname", - onClick: () => onManage("nickname"), - }, - { - type: "button", - text: "timeline.manageItem.avatar", - onClick: () => onManage("avatar"), - }, - { - type: "button", - text: "timeline.manageItem.property", - onClick: () => onManage("property"), - }, - { - type: "button", - onClick: onMember, - text: "timeline.manageItem.member", - }, - ], - }; - } - })()} - {...props} - /> - ); -}; - -export default UserInfoCard; diff --git a/FrontEnd/src/app/views/user/UserPageUI.tsx b/FrontEnd/src/app/views/user/UserPageUI.tsx deleted file mode 100644 index d405399c..00000000 --- a/FrontEnd/src/app/views/user/UserPageUI.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from "react"; - -import TimelinePageTemplateUI, { - TimelinePageTemplateUIProps, -} from "../timeline-common/TimelinePageTemplateUI"; - -import UserInfoCard, { PersonalTimelineManageItem } from "./UserInfoCard"; - -export type UserPageUIProps = Omit< - TimelinePageTemplateUIProps<PersonalTimelineManageItem>, - "CardComponent" ->; - -const UserPageUI: React.FC<UserPageUIProps> = (props) => { - return <TimelinePageTemplateUI {...props} CardComponent={UserInfoCard} />; -}; - -export default UserPageUI; diff --git a/FrontEnd/src/app/views/user/index.tsx b/FrontEnd/src/app/views/user/index.tsx index 9b5acbba..57454d0d 100644 --- a/FrontEnd/src/app/views/user/index.tsx +++ b/FrontEnd/src/app/views/user/index.tsx @@ -1,58 +1,24 @@ -import React, { useState } from "react"; +import React from "react"; import { useParams } from "react-router"; -import { getHttpUserClient } from "@/http/user"; - import TimelinePageTemplate from "../timeline-common/TimelinePageTemplate"; -import UserPageUI from "./UserPageUI"; -import { PersonalTimelineManageItem } from "./UserInfoCard"; -import ChangeNicknameDialog from "./ChangeNicknameDialog"; -import ChangeAvatarDialog from "./ChangeAvatarDialog"; +import UserCard from "./UserCard"; -const UserPage: React.FC = (_) => { +const UserPage: React.FC = () => { const { username } = useParams<{ username: string }>(); - const [dialog, setDialog] = useState<null | PersonalTimelineManageItem>(null); - const [reloadKey, setReloadKey] = React.useState<number>(0); let dialogElement: React.ReactElement | undefined; - const closeDialog = (): void => setDialog(null); - - if (dialog === "nickname") { - dialogElement = ( - <ChangeNicknameDialog - open - close={closeDialog} - onProcess={async (newNickname) => { - await getHttpUserClient().patch(username, { nickname: newNickname }); - setReloadKey(reloadKey + 1); - }} - /> - ); - } else if (dialog === "avatar") { - dialogElement = ( - <ChangeAvatarDialog - open - close={closeDialog} - process={async (file) => { - await getHttpUserClient().putAvatar(username, file); - setReloadKey(reloadKey + 1); - }} - /> - ); - } - return ( <> <TimelinePageTemplate - name={`@${username}`} - UiComponent={UserPageUI} - onManage={(item) => setDialog(item)} + timelineName={`@${username}`} notFoundI18nKey="timeline.userNotExist" reloadKey={reloadKey} onReload={() => setReloadKey(reloadKey + 1)} + CardComponent={UserCard} /> {dialogElement} </> |