UNPKG

@itwin/itwinui-react

Version:

A react component library for iTwinUI

173 lines (172 loc) 4.47 kB
'use strict'; 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; })();