UNPKG

@blockstack/ui

Version:

Blockstack UI components built using React and styled-components with styled-system.

90 lines (76 loc) 2.41 kB
import { objectSpread2 as _objectSpread2 } from '../_virtual/_rollupPluginBabelHelpers.js'; import React__default, { useContext, useCallback, createContext, useReducer } from 'react'; import { Portal } from '../portal/index.esm.js'; import { Toaster } from './toaster.esm.js'; var toastCounter = 0; var ToastControllerContext = /*#__PURE__*/createContext(null); var QUEUE_TOAST = 0; var REMOVE_TOAST = 1; function reducer(state, action) { switch (action.type) { case QUEUE_TOAST: { return _objectSpread2({}, state, { toasts: [].concat(state.toasts, [action.payload]) }); } case REMOVE_TOAST: { var toasts = state.toasts.filter(function (_ref) { var id = _ref.id; return id !== action.payload; }); return _objectSpread2({}, state, { toasts: toasts }); } } return state; } var InternalToastProvider = function InternalToastProvider(_ref2) { var children = _ref2.children; var _useReducer = useReducer(reducer, { toasts: [] }), toasts = _useReducer[0].toasts, dispatch = _useReducer[1]; var addToast = useCallback(function (props) { return dispatch({ type: QUEUE_TOAST, payload: props }); }, []); var removeToast = useCallback(function (id) { return dispatch({ type: REMOVE_TOAST, payload: id }); }, []); return React__default.createElement(ToastControllerContext.Provider, { value: addToast }, children, React__default.createElement(Portal, null, React__default.createElement(Toaster, { toasts: toasts, removeToast: removeToast }))); }; var ToastProvider = function ToastProvider(_ref3) { var children = _ref3.children; var currentContext = useContext(ToastControllerContext); if (currentContext !== null) { return React__default.createElement(React__default.Fragment, null, children); } return React__default.createElement(InternalToastProvider, null, children); }; var useToast = function useToast() { var addToast = useContext(ToastControllerContext); if (addToast === null) { throw new Error('No "ToastProvider" configured'); } return useCallback(function (props) { return addToast(_objectSpread2({}, props, { id: "" + toastCounter++ })); }, [addToast]); }; export { ToastProvider, useToast }; //# sourceMappingURL=toast-context.esm.js.map