diff --git a/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-HeaderAlertCustom-dark-chromium-linux.png b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-HeaderAlertCustom-dark-chromium-linux.png new file mode 100644 index 00000000..d4b5f559 Binary files /dev/null and b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-HeaderAlertCustom-dark-chromium-linux.png differ diff --git a/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-HeaderAlertCustom-dark-webkit-linux.png b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-HeaderAlertCustom-dark-webkit-linux.png new file mode 100644 index 00000000..e1465688 Binary files /dev/null and b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-HeaderAlertCustom-dark-webkit-linux.png differ diff --git a/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-HeaderAlertCustom-light-chromium-linux.png b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-HeaderAlertCustom-light-chromium-linux.png new file mode 100644 index 00000000..3fb47ae8 Binary files /dev/null and b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-HeaderAlertCustom-light-chromium-linux.png differ diff --git a/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-HeaderAlertCustom-light-webkit-linux.png b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-HeaderAlertCustom-light-webkit-linux.png new file mode 100644 index 00000000..968e0d67 Binary files /dev/null and b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-HeaderAlertCustom-light-webkit-linux.png differ diff --git a/src/components/AsideHeader/__stories__/AsideHeader.stories.tsx b/src/components/AsideHeader/__stories__/AsideHeader.stories.tsx index b3c43a4d..69480127 100644 --- a/src/components/AsideHeader/__stories__/AsideHeader.stories.tsx +++ b/src/components/AsideHeader/__stories__/AsideHeader.stories.tsx @@ -1,5 +1,6 @@ import React from 'react'; +import {Xmark} from '@gravity-ui/icons'; import {Button, Flex, Icon, Text, spacing} from '@gravity-ui/uikit'; import type {Meta, StoryFn} from '@storybook/react'; @@ -8,7 +9,7 @@ import {AsideFallback} from '../components/PageLayout/AsideFallback'; import {PageLayout} from '../components/PageLayout/PageLayout'; import {PageLayoutAside} from '../components/PageLayout/PageLayoutAside'; -import {AsideHeaderShowcase} from './AsideHeaderShowcase'; +import {AsideHeaderShowcase, AsideHeaderShowcaseProps} from './AsideHeaderShowcase'; import {DEFAULT_LOGO, menuItemsClamped, menuItemsShowcase} from './moc'; import logoIcon from '../../../../.storybook/assets/logo.svg'; @@ -126,7 +127,9 @@ AdvancedUsage.args = { initialCompact: true, }; -const TopAlertTemplate: StoryFn = (args) => ; +const TopAlertTemplate: StoryFn = (args) => ( + +); export const HeaderAlert = TopAlertTemplate.bind({}); HeaderAlert.args = { topAlert: { @@ -148,6 +151,44 @@ HeaderAlertCentered.args = { }, }; +export const HeaderAlertCustom = TopAlertTemplate.bind({}); +HeaderAlertCustom.args = { + topAlert: { + render: ({handleClose}) => ( + + + We've got something new for you to try! + + + + + + ), + }, +}; + const fallbackArgs = { headerDecoration: true, subheaderItemsCount: 2, diff --git a/src/components/AsideHeader/__stories__/AsideHeaderShowcase.tsx b/src/components/AsideHeader/__stories__/AsideHeaderShowcase.tsx index faa8235f..52b44678 100644 --- a/src/components/AsideHeader/__stories__/AsideHeaderShowcase.tsx +++ b/src/components/AsideHeader/__stories__/AsideHeaderShowcase.tsx @@ -11,9 +11,9 @@ import { eventBroker, } from '@gravity-ui/uikit'; -import {AsideHeader, AsideHeaderProps, FooterItem, TopAlertProps} from '../..'; +import {AsideHeader, AsideHeaderProps, FooterItem} from '../..'; import {ASIDE_HEADER_ICON_SIZE} from '../../constants'; -import {OpenModalSubscriber} from '../../types'; +import {OpenModalSubscriber, TopAlertProps} from '../../types'; import {cn} from '../../utils/cn'; import {menuItemsShowcase, text as placeholderText} from './moc'; @@ -36,7 +36,7 @@ enum Panel { Components = 'components', } -interface AsideHeaderShowcaseProps { +export interface AsideHeaderShowcaseProps { multipleTooltip?: boolean; initialCompact?: boolean; topAlert?: TopAlertProps; diff --git a/src/components/AsideHeader/__tests__/AsideHeader.visual.test.tsx b/src/components/AsideHeader/__tests__/AsideHeader.visual.test.tsx index 105d678b..98b40dfe 100644 --- a/src/components/AsideHeader/__tests__/AsideHeader.visual.test.tsx +++ b/src/components/AsideHeader/__tests__/AsideHeader.visual.test.tsx @@ -68,6 +68,15 @@ test.describe('AsideHeader', () => { await expectScreenshot(); }); + test('render story: ', async ({mount, expectScreenshot}) => { + await mount(, undefined, { + width: 1200, + height: 720, + }); + + await expectScreenshot(); + }); + test('render story: ', async ({mount, expectScreenshot}) => { await mount(, undefined, { width: 1200, diff --git a/src/components/AsideHeader/types.tsx b/src/components/AsideHeader/types.tsx index b0c31439..35255df8 100644 --- a/src/components/AsideHeader/types.tsx +++ b/src/components/AsideHeader/types.tsx @@ -1,3 +1,5 @@ +import * as React from 'react'; + import {QAProps} from '@gravity-ui/uikit'; import {RenderContentType} from '../Content'; diff --git a/src/components/TopAlert/TopAlert.tsx b/src/components/TopAlert/TopAlert.tsx index 7538adf7..3ce027b4 100644 --- a/src/components/TopAlert/TopAlert.tsx +++ b/src/components/TopAlert/TopAlert.tsx @@ -24,7 +24,10 @@ export const TopAlert = ({alert, className, mobileView = false}: Props) => { const handleClose = React.useCallback(() => { setOpened(false); - alert?.onCloseTopAlert?.(); + + if (alert && 'onCloseTopAlert' in alert) { + alert.onCloseTopAlert?.(); + } }, [alert]); React.useEffect(() => { @@ -33,10 +36,23 @@ export const TopAlert = ({alert, className, mobileView = false}: Props) => { } }, [opened, updateTopSize]); - if (!alert || !alert.message) { + if (!alert) { return null; } + const {render} = alert; + + if (typeof render === 'function') { + return ( +
+ {opened && render({handleClose})} +
+ ); + } + return (
void; + render?: never; } + +export type TopAlertProps = + | TopAlertBaseProps + | { + render: (params: {handleClose: () => void}) => React.ReactElement; + };