Skip to content

Instantly share code, notes, and snippets.

@gcmatheusj
Created May 26, 2020 19:42
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gcmatheusj/ad58db214ed86aad21b7d6e9f556af61 to your computer and use it in GitHub Desktop.
Save gcmatheusj/ad58db214ed86aad21b7d6e9f556af61 to your computer and use it in GitHub Desktop.
import React, { createContext, useCallback, useContext, useState } from 'react';
import { uuid } from 'uuidv4';
import ToastContainer from '../components/ToastContainer';
export interface ToastMessage {
id: string;
type?: 'success' | 'error' | 'info';
title: string;
description?: string;
}
interface ToastContextData {
addToast(message: Omit<ToastMessage, 'id'>): void;
removeToast(id: string): void;
}
export const ToastContext = createContext<ToastContextData>(
{} as ToastContextData,
);
export const ToastProvider: React.FC = ({ children }) => {
const [messages, setMessages] = useState<ToastMessage[]>([]);
const addToast = useCallback(
({ type, title, description }: Omit<ToastMessage, 'id'>) => {
const id = uuid();
const message = {
id,
type,
title,
description,
};
setMessages((oldMessages) => [...oldMessages, message]);
},
[],
);
const removeToast = useCallback((id: string) => {
setMessages((oldMessages) =>
oldMessages.filter((message) => message.id !== id),
);
}, []);
return (
<ToastContext.Provider value={{ addToast, removeToast }}>
<ToastContainer messages={messages} />
{children}
</ToastContext.Provider>
);
};
export function useToast(): ToastContextData {
const context = useContext(ToastContext);
if (!context) {
throw new Error('useToast must be used within a ToastProvider');
}
return context;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment