/**
* External dependencies
*/
import { __ } from '@wordpress/i18n';
import clickOutside from 'react-click-outside';
import { Component, lazy, Suspense } from '@wordpress/element';
import { Button } from '@wordpress/components';
import { compose } from '@wordpress/compose';
import { withDispatch, withSelect } from '@wordpress/data';
import { uniqueId, find } from 'lodash';
import PagesIcon from 'gridicons/dist/pages';
import CrossIcon from 'gridicons/dist/cross-small';
import classnames from 'classnames';
import { Icon, lifesaver } from '@wordpress/icons';
import { getSetting, getAdminLink } from '@woocommerce/wc-admin-settings';
import { H, Section, Spinner } from '@woocommerce/components';
import { OPTIONS_STORE_NAME } from '@woocommerce/data';
import { getHistory, getNewPath } from '@woocommerce/navigation';
/**
* Internal dependencies
*/
import './style.scss';
import ActivityPanelToggleBubble from './toggle-bubble';
import {
getUnreadNotes,
getUnreadOrders,
getUnapprovedReviews,
getUnreadStock,
} from './unread-indicators';
import { isWCAdmin } from '../../dashboard/utils';
import { Tabs } from './tabs';
import { SetupProgress } from './setup-progress';
const HelpPanel = lazy( () =>
import( /* webpackChunkName: "activity-panels-help" */ './panels/help' )
);
const InboxPanel = lazy( () =>
import( /* webpackChunkName: "activity-panels-inbox" */ './panels/inbox' )
);
const OrdersPanel = lazy( () =>
import( /* webpackChunkName: "activity-panels-orders" */ './panels/orders' )
);
const StockPanel = lazy( () =>
import( /* webpackChunkName: "activity-panels-stock" */ './panels/stock' )
);
const ReviewsPanel = lazy( () =>
import( /* webpackChunkName: "activity-panels-inbox" */ './panels/reviews' )
);
const manageStock = getSetting( 'manageStock', 'no' );
const reviewsEnabled = getSetting( 'reviewsEnabled', 'no' );
export class ActivityPanel extends Component {
constructor( props ) {
super( props );
this.state = {
isPanelOpen: false,
mobileOpen: false,
currentTab: '',
isPanelSwitching: false,
};
}
togglePanel( { name: tabName }, isTabOpen ) {
this.setState( ( state ) => {
const isPanelSwitching =
tabName !== state.currentTab &&
state.currentTab !== '' &&
isTabOpen &&
state.isPanelOpen;
return {
isPanelOpen: isTabOpen,
mobileOpen: isTabOpen,
currentTab: tabName,
isPanelSwitching,
};
} );
}
closePanel() {
this.setState( () => ( {
isPanelOpen: false,
currentTab: '',
} ) );
}
clearPanel() {
this.setState( () => ( {
isPanelSwitching: false,
} ) );
}
// 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( event ) {
const { isPanelOpen } = this.state;
const isClickOnModalOrSnackbar =
event.target.closest(
'.woocommerce-inbox-dismiss-confirmation_modal'
) || event.target.closest( '.components-snackbar__action' );
if ( isPanelOpen && ! isClickOnModalOrSnackbar ) {
this.closePanel();
}
}
// @todo Pull in dynamic unread status/count
getTabs() {
const {
hasUnreadNotes,
hasUnreadOrders,
hasUnapprovedReviews,
hasUnreadStock,
isEmbedded,
requestingTaskListOptions,
taskListEnabledResolving,
taskListComplete,
taskListHidden,
query,
} = this.props;
// Don't show the inbox on the Home screen.
const { location } = this.props.getHistory();
const showInbox =
isEmbedded ||
! window.wcAdminFeatures.homescreen ||
location.pathname !== '/';
const isPerformingSetupTask =
query.task &&
! query.path &&
( requestingTaskListOptions === true ||
( taskListHidden === false && taskListComplete === false ) );
// To prevent a flicker between 2 different tab groups, while this option resolves just display no tabs.
if ( taskListEnabledResolving ) {
return [];
}
if ( ! taskListComplete && showInbox ) {
return [
{
name: 'inbox',
title: __( 'Inbox', 'woocommerce-admin' ),
icon: inbox,
unread: hasUnreadNotes,
},
{
name: 'setup',
title: __( 'Store Setup', 'woocommerce-admin' ),
icon: