mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: multiple external message banners (#4998)
https://linear.app/unleash/issue/2-1495/adapt-existing-message-banner-component-to-be-more-reusablegeneric https://linear.app/unleash/issue/2-1496/add-support-for-multiple-external-message-banners This PR does 2 things: - Refactors the `MessageBanner` component to be more generic and reusable, by accepting the message info through props; - Adds support for multiple external message banners;
This commit is contained in:
		
							parent
							
								
									7d9698fffa
								
							
						
					
					
						commit
						742abab41e
					
				| @ -2,11 +2,9 @@ import { Check, Close, InfoOutlined, WarningAmber } from '@mui/icons-material'; | |||||||
| import { styled, Icon, Link } from '@mui/material'; | import { styled, Icon, Link } from '@mui/material'; | ||||||
| import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; | import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; | ||||||
| import { useNavigate } from 'react-router-dom'; | import { useNavigate } from 'react-router-dom'; | ||||||
| import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; |  | ||||||
| import { MessageBannerDialog } from './MessageBannerDialog/MessageBannerDialog'; | import { MessageBannerDialog } from './MessageBannerDialog/MessageBannerDialog'; | ||||||
| import { useState } from 'react'; | import { useState } from 'react'; | ||||||
| import ReactMarkdown from 'react-markdown'; | import ReactMarkdown from 'react-markdown'; | ||||||
| import { useVariant } from 'hooks/useVariant'; |  | ||||||
| 
 | 
 | ||||||
| const StyledBar = styled('aside', { | const StyledBar = styled('aside', { | ||||||
|     shouldForwardProp: (prop) => prop !== 'variant' && prop !== 'sticky', |     shouldForwardProp: (prop) => prop !== 'variant' && prop !== 'sticky', | ||||||
| @ -47,8 +45,7 @@ type BannerVariant = | |||||||
|     | 'neutral' |     | 'neutral' | ||||||
|     | 'secondary'; |     | 'secondary'; | ||||||
| 
 | 
 | ||||||
| interface IMessageFlag { | export interface IMessageBanner { | ||||||
|     enabled: boolean; |  | ||||||
|     message: string; |     message: string; | ||||||
|     variant?: BannerVariant; |     variant?: BannerVariant; | ||||||
|     sticky?: boolean; |     sticky?: boolean; | ||||||
| @ -60,16 +57,13 @@ interface IMessageFlag { | |||||||
|     dialog?: string; |     dialog?: string; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export const MessageBanner = () => { | interface IMessageBannerProps { | ||||||
|     const { uiConfig } = useUiConfig(); |     messageBanner: IMessageBanner; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export const MessageBanner = ({ messageBanner }: IMessageBannerProps) => { | ||||||
|     const [open, setOpen] = useState(false); |     const [open, setOpen] = useState(false); | ||||||
| 
 | 
 | ||||||
|     const messageBanner = useVariant<IMessageFlag>( |  | ||||||
|         uiConfig.flags.messageBanner, |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     if (!messageBanner) return null; |  | ||||||
| 
 |  | ||||||
|     const { |     const { | ||||||
|         message, |         message, | ||||||
|         variant = 'neutral', |         variant = 'neutral', | ||||||
| @ -1,7 +1,30 @@ | |||||||
| import { MessageBanner } from 'component/common/MessageBanner/MessageBanner'; | import { | ||||||
|  |     IMessageBanner, | ||||||
|  |     MessageBanner, | ||||||
|  | } from 'component/messageBanners/MessageBanner/MessageBanner'; | ||||||
|  | import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; | ||||||
|  | import { useVariant } from 'hooks/useVariant'; | ||||||
| 
 | 
 | ||||||
| export const ExternalMessageBanners = () => { | export const ExternalMessageBanners = () => { | ||||||
|     // TODO: Implement. If we allow multiple internal message banners, then perhaps we should allow the same for external message banners.
 |     const { uiConfig } = useUiConfig(); | ||||||
| 
 | 
 | ||||||
|     return <MessageBanner />; |     const messageBannerVariant = | ||||||
|  |         useVariant<IMessageBanner | IMessageBanner[]>( | ||||||
|  |             uiConfig.flags.messageBanner, | ||||||
|  |         ) || []; | ||||||
|  | 
 | ||||||
|  |     const messageBanners: IMessageBanner[] = Array.isArray(messageBannerVariant) | ||||||
|  |         ? messageBannerVariant | ||||||
|  |         : [messageBannerVariant]; | ||||||
|  | 
 | ||||||
|  |     return ( | ||||||
|  |         <> | ||||||
|  |             {messageBanners.map((messageBanner) => ( | ||||||
|  |                 <MessageBanner | ||||||
|  |                     key={messageBanner.message} | ||||||
|  |                     messageBanner={messageBanner} | ||||||
|  |                 /> | ||||||
|  |             ))} | ||||||
|  |         </> | ||||||
|  |     ); | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| import { MessageBanner } from 'component/common/MessageBanner/MessageBanner'; | import { MessageBanner } from 'component/messageBanners/MessageBanner/MessageBanner'; | ||||||
| import { useUiFlag } from 'hooks/useUiFlag'; | import { useUiFlag } from 'hooks/useUiFlag'; | ||||||
| 
 | 
 | ||||||
| export const InternalMessageBanners = () => { | export const InternalMessageBanners = () => { | ||||||
| @ -23,7 +23,10 @@ export const InternalMessageBanners = () => { | |||||||
|     return ( |     return ( | ||||||
|         <> |         <> | ||||||
|             {mockMessageBanners.map((messageBanner) => ( |             {mockMessageBanners.map((messageBanner) => ( | ||||||
|                 <MessageBanner key={messageBanner.message} /> |                 <MessageBanner | ||||||
|  |                     key={messageBanner.message} | ||||||
|  |                     messageBanner={messageBanner} | ||||||
|  |                 /> | ||||||
|             ))} |             ))} | ||||||
|         </> |         </> | ||||||
|     ); |     ); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user