/** @format */
/**
* External dependencies
*/
import { __ } from '@wordpress/i18n';
import classnames from 'classnames';
import clickOutside from 'react-click-outside';
import { Component } from '@wordpress/element';
import Gridicon from 'gridicons';
import { IconButton, NavigableMenu } from '@wordpress/components';
import { partial, uniqueId, find } from 'lodash';
import { getSetting } from '@woocommerce/wc-admin-settings';
/**
* Internal dependencies
*/
import './style.scss';
import ActivityPanelToggleBubble from './toggle-bubble';
import { H, Section } from '@woocommerce/components';
import {
getUnreadNotes,
getUnreadOrders,
getUnapprovedReviews,
getUnreadStock,
} from './unread-indicators';
import InboxPanel from './panels/inbox';
import OrdersPanel from './panels/orders';
import StockPanel from './panels/stock';
import { recordEvent } from 'lib/tracks';
import ReviewsPanel from './panels/reviews';
import withSelect from 'wc-api/with-select';
import WordPressNotices from './wordpress-notices';
const manageStock = getSetting( 'manageStock', 'no' );
const reviewsEnabled = getSetting( 'reviewsEnabled', 'no' );
class ActivityPanel extends Component {
constructor() {
super( ...arguments );
this.togglePanel = this.togglePanel.bind( this );
this.clearPanel = this.clearPanel.bind( this );
this.toggleMobile = this.toggleMobile.bind( this );
this.renderTab = this.renderTab.bind( this );
this.updateNoticeFlag = this.updateNoticeFlag.bind( this );
this.state = {
isPanelOpen: false,
mobileOpen: false,
currentTab: '',
isPanelSwitching: false,
hasWordPressNotices: false,
};
}
togglePanel( tabName ) {
const { isPanelOpen, currentTab } = this.state;
// If a panel is being opened, or if an existing panel is already open and a different one is being opened, record a track.
if ( ! isPanelOpen || tabName !== currentTab ) {
recordEvent( 'activity_panel_open', { tab: tabName } );
}
// The WordPress Notices tab is handled differently, since they are displayed inline, so the panel should be closed,
// Close behavior of the expanded notices is based on current tab.
if ( 'wpnotices' === tabName ) {
this.setState( state => ( {
currentTab: 'wpnotices' === state.currentTab ? '' : tabName,
mobileOpen: 'wpnotices' !== state.currentTab,
isPanelOpen: false,
} ) );
return;
}
this.setState( state => {
if (
tabName === state.currentTab ||
'' === state.currentTab ||
'wpnotices' === state.currentTab
) {
return {
isPanelOpen: ! state.isPanelOpen,
currentTab: tabName,
mobileOpen: ! state.isPanelOpen,
};
}
return { currentTab: tabName, isPanelSwitching: true };
} );
}
clearPanel() {
this.setState(
( { isPanelOpen } ) => ( isPanelOpen ? { isPanelSwitching: false } : { currentTab: '' } )
);
}
// On smaller screen, the panel buttons are hidden behind a toggle.
toggleMobile() {
const tabs = this.getTabs();
this.setState( state => ( {
mobileOpen: ! state.mobileOpen,
currentTab: state.mobileOpen ? '' : tabs[ 0 ].name,
isPanelOpen: ! state.mobileOpen,
} ) );
}
handleClickOutside() {
const { isPanelOpen, currentTab } = this.state;
if ( isPanelOpen ) {
this.togglePanel( currentTab );
}
}
updateNoticeFlag( noticeCount ) {
this.setState( {
hasWordPressNotices: noticeCount > 0,
} );
}
// @todo Pull in dynamic unread status/count
getTabs() {
const { hasUnreadNotes, hasUnreadOrders, hasUnapprovedReviews, hasUnreadStock } = this.props;
return [
{
name: 'inbox',
title: __( 'Inbox', 'woocommerce-admin' ),
icon: