{
          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 (
    
      
    
  );
};