Spaces:
Running
Running
File size: 2,400 Bytes
599f646 e23b66d 599f646 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
/**
*
* 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;
};
|