UNPKG

@vimeo/iris

Version:
113 lines (110 loc) 5.66 kB
import { b as __rest, _ as __read, c as __assign } from '../../tslib.es6-7f0e734f.js'; import React__default, { useEffect, useReducer, useCallback } from 'react'; import { Icon, Wrapper, Notification as Notification$1, Content, Action } from './Notification.style.esm.js'; import { reducer } from './Notification.state.esm.js'; import { withIris } from '../../utils/HOCs/withIris.esm.js'; import 'styled-components'; import 'polished'; import '../../themes/index.esm.js'; import '../../color/colors.esm.js'; import '../../typography/Paragraph/Paragraph.esm.js'; import '../../typography/Paragraph/Paragraph.style.esm.js'; import '../../typography/Text/Text.esm.js'; import '../../typography/Text/Text.style.esm.js'; import '../../typography/typography.esm.js'; import '../../tokens/core.esm.js'; import '../../tokens/color/index.esm.js'; import '../../tokens/color/background/background.esm.js'; import '../../tokens/util/readToken.esm.js'; import '../../tokens/util/clamp.esm.js'; import '../../tokens/color/format/format.esm.js'; import '../../tokens/color/format/primary.esm.js'; import '../../tokens/color/format/secondary.esm.js'; import '../../tokens/color/format/tertiary.esm.js'; import '../../tokens/color/rainbow/rainbow.esm.js'; import '../../tokens/color/rainbow/conic/index.esm.js'; import '../../tokens/color/rainbow/conic/sm.esm.js'; import '../../tokens/color/rainbow/conic/xl.esm.js'; import '../../tokens/color/rainbow/linear/index.esm.js'; import '../../tokens/color/rainbow/linear/sm.esm.js'; import '../../tokens/color/rainbow/linear/xl.esm.js'; import '../../tokens/color/livestream/livestream.esm.js'; import '../../tokens/color/status/status.esm.js'; import '../../tokens/color/status/caution.esm.js'; import '../../tokens/color/status/negative.esm.js'; import '../../tokens/color/status/positive.esm.js'; import '../../tokens/color/stroke/stroke.esm.js'; import '../../tokens/color/surface/surface.esm.js'; import '../../tokens/color/text/text.esm.js'; import '../../tokens/util/round.esm.js'; import '../../tokens/color/upsell/upsell.esm.js'; import '../../tokens/color/upsell/sm.esm.js'; import '../../tokens/color/upsell/xl.esm.js'; import '../../tokens/color/upsell/new.esm.js'; import '../../tokens/edge/edge.esm.js'; import '../../tokens/space/space.esm.js'; import '../../tokens/typography/index.esm.js'; import '../../tokens/typography/size/size.esm.js'; import '../../typography/Text/EditableText.esm.js'; import '../../utils/hooks/useLayoutStyles.esm.js'; import '../../utils/DOM/geometry.esm.js'; import '../../utils/css.esm.js'; import '../../icons/ui/CircleInfo.esm.js'; var Notification = withIris(NotficationComponent); function NotficationComponent(_a) { var _b = _a.automatic, automatic = _b === void 0 ? false : _b, action = _a.action, actionLabel = _a.actionLabel, _c = _a.children, children = _c === void 0 ? null : _c, _d = _a.status, status = _d === void 0 ? 'negative' : _d, forwardRef = _a.forwardRef, _e = _a.duration, duration = _e === void 0 ? 4000 : _e, content = _a.content, onComplete = _a.onComplete, props = __rest(_a, ["automatic", "action", "actionLabel", "children", "status", "forwardRef", "duration", "content", "onComplete"]); var controlled = typeof props.showing !== 'undefined'; var initialState = { active: automatic, showing: automatic, time: duration, }; useEffect(function () { if (controlled) { dispatch(props.showing ? 'SHOW' : 'HIDE'); dispatch(props.showing ? 'RESUME' : 'PAUSE'); dispatch('RESET'); } }, [controlled, props.showing]); var _f = __read(useReducer(reducer(duration), initialState), 2), _g = _f[0], showing = _g.showing, time = _g.time, active = _g.active, dispatch = _f[1]; var toggle = useCallback(function () { if (active) dispatch('PAUSE'); if (!active) dispatch('RESUME'); if (showing) dispatch('HIDE'); if (!showing) dispatch('SHOW'); dispatch('RESET'); }, [active, showing]); var pause = function () { return dispatch('PAUSE'); }; var resume = function () { return dispatch('RESUME'); }; var finish = useCallback(function () { dispatch('PAUSE'); dispatch('HIDE'); onComplete && onComplete(); }, [onComplete]); useEffect(function () { var timer = setInterval(function () { return dispatch('TICK'); }, 100); if (time <= 0) finish(); if (!active) clearInterval(timer); return function () { return clearInterval(timer); }; }, [active, time, finish]); var icon = status === 'negative' && typeof content === 'string' && (React__default.createElement("span", null, React__default.createElement(Icon, null))); return (React__default.createElement(React__default.Fragment, null, children && React__default.createElement("div", { onClick: toggle }, children), (showing || props.showing) && (React__default.createElement(Wrapper, null, React__default.createElement(Notification$1, __assign({ icon: icon, status: status, duration: duration, actionLabel: actionLabel, onMouseEnter: pause, onMouseLeave: resume, ref: forwardRef }, props), React__default.createElement(Content, null, icon, content, actionLabel && (React__default.createElement("span", null, "\u00A0", React__default.createElement(Action, { href: "#", onClick: action.onClick }, actionLabel))))))))); } export { Notification };