// notification-context.js
import { createContext, useState } from "react";
const NotificationContext = createContext({
notification: null,
showNotification: function (notificationData) {},
hideNotification: function () {},
});
export function NotificationContextProvider(props) {
const [activeNotification, setActiveNotification] = useState();
function showNotificationHandler(notificationData) {
setActiveNotification(notificationData);
}
function hideNotificationHandler() {
setActiveNotification(null);
}
const context = {
notification: activeNotification,
showNotification: showNotificationHandler,
hideNotification: hideNotificationHandler,
};
return (
<NotificationContext.Provider value={context}>
{props.children}
</NotificationContext.Provider>
);
}
export default NotificationContext;
// _app.js
import Head from "next/head";
import Layout from "../components/layout/layout";
import Notification from "../components/ui/notification";
import "../styles/globals.css";
import { NotificationContextProvider } from "../store/notification-context";
function MyApp({ Component, pageProps }) {
return (
**<NotificationContextProvider>**
<Layout>
<Head>
<title>Next Events</title>
<meta name="description" content="NextJS Events" />
<meta
name="viewport"
content="initial-scale=1.0, width=device-width"
/>
</Head>
<Component {...pageProps} />
<Notification title="Test" message="This is a test" status="pending" />
</Layout>
**</NotificationContextProvider>**
);
}
export default MyApp;
Provider 내부에 위치하는 Layout 안에 Notification 컴포넌트를 위치시킨다.
// Layout
import { Fragment, useContext } from "react";
import MainHeader from "./main-header";
import Notification from "../ui/notification";
import NotificationContext from "../../store/notification-context";
function Layout(props) {
const notificationCtx = useContext(NotificationContext);
const activeNotification = notificationCtx.notification;
return (
<Fragment>
<MainHeader />
<main>{props.children}</main>
{activeNotification && (
<Notification
title={activeNotification.title}
message={activeNotification.message}
status={activeNotification.status}
/>
)}
</Fragment>
);
}
export default Layout;