import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { Container, ListGroup, ListGroupItem, Modal, Row, Col, Button, } from "reactstrap"; import { User, useAvatar } from "../data/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 TimelineMemberCallbacks { onCheckUser: (username: string) => Promise; onAddUser: (user: User) => Promise; onRemoveUser: (username: string) => void; } export interface TimelineMemberProps { members: User[]; edit: TimelineMemberCallbacks | null | undefined; } 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 members = props.members; return ( {members.map((member, index) => ( ))} {(() => { const edit = props.edit; if (edit != null) { return ( <> { setUserSearchText(v); }} loading={userSearchState.type === "loading"} onButtonClick={() => { if (userSearchText === "") { setUserSearchState({ type: "error", data: "login.emptyUsername", }); return; } setUserSearchState({ type: "loading" }); edit.onCheckUser(userSearchText).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 ( ); };