import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { Container, ListGroup, Modal, Row, Col, Button } from "react-bootstrap"; import { User, useAvatar } from "@/services/user"; import { TimelineInfo, timelineService } from "@/services/timeline"; import { getHttpUserClient, HttpUserNotExistError } from "@/http/user"; import SearchInput from "../common/SearchInput"; import BlobImage from "../common/BlobImage"; const TimelineMemberItem: React.FC<{ user: User; owner: boolean; onRemove?: (username: string) => void; }> = ({ user, owner, onRemove }) => { const { t } = useTranslation(); const avatar = useAvatar(user.username); return ( {user.nickname} {"@" + user.username} {(() => { if (owner) { return null; } if (onRemove == null) { return null; } return ( ); })()} ); }; export interface TimelineMemberProps { timeline: TimelineInfo; editable: boolean; } const TimelineMember: React.FC = (props) => { const { t } = useTranslation(); const [userSearchText, setUserSearchText] = useState(""); const [userSearchState, setUserSearchState] = useState< | { type: "user"; data: User; } | { type: "error"; data: string } | { type: "loading" } | { type: "init" } >({ type: "init" }); const userSearchAvatar = useAvatar( userSearchState.type === "user" ? userSearchState.data.username : undefined ); const { timeline } = props; const members = [timeline.owner, ...timeline.members]; return ( {members.map((member, index) => ( { void timelineService.removeMember( timeline.name, member.username ); } : undefined } /> ))} {(() => { if (props.editable) { return ( <> { setUserSearchText(v); }} loading={userSearchState.type === "loading"} onButtonClick={() => { if (userSearchText === "") { setUserSearchState({ type: "error", data: "login.emptyUsername", }); return; } setUserSearchState({ type: "loading" }); getHttpUserClient() .get(userSearchText) .catch((e) => { if (e instanceof HttpUserNotExistError) { return null; } else { throw e; } }) .then( (u) => { if (u == null) { setUserSearchState({ type: "error", data: "timeline.userNotExist", }); } else { setUserSearchState({ type: "user", data: u }); } }, (e) => { setUserSearchState({ type: "error", data: `${e as string}`, }); } ); }} /> {(() => { if (userSearchState.type === "user") { const u = userSearchState.data; const addable = members.findIndex((m) => m.username === u.username) === -1; return ( <> {!addable ? (

{t("timeline.member.alreadyMember")}

) : null} {u.nickname} {"@" + u.username} ); } else if (userSearchState.type === "error") { return (

{t(userSearchState.data)}

); } })()} ); } else { return null; } })()}
); }; export default TimelineMember; export interface TimelineMemberDialogProps extends TimelineMemberProps { open: boolean; onClose: () => void; } export const TimelineMemberDialog: React.FC = ( props ) => { return ( ); };