I’m having a successful deployment
useLocation /Users/hvaandres/Desktop/Development/Ecommerce/modules/hooks.js:29 26 | ); 27 | } 28 | > 29 | return useContext(Context).location; 30 | } 31 | 32 | export function useParams() {
Success:
Compiled successfully! You can now view ecommerce-store in the browser. Local: http://localhost:3000 On Your Network: http://192.168.1.194:3000 Note that the development build is not optimized. To create a production build, use npm run build.
The issue says that is coming from a hook.js file which I don’t see this file in my repo:
If I look at the chrome tools, this is the reference from my issue
import React from "react"; import invariant from "tiny-invariant"; import Context from "./RouterContext.js"; import HistoryContext from "./HistoryContext.js"; import matchPath from "./matchPath.js"; const useContext = React.useContext; export function useHistory() { if (__DEV__) { invariant( typeof useContext === "function", "You must use React >= 16.8 in order to use useHistory()" ); } return useContext(HistoryContext); } export function useLocation() { if (__DEV__) { invariant( typeof useContext === "function", "You must use React >= 16.8 in order to use useLocation()" ); } return useContext(Context).location; } export function useParams() { if (__DEV__) { invariant( typeof useContext === "function", "You must use React >= 16.8 in order to use useParams()" ); } const match = useContext(Context).match; return match ? match.params : {}; } export function useRouteMatch(path) { if (__DEV__) { invariant( typeof useContext === "function", "You must use React >= 16.8 in order to use useRouteMatch()" ); } const location = useLocation(); const match = useContext(Context).match; return path ? matchPath(location.pathname, path) : match; }
If I trace the problem it seems that is located inside of my NavBar.js which is invoking useLocation():
import React, { useState } from 'react'; import { AppBar, Toolbar, IconButton, Badge, MenuItem, Menu, Typography } from '@material-ui/core'; import { ShoppingCart } from '@material-ui/icons'; import { Link, useLocation } from 'react-router-dom'; import logo from '../../assets/logo.png'; import useStyles from './styles'; const PrimarySearchAppBar = ({ totalItems }) => { const [mobileMoreAnchorEl, setMobileMoreAnchorEl] = useState(null); const classes = useStyles(); const location = useLocation(); const isMobileMenuOpen = Boolean(mobileMoreAnchorEl); const handleMobileMenuClose = () => setMobileMoreAnchorEl(null); const mobileMenuId = 'primary-search-account-menu-mobile'; const renderMobileMenu = ( <Menu anchorEl={mobileMoreAnchorEl} anchorOrigin={{ vertical: 'top', horizontal: 'right' }} id={mobileMenuId} keepMounted transformOrigin={{ vertical: 'top', horizontal: 'right' }} open={isMobileMenuOpen} onClose={handleMobileMenuClose}> <MenuItem> <IconButton component={Link} to="/cart" aria-label="Show cart items" color="inherit"> <Badge badgeContent={totalItems} color="secondary"> <ShoppingCart /> </Badge> </IconButton> <p>Cart</p> </MenuItem> </Menu> ); return ( <> <AppBar position="fixed" className={classes.appBar} color="inherit"> <Toolbar> <Typography component={Link} to="/" variant="h6" className={classes.title} color="inherit"> <img src={logo} alt="commerce.js" height="25px" className={classes.image} /> Commerce.js </Typography> <div className={classes.grow} /> {location.pathname === '/' && ( <div className={classes.button}> <IconButton component={Link} to="/cart" aria-label="Show cart items" color="inherit"> <Badge badgeContent={totalItems} color="secondary"> <ShoppingCart /> </Badge> </IconButton> </div> )} </Toolbar> </AppBar> {renderMobileMenu} </> ); }; export default PrimarySearchAppBar;
The problem is that I don’t know what I’m doing wrong. This is my repo, could someone help me to see what is the issue or where I’m making a mistake?
Advertisement
Answer
in App.js import { BrowserRouter as Router} from "react-router-dom"; then wrap your components inside Router <Router> <Navbar totalItems={cart.total_items}/> {/* <Products products={products} onAddToCart={handleAddToCart}/> */} <Cart cart={cart}/> </Router>
This will solve your problem for sure, as your component is triying to use location from useLocation(), for that you have to wrap your component inside a Router coming from router-dom