/**
* 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
} />
);
}