tududi/app/frontend/components/Shared/ToastContext.tsx
Chris Veleris dfcb97a355 Move to React
Add .gitignore

Removed node_modules from previous commit

Fix task modes

Fix task modes

Fix task modes

Remove node_modules

Update basic task modal

Add notes functionality

Improve UI

Setup views

Add scopes

Fix projects layout

Restructure

Fix rest of the UI issues

Cleanup old views

Add .env to .gitignore
2024-10-25 21:03:43 +03:00

62 lines
2 KiB
TypeScript

import React, { createContext, useContext, useState, useCallback } from 'react';
// Define the shape of the context
interface ToastContextProps {
showSuccessToast: (message: string) => void;
showErrorToast: (message: string) => void;
}
// Create a context with default values
const ToastContext = createContext<ToastContextProps | undefined>(undefined);
// Toast provider component
export const ToastProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
const [toastMessage, setToastMessage] = useState<string | null>(null);
const [toastType, setToastType] = useState<'success' | 'error'>('success');
// Show success toast
const showSuccessToast = useCallback((message: string) => {
setToastMessage(message);
setToastType('success');
setTimeout(() => setToastMessage(null), 3000); // Auto-hide after 3 seconds
}, []);
// Show error toast
const showErrorToast = useCallback((message: string) => {
setToastMessage(message);
setToastType('error');
setTimeout(() => setToastMessage(null), 3000); // Auto-hide after 3 seconds
}, []);
return (
<ToastContext.Provider value={{ showSuccessToast, showErrorToast }}>
{children}
{toastMessage && <Toast message={toastMessage} type={toastType} onClose={() => setToastMessage(null)} />}
</ToastContext.Provider>
);
};
// Custom hook to use the ToastContext
export const useToast = () => {
const context = useContext(ToastContext);
if (context === undefined) {
throw new Error('useToast must be used within a ToastProvider');
}
return context;
};
// Toast component
const Toast: React.FC<{ message: string; type: 'success' | 'error'; onClose: () => void }> = ({ message, type, onClose }) => {
return (
<div
className={`fixed bottom-4 right-4 z-50 px-4 py-3 rounded-lg shadow-md text-white ${
type === 'success' ? 'bg-green-500' : 'bg-red-500'
}`}
>
<span>{message}</span>
<button onClick={onClose} className="ml-4">
&times;
</button>
</div>
);
};