UNPKG

@salesforce/design-system-react

Version:

Salesforce Lightning Design System for React

117 lines (101 loc) 3.12 kB
/* Copyright (c) 2015-present, salesforce.com, inc. All rights reserved */ /* Licensed under BSD 3-Clause - see LICENSE.txt or git.io/sfdc-license */ // Implements the [Scoped Notification design pattern](https://lightningdesignsystem.com/components/scoped-notifications/) in React. // Based on SLDS v2.4.5 import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import Icon from '../icon'; import componentDoc from './component.json'; import checkProps from './check-props'; import { SCOPED_NOTIFICATION } from '../../utilities/constants'; const propTypes = { /** * **Assistive text for accessibility.** * * `icon`: The assistive text for the icon. Is overridden by `label` assistive text passed directly to an `Icon` component via the `icon` prop */ assistiveText: PropTypes.shape({ icon: PropTypes.string, }), /** * CSS classes to be added to tag with `.slds-scoped-notification`. Uses `classNames` [API](https://github.com/JedWatson/classnames). */ className: PropTypes.oneOfType([ PropTypes.array, PropTypes.object, PropTypes.string, ]), /** * The icon to be displayed in the scoped notification. Accepts an `Icon` component */ icon: PropTypes.node, /** * Theme for the scoped notification */ theme: PropTypes.oneOf(['dark', 'light']), }; const defaultProps = {}; /** * A Scoped Notification Component serve advisory information for the user that is not important enough to justify an alert. */ class ScopedNotification extends React.Component { constructor(props) { super(props); checkProps(SCOPED_NOTIFICATION, props, componentDoc); } render() { let icon; if (this.props.icon) { let iconAssistiveText = {}; if (this.props.assistiveText && this.props.assistiveText.icon) { iconAssistiveText.label = this.props.assistiveText.icon; } if (this.props.icon.props.assistiveText) { iconAssistiveText = { ...iconAssistiveText, ...this.props.icon.props.assistiveText, }; } icon = React.cloneElement(this.props.icon, { ...this.props.icon.props, assistiveText: iconAssistiveText, }); } else { icon = ( <Icon assistiveText={{ label: (this.props.assistiveText && this.props.assistiveText.icon) || 'Info', }} category="utility" name={this.props.iconName || 'info'} colorVariant={this.props.theme === 'dark' ? 'base' : undefined} size="small" /> ); } return ( <div className={classNames( `slds-scoped-notification`, `slds-media`, `slds-media_center`, { 'slds-scoped-notification_light': this.props.theme === 'light', 'slds-scoped-notification_dark': this.props.theme === 'dark', }, this.props.className )} role="status" > <div className="slds-media__figure">{icon}</div> <div className="slds-media__body">{this.props.children}</div> </div> ); } } ScopedNotification.displayName = SCOPED_NOTIFICATION; ScopedNotification.propTypes = propTypes; ScopedNotification.defaultProps = defaultProps; export default ScopedNotification;