import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Container, ListGroup, ListGroupItem, Modal, Row, Col, Button, } from 'reactstrap'; import { User, useAvatarUrl } from '../data/user'; import SearchInput from '../common/SearchInput'; const TimelineMemberItem: React.FC<{ user: User; owner: boolean; onRemove?: (username: string) => void; }> = ({ user, owner, onRemove }) => { const { t } = useTranslation(); const avatarUrl = useAvatarUrl(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 userSearchAvatarUrl = useAvatarUrl( 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 ( ); };