aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/app/views/user
diff options
context:
space:
mode:
Diffstat (limited to 'FrontEnd/src/app/views/user')
-rw-r--r--FrontEnd/src/app/views/user/UserCard.tsx107
-rw-r--r--FrontEnd/src/app/views/user/UserInfoCard.tsx70
-rw-r--r--FrontEnd/src/app/views/user/UserPageUI.tsx18
-rw-r--r--FrontEnd/src/app/views/user/index.tsx44
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}
</>