import { motion } from 'motion/react'; import React from 'react'; import styled from 'styled-components'; import { messages } from '../../shared/gettext'; import { InAppNotificationIndicatorType } from '../../shared/notifications/notification'; import { IconButton } from '../lib/components'; import { colors } from '../lib/foundations'; import { useExclusiveTask } from '../lib/hooks/use-exclusive-task'; import { tinyText } from './common-styles'; const NOTIFICATION_AREA_ID = 'notification-area'; export const NotificationTitle = styled.span(tinyText, { color: colors.white, }); export const NotificationSubtitleText = styled.span(tinyText, { color: colors.whiteAlpha60, }); interface INotificationSubtitleProps { children?: React.ReactNode; } export function NotificationSubtitle(props: INotificationSubtitleProps) { return React.Children.count(props.children) > 0 ? : null; } interface NotificationActionProps { onClick: () => Promise; } export function NotificationOpenLinkAction(props: NotificationActionProps) { const [onClick] = useExclusiveTask(props.onClick); return ( ); } export function NotificationTroubleshootDialogAction(props: NotificationActionProps) { return ( ); } export function NotificationCloseAction(props: NotificationActionProps) { return ( ); } export const NotificationContent = styled.div.attrs({ id: NOTIFICATION_AREA_ID })({ display: 'flex', flexDirection: 'column', flex: 1, paddingRight: '4px', }); export const NotificationActions = styled.div({ display: 'flex', flex: 0, flexDirection: 'column', justifyContent: 'center', }); interface INotificationIndicatorProps { $type?: InAppNotificationIndicatorType; } const notificationIndicatorTypeColorMap = { success: colors.green, warning: colors.yellow, error: colors.red, }; export const NotificationIndicator = styled.div((props) => ({ width: '10px', height: '10px', borderRadius: '5px', marginTop: '4px', marginRight: '8px', backgroundColor: props.$type ? notificationIndicatorTypeColorMap[props.$type] : colors.transparent, })); const Collapsible = styled(motion.div)({ display: 'flex', flexDirection: 'column', justifyContent: 'flex-start', translateY: '0%', backgroundColor: colors.darkerBlue50, overflow: 'hidden', }); const Content = styled.section({ display: 'flex', flexDirection: 'row', padding: '8px 12px 8px 16px', height: 'fit-content', }); interface INotificationBannerProps { children?: React.ReactNode; // Array, className?: string; animateIn: boolean; } export function NotificationBanner({ className, children, animateIn }: INotificationBannerProps) { const translateYInitial = animateIn ? '-100%' : '0%'; return ( {children} ); }