@itwin/itwinui-react
Version:
A react component library for iTwinUI
173 lines (172 loc) • 4.47 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true,
});
function _export(target, all) {
for (var name in all)
Object.defineProperty(target, name, {
enumerable: true,
get: all[name],
});
}
_export(exports, {
ToastProvider: function () {
return ToastProvider;
},
Toaster: function () {
return Toaster;
},
ToasterStateContext: function () {
return ToasterStateContext;
},
useToaster: function () {
return useToaster;
},
});
const _interop_require_default = require('@swc/helpers/_/_interop_require_default');
const _interop_require_wildcard = require('@swc/helpers/_/_interop_require_wildcard');
const _react = /*#__PURE__*/ _interop_require_wildcard._(require('react'));
const _classnames = /*#__PURE__*/ _interop_require_default._(
require('classnames'),
);
const _index = require('../../utils/index.js');
const _Toast = require('./Toast.js');
const useToaster = () => {
let dispatch = (0, _index.useSafeContext)(ToasterDispatchContext);
return _react.useMemo(() => {
let showToast = (category) => (content, options) => {
let id = nextId();
dispatch({
type: 'add',
toast: {
...options,
id,
content,
category,
},
});
return {
close: () =>
dispatch({
type: 'remove',
id,
}),
};
};
return {
positive: showToast('positive'),
informational: showToast('informational'),
negative: showToast('negative'),
warning: showToast('warning'),
closeAll: () => {
dispatch({
type: 'close-all',
});
},
setSettings: (settings) => {
dispatch({
type: 'settings',
settings,
});
},
};
}, [dispatch]);
};
const Toaster = () => {
let { toasts, settings } = (0, _index.useSafeContext)(ToasterStateContext);
return _react.createElement(
_index.Box,
{
className: (0, _classnames.default)(
'iui-toast-wrapper',
`iui-placement-${settings.placement}`,
),
},
toasts.map((toastProps) =>
_react.createElement(_Toast.Toast, {
key: toastProps.id,
...toastProps,
}),
),
);
};
const ToastProvider = ({ children, inherit = false }) => {
let [toasterState, dispatch] = _react.useReducer(toastReducer, {
toasts: [],
settings: {
order: 'auto',
placement: 'top',
},
});
let toasterDispatchContext = _react.useContext(ToasterDispatchContext);
let toasterStateContext = _react.useContext(ToasterStateContext);
let shouldReuse = toasterStateContext && inherit;
let toasterDispatchContextValue = shouldReuse
? toasterDispatchContext
: dispatch;
let toasterStateContextValue = shouldReuse
? toasterStateContext
: toasterState;
return _react.createElement(
ToasterDispatchContext.Provider,
{
value: toasterDispatchContextValue,
},
_react.createElement(
ToasterStateContext.Provider,
{
value: toasterStateContextValue,
},
children,
),
);
};
const toastReducer = (state, action) => {
if ('add' === action.type) {
let order = state.settings.order;
if ('auto' === order)
order = state.settings.placement.startsWith('top')
? 'descending'
: 'ascending';
return {
...state,
toasts: [
...('ascending' === order ? state.toasts : []),
action.toast,
...('descending' === order ? state.toasts : []),
],
};
}
if ('remove' === action.type)
return {
...state,
toasts: state.toasts.filter((toast) => toast.id !== action.id),
};
if ('close-all' === action.type)
return {
...state,
toasts: state.toasts.map((toast) => ({
...toast,
isVisible: false,
})),
};
if ('settings' === action.type)
return {
...state,
settings: {
...state.settings,
...action.settings,
},
};
return state;
};
const ToasterStateContext = _react.createContext(void 0);
if ('development' === process.env.NODE_ENV)
ToasterStateContext.displayName = 'ToasterStateContext';
const ToasterDispatchContext = _react.createContext(void 0);
if ('development' === process.env.NODE_ENV)
ToasterDispatchContext.displayName = 'ToasterDispatchContext';
const nextId = (() => {
let count = 0;
return () => ++count;
})();