Реагируйте на имя административного ресурса с переменной пути

# #reactjs #firebase #authentication #react-admin #authprovider

Вопрос:

Можно ли указать имя ресурса в React Admin с переменной path?

Проблема

Когда пользователь аутентифицируется, если администратор, он должен увидеть список учетных записей электронной почты. Нажав на электронное письмо, оно перенаправляет на путь experts/${email}/requests .

Чтобы отобразить этот путь, мне нужно определить новый ресурс для каждого электронного письма. Проблема в том, что я должен сделать это до аутентификации.

То, что я хотел бы иметь, — это переменная пути для имени ресурса. например experts/:email/requests .

Пример текущей реализации

 function App() {  const [emails, setEmails] = useStatelt;string[]gt;([]);  useEffect(() =gt; {  (async () =gt; {  const experts = await firebase.firestore().collection("experts").get();  const docIds: string[] = experts.docs.map((doc) =gt; doc.id);  setEmails(docIds);  })();  }, []);   return (  lt;Admin  authProvider={authProvider}  dataProvider={dataProvider}  gt;  {(props) =gt; {  if (props.admin) {  return [  emails.map((email) =gt; {  return (  lt;Resource  key={email}  options={{ label: `${email}` }}  name={`experts/${email}/requests`}  list={RequestList}  edit={RequestEdit}  /gt;  );  }),  lt;Resource name={`experts`} list={ExpertList} /gt;,  ];  } else {  return [  lt;Resource  options={{ label: `${props.email}` }}  name={`experts/${props.email}/requests`}  list={RequestList}  edit={RequestEdit}  /gt;,  ];  }  }}  lt;/Admingt;  );  }  

Ответ №1:

Вместо переменной пути (невозможно с React Admin) я решил переопределить логин поставщика авторизации Firebase, чтобы получить данные сразу после входа пользователя.

Время ожидания необходимо, потому что может случиться так, что локальное хранилище будет настроено после первого рендеринга.

 let authProvider = FirebaseAuthProvider(firebaseConfig, options); const login = authProvider.login; authProvider = {  ...authProvider,  login: async (params) =gt; {  try {  const user = await login(params);  const experts = await firebase.firestore().collection("experts").get();  const docIds: string[] = experts.docs.map((doc) =gt; doc.id);  localStorage.setItem("emails", JSON.stringify(docIds));  await timeout(300);  return user;  } catch (error) {  console.error("error", error);  }  }, };