# #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); } }, };