19

I'm trying to use the useSnack hook from notistack library but I keep getting this error

TypeError: Cannot destructure property 'enqueueSnackbar' of 'Object(...)(...)' as it is undefined.

Here is the code:

import React, { useContext, useEffect } from "react";
import AlertContext from "../context/alert/alertContext";
import { SnackbarProvider, useSnackbar } from "notistack";

const Alerts = (props) => {
  const alertContext = useContext(AlertContext);
  // This line below is where the error seems to be
  const { enqueueSnackbar } = useSnackbar();
  useEffect(() => {
    alertContext.msg !== "" &&
      enqueueSnackbar(alertContext.msg, {
        variant: alertContext.type,
      });
  }, [alertContext]);
  return <SnackbarProvider maxSnack={4}>{props.children}</SnackbarProvider>;
};

export default Alerts;
Samuel Seibidor
  • 195
  • 1
  • 1
  • 4

2 Answers2

21

useSnackbar hook accessible anywhere down the tree from SnackbarProvider.

So you cannot use it in the same component as SnackbarProvier.

import AlertContext from "../context/alert/alertContext";
import { SnackbarProvider } from "notistack";

const Alerts = (props) => {
  const alertContext = useContext(AlertContext);
  const providerRef = React.useRef();

  useEffect(() => {
    alertContext.msg !== "" &&
      providerRef.current.enqueueSnackbar(alertContext.msg, {
        variant: alertContext.type,
      });
  }, [alertContext]);
  return <SnackbarProvider ref={providerRef} maxSnack={4}>
       {props.children}
       </SnackbarProvider>;
};

export default Alerts;
Bassem
  • 3,582
  • 2
  • 24
  • 47
  • I moved the SnackbarProvider to index.js og my react app and it started working in all components of my app, very helpful answer – Inzamam Malik Jul 18 '21 at 23:43
3

Wrap you index file with SnapBar provider:

index.js

import { SnackbarProvider } from "notistack";

const Index = () => (
    <SnackbarProvider maxSnack={1} preventDuplicate>
        index
    </SnackbarProvider>
)

export default Index

jsx file

import { useSnackbar } from "notistack";

const Logs = () => {
    const { enqueueSnackbar } = useSnackbar();

    const handler = () => {
        enqueueSnackbar(`Successful.`, { variant: "success" });
    };

    return <span onClick={handler}>"Logs loading"</span>;
};

export default Logs;
Zak
  • 6,976
  • 2
  • 26
  • 48
Chukwuemeka Maduekwe
  • 6,687
  • 5
  • 44
  • 67