NikolayAlb
@NikolayAlb

React и бэкэнд. Как отобразить пользователей с их правами и представить ситуативный набор кнопок?

Добрый вечер. В данный момент пишу (пытаюсь) систему команды. Т.е. мы с фронтенда дергаем апи сервера, прикрепляем/открепляем существующих юзеров от проекта, и также несложный поиск.
Примерно так схематично должно всё выглядеть:
Участник [имя] [кнопка удаления участника]
Участник [имя] [кнопка удаления участника]
...
[форма поиска]
Найденный пользователь [Имя] [кнопка добавления пльзователя в участники]
...


Непосредственно компоненты участников, их удаление и добавление по поиску, самой формы поиска - я реализовал.
Но я столкнулся со сложностью реализации, когда существует еще понятие роли пользователя в проекте:
  • Создатель проекта - не может удалить себя, соответственно и кнопки удаления для него быть не должно видно, но может добавлять остальных юзеров.
  • Менеджер проекта - Может добавлять и удалять юзеров, но не может удалять создателя (но себя удалить может).
  • Обычный участник - Может удалить себя, но при этом не имеет доступа к компоненту поиска и соответственно, добавления других юзеров.


Но еще нужно каким-то образом реализовать приписки к пользователям ('creator'/'manager'). На сервере не проблема создать определенный ответ - ответ со списком ролей/bool ролей и т.д., но какой-бы способ я не выдумывал - либо реализация на фронтенде получается очень корявой, либо бэкэнд формирует слишком избыточный ответ, как со списком ролей, так и с флагами этих ролей, но и при таком случае во фронтенде у нас появляются крупные конструкции ифов.

Возможно есть какие-то best practice реализации подобного вывода, или может посоветуйте как лучше сделать?
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
Вам хватит простых условий:
render() {
  const { me, project, users } = this.props;
  const isMeModerator = isModerator(me);
  const isMeCreator = me.id === project.creator_id;
  const shouldShowSearchForm = isMeModerator || isMeCreator;

  return (
    <div>
      {shouldShowSearchForm && <Search />}
      <ul>
         {users.map(user => {
           const isUserCreator = user.id === project.creator_id;
           const shouldShowDeleteButton = (isMeModerator || isMeCreator) && !isUserCreator;

           return (
             <li key={user.id}>
               {user.name}
               {shouldShowDeleteButton && <Button>Delete</Delete>}
               {isUserCreator && <CreatorLabel />}
             </li>
           );  
         }}
      </ul>
    </div>
  );
}


Если в приложении много элементов которые зависят от ролей и полномочий можно написать контейнер с интерфейсом вида:
<PermissionsChecker requiredPermissions={permissions}>
  <SomeComponent />
</PermissionsChecker>

Тут permissions можно коннектить в PermissionsСhecker из стора и сверять с полученными в свойстве requiredPermissions и в случае наличия необходимых прав в store, возвращать дочерний компонент, в противном случае null.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы