UNPKG

@ozen-ui/kit

Version:

React component library

89 lines (88 loc) 5.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SnackbarProvider = exports.cnSnackbar = void 0; var tslib_1 = require("tslib"); var react_1 = tslib_1.__importStar(require("react")); var useThemeProps_1 = require("../../hooks/useThemeProps"); var classname_1 = require("../../utils/classname"); var generateUniqKey_1 = require("../../utils/generateUniqKey"); var components_1 = require("./components"); var constants_1 = require("./constants"); var SnackbarContext_1 = require("./SnackbarContext"); var store_1 = require("./store"); exports.cnSnackbar = (0, classname_1.cn)('Snackbar'); exports.SnackbarProvider = (0, react_1.forwardRef)(function (inProps, ref) { var props = (0, useThemeProps_1.useThemeProps)({ props: inProps, name: 'SnackbarProvider', }); var _a = props.anchorOrigin, anchorOrigin = _a === void 0 ? constants_1.SNACKBAR_DEFAULT_ANCHOR_ORIGIN : _a, _b = props.maxMessages, maxMessages = _b === void 0 ? constants_1.SNACKBAR_DEFAULT_MAX_MESSAGES : _b, _c = props.container, container = _c === void 0 ? constants_1.SNACKBAR_DEFAULT_CONTAINER : _c, _d = props.lifetime, lifetime = _d === void 0 ? constants_1.SNACKBAR_DEFAULT_LIFETIME : _d, _e = props.disableWindowBlurListener, disableWindowBlurListener = _e === void 0 ? constants_1.SNACKBAR_DEFAULT_DISABLE_WINDOW_BLUR_LISTENER : _e, _f = props.status, status = _f === void 0 ? constants_1.SNACKBAR_ITEM_DEFAULT_STATUS : _f, className = props.className, children = props.children, other = tslib_1.__rest(props, ["anchorOrigin", "maxMessages", "container", "lifetime", "disableWindowBlurListener", "status", "className", "children"]); var providerProps = (0, react_1.useMemo)(function () { return ({ status: status, anchorOrigin: anchorOrigin, maxMessages: maxMessages, lifetime: lifetime, disableWindowBlurListener: disableWindowBlurListener, }); }, [status, anchorOrigin, maxMessages, lifetime, disableWindowBlurListener]); var _g = tslib_1.__read((0, react_1.useReducer)(store_1.snackbarReducer, { providerProps: providerProps, messages: [], queue: [], }), 2), state = _g[0], dispatch = _g[1]; var messagesByAnchorOrigin = state.messages.reduce(function (acc, message) { var _a; var anchorOrigin = message.anchorOrigin; var originKey = "".concat(anchorOrigin.horizontal, "-").concat(anchorOrigin.vertical); var currentOriginMessages = acc[originKey] || []; var isVerticalOriginTop = (anchorOrigin === null || anchorOrigin === void 0 ? void 0 : anchorOrigin.vertical) === 'top'; return tslib_1.__assign(tslib_1.__assign({}, acc), (_a = {}, _a[originKey] = tslib_1.__spreadArray(tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(((!isVerticalOriginTop && currentOriginMessages) || [])), false), [ message ], false), tslib_1.__read(((isVerticalOriginTop && currentOriginMessages) || [])), false), _a)); }, {}); var pushMessage = (0, react_1.useCallback)(function (pushMessageProps) { var messageId = pushMessageProps.messageId || (0, generateUniqKey_1.generateUniqKey)(); dispatch({ type: 'push-message', payload: tslib_1.__assign(tslib_1.__assign({}, pushMessageProps), { messageId: messageId }), }); return messageId; }, []); var closeMessage = (0, react_1.useCallback)(function (messageId) { dispatch({ type: 'close-message', payload: messageId }); }, []); var handleExitedSnackbarItem = function (messageId) { dispatch({ type: 'delete-message', payload: messageId }); }; var handleEnteredSnackbarItem = function (messageId) { dispatch({ type: 'message-opening-done', payload: messageId }); }; (0, react_1.useEffect)(function () { dispatch({ type: 'update-messages-from-queue' }); }, [state]); (0, react_1.useEffect)(function () { dispatch({ type: 'set-provider-props', payload: providerProps }); }, [providerProps]); var context = (0, react_1.useMemo)(function () { return ({ pushMessage: pushMessage, closeMessage: closeMessage }); }, []); var snackbars = Object.keys(messagesByAnchorOrigin).map(function (origin) { var _a; var messages = messagesByAnchorOrigin[origin] || []; return (react_1.default.createElement(components_1.Snackbar, tslib_1.__assign({}, other, { key: origin, anchorOrigin: (_a = messages === null || messages === void 0 ? void 0 : messages[0]) === null || _a === void 0 ? void 0 : _a.anchorOrigin, className: className, container: container, ref: ref }), !!messages.length && messages.map(function (message) { return (react_1.default.createElement(components_1.SnackbarItem, tslib_1.__assign({}, message, { key: message.key, onClose: function (messageId) { var _a; closeMessage(messageId); (_a = message.onClose) === null || _a === void 0 ? void 0 : _a.call(message, messageId); }, onExited: function (messageId) { var _a; handleExitedSnackbarItem(messageId); (_a = message.onExited) === null || _a === void 0 ? void 0 : _a.call(message, messageId); }, onEntered: function (messageId) { var _a; handleEnteredSnackbarItem(messageId); (_a = message.onEntered) === null || _a === void 0 ? void 0 : _a.call(message, messageId); } }))); }))); }); return (react_1.default.createElement(SnackbarContext_1.SnackbarContext.Provider, { value: context }, children, snackbars)); }); exports.SnackbarProvider.displayName = 'SnackbarProvider';