@ -3,13 +3,7 @@ import PropTypes from 'prop-types';
import { defineMessages , injectIntl } from 'react-intl' ;
import ImmutablePropTypes from 'react-immutable-proptypes' ;
import ImmutablePureComponent from 'react-immutable-pure-component' ;
import ReactSwipeableViews from 'react-swipeable-views' ;
import TabsBar , { links , getIndex , getLink } from './tabs_bar' ;
import { Link } from 'react-router-dom' ;
import { disableSwiping } from 'flavours/glitch/initial_state' ;
import BundleContainer from '../containers/bundle_container' ;
import ColumnLoading from './column_loading' ;
import DrawerLoading from './drawer_loading' ;
@ -72,20 +66,13 @@ class ColumnsArea extends ImmutablePureComponent {
openSettings : PropTypes . func ,
} ;
// Corresponds to (max-width: 600px + (285px * 1) + (10px * 1) ) in SCSS
mediaQuery = 'matchMedia' in window && window . matchMedia ( '(max-width: 895 px)' ) ;
// Corresponds to (max-width: $no-gap-breakpoint + 285px - 1px ) in SCSS
mediaQuery = 'matchMedia' in window && window . matchMedia ( '(max-width: 1174 px)' ) ;
state = {
shouldAnimate : false ,
renderComposePanel : ! ( this . mediaQuery && this . mediaQuery . matches ) ,
}
componentWillReceiveProps ( ) {
if ( typeof this . pendingIndex !== 'number' && this . lastIndex !== getIndex ( this . context . router . history . location . pathname ) ) {
this . setState ( { shouldAnimate : false } ) ;
}
}
componentDidMount ( ) {
if ( ! this . props . singleColumn ) {
this . node . addEventListener ( 'wheel' , this . handleWheel , supportsPassiveEvents ? { passive : true } : false ) ;
@ -100,10 +87,7 @@ class ColumnsArea extends ImmutablePureComponent {
this . setState ( { renderComposePanel : ! this . mediaQuery . matches } ) ;
}
this . lastIndex = getIndex ( this . context . router . history . location . pathname ) ;
this . isRtlLayout = document . getElementsByTagName ( 'body' ) [ 0 ] . classList . contains ( 'rtl' ) ;
this . setState ( { shouldAnimate : true } ) ;
}
componentWillUpdate ( nextProps ) {
@ -116,13 +100,6 @@ class ColumnsArea extends ImmutablePureComponent {
if ( this . props . singleColumn !== prevProps . singleColumn && ! this . props . singleColumn ) {
this . node . addEventListener ( 'wheel' , this . handleWheel , supportsPassiveEvents ? { passive : true } : false ) ;
}
const newIndex = getIndex ( this . context . router . history . location . pathname ) ;
if ( this . lastIndex !== newIndex ) {
this . lastIndex = newIndex ;
this . setState ( { shouldAnimate : true } ) ;
}
}
componentWillUnmount ( ) {
@ -150,31 +127,6 @@ class ColumnsArea extends ImmutablePureComponent {
this . setState ( { renderComposePanel : ! e . matches } ) ;
}
handleSwipe = ( index ) => {
this . pendingIndex = index ;
const nextLinkTranslationId = links [ index ] . props [ 'data-preview-title-id' ] ;
const currentLinkSelector = '.tabs-bar__link.active' ;
const nextLinkSelector = ` .tabs-bar__link[data-preview-title-id=" ${ nextLinkTranslationId } "] ` ;
// HACK: Remove the active class from the current link and set it to the next one
// React-router does this for us, but too late, feeling laggy.
document . querySelector ( currentLinkSelector ) . classList . remove ( 'active' ) ;
document . querySelector ( nextLinkSelector ) . classList . add ( 'active' ) ;
if ( ! this . state . shouldAnimate && typeof this . pendingIndex === 'number' ) {
this . context . router . history . push ( getLink ( this . pendingIndex ) ) ;
this . pendingIndex = null ;
}
}
handleAnimationEnd = ( ) => {
if ( typeof this . pendingIndex === 'number' ) {
this . context . router . history . push ( getLink ( this . pendingIndex ) ) ;
this . pendingIndex = null ;
}
}
handleWheel = ( ) => {
if ( typeof this . _interruptScrollAnimation !== 'function' ) {
return ;
@ -187,22 +139,6 @@ class ColumnsArea extends ImmutablePureComponent {
this . node = node ;
}
renderView = ( link , index ) => {
const columnIndex = getIndex ( this . context . router . history . location . pathname ) ;
const title = this . props . intl . formatMessage ( { id : link . props [ 'data-preview-title-id' ] } ) ;
const icon = link . props [ 'data-preview-icon' ] ;
const view = ( index === columnIndex ) ?
React . cloneElement ( this . props . children ) :
< ColumnLoading title = { title } icon = { icon } / > ;
return (
< div className = 'columns-area columns-area--mobile' key = { index } >
{ view }
< / d i v >
) ;
}
renderLoading = columnId => ( ) => {
return columnId === 'COMPOSE' ? < DrawerLoading / > : < ColumnLoading / > ;
}
@ -213,22 +149,12 @@ class ColumnsArea extends ImmutablePureComponent {
render ( ) {
const { columns , children , singleColumn , intl , navbarUnder , openSettings } = this . props ;
const { shouldAnimate , renderComposePanel } = this . state ;
const { renderComposePanel } = this . state ;
const { signedIn } = this . context . identity ;
const columnIndex = getIndex ( this . context . router . history . location . pathname ) ;
if ( singleColumn ) {
const floatingActionButton = ( ! signedIn || shouldHideFAB ( this . context . router . history . location . pathname ) ) ? null : < Link key = 'floating-action-button' to = '/publish' className = 'floating-action-button' aria - label = { intl . formatMessage ( messages . publish ) } > < Icon id = 'pencil' / > < / L i n k > ;
const content = columnIndex !== - 1 ? (
< ReactSwipeableViews key = 'content' hysteresis = { 0.2 } threshold = { 15 } index = { columnIndex } onChangeIndex = { this . handleSwipe } onTransitionEnd = { this . handleAnimationEnd } animateTransitions = { shouldAnimate } springConfig = { { duration : '400ms' , delay : '0s' , easeFunction : 'ease' } } style = { { height : '100%' } } disabled = { disableSwiping } >
{ links . map ( this . renderView ) }
< / R e a c t S w i p e a b l e V i e w s >
) : (
< div key = 'content' className = 'columns-area columns-area--mobile' > { children } < / d i v >
) ;
return (
< div className = 'columns-area__panels' >
< div className = 'columns-area__panels__pane columns-area__panels__pane--compositional' >
@ -238,9 +164,8 @@ class ColumnsArea extends ImmutablePureComponent {
< / d i v >
< div className = { ` columns-area__panels__main ${ floatingActionButton && 'with-fab' } ` } >
{ ! navbarUnder && < TabsBar key = 'tabs' / > }
{ content }
{ navbarUnder && < TabsBar key = 'tabs' / > }
< div className = 'tabs-bar__wrapper' > < div id = 'tabs-bar__portal' / > < / d i v >
< div className = 'columns-area columns-area--mobile' > { children } < / d i v >
< / d i v >
< div className = 'columns-area__panels__pane columns-area__panels__pane--start columns-area__panels__pane--navigational' >