@vimeo/iris
Version:
Vimeo Design System
113 lines (110 loc) • 5.66 kB
JavaScript
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 };