@atlaskit/flag
Version:
A flag is used for confirmations, alerts, and acknowledgments that require minimal user interaction, often displayed using a flag group.
63 lines (60 loc) • 1.93 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import React, { useCallback, useMemo, useState } from 'react';
import AutoDismissFlag from './auto-dismiss-flag';
import Flag from './flag';
import { FlagContext } from './flag-context';
import FlagGroup from './flag-group';
const getUniqueId = (() => {
let count = 0;
return () => `flag-provider-unique-id:${count++}`;
})();
// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports
export function FlagsProvider({
children,
shouldRenderToParent
}) {
const [flags, setFlags] = useState([]);
const removeFlag = useCallback(id => {
setFlags(current => {
return current.slice(0).filter(flag => flag.id !== id);
});
}, []);
const api = useMemo(() => ({
showFlag: function show(value) {
const flag = {
...value,
id: value.id || getUniqueId()
};
setFlags(current => {
const index = current.findIndex(value => value.id === flag.id);
// If flag is not found add it
if (index === -1) {
return [flag, ...current];
}
// If flag already exists with the same id, then replace it
const shallow = [...current];
shallow[index] = flag;
return shallow;
});
return function dismiss() {
removeFlag(flag.id);
};
},
hideFlag: removeFlag
}), [removeFlag]);
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FlagContext.Provider, {
value: api
}, children), /*#__PURE__*/React.createElement(FlagGroup, {
onDismissed: removeFlag,
shouldRenderToParent: shouldRenderToParent
}, flags.map(flag => {
const {
isAutoDismiss,
...restProps
} = flag;
const FlagType = isAutoDismiss ? AutoDismissFlag : Flag;
return /*#__PURE__*/React.createElement(FlagType, _extends({}, restProps, {
key: flag.id
}));
})));
}