Using react-hot-toast with Astro

Posted January 23, 2023

Thank you to @happydev on the Astro discord who was able to figure this out.

1. Install react-hot-toast

Terminal window
npm install react-hot-toast

2. Create a component called Toastify.tsx

The Toastify component takes another component as its argument and returns it with a Toaster component imported from react-hot-toast.

Toastify.tsx
import { Toaster } from "react-hot-toast";
export default (Component) => {
return (props) => (
<br>
<Toaster position="top-center" reverseOrder={false} />
<Component {...props} />
</>
);
};

3. Create a component called Button.tsx

Button.tsx
export default function Button(message) {
return <button>{message}</button>;
}

4. Import Toastify.tsx into Button.tsx

Export the Toastify component with the Button as its argument.

Button.tsx
import Toastify from "./Toastify";
import toast from "react-hot-toast";
export default function Toastify(function Button({message})) {
return <button>{message}</button>
}

5. Create a function to trigger the toast

Button.tsx
const notify = () => toast("Toast!");

6. Set the client directive to client:load

If there is no client directive the HTML will be rendered without JavaScript. Reference

<ToastExample client:load message="Click me!" />

Final Result

import Toastify from "./Toastify";
import toast from "react-hot-toast";
export default Toastify(function Button({ message }) {
const notify = () => toast("Toast!");
return (
<>
<button onClick={notify}>{message}</button>
</>
);
});