eletrotupi / tcc/ frontend/context/ToastContext.tsxc377fb94289224023a0ab5d229329b5a4e06af51
1.1 KB | 36 lines Raw
1
import React, { createContext, useCallback, useContext, useRef, useState } from 'react';
2
import { Toast, ToastVariant } from '@/components/ui/Toast';
3

4
interface ToastContextValue {
5
  showToast: (message: string, variant?: ToastVariant) => void;
6
}
7

8
const ToastContext = createContext<ToastContextValue>({
9
  showToast: () => {},
10
});
11

12
export function useToast() {
13
  return useContext(ToastContext);
14
}
15

16
export function ToastProvider({ children }: { children: React.ReactNode }) {
17
  const [message, setMessage] = useState('');
18
  const [variant, setVariant] = useState<ToastVariant>('error');
19
  const [visible, setVisible] = useState(false);
20
  const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
21

22
  const showToast = useCallback((msg: string, v: ToastVariant = 'error') => {
23
    if (timerRef.current) clearTimeout(timerRef.current);
24
    setMessage(msg);
25
    setVariant(v);
26
    setVisible(true);
27
    timerRef.current = setTimeout(() => setVisible(false), 3500);
28
  }, []);
29

30
  return (
31
    <ToastContext.Provider value={{ showToast }}>
32
      {children}
33
      <Toast message={message} variant={variant} visible={visible} />
34
    </ToastContext.Provider>
35
  );
36
}