mirror of https://github.com/trezor/trezor-wallet
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.6 KiB
88 lines
2.6 KiB
/* @flow */
|
|
'use strict';
|
|
|
|
import React from 'react';
|
|
import { bindActionCreators } from 'redux';
|
|
import { connect } from 'react-redux';
|
|
|
|
import * as NOTIFICATION from '../../actions/constants/notification';
|
|
import type { Action, State, Dispatch } from '../../flowtype';
|
|
|
|
type Props = {
|
|
notifications: $ElementType<State, 'notifications'>,
|
|
close: (notif?: any) => Action
|
|
}
|
|
|
|
type NProps = {
|
|
key?: number;
|
|
className: string;
|
|
cancelable?: boolean;
|
|
title: string;
|
|
message?: string;
|
|
actions?: Array<any>;
|
|
close?: (notif?: any) => Action
|
|
}
|
|
|
|
export const Notification = (props: NProps): React$Element<string> => {
|
|
const className = `notification ${ props.className }`;
|
|
const close: Function = typeof props.close === 'function' ? props.close : () => {}; // TODO: add default close action
|
|
const actionButtons = props.actions ? props.actions.map((a, i) => {
|
|
return (
|
|
<button key={ i } onClick={ event => { close(); a.callback(); } } className="transparent">{ a.label }</button>
|
|
)
|
|
}) : null;
|
|
|
|
return (
|
|
<div className={ className }>
|
|
{ props.cancelable ? (
|
|
<button className="notification-close transparent"
|
|
onClick={ event => close() }></button>
|
|
) : null }
|
|
<div className="notification-body">
|
|
<h2>{ props.title }</h2>
|
|
{ props.message ? (<p dangerouslySetInnerHTML={{__html: props.message }}></p>) : null }
|
|
</div>
|
|
{ props.actions && props.actions.length > 0 ? (
|
|
<div className="notification-action">
|
|
{ actionButtons }
|
|
</div>
|
|
) : null }
|
|
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export const NotificationGroup = (props: Props) => {
|
|
const { notifications, close } = props;
|
|
return notifications.map((n, i) => {
|
|
return (
|
|
<Notification
|
|
key={i}
|
|
className={ n.type }
|
|
title={ n.title }
|
|
message={ n.message }
|
|
cancelable={ n.cancelable }
|
|
actions={ n.actions }
|
|
close={ close }
|
|
/>
|
|
)
|
|
});
|
|
}
|
|
|
|
export default connect(
|
|
(state: State) => {
|
|
return {
|
|
notifications: state.notifications
|
|
};
|
|
},
|
|
(dispatch: Dispatch) => {
|
|
return {
|
|
close: bindActionCreators((notif?: any): Action => {
|
|
return {
|
|
type: NOTIFICATION.CLOSE,
|
|
payload: notif
|
|
}
|
|
}, dispatch),
|
|
};
|
|
}
|
|
)(NotificationGroup); |