/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @format */ import React, {useCallback, useMemo} from 'react'; import {Layout, theme} from 'flipper-plugin'; import {styled, Glyph} from '../../ui'; import {Input, Typography, Button, Collapse} from 'antd'; import { DownOutlined, UpOutlined, SearchOutlined, ExclamationCircleOutlined, SettingOutlined, DeleteOutlined, } from '@ant-design/icons'; import {LeftSidebar, SidebarTitle} from '../LeftSidebar'; import {Notification as NotificationData} from '../../plugin'; import {useStore, useDispatch} from '../../utils/useStore'; import {ClientQuery} from '../../Client'; import {deconstructClientId} from '../../utils/clientUtils'; import {selectPlugin} from '../../reducers/connections'; type NotificationExtra = { onOpen: () => void; clientName: string | undefined; appName: string | undefined; pluginName: string; iconName: string | null | undefined; }; type PluginNotification = NotificationData & NotificationExtra; const {Title, Text, Paragraph} = Typography; const CollapseContainer = styled.div({ '.ant-collapse-ghost .ant-collapse-item': { '& > .ant-collapse-header': { paddingLeft: '16px', }, '& > .ant-collapse-content > .ant-collapse-content-box': { padding: 0, }, }, }); function DetailCollapse({detail}: {detail: string | React.ReactNode}) { const detailView = typeof detail === 'string' ? ( {detail} ) : ( detail ); return ( isActive ? ( ) : ( ) }> View detail }> {detailView} ); } function NotificationEntry({notification}: {notification: PluginNotification}) { const { onOpen, message, title, clientName, appName, pluginName, iconName, } = notification; const icon = iconName ? ( ) : ( ); return ( {icon} {pluginName} {title} {clientName && appName ? `${clientName}/${appName}` : clientName ?? appName ?? 'Not Connected'} ); } function NotificationList({ notifications, }: { notifications: Array; }) { return ( {notifications.map((notification) => ( ))} ); } export function Notification() { const dispatch = useDispatch(); const clients = useStore((state) => state.connections.clients); const getClientQuery = useCallback( (id: string | null) => id !== null ? clients.reduce( (query: ClientQuery | null, client) => client.id === id ? client.query : query, null, ) ?? deconstructClientId(id) : null, [clients], ); const clientPlugins = useStore((state) => state.plugins.clientPlugins); const devicePlugins = useStore((state) => state.plugins.devicePlugins); const getPlugin = useCallback( (id: string) => clientPlugins.get(id) || devicePlugins.get(id), [clientPlugins, devicePlugins], ); const activeNotifications = useStore( (state) => state.notifications.activeNotifications, ); const displayedNotifications: Array = useMemo( () => activeNotifications.map((noti) => { const plugin = getPlugin(noti.pluginId); const client = getClientQuery(noti.client); return { ...noti.notification, onOpen: () => dispatch( selectPlugin({ selectedPlugin: noti.pluginId, selectedApp: noti.client, deepLinkPayload: noti.notification.action, }), ), clientName: client?.device_id, appName: client?.app, pluginName: plugin?.title ?? noti.pluginId, iconName: plugin?.icon, }; }), [activeNotifications, getPlugin, getClientQuery, dispatch], ); const actions = (
); return ( notifications } /> ); }