Updated pages, layout component structures

• Updated:
- pages, layout component structures
This commit is contained in:
mgabdev 2020-08-14 12:45:59 -05:00
parent 67e1082cf5
commit 014e476b5d
23 changed files with 461 additions and 500 deletions

@ -1,18 +1,6 @@
import Layout from './layout'
export default class DefaultLayout extends PureComponent {
static propTypes = {
actions: PropTypes.array,
children: PropTypes.node.isRequired,
layout: PropTypes.object,
noComposeButton: PropTypes.bool,
noRightSidebar: PropTypes.bool,
page: PropTypes.string,
showBackBtn: PropTypes.bool,
tabs: PropTypes.array,
title: PropTypes.string.isRequired,
}
class DefaultLayout extends PureComponent {
render() {
const {
@ -44,3 +32,17 @@ export default class DefaultLayout extends PureComponent {
}
}
DefaultLayout.propTypes = {
actions: PropTypes.array,
children: PropTypes.node.isRequired,
layout: PropTypes.object,
noComposeButton: PropTypes.bool,
noRightSidebar: PropTypes.bool,
page: PropTypes.string,
showBackBtn: PropTypes.bool,
tabs: PropTypes.array,
title: PropTypes.string.isRequired,
}
export default DefaultLayout

@ -14,37 +14,21 @@ import {
GroupInfoPanel,
} from '../features/ui/util/async_components'
export default class GroupLayout extends ImmutablePureComponent {
static propTypes = {
actions: PropTypes.array,
children: PropTypes.node,
group: ImmutablePropTypes.map,
groupId: PropTypes.string,
isTimeline: PropTypes.bool,
layout: PropTypes.object,
relationships: ImmutablePropTypes.map,
showBackBtn: PropTypes.bool,
title: PropTypes.string,
}
class GroupLayout extends ImmutablePureComponent {
render() {
const {
actions,
children,
group,
groupId,
isTimeline,
relationships,
showBackBtn,
title,
} = this.props
return (
<Layout
noRightSidebar
actions={actions}
showBackBtn={showBackBtn}
showBackBtn
title={title}
page='group'
>
@ -97,3 +81,13 @@ export default class GroupLayout extends ImmutablePureComponent {
}
}
GroupLayout.propTypes = {
children: PropTypes.node,
group: ImmutablePropTypes.map,
groupId: PropTypes.string,
relationships: ImmutablePropTypes.map,
title: PropTypes.string,
}
export default GroupLayout

@ -20,22 +20,7 @@ import {
SidebarXS,
} from '../features/ui/util/async_components'
export default class Layout extends PureComponent {
static propTypes = {
actions: PropTypes.array,
children: PropTypes.node,
layout: PropTypes.array,
noComposeButton: PropTypes.bool,
noRightSidebar: PropTypes.bool,
noSidebar: PropTypes.bool,
page: PropTypes.string,
showBackBtn: PropTypes.bool,
showLinkFooterInSidebar: PropTypes.bool,
showGlobalFooter: PropTypes.bool,
tabs: PropTypes.array,
title: PropTypes.string,
}
class Layout extends PureComponent {
render() {
const {
@ -176,3 +161,20 @@ export default class Layout extends PureComponent {
}
}
Layout.propTypes = {
actions: PropTypes.array,
children: PropTypes.node,
layout: PropTypes.array,
noComposeButton: PropTypes.bool,
noRightSidebar: PropTypes.bool,
noSidebar: PropTypes.bool,
page: PropTypes.string,
showBackBtn: PropTypes.bool,
showLinkFooterInSidebar: PropTypes.bool,
showGlobalFooter: PropTypes.bool,
tabs: PropTypes.array,
title: PropTypes.string,
}
export default Layout

@ -1,27 +1,24 @@
import PageTitle from '../features/ui/util/page_title'
import AboutLayout from '../layouts/about_layout'
export default class AboutPage extends PureComponent {
static propTypes = {
title: PropTypes.string.isRequired,
children: PropTypes.node.isRequired,
}
class AboutPage extends PureComponent {
render() {
const { children, title } = this.props
return (
<AboutLayout
noComposeButton
showBackBtn
title={title}
page='about'
>
<AboutLayout title={title}>
<PageTitle path={title} />
{children}
</AboutLayout>
)
}
}
}
AboutPage.propTypes = {
title: PropTypes.string.isRequired,
children: PropTypes.node.isRequired,
}
export default AboutPage

@ -6,13 +6,7 @@ import {
WhoToFollowPanel,
} from '../features/ui/util/async_components'
export default class BasicPage extends PureComponent {
static propTypes = {
children: PropTypes.node.isRequired,
page: PropTypes.string.isRequired,
title: PropTypes.string.isRequired,
}
class BasicPage extends PureComponent {
render() {
const {
@ -39,4 +33,12 @@ export default class BasicPage extends PureComponent {
)
}
}
}
BasicPage.propTypes = {
children: PropTypes.node.isRequired,
page: PropTypes.string.isRequired,
title: PropTypes.string.isRequired,
}
export default BasicPage

@ -2,6 +2,7 @@ import { defineMessages, injectIntl } from 'react-intl'
import { openModal } from '../actions/modal'
import PageTitle from '../features/ui/util/page_title'
import DefaultLayout from '../layouts/default_layout'
import { MODAL_COMMUNITY_TIMELINE_SETTINGS } from '../constants'
import {
LinkFooter,
GroupsPanel,
@ -10,29 +11,14 @@ import {
WhoToFollowPanel,
} from '../features/ui/util/async_components'
const messages = defineMessages({
community: { 'id': 'column.community', 'defaultMessage': 'Community feed' },
})
const mapDispatchToProps = (dispatch) => ({
onOpenCommunityPageSettingsModal() {
dispatch(openModal('COMMUNITY_TIMELINE_SETTINGS'))
},
})
export default
@injectIntl
@connect(null, mapDispatchToProps)
class CommunityPage extends PureComponent {
static propTypes = {
intl: PropTypes.object.isRequired,
children: PropTypes.node.isRequired,
onOpenCommunityPageSettingsModal: PropTypes.func.isRequired,
onOpenCommunityPageSettingsModal = () => {
this.props.dispatch(openModal(MODAL_COMMUNITY_TIMELINE_SETTINGS))
}
render() {
const { intl, children, onOpenCommunityPageSettingsModal } = this.props
const { children, intl } = this.props
const title = intl.formatMessage(messages.community)
@ -43,7 +29,7 @@ class CommunityPage extends PureComponent {
actions={[
{
icon: 'ellipsis',
onClick: onOpenCommunityPageSettingsModal,
onClick: this.onOpenCommunityPageSettingsModal,
},
]}
layout={[
@ -59,4 +45,16 @@ class CommunityPage extends PureComponent {
</DefaultLayout>
)
}
}
}
const messages = defineMessages({
community: { 'id': 'column.community', 'defaultMessage': 'Community feed' },
})
CommunityPage.propTypes = {
children: PropTypes.node.isRequired,
dispatch: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
}
export default injectIntl(connect()(CommunityPage))

@ -1,9 +1,7 @@
export default class ErrorPage extends PureComponent {
render() {
const { children } = this.props;
// : todo :
const { children } = this.props
return (
<div>

@ -1,25 +1,24 @@
import PageTitle from '../features/ui/util/page_title'
import ExploreLayout from '../layouts/explore_layout'
export default class ExplorePage extends PureComponent {
static propTypes = {
title: PropTypes.string.isRequired,
children: PropTypes.node.isRequired,
}
class ExplorePage extends PureComponent {
render() {
const { children, title } = this.props
return (
<ExploreLayout
page='explore'
title={title}
>
<ExploreLayout title={title}>
<PageTitle path={title} />
{children}
</ExploreLayout>
)
}
}
}
ExplorePage.propTypes = {
title: PropTypes.string.isRequired,
children: PropTypes.node.isRequired,
}
export default ExplorePage

@ -8,39 +8,10 @@ import GroupLayout from '../layouts/group_layout'
import TimelineComposeBlock from '../components/timeline_compose_block'
import Divider from '../components/divider'
const messages = defineMessages({
group: { id: 'group', defaultMessage: 'Group' },
})
const mapStateToProps = (state, { params: { id } }) => ({
group: state.getIn(['groups', id]),
relationships: state.getIn(['group_relationships', id]),
})
const mapDispatchToProps = (dispatch) => ({
onFetchGroup(groupId) {
dispatch(fetchGroup(groupId))
},
})
export default
@injectIntl
@connect(mapStateToProps, mapDispatchToProps)
class GroupPage extends ImmutablePureComponent {
static propTypes = {
intl: PropTypes.object.isRequired,
group: ImmutablePropTypes.map,
children: PropTypes.node.isRequired,
relationships: ImmutablePropTypes.map,
onFetchGroup: PropTypes.func.isRequired,
sortByValue: PropTypes.string.isRequired,
sortByTopValue: PropTypes.string.isRequired,
}
componentDidMount() {
this.props.onFetchGroup(this.props.params.id)
// this.props.onFetchGroup(this.props.params.slug)
this.props.dispatch(fetchGroup(this.props.params.id))
}
render() {
@ -54,15 +25,13 @@ class GroupPage extends ImmutablePureComponent {
const groupTitle = !!group ? group.get('title') : ''
const groupId = !!group ? group.get('id') : undefined
return (
<GroupLayout
showBackBtn
title={'Group'}
group={group}
groupId={groupId}
relationships={relationships}
isTimeline={isTimeline}
>
<PageTitle path={[groupTitle, intl.formatMessage(messages.group)]} />
@ -78,4 +47,25 @@ class GroupPage extends ImmutablePureComponent {
</GroupLayout>
)
}
}
}
const messages = defineMessages({
group: { id: 'group', defaultMessage: 'Group' },
})
const mapStateToProps = (state, { params: { id } }) => ({
group: state.getIn(['groups', id]),
relationships: state.getIn(['group_relationships', id]),
})
GroupPage.propTypes = {
intl: PropTypes.object.isRequired,
group: ImmutablePropTypes.map,
children: PropTypes.node.isRequired,
relationships: ImmutablePropTypes.map,
dispatch: PropTypes.func.isRequired,
sortByValue: PropTypes.string.isRequired,
sortByTopValue: PropTypes.string.isRequired,
}
export default injectIntl(connect(mapStateToProps)(GroupPage))

@ -1,4 +1,3 @@
import { Fragment } from 'react'
import { me } from '../initial_state'
import { defineMessages, injectIntl } from 'react-intl'
import PageTitle from '../features/ui/util/page_title'
@ -11,31 +10,8 @@ import {
LinkFooter,
} from '../features/ui/util/async_components'
const messages = defineMessages({
groups: { id: 'groups', defaultMessage: 'Groups' },
new: { id: 'new', defaultMessage: 'Recently Added Groups' },
featured: { id: 'featured', defaultMessage: 'Featured Groups' },
myGroupsTimeline: { id: 'my_groups_timeline', defaultMessage: 'Timeline' },
myGroups: { id: 'my_groups', defaultMessage: 'My Groups' },
admin: { id: 'admin', defaultMessage: 'Admin' },
})
const mapStateToProps = (state) => ({
isPro: state.getIn(['accounts', me, 'is_pro']),
})
export default
@injectIntl
@connect(mapStateToProps)
class GroupsPage extends PureComponent {
static propTypes = {
activeTab: PropTypes.string.isRequired,
intl: PropTypes.object.isRequired,
children: PropTypes.node.isRequired,
isPro: PropTypes.bool,
}
render() {
const {
activeTab,
@ -46,13 +22,6 @@ class GroupsPage extends PureComponent {
const dontShowChildren = (activeTab === 'timeline' && !me)
const actions = isPro ? [
{
icon: 'add',
to: '/groups/create',
},
] : []
const tabs = !!me ? [
{
title: intl.formatMessage(messages.myGroupsTimeline),
@ -80,7 +49,7 @@ class GroupsPage extends PureComponent {
}
const title = intl.formatMessage(messages.groups)
const layout = []
if (!!me) {
layout.push(<WrappedBundle component={GroupsPanel} componentParams={{ groupType: 'member' }} />)
@ -90,14 +59,22 @@ class GroupsPage extends PureComponent {
return (
<DefaultLayout
title={title}
actions={actions}
actions={[
{
title: 'Create',
icon: 'add',
to: '/groups/create',
},
]}
tabs={tabs}
page='groups'
layout={layout}
>
<PageTitle path={title} />
{ !dontShowChildren && children }
{
!dontShowChildren && children
}
{
dontShowChildren &&
@ -108,3 +85,25 @@ class GroupsPage extends PureComponent {
}
}
const messages = defineMessages({
groups: { id: 'groups', defaultMessage: 'Groups' },
new: { id: 'new', defaultMessage: 'Recently Added Groups' },
featured: { id: 'featured', defaultMessage: 'Featured Groups' },
myGroupsTimeline: { id: 'my_groups_timeline', defaultMessage: 'Timeline' },
myGroups: { id: 'my_groups', defaultMessage: 'My Groups' },
admin: { id: 'admin', defaultMessage: 'Admin' },
})
const mapStateToProps = (state) => ({
isPro: state.getIn(['accounts', me, 'is_pro']),
})
GroupsPage.propTypes = {
activeTab: PropTypes.string.isRequired,
intl: PropTypes.object.isRequired,
children: PropTypes.node.isRequired,
isPro: PropTypes.bool,
}
export default injectIntl(connect(mapStateToProps)(GroupsPage))

@ -3,6 +3,7 @@ import { defineMessages, injectIntl } from 'react-intl'
import isObject from 'lodash.isobject'
import PageTitle from '../features/ui/util/page_title'
import DefaultLayout from '../layouts/default_layout'
import { MODAL_HASHTAG_TIMELINE_SETTINGS } from '../constants'
import {
LinkFooter,
ProgressPanel,
@ -10,36 +11,23 @@ import {
WhoToFollowPanel,
} from '../features/ui/util/async_components'
const messages = defineMessages({
hashtag: { id: 'hashtag', defaultMessage: 'Hashtag' },
hashtagTimeline: { id: 'hashtag_timeline', defaultMessage: 'Hashtag timeline' },
})
const mapDispatchToProps = (dispatch) => ({
onOpenHashtagPageSettingsModal(hashtag) {
dispatch(openModal('HASHTAG_TIMELINE_SETTINGS', {
hashtag,
}))
},
})
export default
@injectIntl
@connect(null, mapDispatchToProps)
class HashtagPage extends PureComponent {
static propTypes = {
intl: PropTypes.object.isRequired,
children: PropTypes.node.isRequired,
onOpenHashtagPageSettingsModal: PropTypes.func.isRequired,
params: PropTypes.object.isRequired,
onOpenHashtagPageSettingsModal = () => {
const { params } = this.props
const hashtag = isObject(params) ? params.id : ''
if (!hashtag) return
this.props.dispatch(openModal(MODAL_HASHTAG_TIMELINE_SETTINGS, {
hashtag,
}))
}
render() {
const {
intl,
children,
onOpenHashtagPageSettingsModal,
intl,
params,
} = this.props
@ -52,7 +40,7 @@ class HashtagPage extends PureComponent {
actions={[
{
icon: 'ellipsis',
onClick: onOpenHashtagPageSettingsModal,
onClick: this.onOpenHashtagPageSettingsModal,
},
]}
layout={[
@ -67,4 +55,18 @@ class HashtagPage extends PureComponent {
</DefaultLayout>
)
}
}
}
const messages = defineMessages({
hashtag: { id: 'hashtag', defaultMessage: 'Hashtag' },
hashtagTimeline: { id: 'hashtag_timeline', defaultMessage: 'Hashtag timeline' },
})
HashtagPage.propTypes = {
children: PropTypes.node.isRequired,
dispatch: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
params: PropTypes.object.isRequired,
}
export default injectIntl(connect()(HashtagPage))

@ -21,34 +21,8 @@ import {
ProgressPanel,
} from '../features/ui/util/async_components'
const messages = defineMessages({
home: { id: 'home', defaultMessage: 'Home' },
})
const mapStateToProps = (state) => ({
totalQueuedItemsCount: state.getIn(['timelines', 'home', 'totalQueuedItemsCount']),
isPro: state.getIn(['accounts', me, 'is_pro']),
})
const mapDispatchToProps = (dispatch) => ({
onOpenHomePageSettingsModal() {
dispatch(openModal(MODAL_HOME_TIMELINE_SETTINGS))
},
})
export default
@injectIntl
@connect(mapStateToProps, mapDispatchToProps)
class HomePage extends PureComponent {
static propTypes = {
children: PropTypes.node.isRequired,
intl: PropTypes.object.isRequired,
onOpenHomePageSettingsModal: PropTypes.func.isRequired,
totalQueuedItemsCount: PropTypes.number.isRequired,
isPro: PropTypes.bool,
}
state = {
lazyLoaded: false,
}
@ -81,24 +55,29 @@ class HomePage extends PureComponent {
trailing: true,
})
onOpenHomePageSettingsModal = () => {
this.props.dispatch(openModal(MODAL_HOME_TIMELINE_SETTINGS))
}
render() {
const {
intl,
children,
totalQueuedItemsCount,
onOpenHomePageSettingsModal,
intl,
isPro,
totalQueuedItemsCount,
} = this.props
const { lazyLoaded } = this.state
const title = intl.formatMessage(messages.home)
return (
<DefaultLayout
page='home'
title={intl.formatMessage(messages.home)}
title={title}
actions={[
{
icon: 'ellipsis',
onClick: onOpenHomePageSettingsModal,
onClick: this.onOpenHomePageSettingsModal,
},
]}
layout={[
@ -115,7 +94,7 @@ class HomePage extends PureComponent {
>
<PageTitle
path={intl.formatMessage(messages.home)}
path={title}
badge={totalQueuedItemsCount}
/>
@ -130,4 +109,23 @@ class HomePage extends PureComponent {
</DefaultLayout>
)
}
}
}
const messages = defineMessages({
home: { id: 'home', defaultMessage: 'Home' },
})
const mapStateToProps = (state) => ({
totalQueuedItemsCount: state.getIn(['timelines', 'home', 'totalQueuedItemsCount']),
isPro: state.getIn(['accounts', me, 'is_pro']),
})
HomePage.propTypes = {
children: PropTypes.node.isRequired,
dispatch: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
isPro: PropTypes.bool,
totalQueuedItemsCount: PropTypes.number.isRequired,
}
export default injectIntl(connect(mapStateToProps)(HomePage))

@ -4,12 +4,10 @@ import IntroductionLayout from '../layouts/introduction_layout'
export default class IntroductionPage extends PureComponent {
render() {
const { children } = this.props
return (
<IntroductionLayout>
<PageTitle path='Welcome to Gab' />
{children}
{this.props.children}
</IntroductionLayout>
)
}

@ -4,7 +4,6 @@ import { defineMessages, injectIntl } from 'react-intl'
import { openModal } from '../actions/modal'
import {
MODAL_LIST_EDITOR,
// MODAL_LIST_TIMELINE_SETTINGS,
} from '../constants'
import PageTitle from '../features/ui/util/page_title'
import DefaultLayout from '../layouts/default_layout'
@ -16,68 +15,38 @@ import {
WhoToFollowPanel,
} from '../features/ui/util/async_components'
const messages = defineMessages({
list: { id: 'list', defaultMessage: 'List' },
})
const mapStateToProps = (state, props) => ({
list: state.getIn(['lists', props.params.id]),
})
const mapDispatchToProps = (dispatch) => ({
onOpenListEditModal(list) {
if (!list) return
const listId = list.get('id')
dispatch(openModal(MODAL_LIST_EDITOR, { id: listId }))
},
// : todo :
// onOpenListTimelineSettingsModal() {
// dispatch(openModal(MODAL_LIST_TIMELINE_SETTINGS))
// },
})
export default
@injectIntl
@connect(mapStateToProps, mapDispatchToProps)
class ListPage extends ImmutablePureComponent {
static propTypes = {
intl: PropTypes.object.isRequired,
list: ImmutablePropTypes.map,
children: PropTypes.node.isRequired,
onOpenListEditModal: PropTypes.func.isRequired,
// onOpenListTimelineSettingsModal: PropTypes.func.isRequired,
}
handleOnOpenListEditModal = () => {
this.props.onOpenListEditModal(this.props.list)
onOpenListEditModal = () => {
const { list } = this.props
if (!list) return
this.props.dispatch(openModal(MODAL_LIST_EDITOR, {
id: list.get('id'),
}))
}
render() {
const {
intl,
children,
intl,
list,
onOpenListEditModal,
// onOpenListTimelineSettingsModal
} = this.props
const title = !!list ? list.get('title') : ''
const listTitle = !!list ? list.get('title') : ''
const title = intl.formatMessage(messages.list)
return (
<DefaultLayout
showBackBtn
title={intl.formatMessage(messages.list)}
title={title}
page='list'
actions={[
{
icon: 'cog',
onClick: this.handleOnOpenListEditModal,
onClick: this.onOpenListEditModal,
},
// {
// icon: 'ellipsis',
// onClick: onOpenListTimelineSettingsModal,
// },
]}
layout={[
<WrappedBundle component={ListDetailsPanel} componentParams={{ list: list, onEdit: this.handleOnOpenListEditModal }} />,
@ -86,9 +55,26 @@ class ListPage extends ImmutablePureComponent {
LinkFooter,
]}
>
<PageTitle path={[title, intl.formatMessage(messages.list)]} />
<PageTitle path={[listTitle, title]} />
{ children }
</DefaultLayout>
)
}
}
}
const messages = defineMessages({
list: { id: 'list', defaultMessage: 'List' },
})
const mapStateToProps = (state, props) => ({
list: state.getIn(['lists', props.params.id]),
})
ListPage.propTypes = {
children: PropTypes.node.isRequired,
dispatch: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
list: ImmutablePropTypes.map,
}
export default injectIntl(connect(mapStateToProps)(ListPage))

@ -2,48 +2,33 @@ import { openModal } from '../actions/modal'
import { defineMessages, injectIntl } from 'react-intl'
import PageTitle from '../features/ui/util/page_title'
import DefaultLayout from '../layouts/default_layout'
import { MODAL_LIST_CREATE } from '../constants'
import {
LinkFooter,
TrendsPanel,
WhoToFollowPanel,
} from '../features/ui/util/async_components'
const messages = defineMessages({
lists: { id: 'lists', defaultMessage: 'Lists' },
})
const mapDispatchToProps = (dispatch) => ({
onOpenListCreateModal() {
dispatch(openModal('LIST_CREATE'))
},
})
export default
@injectIntl
@connect(null, mapDispatchToProps)
class ListsPage extends PureComponent {
static propTypes = {
intl: PropTypes.object.isRequired,
children: PropTypes.node.isRequired,
onOpenListCreateModal: PropTypes.func.isRequired,
onOpenListCreateModal = () => {
this.props.dispatch(openModal(MODAL_LIST_CREATE))
}
render() {
const {
intl,
children,
onOpenListCreateModal,
} = this.props
const { children, intl } = this.props
const title = intl.formatMessage(messages.lists)
return (
<DefaultLayout
title={intl.formatMessage(messages.lists)}
showBackBtn
title={title}
page='lists'
actions={[
{
icon: 'add',
onClick: onOpenListCreateModal,
onClick: this.onOpenListCreateModal,
},
]}
layout={[
@ -51,12 +36,23 @@ class ListsPage extends PureComponent {
WhoToFollowPanel,
LinkFooter,
]}
showBackBtn
>
<PageTitle path={intl.formatMessage(messages.lists)} />
<PageTitle path={title} />
{children}
</DefaultLayout>
)
}
}
}
const messages = defineMessages({
lists: { id: 'lists', defaultMessage: 'Lists' },
})
ListsPage.propTypes = {
intl: PropTypes.object.isRequired,
children: PropTypes.node.isRequired,
dispatch: PropTypes.func.isRequired,
}
export default injectIntl(connect()(ListsPage))

@ -6,13 +6,7 @@ import {
WhoToFollowPanel,
} from '../features/ui/util/async_components'
export default class ModalPage extends PureComponent {
static propTypes = {
title: PropTypes.string,
page: PropTypes.string,
children: PropTypes.node,
}
class ModalPage extends PureComponent {
render() {
const {
@ -42,4 +36,12 @@ export default class ModalPage extends PureComponent {
)
}
}
}
ModalPage.propTypes = {
title: PropTypes.string,
page: PropTypes.string,
children: PropTypes.node,
}
export default ModalPage

@ -8,19 +8,14 @@ import {
VerifiedAccountsPanel,
} from '../features/ui/util/async_components'
export default class NewsPage extends PureComponent {
static propTypes = {
title: PropTypes.string.isRequired,
children: PropTypes.node.isRequired,
}
class NewsPage extends PureComponent {
render() {
const { children, title } = this.props
return (
<DefaultLayout
page='explore'
page='news'
title={title}
noComposeButton
showBackBtn
@ -39,3 +34,10 @@ export default class NewsPage extends PureComponent {
}
}
NewsPage.propTypes = {
children: PropTypes.node.isRequired,
title: PropTypes.string.isRequired,
}
export default NewsPage

@ -12,6 +12,61 @@ import {
WhoToFollowPanel,
} from '../features/ui/util/async_components'
class NotificationsPage extends PureComponent {
onChangeActiveFilter(notificationType) {
this.props.dispatch(setFilter('active', notificationType))
if (notificationType === 'all') {
this.context.router.history.push('/notifications')
} else if (notificationType === 'follow_requests') {
this.context.router.history.push(`/notifications/follow_requests`)
} else {
this.context.router.history.push(`/notifications?view=${notificationType}`)
}
}
render() {
const {
children,
intl,
locked,
notificationCount,
selectedFilter,
} = this.props
let filters = NOTIFICATION_FILTERS
if (!locked && filters.indexOf('follow_requests') > -1) {
filters.splice(filters.indexOf('follow_requests'))
}
const tabs = filters.map((filter) => ({
title: intl.formatMessage(messages[filter]),
onClick: () => this.onChangeActiveFilter(filter),
active: selectedFilter.toLowerCase() === filter.toLowerCase(),
}))
const title = intl.formatMessage(messages.notifications)
return (
<DefaultLayout
title={title}
page='notifications'
layout={[
NotificationFilterPanel,
TrendsPanel,
WhoToFollowPanel,
LinkFooter,
]}
tabs={tabs}
>
<PageTitle badge={notificationCount} path={title} />
{children}
</DefaultLayout>
)
}
}
const messages = defineMessages({
notifications: { id: 'tabs_bar.notifications', defaultMessage: 'Notifications' },
mention: { id: 'notifications.filter.mentions', defaultMessage: 'Mentions' },
@ -29,80 +84,17 @@ const mapStateToProps = (state) => ({
locked: !!state.getIn(['accounts', me, 'locked']),
})
const mapDispatchToProps = (dispatch) => ({
setFilter(value) {
dispatch(setFilter('active', value))
},
})
NotificationsPage.contextTypes = {
router: PropTypes.object.isRequired,
}
export default
@injectIntl
@connect(mapStateToProps, mapDispatchToProps)
class NotificationsPage extends PureComponent {
NotificationsPage.propTypes = {
children: PropTypes.node.isRequired,
dispatch: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
locked: PropTypes.bool,
notificationCount: PropTypes.number.isRequired,
selectedFilter: PropTypes.string.isRequired,
}
static contextTypes = {
router: PropTypes.object.isRequired,
}
static propTypes = {
children: PropTypes.node.isRequired,
intl: PropTypes.object.isRequired,
notificationCount: PropTypes.number.isRequired,
setFilter: PropTypes.func.isRequired,
selectedFilter: PropTypes.string.isRequired,
locked: PropTypes.bool,
}
onChangeActiveFilter(notificationType) {
this.props.setFilter(notificationType)
if (notificationType === 'all') {
this.context.router.history.push('/notifications')
} else if (notificationType === 'follow_requests') {
this.context.router.history.push(`/notifications/follow_requests`)
} else {
this.context.router.history.push(`/notifications?view=${notificationType}`)
}
}
render() {
const {
children,
intl,
notificationCount,
selectedFilter,
locked
} = this.props
let filters = NOTIFICATION_FILTERS
if (!locked && filters.indexOf('follow_requests') > -1) {
filters.splice(filters.indexOf('follow_requests'))
}
const tabs = filters.map((filter) => ({
title: intl.formatMessage(messages[filter]),
onClick: () => this.onChangeActiveFilter(filter),
active: selectedFilter.toLowerCase() === filter.toLowerCase(),
}))
return (
<DefaultLayout
title={intl.formatMessage(messages.notifications)}
page='notifications'
layout={[
NotificationFilterPanel,
TrendsPanel,
WhoToFollowPanel,
LinkFooter,
]}
tabs={tabs}
>
<PageTitle
badge={notificationCount}
path={intl.formatMessage(messages.notifications)}
/>
{children}
</DefaultLayout>
)
}
}{}
export default injectIntl(connect(mapStateToProps)(NotificationsPage))

@ -7,19 +7,8 @@ import {
ProgressPanel,
} from '../features/ui/util/async_components'
const messages = defineMessages({
title: { 'id': 'column.pro', 'defaultMessage': 'Pro feed' },
})
export default
@injectIntl
class ProPage extends PureComponent {
static propTypes = {
intl: PropTypes.object.isRequired,
children: PropTypes.node.isRequired,
}
render() {
const { intl, children } = this.props
@ -40,4 +29,16 @@ class ProPage extends PureComponent {
</DefaultLayout>
)
}
}
}
const messages = defineMessages({
title: { 'id': 'column.pro', 'defaultMessage': 'Pro feed' },
})
ProPage.propTypes = {
children: PropTypes.node.isRequired,
intl: PropTypes.object.isRequired,
}
export default injectIntl(ProPage)

@ -9,46 +9,10 @@ import ColumnIndicator from '../components/column_indicator'
import Block from '../components/block'
import ProfileLayout from '../layouts/profile_layout'
const mapStateToProps = (state, { params: { username } }) => {
const accounts = state.getIn(['accounts'])
const account = accounts.find(acct => username.toLowerCase() === acct.getIn(['acct'], '').toLowerCase())
const accountId = !!account ? account.get('id') : -1
const isBlocked = state.getIn(['relationships', accountId, 'blocked_by'], false)
const isLocked = state.getIn(['accounts', accountId, 'locked'], false)
const isFollowing = state.getIn(['relationships', accountId, 'following'], false)
const unavailable = (me === accountId) ? false : (isBlocked || (isLocked && !isFollowing))
const getAccount = makeGetAccount()
return {
unavailable,
account: accountId !== -1 ? getAccount(state, accountId) : null,
}
}
const mapDispatchToProps = (dispatch) => ({
onFetchAccountByUsername(username) {
dispatch(fetchAccountByUsername(username))
},
})
export default
@connect(mapStateToProps, mapDispatchToProps)
class ProfilePage extends ImmutablePureComponent {
static propTypes = {
children: PropTypes.node,
params: PropTypes.object.isRequired,
account: ImmutablePropTypes.map,
onFetchAccountByUsername: PropTypes.func.isRequired,
unavailable: PropTypes.bool.isRequired,
noSidebar: PropTypes.bool,
}
componentDidMount() {
this.props.onFetchAccountByUsername(this.props.params.username)
this.props.dispatch(fetchAccountByUsername(this.props.params.username))
}
render() {
@ -89,4 +53,34 @@ class ProfilePage extends ImmutablePureComponent {
)
}
}
}
const mapStateToProps = (state, { params: { username } }) => {
const accounts = state.getIn(['accounts'])
const account = accounts.find(acct => username.toLowerCase() === acct.getIn(['acct'], '').toLowerCase())
const accountId = !!account ? account.get('id') : -1
const isBlocked = state.getIn(['relationships', accountId, 'blocked_by'], false)
const isLocked = state.getIn(['accounts', accountId, 'locked'], false)
const isFollowing = state.getIn(['relationships', accountId, 'following'], false)
const unavailable = (me === accountId) ? false : (isBlocked || (isLocked && !isFollowing))
const getAccount = makeGetAccount()
return {
unavailable,
account: accountId !== -1 ? getAccount(state, accountId) : null,
}
}
ProfilePage.propTypes = {
account: ImmutablePropTypes.map,
children: PropTypes.node,
dispatch: PropTypes.func.isRequired,
noSidebar: PropTypes.bool,
params: PropTypes.object.isRequired,
unavailable: PropTypes.bool.isRequired,
}
export default connect(mapStateToProps)(ProfilePage)

@ -11,34 +11,12 @@ import {
SignUpPanel,
} from '../features/ui/util/async_components'
const messages = defineMessages({
search: { id: 'search', defaultMessage: 'Search' },
top: { id: 'top', defaultMessage: 'Top' },
people: { id: 'people', defaultMessage: 'People' },
groups: { id: 'groups', defaultMessage: 'Groups' },
hashtags: { id: 'hashtags', defaultMessage: 'Hashtags' },
})
const mapStateToProps = (state) => ({
value: state.getIn(['search', 'value']),
})
export default
@injectIntl
@connect(mapStateToProps)
class SearchPage extends PureComponent {
static propTypes = {
intl: PropTypes.object.isRequired,
children: PropTypes.node.isRequired,
value: PropTypes.string,
}
componentWillMount() {
const { intl } = this.props
render() {
const { intl, children, value } = this.props
const title = intl.formatMessage(messages.search)
const tabs = [
this.tabs = [
{
title: intl.formatMessage(messages.top),
to: '/search'
@ -56,7 +34,16 @@ class SearchPage extends PureComponent {
to: '/search/hashtags'
},
]
}
render() {
const {
children,
intl,
value,
} = this.props
const title = intl.formatMessage(messages.search)
const qos = !!value ? value : ''
return (
@ -64,7 +51,7 @@ class SearchPage extends PureComponent {
noComposeButton
title={title}
showBackBtn
tabs={tabs}
tabs={this.tabs}
page={`search.${qos}`}
layout={[
SignUpPanel,
@ -74,7 +61,7 @@ class SearchPage extends PureComponent {
]}
>
<PageTitle path={title} />
<Responsive max={BREAKPOINT_EXTRA_SMALL}>
<div className={[_s.default, _s.px10].join(' ')}>
<Search />
@ -86,4 +73,24 @@ class SearchPage extends PureComponent {
)
}
}
}
const messages = defineMessages({
search: { id: 'search', defaultMessage: 'Search' },
top: { id: 'top', defaultMessage: 'Top' },
people: { id: 'people', defaultMessage: 'People' },
groups: { id: 'groups', defaultMessage: 'Groups' },
hashtags: { id: 'hashtags', defaultMessage: 'Hashtags' },
})
const mapStateToProps = (state) => ({
value: state.getIn(['search', 'value']),
})
SearchPage.propTypes = {
intl: PropTypes.object.isRequired,
children: PropTypes.node.isRequired,
value: PropTypes.string,
}
export default injectIntl(connect(mapStateToProps)(SearchPage))

@ -1,14 +1,13 @@
import SettingsLayout from '../layouts/settings_layout'
export default class SettingsPage extends PureComponent {
static propTypes = {
tabs: PropTypes.array,
title: PropTypes.string,
}
class SettingsPage extends PureComponent {
render() {
const { children, title, tabs } = this.props;
const {
children,
tabs,
title,
} = this.props
return (
<SettingsLayout
@ -19,4 +18,13 @@ export default class SettingsPage extends PureComponent {
</SettingsLayout>
)
}
}
}
SettingsPage.propTypes = {
children: PropTypes.node.isRequired,
tabs: PropTypes.array,
title: PropTypes.string,
}
export default SettingsPage

@ -9,28 +9,10 @@ import {
WhoToFollowPanel,
} from '../features/ui/util/async_components'
const messages = defineMessages({
shortcuts: { id: 'shortcuts', defaultMessage: 'Shortcuts' },
})
const mapDispatchToProps = (dispatch) => ({
onOpenEditShortcutsModal() {
dispatch(openModal(MODAL_EDIT_SHORTCUTS))
},
})
export default
@injectIntl
@connect(null, mapDispatchToProps)
class ShortcutsPage extends PureComponent {
static propTypes = {
intl: PropTypes.object.isRequired,
onOpenEditShortcutsModal: PropTypes.func.isRequired,
}
handleOnOpenEditShortcutsModal = () => {
this.props.onOpenEditShortcutsModal()
this.props.dispatch(openModal(MODAL_EDIT_SHORTCUTS))
}
render() {
@ -59,4 +41,16 @@ class ShortcutsPage extends PureComponent {
</DefaultLayout>
)
}
}
}
const messages = defineMessages({
shortcuts: { id: 'shortcuts', defaultMessage: 'Shortcuts' },
})
ShortcutsPage.propTypes = {
children: PropTypes.node.isRequired,
dispatch: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
}
export default injectIntl(connect()(ShortcutsPage))