@blockstack/ui
Version:
Blockstack UI components built using React and styled-components with styled-system.
90 lines (76 loc) • 2.41 kB
JavaScript
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