Spaces:
Running
Running
| /** | |
| * | |
| * Copyright 2023-2025 InspectorRAGet Team | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| * | |
| **/ | |
| 'use client'; | |
| import { createContext, useContext, useState, useRef } from 'react'; | |
| import { ToastNotification } from '@carbon/react'; | |
| import { Notification as NotificationType } from '@/src/types'; | |
| import styles from './Notification.module.scss'; | |
| type NotificationContextType = { | |
| createNotification(notification: NotificationType, timeout?: number): void; | |
| }; | |
| const NotificationContext = createContext<NotificationContextType | undefined>( | |
| undefined, | |
| ); | |
| const NotificationComponent = ({ | |
| title, | |
| subtitle, | |
| kind, | |
| caption, | |
| }: NotificationType) => ( | |
| <ToastNotification | |
| hideCloseButton={true} | |
| className={styles.notification} | |
| closeOnEscape={false} | |
| title={title} | |
| kind={kind} | |
| subtitle={subtitle} | |
| caption={caption} | |
| /> | |
| ); | |
| export const NotificationProvider = ({ children }: { children: any }) => { | |
| const [notification, setNotification] = useState< | |
| NotificationType | undefined | |
| >(); | |
| const timeoutId = useRef<NodeJS.Timeout | undefined>(); | |
| const createNotification = ( | |
| notification: NotificationType, | |
| timeout?: number, | |
| ) => { | |
| if (timeoutId.current) { | |
| clearTimeout(timeoutId.current); | |
| } | |
| setNotification(notification); | |
| timeoutId.current = setTimeout( | |
| () => { | |
| setNotification(undefined); | |
| }, | |
| timeout ? timeout : 5000, | |
| ); | |
| }; | |
| return ( | |
| <NotificationContext.Provider value={{ createNotification }}> | |
| {children} | |
| {notification && <NotificationComponent {...notification} />} | |
| </NotificationContext.Provider> | |
| ); | |
| }; | |
| export const useNotification = () => { | |
| const context = useContext(NotificationContext); | |
| if (context === undefined) { | |
| throw new Error( | |
| 'useNotification must be used within a NotificationProvider', | |
| ); | |
| } | |
| return context; | |
| }; | |