timolins / react-hot-toast

Smoking Hot React Notifications 🔥
https://react-hot-toast.com
MIT License
9.47k stars 310 forks source link

More default toast types (`toast.info()`, `toast.warn()`) #29

Open danqing opened 3 years ago

danqing commented 3 years ago

The default success / error states are really great! I wonder if there should also be a default warning state (yellow, maybe exclamation mark) too.

timolins commented 3 years ago

Yes! I think toast.warning() and toast.info() would be nice defaults. I'll see what I can do.

tobiasbueschel commented 3 years ago

Adding to that, shall we include some documentation on how to define your own custom toast types? @timolins Also thanks for the great library 👍

ilyaskarim commented 2 years ago

Is there any updates on this please?

rlenoir-codepoint commented 2 years ago

I would also be interested in having those two!

I already have a custom Toaster component where I map the type to our app theme styles for each case (success/error/warning/info), I am just missing the toast methods to call now :).

prince272 commented 2 years ago

Me too ooo! @rlenoir-codepoint

hibangun commented 2 years ago

@rlenoir-codepoint could you please share on how you implement custom taster component for each cases (success/error/warning/info)? :)

rlenoir-codepoint commented 2 years ago

@rlenoir-codepoint could you please share on how you implement custom taster component for each cases (success/error/warning/info)? :)

@hibangun I followed the documentation by extending the ToastBar API, see https://react-hot-toast.com/docs/toast-bar.

In a nutshell:

import { Toast, ToastBar, Toaster } from 'react-hot-toast';

type ToastNotificationType = {
  type: Toast['type'] | 'warning' | 'info';
  // warning + info might be added in future https://github.com/timolins/react-hot-toast/issues/29
};

<Toaster>
      {t => {

        // Mapping the toast notification type to the theme styles
        const getTypeStyleProps = (type: ToastNotificationType['type']) => {
          //
          let props = {};

          switch (type) {
            case 'success':
              props = {
                color: 'emerald-900',
                borderColor: 'emerald-300',
                backgroundColor: 'emerald-100',
              };
              break;

            case 'error':
              props = {
                color: 'red-900',
                borderColor: 'red-300',
                backgroundColor: 'red-100',
              };
              break;

            case 'warning':
              props = {
                color: 'amber-900',
                borderColor: 'amber-300',
                backgroundColor: 'amber-100',
              };
              break;

            case 'info':
              props = {
                color: 'blue-900',
                borderColor: 'blue-300',
                backgroundColor: 'blue-100',
              };
              break;

            default:
              props = {};
              break;
          }

          return props;
        };

        return (
          <ToastBar {...props} toast={t}>
            {({ icon, message }) => (
              <StyledToast {...getTypeStyleProps(t.type)}>
                ...
              </StyledToast>
            )}
          </ToastBar>
        );
      }}
    </Toaster>
maciekgrzybek commented 2 years ago

Hey, @timolins is this up for grab? I'd be happy to implement it :)

huazhuangnan commented 1 year ago

@danqing @timolins @hibangun @maciekgrzybek

import type { Toast, ToasterProps } from 'react-hot-toast';

export type Options = Partial<Pick<Toast, "icon" | "duration" | "ariaProps" | "className" | "style" | "position" | "iconTheme">> | undefined;

export const info: Options = {
  icon: <svg>...</svg>,
 iconTheme: {
    primary:  '..',
    secondary:  '...',
  }
}
export const warning: Options = {
  icon: <svg>..</svg>,
  iconTheme: {
    primary:  '..',
    secondary:  '...',
  }
}

export const customToast = Object.assign(toast, {
  info: (message: Message, opts?: Options) => toast(message, { ...opts, ...info }),
  warning: (message: Message, opts?: Options) => toast(message, { ...opts, ...warning }),
});