1
0
mirror of https://github.com/flarum/core.git synced 2025-08-08 01:16:52 +02:00

update: forum/components/DiscussionPage

- The discussion list pane has been extracted to the DiscussionListPane component
This commit is contained in:
Alexander Skvortsov
2020-08-09 23:00:45 -04:00
committed by Franz Liedke
parent edca7b93ec
commit fa2301b5c1

View File

@@ -1,13 +1,13 @@
import Page from '../../common/components/Page'; import Page from '../../common/components/Page';
import ItemList from '../../common/utils/ItemList'; import ItemList from '../../common/utils/ItemList';
import DiscussionHero from './DiscussionHero'; import DiscussionHero from './DiscussionHero';
import DiscussionListPane from './DiscussionListPane';
import PostStream from './PostStream'; import PostStream from './PostStream';
import PostStreamScrubber from './PostStreamScrubber'; import PostStreamScrubber from './PostStreamScrubber';
import LoadingIndicator from '../../common/components/LoadingIndicator'; import LoadingIndicator from '../../common/components/LoadingIndicator';
import SplitDropdown from '../../common/components/SplitDropdown'; import SplitDropdown from '../../common/components/SplitDropdown';
import listItems from '../../common/helpers/listItems'; import listItems from '../../common/helpers/listItems';
import DiscussionControls from '../utils/DiscussionControls'; import DiscussionControls from '../utils/DiscussionControls';
import DiscussionList from './DiscussionList';
import PostStreamState from '../states/PostStreamState'; import PostStreamState from '../states/PostStreamState';
/** /**
@@ -15,8 +15,8 @@ import PostStreamState from '../states/PostStreamState';
* the discussion list pane, the hero, the posts, and the sidebar. * the discussion list pane, the hero, the posts, and the sidebar.
*/ */
export default class DiscussionPage extends Page { export default class DiscussionPage extends Page {
init() { oninit(vnode) {
super.init(); super.oninit(vnode);
/** /**
* The discussion that is being viewed. * The discussion that is being viewed.
@@ -42,10 +42,6 @@ export default class DiscussionPage extends Page {
if (app.discussions.hasDiscussions()) { if (app.discussions.hasDiscussions()) {
app.pane.enable(); app.pane.enable();
app.pane.hide(); app.pane.hide();
if (app.previous.matches(DiscussionPage)) {
m.redraw.strategy('diff');
}
} }
app.history.push('discussion'); app.history.push('discussion');
@@ -92,14 +88,7 @@ export default class DiscussionPage extends Page {
return ( return (
<div className="DiscussionPage"> <div className="DiscussionPage">
{app.discussions.hasDiscussions() ? ( <DiscussionListPane />
<div className="DiscussionPage-list" config={this.configPane.bind(this)}>
{!$('.App-navigation').is(':visible') && <DiscussionList state={app.discussions} />}
</div>
) : (
''
)}
<div className="DiscussionPage-discussion"> <div className="DiscussionPage-discussion">
{discussion {discussion
? [ ? [
@@ -124,8 +113,8 @@ export default class DiscussionPage extends Page {
); );
} }
config(...args) { oncreate(vnode) {
super.config(...args); super.oncreate(vnode);
if (this.discussion) { if (this.discussion) {
app.setTitle(this.discussion.title()); app.setTitle(this.discussion.title());
@@ -149,7 +138,7 @@ export default class DiscussionPage extends Page {
app.store.find('discussions', m.route.param('id').split('-')[0], params).then(this.show.bind(this)); app.store.find('discussions', m.route.param('id').split('-')[0], params).then(this.show.bind(this));
} }
m.lazyRedraw(); m.redraw();
} }
/** /**
@@ -209,48 +198,6 @@ export default class DiscussionPage extends Page {
app.current.set('stream', this.stream); app.current.set('stream', this.stream);
} }
/**
* Configure the discussion list pane.
*
* @param {DOMElement} element
* @param {Boolean} isInitialized
* @param {Object} context
*/
configPane(element, isInitialized, context) {
if (isInitialized) return;
context.retain = true;
const $list = $(element);
// When the mouse enters and leaves the discussions pane, we want to show
// and hide the pane respectively. We also create a 10px 'hot edge' on the
// left of the screen to activate the pane.
const pane = app.pane;
$list.hover(pane.show.bind(pane), pane.onmouseleave.bind(pane));
const hotEdge = (e) => {
if (e.pageX < 10) pane.show();
};
$(document).on('mousemove', hotEdge);
context.onunload = () => $(document).off('mousemove', hotEdge);
// If the discussion we are viewing is listed in the discussion list, then
// we will make sure it is visible in the viewport if it is not we will
// scroll the list down to it.
const $discussion = $list.find('.DiscussionListItem.active');
if ($discussion.length) {
const listTop = $list.offset().top;
const listBottom = listTop + $list.outerHeight();
const discussionTop = $discussion.offset().top;
const discussionBottom = discussionTop + $discussion.outerHeight();
if (discussionTop < listTop || discussionBottom > listBottom) {
$list.scrollTop($list.scrollTop() - listTop + discussionTop);
}
}
}
/** /**
* Build an item list for the contents of the sidebar. * Build an item list for the contents of the sidebar.
* *
@@ -261,17 +208,20 @@ export default class DiscussionPage extends Page {
items.add( items.add(
'controls', 'controls',
SplitDropdown.component({ SplitDropdown.component(
children: DiscussionControls.controls(this.discussion, this).toArray(), {
icon: 'fas fa-ellipsis-v', icon: 'fas fa-ellipsis-v',
className: 'App-primaryControl', className: 'App-primaryControl',
buttonClassName: 'Button--primary', buttonClassName: 'Button--primary',
}) },
DiscussionControls.controls(this.discussion, this).toArray()
)
); );
items.add( items.add(
'scrubber', 'scrubber',
PostStreamScrubber.component({ PostStreamScrubber.component({
discussion: this.discussion,
stream: this.stream, stream: this.stream,
className: 'App-titleControl', className: 'App-titleControl',
}), }),
@@ -295,7 +245,7 @@ export default class DiscussionPage extends Page {
// replace it into the window's history and our own history stack. // replace it into the window's history and our own history stack.
const url = app.route.discussion(discussion, (this.near = startNumber)); const url = app.route.discussion(discussion, (this.near = startNumber));
m.route(url, true); m.route.set(url);
window.history.replaceState(null, document.title, url); window.history.replaceState(null, document.title, url);
app.history.push('discussion', discussion.title()); app.history.push('discussion', discussion.title());