UNPKG

@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
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 })); }))); }