@lexstile

Как правильно выстроить роутинг в зависимости от роли пользователя?

Проблема: в объектах employeeRoutes, adminRoutes, ownerRoutes есть одинаковое поле "/" (главная страница), т. к. эта страница должна показываться всем пользователям, но с отличным в зависимости от роли контентом.
62be0125e931a214015328.png

Изначально я планировал обойтись без функции createRoutes, которая сейчас эту проблему решает, но меня смущает, что я 2 раза создаю практически идентичный объект - сначала в routes, затем в createRoutes.
Код
const routes = {
  ...guestRoutes,
  ...employeeRoutes,
  ...adminRoutes,
  ...ownerRoutes,
};

const createRoutes = (role) => {
  switch (role) {
    case ROLES.EMPLOYEE:
      return { ...routes, ...employeeRoutes };
    case ROLES.ADMIN:
      return { ...routes, ...adminRoutes };
// это кейс можно не писать, т. к. в изначальном объекте ownerRoutes и так в самом конце.
    case ROLES.OWNER:
      return { ...routes, ...ownerRoutes };
  }

  return routes;
};

export const getRoutes = (role) => {
  const routes = createRoutes(role);

  if ([ROLES.GUEST, ROLES.EMPLOYEE, ROLES.ADMIN, ROLES.OWNER].includes(role)) {
    return Object.values(ROUTES[role]).reduce((acc, route) => (routes[route] ? [...acc, routes[route]] : [...acc]), []);
  }

  return [];
};

Мне нужно, чтобы объект роутов, привязанный к роли закидывался последним, т. е. пример:
Если employee, то такой объект
{
  ...guestRoutes,
  ...adminRoutes,
  ...ownerRoutes,
  ...employeeRoutes,
}

Если admin, то такой объект
{
  ...guestRoutes,
  ...employeeRoutes,
  ...ownerRoutes,
  ...adminRoutes,
}

Если owner, то такой объект
{
  ...guestRoutes,
  ...employeeRoutes,
  ...adminRoutes,
  ...ownerRoutes,
}

Можно ли как-то красиво обыграть данный кейс?
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы