diff --git a/frontend/components/context/NotificationProvider.tsx b/frontend/components/context/NotificationProvider.tsx new file mode 100644 index 000000000..98e24f5ab --- /dev/null +++ b/frontend/components/context/NotificationProvider.tsx @@ -0,0 +1,113 @@ +import { createContext, ReactNode, useContext, useState } from "react"; +import { faXmarkCircle } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import classnames from "classnames"; + +type NotificationType = "success" | "error"; +type Notification = { + text: string; + type: NotificationType; +}; + +type NotificationContextState = { + createNotification: (text: string, type?: NotificationType) => void; +}; +const NotificationContext = createContext({ + createNotification: () => console.log("createNotification not set!"), +}); + +export const useNotificationContext = () => useContext(NotificationContext); + +interface NotificationProviderProps { + children: ReactNode; +} + +interface NoticationsProps { + notifications: Notification[]; + clearNotification: (text?: string) => void; +} + +const Notifications = ({ + notifications, + clearNotification, +}: NoticationsProps) => { + return ( +
+
+ {notifications.map((notif) => ( +
+

{notif.text}

+ +
+ ))} +
+
+ ); +}; + +const NotificationProvider = ({ children }: NotificationProviderProps) => { + const [notifications, setNotifications] = useState([ + { + text: "Your secrets weren't saved, please fix the conflicts first.", + type: "error", + }, + { + text: "Testing", + type: "success", + }, + ]); + + const clearNotification = (text?: string) => { + if (text) { + return setNotifications((state) => + state.filter((notif) => notif.text !== text) + ); + } + + return setNotifications([]); + }; + + const createNotification = ( + text: string, + type: NotificationType = "success" + ) => { + const doesNotifExist = notifications.some((notif) => notif.text === text); + + if (doesNotifExist) { + return; + } + + return setNotifications((state) => [...state, { text, type }]); + }; + + return ( + + + {children} + + ); +}; + +export default NotificationProvider;