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; | |
}; | |