2015-07-15 12:30:11 +08:00
|
|
|
import Component from 'flarum/Component';
|
|
|
|
import Button from 'flarum/components/Button';
|
2015-08-02 15:56:57 +08:00
|
|
|
import LinkButton from 'flarum/components/LinkButton';
|
2015-07-15 12:30:11 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The `Navigation` component displays a set of navigation buttons. Typically
|
|
|
|
* this is just a back button which pops the app's History. If the user is on
|
|
|
|
* the root page and there is no history to pop, then in some instances it may
|
|
|
|
* show a button that toggles the app's drawer.
|
|
|
|
*
|
|
|
|
* If the app has a pane, it will also include a 'pin' button which toggles the
|
|
|
|
* pinned state of the pane.
|
|
|
|
*
|
|
|
|
* Accepts the following props:
|
|
|
|
*
|
|
|
|
* - `className` The name of a class to set on the root element.
|
|
|
|
* - `drawer` Whether or not to show a button to toggle the app's drawer if
|
|
|
|
* there is no more history to pop.
|
|
|
|
*/
|
|
|
|
export default class Navigation extends Component {
|
|
|
|
view() {
|
|
|
|
const {history, pane} = app;
|
|
|
|
|
|
|
|
return (
|
2015-07-17 13:17:49 +08:00
|
|
|
<div className={'Navigation ButtonGroup ' + (this.props.className || '')}
|
2015-07-15 12:30:11 +08:00
|
|
|
onmouseenter={pane && pane.show.bind(pane)}
|
|
|
|
onmouseleave={pane && pane.onmouseleave.bind(pane)}>
|
2015-07-17 13:17:49 +08:00
|
|
|
{history.canGoBack()
|
|
|
|
? [this.getBackButton(), this.getPaneButton()]
|
|
|
|
: this.getDrawerButton()}
|
2015-07-15 12:30:11 +08:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
config(isInitialized, context) {
|
|
|
|
// Since this component is 'above' the content of the page (that is, it is a
|
|
|
|
// part of the global UI that persists between routes), we will flag the DOM
|
|
|
|
// to be retained across route changes.
|
|
|
|
context.retain = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the back button.
|
|
|
|
*
|
|
|
|
* @return {Object}
|
|
|
|
* @protected
|
|
|
|
*/
|
|
|
|
getBackButton() {
|
|
|
|
const {history} = app;
|
2015-11-02 15:38:55 +08:00
|
|
|
const previous = history.getPrevious() || {};
|
2015-07-15 12:30:11 +08:00
|
|
|
|
2015-08-02 15:56:57 +08:00
|
|
|
return LinkButton.component({
|
2017-07-22 10:38:09 +08:00
|
|
|
className: 'Button Navigation-back Button--icon',
|
2015-08-02 15:56:57 +08:00
|
|
|
href: history.backUrl(),
|
2018-05-09 14:56:30 +08:00
|
|
|
icon: 'fas fa-chevron-left',
|
2017-07-22 10:38:09 +08:00
|
|
|
title: previous.title,
|
2015-08-02 15:56:57 +08:00
|
|
|
config: () => {},
|
|
|
|
onclick: e => {
|
|
|
|
if (e.shiftKey || e.ctrlKey || e.metaKey || e.which === 2) return;
|
|
|
|
e.preventDefault();
|
|
|
|
history.back();
|
|
|
|
}
|
2015-07-15 12:30:11 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the pane pinned toggle button.
|
|
|
|
*
|
|
|
|
* @return {Object|String}
|
|
|
|
* @protected
|
|
|
|
*/
|
|
|
|
getPaneButton() {
|
|
|
|
const {pane} = app;
|
|
|
|
|
|
|
|
if (!pane || !pane.active) return '';
|
|
|
|
|
|
|
|
return Button.component({
|
2015-07-17 13:17:49 +08:00
|
|
|
className: 'Button Button--icon Navigation-pin' + (pane.pinned ? ' active' : ''),
|
2015-07-15 12:30:11 +08:00
|
|
|
onclick: pane.togglePinned.bind(pane),
|
2018-05-09 14:56:30 +08:00
|
|
|
icon: 'fas fa-thumbtack'
|
2015-07-15 12:30:11 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the drawer toggle button.
|
|
|
|
*
|
|
|
|
* @return {Object|String}
|
|
|
|
* @protected
|
|
|
|
*/
|
|
|
|
getDrawerButton() {
|
|
|
|
if (!this.props.drawer) return '';
|
|
|
|
|
|
|
|
const {drawer} = app;
|
|
|
|
const user = app.session.user;
|
|
|
|
|
|
|
|
return Button.component({
|
2015-07-17 13:17:49 +08:00
|
|
|
className: 'Button Button--icon Navigation-drawer' +
|
2015-09-29 07:27:41 +08:00
|
|
|
(user && user.newNotificationsCount() ? ' new' : ''),
|
2015-07-17 13:17:49 +08:00
|
|
|
onclick: e => {
|
|
|
|
e.stopPropagation();
|
|
|
|
drawer.show();
|
|
|
|
},
|
2018-05-09 14:56:30 +08:00
|
|
|
icon: 'fas fa-bars'
|
2015-07-15 12:30:11 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|