Added LinkTimeline and PreviewCard fetching by id
• Added: - LinkTimeline and PreviewCard fetching by id
This commit is contained in:
108
app/javascript/gabsocial/features/link_timeline.js
Normal file
108
app/javascript/gabsocial/features/link_timeline.js
Normal file
@@ -0,0 +1,108 @@
|
||||
import React from 'react'
|
||||
import PropTypes from 'prop-types'
|
||||
import { connect } from 'react-redux'
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes'
|
||||
import ImmutablePureComponent from 'react-immutable-pure-component'
|
||||
import { FormattedMessage } from 'react-intl'
|
||||
import { connectLinkStream } from '../actions/streaming'
|
||||
import { expandLinkTimeline } from '../actions/timelines'
|
||||
import { fetchLinkCard } from '../actions/links'
|
||||
import { openModal } from '../actions/modal'
|
||||
import StatusList from '../components/status_list'
|
||||
import ColumnIndicator from '../components/column_indicator'
|
||||
import Button from '../components/button'
|
||||
import Text from '../components/text'
|
||||
|
||||
class LinkTimeline extends ImmutablePureComponent {
|
||||
|
||||
static contextTypes = {
|
||||
router: PropTypes.object,
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.handleConnect(this.props.params.id)
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
this.handleDisconnect()
|
||||
}
|
||||
|
||||
componentWillReceiveProps(nextProps) {
|
||||
if (nextProps.params.id !== this.props.params.id) {
|
||||
this.handleDisconnect()
|
||||
this.handleConnect(nextProps.params.id)
|
||||
}
|
||||
}
|
||||
|
||||
handleConnect(id) {
|
||||
const { dispatch } = this.props
|
||||
|
||||
dispatch(fetchLinkCard(id))
|
||||
dispatch(expandLinkTimeline(id))
|
||||
|
||||
this.disconnect = dispatch(connectLinkStream(id))
|
||||
}
|
||||
|
||||
handleDisconnect() {
|
||||
if (this.disconnect) {
|
||||
this.disconnect()
|
||||
this.disconnect = null
|
||||
}
|
||||
}
|
||||
|
||||
handleLoadMore = (maxId) => {
|
||||
const { id } = this.props.params
|
||||
this.props.dispatch(expandLinkTimeline(id, { maxId }))
|
||||
}
|
||||
|
||||
render() {
|
||||
const {
|
||||
link,
|
||||
items,
|
||||
isFetched,
|
||||
isLoading,
|
||||
} = this.props
|
||||
const { id } = this.props.params
|
||||
|
||||
if (typeof link === 'undefined' && isLoading) {
|
||||
return <ColumnIndicator type='loading' />
|
||||
} else if (!link) {
|
||||
return <ColumnIndicator type='missing' />
|
||||
}
|
||||
|
||||
const emptyMessage = (
|
||||
<div className={[_s.d, _s.py15, _s.px15, _s.aiCenter].join(' ')}>
|
||||
<Text>No statuses with this url yet.</Text>
|
||||
</div>
|
||||
)
|
||||
|
||||
return (
|
||||
<StatusList
|
||||
scrollKey='link_timeline'
|
||||
timelineId={`link:${id}`}
|
||||
onLoadMore={this.handleLoadMore}
|
||||
emptyMessage={emptyMessage}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const mapStateToProps = (state, props) => ({
|
||||
items: state.getIn(['links', 'items']),
|
||||
link: state.getIn(['links', 'items', `${props.params.id}`]),
|
||||
isFetched: state.getIn(['links', 'isFetched']),
|
||||
isLoading: state.getIn(['links', 'isLoading']),
|
||||
})
|
||||
|
||||
LinkTimeline.propTypes = {
|
||||
params: PropTypes.object.isRequired,
|
||||
dispatch: PropTypes.func.isRequired,
|
||||
link: PropTypes.oneOfType([
|
||||
ImmutablePropTypes.map,
|
||||
PropTypes.bool,
|
||||
]),
|
||||
intl: PropTypes.object.isRequired,
|
||||
}
|
||||
|
||||
export default connect(mapStateToProps)(LinkTimeline)
|
||||
@@ -44,6 +44,7 @@ import ProPage from '../../pages/pro_page'
|
||||
import ExplorePage from '../../pages/explore_page'
|
||||
import NewsPage from '../../pages/news_page'
|
||||
import AboutPage from '../../pages/about_page'
|
||||
import LinkPage from '../../pages/link_page'
|
||||
|
||||
import {
|
||||
About,
|
||||
@@ -77,6 +78,7 @@ import {
|
||||
HomeTimeline,
|
||||
Investors,
|
||||
LikedStatuses,
|
||||
LinkTimeline,
|
||||
ListCreate,
|
||||
ListsDirectory,
|
||||
ListEdit,
|
||||
@@ -213,6 +215,8 @@ class SwitchingArea extends React.PureComponent {
|
||||
<WrappedRoute path='/groups/:id' exact publicRoute page={GroupPage} component={GroupTimeline} content={children} componentParams={{ isTimeline: true }} />
|
||||
|
||||
<WrappedRoute path='/tags/:id' publicRoute page={HashtagPage} component={HashtagTimeline} content={children} componentParams={{ title: 'Hashtag' }} />
|
||||
|
||||
<WrappedRoute path='/links/:id' page={LinkPage} component={LinkTimeline} content={children} componentParams={{ title: 'Links' }} />
|
||||
|
||||
<WrappedRoute path='/shortcuts' page={ShortcutsPage} component={Shortcuts} content={children} />
|
||||
|
||||
|
||||
@@ -61,6 +61,7 @@ export function HotkeysModal() { return import(/* webpackChunkName: "components/
|
||||
export function Introduction() { return import(/* webpackChunkName: "features/introduction" */'../../introduction') }
|
||||
export function Investors() { return import(/* webpackChunkName: "features/about/investors" */'../../about/investors') }
|
||||
export function LinkFooter() { return import(/* webpackChunkName: "components/link_footer" */'../../../components/link_footer') }
|
||||
export function LinkTimeline() { return import(/* webpackChunkName: "features/link_timeline" */'../../link_timeline') }
|
||||
export function ListAddUserModal() { return import(/* webpackChunkName: "features/list_add_user_modal" */'../../../components/modal/list_add_user_modal') }
|
||||
export function ListCreate() { return import(/* webpackChunkName: "features/list_create" */'../../list_create') }
|
||||
export function ListCreateModal() { return import(/* webpackChunkName: "components/list_create_modal" */'../../../components/modal/list_create_modal') }
|
||||
|
||||
Reference in New Issue
Block a user