@atlaskit/flag 14.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1244 -0
- package/LICENSE +13 -0
- package/README.md +13 -0
- package/__perf__/autodismiss.tsx +18 -0
- package/__perf__/default.tsx +18 -0
- package/__perf__/withFlagGroup.tsx +20 -0
- package/auto-dismiss-flag/package.json +7 -0
- package/constants/package.json +7 -0
- package/dist/cjs/auto-dismiss-flag.js +89 -0
- package/dist/cjs/constants.js +8 -0
- package/dist/cjs/expander.js +41 -0
- package/dist/cjs/flag-actions.js +64 -0
- package/dist/cjs/flag-group.js +107 -0
- package/dist/cjs/flag-provider.js +119 -0
- package/dist/cjs/flag.js +219 -0
- package/dist/cjs/index.js +51 -0
- package/dist/cjs/theme.js +160 -0
- package/dist/cjs/types.js +10 -0
- package/dist/cjs/version.json +5 -0
- package/dist/es2019/auto-dismiss-flag.js +67 -0
- package/dist/es2019/constants.js +1 -0
- package/dist/es2019/expander.js +33 -0
- package/dist/es2019/flag-actions.js +73 -0
- package/dist/es2019/flag-group.js +130 -0
- package/dist/es2019/flag-provider.js +68 -0
- package/dist/es2019/flag.js +245 -0
- package/dist/es2019/index.js +4 -0
- package/dist/es2019/theme.js +119 -0
- package/dist/es2019/types.js +2 -0
- package/dist/es2019/version.json +5 -0
- package/dist/esm/auto-dismiss-flag.js +67 -0
- package/dist/esm/constants.js +1 -0
- package/dist/esm/expander.js +29 -0
- package/dist/esm/flag-actions.js +50 -0
- package/dist/esm/flag-group.js +85 -0
- package/dist/esm/flag-provider.js +92 -0
- package/dist/esm/flag.js +195 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/theme.js +129 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/version.json +5 -0
- package/dist/types/auto-dismiss-flag.d.ts +4 -0
- package/dist/types/constants.d.ts +2 -0
- package/dist/types/expander.d.ts +9 -0
- package/dist/types/flag-actions.d.ts +14 -0
- package/dist/types/flag-group.d.ts +27 -0
- package/dist/types/flag-provider.d.ts +26 -0
- package/dist/types/flag.d.ts +3 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/theme.d.ts +9 -0
- package/dist/types/types.d.ts +79 -0
- package/expander/package.json +7 -0
- package/extract-react-types/show-flag-args.tsx +5 -0
- package/flag/package.json +7 -0
- package/flag-actions/package.json +7 -0
- package/flag-group/package.json +7 -0
- package/flag-provider/package.json +7 -0
- package/package.json +80 -0
- package/theme/package.json +7 -0
- package/types/package.json +7 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import * as colors from '@atlaskit/theme/colors';
|
|
2
|
+
const flagBackgroundColor = {
|
|
3
|
+
error: {
|
|
4
|
+
light: colors.R400,
|
|
5
|
+
dark: colors.R300
|
|
6
|
+
},
|
|
7
|
+
info: {
|
|
8
|
+
light: colors.N500,
|
|
9
|
+
dark: colors.N500
|
|
10
|
+
},
|
|
11
|
+
normal: {
|
|
12
|
+
light: colors.N0,
|
|
13
|
+
dark: colors.DN50
|
|
14
|
+
},
|
|
15
|
+
success: {
|
|
16
|
+
light: colors.G400,
|
|
17
|
+
dark: colors.G300
|
|
18
|
+
},
|
|
19
|
+
warning: {
|
|
20
|
+
light: colors.Y200,
|
|
21
|
+
dark: colors.Y300
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
export const getFlagBackgroundColor = (appearance, mode) => flagBackgroundColor[appearance][mode];
|
|
25
|
+
export const flagBorderColor = colors.N60A;
|
|
26
|
+
const flagTextColor = {
|
|
27
|
+
error: {
|
|
28
|
+
light: colors.N0,
|
|
29
|
+
dark: colors.DN40
|
|
30
|
+
},
|
|
31
|
+
info: {
|
|
32
|
+
light: colors.N0,
|
|
33
|
+
dark: colors.DN600
|
|
34
|
+
},
|
|
35
|
+
normal: {
|
|
36
|
+
light: colors.N500,
|
|
37
|
+
dark: colors.DN600
|
|
38
|
+
},
|
|
39
|
+
success: {
|
|
40
|
+
light: colors.N0,
|
|
41
|
+
dark: colors.DN40
|
|
42
|
+
},
|
|
43
|
+
warning: {
|
|
44
|
+
light: colors.N700,
|
|
45
|
+
dark: colors.DN40
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
export const getFlagTextColor = (appearance, mode) => flagTextColor[appearance][mode];
|
|
49
|
+
export const flagShadowColor = colors.N50A;
|
|
50
|
+
const flagFocusRingColor = {
|
|
51
|
+
error: {
|
|
52
|
+
light: colors.N40,
|
|
53
|
+
dark: colors.N40
|
|
54
|
+
},
|
|
55
|
+
info: {
|
|
56
|
+
light: colors.N40,
|
|
57
|
+
dark: colors.N40
|
|
58
|
+
},
|
|
59
|
+
normal: {
|
|
60
|
+
light: colors.B100,
|
|
61
|
+
dark: colors.B100
|
|
62
|
+
},
|
|
63
|
+
success: {
|
|
64
|
+
light: colors.N40,
|
|
65
|
+
dark: colors.N40
|
|
66
|
+
},
|
|
67
|
+
warning: {
|
|
68
|
+
light: colors.N200,
|
|
69
|
+
dark: colors.N200
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
export const getFlagFocusRingColor = (appearance, mode) => flagFocusRingColor[appearance][mode];
|
|
73
|
+
const lightButtonBackground = 'rgba(255, 255, 255, 0.08)';
|
|
74
|
+
const actionBackground = {
|
|
75
|
+
success: {
|
|
76
|
+
light: lightButtonBackground,
|
|
77
|
+
dark: colors.N30A
|
|
78
|
+
},
|
|
79
|
+
info: {
|
|
80
|
+
light: lightButtonBackground,
|
|
81
|
+
dark: lightButtonBackground
|
|
82
|
+
},
|
|
83
|
+
error: {
|
|
84
|
+
light: lightButtonBackground,
|
|
85
|
+
dark: colors.N30A
|
|
86
|
+
},
|
|
87
|
+
warning: {
|
|
88
|
+
light: colors.N30A,
|
|
89
|
+
dark: colors.N30A
|
|
90
|
+
},
|
|
91
|
+
normal: {
|
|
92
|
+
light: 'none',
|
|
93
|
+
dark: 'none'
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
const actionColor = {
|
|
97
|
+
success: {
|
|
98
|
+
light: colors.N0,
|
|
99
|
+
dark: colors.DN40
|
|
100
|
+
},
|
|
101
|
+
info: {
|
|
102
|
+
light: colors.N0,
|
|
103
|
+
dark: colors.DN600
|
|
104
|
+
},
|
|
105
|
+
error: {
|
|
106
|
+
light: colors.N0,
|
|
107
|
+
dark: colors.DN600
|
|
108
|
+
},
|
|
109
|
+
warning: {
|
|
110
|
+
light: colors.N700,
|
|
111
|
+
dark: colors.DN40
|
|
112
|
+
},
|
|
113
|
+
normal: {
|
|
114
|
+
light: colors.B400,
|
|
115
|
+
dark: colors.B100
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
export const getActionBackground = (appearance, mode) => actionBackground[appearance][mode];
|
|
119
|
+
export const getActionColor = (appearance, mode) => actionColor[appearance][mode];
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import React, { useCallback, useEffect, useRef } from 'react';
|
|
3
|
+
import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next/usePlatformLeafEventHandler';
|
|
4
|
+
import Flag from './flag';
|
|
5
|
+
import { useFlagGroup } from './flag-group';
|
|
6
|
+
var packageName = "@atlaskit/flag";
|
|
7
|
+
var packageVersion = "14.4.1";
|
|
8
|
+
export var AUTO_DISMISS_SECONDS = 8;
|
|
9
|
+
|
|
10
|
+
function noop() {}
|
|
11
|
+
|
|
12
|
+
var AutoDismissFlag = function AutoDismissFlag(props) {
|
|
13
|
+
var id = props.id,
|
|
14
|
+
analyticsContext = props.analyticsContext,
|
|
15
|
+
_props$onDismissed = props.onDismissed,
|
|
16
|
+
onDismissedProp = _props$onDismissed === void 0 ? noop : _props$onDismissed;
|
|
17
|
+
var autoDismissTimer = useRef(null);
|
|
18
|
+
|
|
19
|
+
var _useFlagGroup = useFlagGroup(),
|
|
20
|
+
onDismissedFromFlagGroup = _useFlagGroup.onDismissed,
|
|
21
|
+
isDismissAllowed = _useFlagGroup.isDismissAllowed;
|
|
22
|
+
|
|
23
|
+
var onDismissed = useCallback(function (id, analyticsEvent) {
|
|
24
|
+
onDismissedProp(id, analyticsEvent);
|
|
25
|
+
onDismissedFromFlagGroup(id, analyticsEvent);
|
|
26
|
+
}, [onDismissedProp, onDismissedFromFlagGroup]);
|
|
27
|
+
var onDismissedAnalytics = usePlatformLeafEventHandler({
|
|
28
|
+
fn: onDismissed,
|
|
29
|
+
action: 'dismissed',
|
|
30
|
+
analyticsData: analyticsContext,
|
|
31
|
+
componentName: 'flag',
|
|
32
|
+
packageName: packageName,
|
|
33
|
+
packageVersion: packageVersion
|
|
34
|
+
});
|
|
35
|
+
var isAutoDismissAllowed = isDismissAllowed && onDismissed;
|
|
36
|
+
var dismissFlag = useCallback(function () {
|
|
37
|
+
if (isAutoDismissAllowed) {
|
|
38
|
+
onDismissedAnalytics(id);
|
|
39
|
+
}
|
|
40
|
+
}, [id, onDismissedAnalytics, isAutoDismissAllowed]);
|
|
41
|
+
var stopAutoDismissTimer = useCallback(function () {
|
|
42
|
+
if (autoDismissTimer.current) {
|
|
43
|
+
clearTimeout(autoDismissTimer.current);
|
|
44
|
+
autoDismissTimer.current = null;
|
|
45
|
+
}
|
|
46
|
+
}, []);
|
|
47
|
+
var startAutoDismissTimer = useCallback(function () {
|
|
48
|
+
if (!isAutoDismissAllowed) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
stopAutoDismissTimer();
|
|
53
|
+
autoDismissTimer.current = window.setTimeout(dismissFlag, AUTO_DISMISS_SECONDS * 1000);
|
|
54
|
+
}, [dismissFlag, stopAutoDismissTimer, isAutoDismissAllowed]);
|
|
55
|
+
useEffect(function () {
|
|
56
|
+
startAutoDismissTimer();
|
|
57
|
+
return stopAutoDismissTimer;
|
|
58
|
+
}, [startAutoDismissTimer, stopAutoDismissTimer]);
|
|
59
|
+
return /*#__PURE__*/React.createElement(Flag, _extends({}, props, {
|
|
60
|
+
onMouseOver: stopAutoDismissTimer,
|
|
61
|
+
onFocus: stopAutoDismissTimer,
|
|
62
|
+
onMouseOut: startAutoDismissTimer,
|
|
63
|
+
onBlur: startAutoDismissTimer
|
|
64
|
+
}));
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export default AutoDismissFlag;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export var DEFAULT_APPEARANCE = 'normal';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
|
|
2
|
+
|
|
3
|
+
var _templateObject;
|
|
4
|
+
|
|
5
|
+
/** @jsx jsx */
|
|
6
|
+
import { css, jsx } from '@emotion/core';
|
|
7
|
+
import { ExitingPersistence, FadeIn } from '@atlaskit/motion';
|
|
8
|
+
import { gridSize } from '@atlaskit/theme/constants';
|
|
9
|
+
var paddingLeft = gridSize() * 5;
|
|
10
|
+
|
|
11
|
+
var Expander = function Expander(_ref) {
|
|
12
|
+
var children = _ref.children,
|
|
13
|
+
isExpanded = _ref.isExpanded,
|
|
14
|
+
testId = _ref.testId;
|
|
15
|
+
// Need to always render the ExpanderInternal otherwise the
|
|
16
|
+
// reveal transition doesn't happen. We can't use CSS animation for
|
|
17
|
+
// the the reveal because we don't know the height of the content.
|
|
18
|
+
return jsx("div", {
|
|
19
|
+
"aria-hidden": !isExpanded,
|
|
20
|
+
css: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n max-height: ", "px;\n transition: max-height 0.3s;\n display: flex;\n flex: 1 1 100%;\n flex-direction: column;\n justify-content: center;\n min-width: 0;\n padding: 0 0 0 ", "px;\n "])), isExpanded ? 150 : 0, paddingLeft),
|
|
21
|
+
"data-testid": testId && "".concat(testId, "-expander")
|
|
22
|
+
}, jsx(ExitingPersistence, {
|
|
23
|
+
appear: true
|
|
24
|
+
}, isExpanded && jsx(FadeIn, null, function (props) {
|
|
25
|
+
return jsx("div", props, children);
|
|
26
|
+
})));
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export default Expander;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
|
|
2
|
+
|
|
3
|
+
var _templateObject, _templateObject2, _templateObject3;
|
|
4
|
+
|
|
5
|
+
/** @jsx jsx */
|
|
6
|
+
import { css, jsx } from '@emotion/core';
|
|
7
|
+
import Button from '@atlaskit/button/custom-theme-button';
|
|
8
|
+
import { gridSize as getGridSize } from '@atlaskit/theme/constants';
|
|
9
|
+
import { DEFAULT_APPEARANCE } from './constants';
|
|
10
|
+
import { getActionBackground, getActionColor, getFlagFocusRingColor } from './theme';
|
|
11
|
+
var gridSize = getGridSize();
|
|
12
|
+
var separatorWidth = gridSize * 2;
|
|
13
|
+
var defaultAppearanceTranslate = gridSize / 4;
|
|
14
|
+
|
|
15
|
+
var FlagActions = function FlagActions(props) {
|
|
16
|
+
var _props$appearance = props.appearance,
|
|
17
|
+
appearance = _props$appearance === void 0 ? DEFAULT_APPEARANCE : _props$appearance,
|
|
18
|
+
_props$actions = props.actions,
|
|
19
|
+
actions = _props$actions === void 0 ? [] : _props$actions,
|
|
20
|
+
linkComponent = props.linkComponent,
|
|
21
|
+
mode = props.mode,
|
|
22
|
+
testId = props.testId;
|
|
23
|
+
|
|
24
|
+
if (!actions.length) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
var isBold = appearance !== DEFAULT_APPEARANCE;
|
|
29
|
+
return jsx("div", {
|
|
30
|
+
css: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: flex;\n flex-wrap: wrap;\n padding-top: ", "px;\n transform: ", ";\n align-items: center;\n "])), gridSize, appearance === DEFAULT_APPEARANCE ? "translateX(-".concat(defaultAppearanceTranslate, "px)") : 0),
|
|
31
|
+
"data-testid": testId && "".concat(testId, "-actions")
|
|
32
|
+
}, actions.map(function (action, index) {
|
|
33
|
+
return [index && !isBold ? jsx("div", {
|
|
34
|
+
css: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n text-align: center;\n display: inline-block;\n width: ", "px;\n "])), separatorWidth),
|
|
35
|
+
key: index + 0.5
|
|
36
|
+
}, "\xB7") : '', jsx(Button, {
|
|
37
|
+
onClick: action.onClick,
|
|
38
|
+
href: action.href,
|
|
39
|
+
target: action.target,
|
|
40
|
+
appearance: isBold ? 'default' : 'link',
|
|
41
|
+
component: linkComponent,
|
|
42
|
+
spacing: "compact",
|
|
43
|
+
testId: action.testId,
|
|
44
|
+
key: index,
|
|
45
|
+
css: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n &&,\n a&& {\n margin-left: ", "px;\n font-weight: 500;\n padding: 0 ", "px !important;\n background: ", ";\n color: ", " !important;\n }\n &&:focus,\n a&&:focus {\n box-shadow: 0 0 0 2px ", ";\n }\n &&:hover,\n &&:active,\n a&&:hover,\n a&&:active {\n text-decoration: underline;\n }\n "])), index && isBold ? gridSize : 0, appearance === 'normal' ? 0 : gridSize, getActionBackground(appearance, mode), getActionColor(appearance, mode), getFlagFocusRingColor(appearance, mode))
|
|
46
|
+
}, action.content)];
|
|
47
|
+
}));
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export default FlagActions;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
|
|
3
|
+
import _typeof from "@babel/runtime/helpers/typeof";
|
|
4
|
+
|
|
5
|
+
var _templateObject, _templateObject2, _templateObject3;
|
|
6
|
+
|
|
7
|
+
/** @jsx jsx */
|
|
8
|
+
import { Children, createContext, useContext, useMemo } from 'react';
|
|
9
|
+
import { css, jsx } from '@emotion/core';
|
|
10
|
+
import { easeIn, ExitingPersistence, SlideIn } from '@atlaskit/motion';
|
|
11
|
+
import Portal from '@atlaskit/portal';
|
|
12
|
+
import { gridSize as getGridSize, layers } from '@atlaskit/theme/constants';
|
|
13
|
+
var gridSize = getGridSize();
|
|
14
|
+
export var flagWidth = gridSize * 50;
|
|
15
|
+
export var flagAnimationTime = 400;
|
|
16
|
+
var flagBottom = gridSize * 6;
|
|
17
|
+
var flagLeft = gridSize * 10;
|
|
18
|
+
|
|
19
|
+
function noop() {}
|
|
20
|
+
|
|
21
|
+
var defaultFlagGroupContext = {
|
|
22
|
+
onDismissed: function onDismissed() {},
|
|
23
|
+
isDismissAllowed: false
|
|
24
|
+
};
|
|
25
|
+
export var FlagGroupContext = /*#__PURE__*/createContext(defaultFlagGroupContext);
|
|
26
|
+
export function useFlagGroup() {
|
|
27
|
+
return useContext(FlagGroupContext);
|
|
28
|
+
} // transition: none is set on first-of-type to prevent a bug in Firefox
|
|
29
|
+
// that causes a broken transition
|
|
30
|
+
|
|
31
|
+
var baseStyles = "\n bottom: 0;\n position: absolute;\n width: ".concat(flagWidth, "px;\n transition: transform ").concat(flagAnimationTime, "ms ease-in-out;\n\n @media (max-width: 560px) {\n width: 100vw;\n }\n\n &:first-of-type {\n transition: none;\n transform: translate(0,0);\n }\n\n &:nth-of-type(n + 2) {\n animation-duration: 0ms;\n transform: translateX(0) translateY(100%) translateY(").concat(2 * gridSize, "px);\n }\n\n /* Layer the 'primary' flag above the 'secondary' flag */\n &:nth-of-type(1) {\n z-index: 5;\n }\n &:nth-of-type(2) {\n z-index: 4;\n }\n\n &:nth-of-type(n + 4) {\n visibility: hidden;\n }\n");
|
|
32
|
+
|
|
33
|
+
var FlagGroup = function FlagGroup(props) {
|
|
34
|
+
var id = props.id,
|
|
35
|
+
_props$label = props.label,
|
|
36
|
+
label = _props$label === void 0 ? 'Flag notifications' : _props$label,
|
|
37
|
+
_props$labelTag = props.labelTag,
|
|
38
|
+
LabelTag = _props$labelTag === void 0 ? 'h2' : _props$labelTag,
|
|
39
|
+
children = props.children,
|
|
40
|
+
_props$onDismissed = props.onDismissed,
|
|
41
|
+
onDismissed = _props$onDismissed === void 0 ? noop : _props$onDismissed;
|
|
42
|
+
var hasFlags = Array.isArray(children) ? children.length > 0 : Boolean(children);
|
|
43
|
+
var dismissFlagContext = useMemo(function () {
|
|
44
|
+
return {
|
|
45
|
+
onDismissed: onDismissed,
|
|
46
|
+
isDismissAllowed: true
|
|
47
|
+
};
|
|
48
|
+
}, [onDismissed]);
|
|
49
|
+
|
|
50
|
+
var renderChildren = function renderChildren() {
|
|
51
|
+
return children && _typeof(children) === 'object' ? Children.map(children, function (flag, index) {
|
|
52
|
+
var isDismissAllowed = index === 0;
|
|
53
|
+
return jsx(SlideIn, {
|
|
54
|
+
enterFrom: 'left',
|
|
55
|
+
fade: 'inout',
|
|
56
|
+
duration: flagAnimationTime,
|
|
57
|
+
animationTimingFunction: function animationTimingFunction() {
|
|
58
|
+
return easeIn;
|
|
59
|
+
}
|
|
60
|
+
}, function (props) {
|
|
61
|
+
return jsx("div", _extends({}, props, {
|
|
62
|
+
css: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n ", "\n ", "\n "])), baseStyles, isDismissAllowed ? // Transform needed to push up while 1st flag is leaving
|
|
63
|
+
// Exiting time should match the exiting time of motion so is halved
|
|
64
|
+
"\n && + * {\n transform: translate(0, 0);\n transition-duration: ".concat(flagAnimationTime / 2, "ms\n }") : '')
|
|
65
|
+
}), jsx(FlagGroupContext.Provider, {
|
|
66
|
+
value: // Only the first flag should be able to be dismissed.
|
|
67
|
+
isDismissAllowed ? dismissFlagContext : defaultFlagGroupContext
|
|
68
|
+
}, flag));
|
|
69
|
+
});
|
|
70
|
+
}) : false;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
return jsx(Portal, {
|
|
74
|
+
zIndex: layers.flag()
|
|
75
|
+
}, jsx("div", {
|
|
76
|
+
id: id,
|
|
77
|
+
css: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n bottom: ", "px;\n left: ", "px;\n position: fixed;\n z-index: ", ";\n @media (max-width: 560px) {\n bottom: 0;\n left: 0;\n }\n "])), flagBottom, flagLeft, layers.flag())
|
|
78
|
+
}, hasFlags ? jsx(LabelTag, {
|
|
79
|
+
css: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n border: 0;\n clip: rect(1px, 1px, 1px, 1px);\n height: 1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n "])))
|
|
80
|
+
}, label) : null, jsx(ExitingPersistence, {
|
|
81
|
+
appear: false
|
|
82
|
+
}, renderChildren())));
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export default FlagGroup;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
3
|
+
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
4
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
5
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
6
|
+
|
|
7
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
8
|
+
|
|
9
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
10
|
+
|
|
11
|
+
import React, { useCallback, useContext, useMemo, useState } from 'react';
|
|
12
|
+
import AutoDismissFlag from './auto-dismiss-flag';
|
|
13
|
+
import Flag from './flag';
|
|
14
|
+
import FlagGroup from './flag-group';
|
|
15
|
+
var FlagContext = /*#__PURE__*/React.createContext(null);
|
|
16
|
+
export function useFlags() {
|
|
17
|
+
var api = useContext(FlagContext);
|
|
18
|
+
|
|
19
|
+
if (api == null) {
|
|
20
|
+
throw new Error('Unable to find FlagProviderContext');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return api;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var getUniqueId = function () {
|
|
27
|
+
var count = 0;
|
|
28
|
+
return function () {
|
|
29
|
+
return "flag-provider-unique-id:".concat(count++);
|
|
30
|
+
};
|
|
31
|
+
}();
|
|
32
|
+
|
|
33
|
+
export function FlagsProvider(_ref) {
|
|
34
|
+
var children = _ref.children;
|
|
35
|
+
|
|
36
|
+
var _useState = useState([]),
|
|
37
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
38
|
+
flags = _useState2[0],
|
|
39
|
+
setFlags = _useState2[1];
|
|
40
|
+
|
|
41
|
+
var removeFlag = useCallback(function (id) {
|
|
42
|
+
setFlags(function (current) {
|
|
43
|
+
return current.slice(0).filter(function (flag) {
|
|
44
|
+
return flag.id !== id;
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}, []);
|
|
48
|
+
var api = useMemo(function () {
|
|
49
|
+
return {
|
|
50
|
+
showFlag: function show(value) {
|
|
51
|
+
var flag = _objectSpread(_objectSpread({}, value), {}, {
|
|
52
|
+
id: value.id || getUniqueId()
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
setFlags(function (current) {
|
|
56
|
+
var index = current.findIndex(function (value) {
|
|
57
|
+
return value.id === flag.id;
|
|
58
|
+
}); // If flag is not found add it
|
|
59
|
+
|
|
60
|
+
if (index === -1) {
|
|
61
|
+
return [flag].concat(_toConsumableArray(current));
|
|
62
|
+
} // If flag already exists with the same id, then replace it
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
var shallow = _toConsumableArray(current);
|
|
66
|
+
|
|
67
|
+
shallow[index] = flag;
|
|
68
|
+
return shallow;
|
|
69
|
+
});
|
|
70
|
+
return function dismiss() {
|
|
71
|
+
removeFlag(flag.id);
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}, [removeFlag]);
|
|
76
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FlagContext.Provider, {
|
|
77
|
+
value: api
|
|
78
|
+
}, children), /*#__PURE__*/React.createElement(FlagGroup, {
|
|
79
|
+
onDismissed: removeFlag
|
|
80
|
+
}, flags.map(function (flag) {
|
|
81
|
+
var isAutoDismiss = flag.isAutoDismiss,
|
|
82
|
+
restProps = _objectWithoutProperties(flag, ["isAutoDismiss"]);
|
|
83
|
+
|
|
84
|
+
var FlagType = isAutoDismiss ? AutoDismissFlag : Flag;
|
|
85
|
+
return /*#__PURE__*/React.createElement(FlagType, _extends({}, restProps, {
|
|
86
|
+
key: flag.id
|
|
87
|
+
}));
|
|
88
|
+
})));
|
|
89
|
+
}
|
|
90
|
+
export var withFlagsProvider = function withFlagsProvider(fn) {
|
|
91
|
+
return /*#__PURE__*/React.createElement(FlagsProvider, null, fn());
|
|
92
|
+
};
|