Migrate to v9
What is new in v9β
Say hello to addons! What are addons? So, addons are like DLCs in video games but for react-toastify π. More seriously, you can think of it as utilities built around react-toastify. For example, custom theme, hooks, components etc...
useNotificationCenterβ
The first addon that I would like to introduce is the useNotificationCenter
headless hook! As the name suggests, it let you build your notification center on top of react-toastify. See for yourself π
Another example using MUI.
Addons only impact your bundle size if you use them π!
Check the documentation for more details.
Stacked toastsβ
This second addon will be released later. There are a bunch of details that I need to cover and I don't want to release something too buggy. Nevertheless, I'm really excited about it and I think it's worth showcasing anyway.
I call it StackedContainer
for now, it's an alternative to the ToastContainer
component.
Breaking changesβ
There are 2 breaking changes. The API change for toast.onChange
and the removal of toast.configure
.
toast.onChange
β
The previous API was returning the numberOfToastDisplayed
and the containerId
. Honestly, this API seems to be incomplete.
For example, with the old API, if I wanted to do some logging this would be very difficult because I don't have enough data to log.
toast.onChange((numberOfToastDisplayed, containerId) => {
logger.info("nothing useful to log, ...")
})
The new API offers more possibilities. The callback will receive a ToastItem
. The item provides a bunch of useful properties status
, content
, id
, data
, etc...
interface ToastItem<Data = {}> {
id: Id;
content: React.ReactNode;
theme?: Theme;
type?: TypeOptions;
isLoading?: boolean;
containerId?: Id;
data: Data;
icon?: React.ReactNode | false;
status: "added" | "removed" | "updated"
}
const unsubscribe = toast.onChange((payload: ToastItem) => {
switch (payload.status) {
case "added":
// new toast added
break;
case "updated":
// toast updated
break;
case "removed":
// toast has been removed
break;
}
});
For example, if I want to log something every time there is a new error notification, with the new API it's trivial
toast.onChange(payload => {
if(payload.status === "added" && payload.type === toast.TYPE.ERROR) {
logger.error({
createdAt: Date.now(),
content: payload.content,
data: payload.data
})
}
})
toast.configure
removalβ
toast.configure
works fine for most cases but the current implementation has one main issue. It does not work with react context because it creates a new react tree.
That being said, having 2 APIs to do the same thing is a bad thing.