{
setUserSearchText(v);
}}
loading={userSearchState.type === "loading"}
onButtonClick={() => {
if (userSearchText === "") {
setUserSearchState({
type: "error",
data: "login.emptyUsername",
});
return;
}
setUserSearchState({ type: "loading" });
getHttpSearchClient()
.searchUsers(userSearchText)
.then(
(users) => {
users = users.filter(
(user) =>
timeline.members.findIndex(
(m) => m.username === user.username
) === -1 && timeline.owner.username !== user.username
);
setUserSearchState({ type: "users", data: users });
},
(e) => {
setUserSearchState({
type: "error",
data: { type: "custom", value: String(e) },
});
}
);
}}
/>
{(() => {
if (userSearchState.type === "users") {
const users = userSearchState.data;
if (users.length === 0) {
return {t("timeline.member.noUserAvailableToAdd")}
;
} else {
return (
{users.map((user) => (
{
void getHttpTimelineClient()
.memberPut(timeline.name, user.username)
.then(() => {
setUserSearchText("");
setUserSearchState({ type: "init" });
onChange();
});
}}
/>
))}
);
}
} else if (userSearchState.type === "error") {
return (
{convertI18nText(userSearchState.data, t)}
);
}
})()}
>
);
};
export interface TimelineMemberProps {
timeline: HttpTimelineInfo;
onChange: () => void;
}
const TimelineMember: React.FC = (props) => {
const { timeline, onChange } = props;
const members = [timeline.owner, ...timeline.members];
return (
{members.map((member, index) => (
{
void getHttpTimelineClient()
.memberDelete(timeline.name, member.username)
.then(onChange);
}
: undefined
}
/>
))}
{timeline.manageable ? (
) : null}
);
};
export default TimelineMember;
export interface TimelineMemberDialogProps extends TimelineMemberProps {
open: boolean;
onClose: () => void;
}
export const TimelineMemberDialog: React.FC = (
props
) => {
return (
);
};