Reputation: 45
I am trying to fetch folder id from useParams but it is giving undefined. This is my App component
import { useParams} from 'react-router-dom';
function App() {
const [isLogin , setIsLogin] = useState(true);
// const ctx = useContext(UserContext)
// const isLogin = ctx.isLogin;
const user = useAuthState(auth);
// const userId = user?.[0].uid;
const userDetails = auth.currentUser;
useEffect(() => {
if (userDetails?.uid === null ) {
setIsLogin(false);
}
} , [userDetails ])
const { folderId } = useParams()
console.log(folderId)
return (
<DndProvider backend={HTML5Backend}>
<NavBar user = {user} onLogout={(props) => {setIsLogin(props)}} isLogin={isLogin} />
<p>Id is {folderId}</p>
<Routes>
<Route path="/:folderId" exact element = {<ShowNotes userId = {userDetails?.uid} />} />
<Route path='/register' exact element={user && isLogin ?
<div>
<FolderButton userId = {userDetails?.uid} />
<ShowFolder userId = {userDetails?.uid} />
</div> : <SignInForm onLogin = {(props) => {setIsLogin(props)}} />} />
<Route path='/' exact element={user && isLogin ? <div>
<AddNotesButton userId = {userDetails?.uid} />
<FolderButton userId = {userDetails?.uid} />
<ShowFolder userId = {userDetails?.uid} />
</div> : <Login onLogin = {(props) => {setIsLogin(props)}} />} />
</Routes>
</DndProvider>
);
}
export default App;
this is folder component
mport React, { useState, useEffect } from "react";
import { db } from "../firebase";
import { collection, getDocs, docs } from "firebase/firestore";
import FolderData from "./FolderData";
function ShowFolder(props) {
const [folders, setFolders] = useState([]);
const folderRef = collection(db, "folders");
useEffect(() => {
const getData = async () => {
const data = await getDocs(folderRef);
const folderData = data.docs.map((doc) => {
return { id: doc.id, data: doc.data() };
});
console.log(folderData);
setFolders(folderData);
};
getData();
}, []);
return (
<>
{folders.map((folder) => {
return (
<div key={folder.id}>
{folder.data.userId === props.userId && (
<div>
<div className="container w-full md:px-4 mx-auto py-2">
<div className="md:grid lg:grid-cols-3 md:grid-cols-2 mlg:grid-cols-3 md:gap-10 space-y-6 md:space-y-0 px-10 md:px-0 mx-auto">
<FolderData key={folder.id} folder={folder} />
</div>
</div>
</div>
)}
</div>
);
})}
</>
);
}
export default ShowFolder;
and this is folderData
import React from "react";
import { Link } from "react-router-dom";
import image from "../assets/folder.png";
function FolderData(props) {
return (
<div>
<Link to={`/${props.folder.id}`}>
<figure>
<img alt="" src={image} height="150" width="90" />
<figcaption>{props.folder.data.title}</figcaption>
</figure>
</Link>
</div>
);
}
export default FolderData;
Please help me out. I have even tried using match.params but that also is undefined. and if there is any other way i can get the content from url please suggest me that also.
Upvotes: 0
Views: 945
Reputation: 2056
Your const { folderId } = useParams()
needs to be in component which is wrapped by Route
component that define these params
Upvotes: 1