UNPKG

@atlaskit/flag

Version:

A flag is used for confirmations, alerts, and acknowledgments that require minimal user interaction, often displayed using a flag group.

75 lines (74 loc) 2.65 kB
import _extends from "@babel/runtime/helpers/extends"; import React, { useCallback, useEffect, useRef } from 'react'; import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next/usePlatformLeafEventHandler'; import noop from '@atlaskit/ds-lib/noop'; import Flag from './flag'; import { useFlagGroup } from './internal/use-flag-group'; const packageName = "@atlaskit/flag"; const packageVersion = "18.5.5"; export const AUTO_DISMISS_SECONDS = 8; /** * __Auto dismiss flag__ * * An auto dismiss flag is dismissed automatically after eight seconds. * * - [Examples](https://atlassian.design/components/flag/auto-dismiss-flag/examples) * - [Code](https://atlassian.design/components/flag/auto-dismiss-flag/code) */ const AutoDismissFlag = props => { const { id, analyticsContext, onDismissed: onDismissedProp = noop, autoDismissSeconds = AUTO_DISMISS_SECONDS } = props; const autoDismissTimer = useRef(null); const { onDismissed: onDismissedFromFlagGroup, isDismissAllowed } = useFlagGroup(); const onDismissed = useCallback((id, analyticsEvent) => { onDismissedProp(id, analyticsEvent); onDismissedFromFlagGroup(id, analyticsEvent); }, [onDismissedProp, onDismissedFromFlagGroup]); const onDismissedAnalytics = usePlatformLeafEventHandler({ fn: onDismissed, action: 'dismissed', analyticsData: analyticsContext, componentName: 'flag', packageName, packageVersion }); const isAutoDismissAllowed = isDismissAllowed && onDismissed; const dismissFlag = useCallback(() => { if (isAutoDismissAllowed) { onDismissedAnalytics(id); } }, [id, onDismissedAnalytics, isAutoDismissAllowed]); const stopAutoDismissTimer = useCallback(() => { if (autoDismissTimer.current) { clearTimeout(autoDismissTimer.current); autoDismissTimer.current = null; } }, []); const startAutoDismissTimer = useCallback(() => { if (!isAutoDismissAllowed) { return; } stopAutoDismissTimer(); autoDismissTimer.current = window.setTimeout(dismissFlag, autoDismissSeconds * 1000); }, [dismissFlag, stopAutoDismissTimer, isAutoDismissAllowed, autoDismissSeconds]); useEffect(() => { startAutoDismissTimer(); return stopAutoDismissTimer; }, [startAutoDismissTimer, stopAutoDismissTimer]); return /*#__PURE__*/React.createElement(Flag // eslint-disable-next-line @repo/internal/react/no-unsafe-spread-props , _extends({}, props, { onMouseOver: stopAutoDismissTimer, onFocus: stopAutoDismissTimer, onMouseOut: startAutoDismissTimer, onBlur: startAutoDismissTimer })); }; export default AutoDismissFlag;