...
 
Commits (3)
......@@ -47,8 +47,6 @@ describe('Channel screen component', () => {
let store, screen, entities, channel, navigation, activityResponse, user;
featuresService.features['es-feeds'] = true;
beforeEach(() => {
let activityResponse = activitiesServiceFaker().load(1);
......
......@@ -44,7 +44,7 @@ export default class ChannelFeedStore {
constructor(guid) {
this.guid = guid;
this.buildStores();
this.feedStore = new FeedStore(true);
}
get esFeedfilter () {
......@@ -56,68 +56,11 @@ export default class ChannelFeedStore {
}
}
buildStores() {
// TODO: remove this when es-feeds is in production
this.stores = {
feed: {
list: new OffsetFeedListStore('shallow', true),
},
images: {
list: new OffsetFeedListStore('shallow'),
isTiled: true,
},
videos: {
list: new OffsetFeedListStore('shallow'),
isTiled: true,
},
blogs: {
list: new OffsetFeedListStore('shallow'),
isTiled: false,
},
};
extendObservable(this.stores.feed,{
loading: false
});
extendObservable(this.stores.images,{
loading: false
});
extendObservable(this.stores.videos,{
loading: false
});
extendObservable(this.stores.blogs,{
loading: false
});
if (featuresService.has('es-feeds')) {
this.feedStore = new FeedStore(true);
}
}
@action
setChannel(channel) {
this.channel = channel;
}
get store() {
return this.stores[this.filter]
}
get list() {
return this.stores[this.filter].list;
}
set list(value) {
this.stores[this.filter] = value;
}
get loading() {
return this.stores[this.filter].loading;
}
get isTiled() {
return this.stores[this.filter].isTiled;
}
/**
* Set channel guid
* @param {string} guid
......@@ -143,169 +86,17 @@ export default class ChannelFeedStore {
*/
async loadFeed(refresh = false) {
if (featuresService.has('es-feeds')) {
if (refresh) this.feedStore.clear();
this.feedStore.setEndpoint(`api/v2/feeds/container/${this.guid}/${this.esFeedfilter}`)
.setLimit(12)
.fetchRemoteOrLocal();
return;
}
if (this.list.cantLoadMore() || this.loading) {
return Promise.resolve();
}
switch (this.filter) {
case 'feed':
await this._loadFeed(refresh);
break;
case 'images':
await this._loadImagesFeed(refresh);
break;
case 'videos':
await this._loadVideosFeed(refresh);
break;
case 'blogs':
await this._loadBlogsFeed(refresh);
break;
}
}
/**
* Load channel feed
*/
async _loadFeed(refresh = false) {
// reference the store because it may change after the await
const store = this.store;
if (!this.channel || store.list.cantLoadMore()) {
return;
}
store.loading = true;
store.list.setErrorLoading(false);
try {
let opts = {
offset: store.list.offset,
limit: 12,
};
if (
this.channel.pinned_posts
&& this.channel.pinned_posts.length
&& !store.list.offset
) {
opts.pinned = this.channel.pinned_posts.join(',');
}
const feed = await channelService.getFeed(this.channel.guid, opts);
if (feed.entities.length > 0) {
feed.entities = ActivityModel.createMany(feed.entities);
this.assignRowKeys(feed);
}
this.list.setList(feed, refresh);
} catch (err) {
// ignore aborts
if (err.code === 'Abort') return;
store.list.setErrorLoading(true);
if (!isNetworkFail(err)) {
logService.exception('[ChannelFeedStore] _loadFeed', err);
}
} finally {
store.loading = false;
}
}
/**
* Load channel images feed
*/
async _loadImagesFeed(refresh = false) {
// reference the store because it may change after the await
const store = this.store;
store.loading = true;
store.list.setErrorLoading(false);
try {
const feed = await channelService.getImageFeed(this.guid, this.list.offset);
feed.entities = ActivityModel.createMany(feed.entities);
this.assignRowKeys(feed, store);
store.list.setList(feed, refresh);
} catch (err) {
// ignore aborts
if (err.code === 'Abort') return;
store.list.setErrorLoading(true);
if (!isNetworkFail(err)) {
logService.exception('[ChannelFeedStore] _loadImagesFeed', err);
}
} finally {
store.loading = false;
}
}
/**
* Load channel videos feed
*/
async _loadVideosFeed(refresh = false) {
// reference the store because it may change after the await
const store = this.store;
store.loading = true;
store.list.setErrorLoading(false);
try {
const feed = await channelService.getVideoFeed(this.guid, this.list.offset);
feed.entities = ActivityModel.createMany(feed.entities);
this.assignRowKeys(feed, store);
store.list.setList(feed, refresh);
} catch (err) {
// ignore aborts
if (err.code === 'Abort') return;
if (!isNetworkFail(err)) {
logService.exception('[ChannelFeedStore] _loadVideosFeed', err);
}
store.list.setErrorLoading(true);
} finally {
store.loading = false;
}
}
/**
* Load channel videos feed
*/
async _loadBlogsFeed(refresh) {
// reference the store because it may change after the await
const store = this.store;
if (refresh) this.feedStore.clear();
store.loading = true;
store.list.setErrorLoading(false);
this.feedStore.setEndpoint(`api/v2/feeds/container/${this.guid}/${this.esFeedfilter}`)
.setLimit(12)
.fetchRemoteOrLocal();
try {
const feed = await channelService.getBlogFeed(this.guid, this.list.offset);
if (store.list.offset) {
feed.entities.shift();
}
feed.entities = BlogModel.createMany(feed.entities);
this.assignRowKeys(feed, store);
store.list.setList(feed, refresh);
} catch (err) {
store.list.setErrorLoading(true);
if (!isNetworkFail(err)) {
logService.exception('[ChannelFeedStore] _loadBlogsFeed', err);
}
} finally {
store.loading = false;
}
return;
}
@action
clearFeed() {
this.list.clearList();
this.isTiled = false;
this.filter = 'feed';
this.showrewards = false;
this.feedStore.clear();
......@@ -318,33 +109,22 @@ export default class ChannelFeedStore {
return;
}
if (featuresService.has('es-feeds')) {
this.feedStore.clear();
this.feedStore.setEndpoint(`api/v2/feeds/container/${this.guid}/${this.esFeedfilter}`)
.setLimit(12)
.fetchRemoteOrLocal();
this.feedStore.clear();
this.feedStore.setEndpoint(`api/v2/feeds/container/${this.guid}/${this.esFeedfilter}`)
.setLimit(12)
.fetchRemoteOrLocal();
return;
}
return;
// reference because it could change after the await
const list = this.list;
//this.list.refresh();
list.clearList();
await this.loadFeed(true);
list.refreshDone();
}
@action
setFilter(filter) {
this.filter = filter;
if (featuresService.has('es-feeds')) {
this.feedStore.setEndpoint(`api/v2/feeds/container/${this.guid}/${this.esFeedfilter}`)
.setIsTiled(filter === 'images' || filter === 'videos')
.clear()
.fetchRemoteOrLocal();
} else {
this.refresh();
}
this.feedStore.setEndpoint(`api/v2/feeds/container/${this.guid}/${this.esFeedfilter}`)
.setIsTiled(filter === 'images' || filter === 'videos')
.clear()
.fetchRemoteOrLocal();
}
}
......@@ -22,7 +22,6 @@ import { Icon } from 'react-native-elements'
import RewardsCarousel from './carousel/RewardsCarousel';
import ChannelHeader from './header/ChannelHeader';
import Toolbar from './toolbar/Toolbar';
import NewsfeedList from '../newsfeed/NewsfeedList';
import CenteredLoading from '../common/components/CenteredLoading';
import Button from '../common/components/Button';
import colors from '../styles/Colors';
......@@ -259,26 +258,18 @@ export default class ChannelScreen extends Component {
const emptyRender = () => <View />;
const list = featuresService.has('es-feeds') ?
<FeedList
feedStore={feed.feedStore}
renderActivity={renderActivity}
header={header}
navigation={this.props.navigation}
emptyMessage={emptyMessage}
/> :
<NewsfeedList
newsfeed={feed}
renderActivity={renderActivity}
header={header}
navigation={this.props.navigation}
emptyMessage={emptyMessage}
/>;
return (
<View style={CommonStyle.flexContainer}>
{!channel.blocked && list}
{!channel.blocked &&
<FeedList
feedStore={feed.feedStore}
renderActivity={renderActivity}
header={header}
navigation={this.props.navigation}
emptyMessage={emptyMessage}
/>}
{/* Not using FlatList breaks header layout */}
{channel.blocked && <FlatList
......
......@@ -33,7 +33,6 @@ import CaptureFab from '../capture/CaptureFab';
import GroupHeader from './header/GroupHeader';
import { CommonStyle as CS } from '../styles/Common';
import CommentList from '../comments/CommentList';
import NewsfeedList from '../newsfeed/NewsfeedList';
import CenteredLoading from '../common/components/CenteredLoading';
import commentsStoreProvider from '../comments/CommentsStoreProvider';
import i18n from '../common/services/i18n.service';
......@@ -170,25 +169,13 @@ export default class GroupViewScreen extends Component {
)
switch (group.tab) {
case 'feed':
if (featuresService.has('es-feeds')) {
return (
<FeedList
feedStore={ group.feed }
header={ header }
navigation={ this.props.navigation }
/>
);
} else {
return (
<NewsfeedList
newsfeed={ group }
guid={ group.group.guid }
header={ header }
navigation={ this.props.navigation }
/>
);
}
return (
<FeedList
feedStore={ group.feed }
header={ header }
navigation={ this.props.navigation }
/>
);
break;
case 'members':
return (
......
......@@ -96,56 +96,10 @@ class GroupViewStore {
* Load feed
*/
async loadFeed() {
if (featuresService.has('es-feeds')) {
this.feed
.setEndpoint(`api/v2/feeds/container/${this.group.guid}/activities`)
.setLimit(12)
.fetchRemoteOrLocal();
return;
}
if (this.list.cantLoadMore() || this.loading) {
return;
}
this.setLoading(true);
let pinned = null;
if (
this.group.pinned_posts
&& this.group.pinned_posts.length
&& !this.list.offset
) {
pinned = this.group.pinned_posts.join(',');
}
this.list.setErrorLoading(false);
try {
const data = await groupsService.loadFeed(this.guid, this.list.offset, pinned);
data.entities = ActivityModel.createMany(data.entities);
data.entities = data.entities.map(entity => {
if (!(this.group['is:moderator'] || this.group['is:owner'])) {
entity.dontPin = true;
}
return entity;
});
this.assignRowKeys(data);
this.list.setList(data);
} catch (err) {
// ignore aborts
if (err.code === 'Abort') return;
this.list.setErrorLoading(true);
if (!isNetworkFail(err)) {
logService.exception('[GroupsViewStore]', err);
}
} finally {
this.setLoading(false);
}
this.feed
.setEndpoint(`api/v2/feeds/container/${this.group.guid}/activities`)
.setLimit(12)
.fetchRemoteOrLocal();
}
/**
......
......@@ -75,11 +75,7 @@ export default class NewsfeedScreen extends Component {
}
async loadFeed() {
if (featuresService.has('es-feeds')) {
await this.props.newsfeed.feedStore.fetchLocalOrRemote();
} else {
await this.props.newsfeed.loadFeed();
}
await this.props.newsfeed.feedStore.fetchLocalOrRemote();
// load groups after the feed
await this.groupsBar.wrappedInstance.initialLoad();
......
......@@ -22,12 +22,10 @@ class NewsfeedStore {
*/
listRef;
// legacy
stores;
service = new NewsfeedService;
@observable filter = 'subscribed';
@observable loading = false;
@observable.ref boosts = [];
......@@ -61,101 +59,64 @@ class NewsfeedStore {
setListRef = (r) => this.listRef = r;
buildStores() {
this.stores = {
'subscribed': {
list: new OffsetFeedListStore('shallow', true),
},
'boostfeed': {
list: new OffsetFeedListStore('shallow', true),
},
};
extendObservable(this.stores.subscribed, {
loading: false
});
extendObservable(this.stores.boostfeed, {
loading: false
});
this.list = new OffsetFeedListStore('shallow', true);
this.feedStore.getMetadataService()
.setSource('feed/subscribed')
.setMedium('feed');
this.stores.subscribed.list.getMetadataService()
.setSource('feed/subscribed')
.setMedium('feed');
this.stores.boostfeed.list.getMetadataService()
this.list.getMetadataService()
.setSource('feed/boosts')
.setMedium('featured-content');
}
/**
* Load feed
* Load boost feed
*/
@action
async loadFeed(refresh = false) {
// reference the store because it may change after the await
const store = this.store;
const fetchFn = this.fetch;
let feed;
if (store.list.cantLoadMore() || store.loading) {
if (this.list.cantLoadMore() || this.loading) {
return Promise.resolve();
}
store.list.setErrorLoading(false);
this.list.setErrorLoading(false);
store.loading = true;
this.loading = true;
try {
feed = await fetchFn(store.list.offset, 12);
feed = await this.service.getBoosts(this.list.offset, 12);
feed.entities = ActivityModel.createMany(feed.entities);
this.assignRowKeys(feed, store);
store.list.setList(feed, refresh);
this.assignRowKeys(feed);
this.list.setList(feed, refresh);
this.loaded = true;
} catch (err) {
// ignore aborts
if (err.code === 'Abort') return;
store.list.setErrorLoading(true);
this.list.setErrorLoading(true);
if (!isNetworkFail(err)) {
logService.exception('[NewsfeedStore] loadFeed', err);
}
} finally {
store.loading = false;
this.loading = false;
}
}
/**
* Generate a unique Id for use with list views
* @param {object} feed
* @param {object} store
*/
assignRowKeys(feed, store) {
assignRowKeys(feed) {
feed.entities.forEach((entity, index) => {
entity.rowKey = `${entity.guid}:${index}:${store.list.entities.length}`;
entity.rowKey = `${entity.guid}:${index}:${this.list.entities.length}`;
});
}
get store() {
return this.stores[this.filter]
}
get list() {
return this.stores[this.filter].list;
}
get loading() {
return this.stores[this.filter].loading;
}
set loading(val) {
return this.stores[this.filter].loading = val;
}
/**
* Set filter
* @param {string} filter
......@@ -167,18 +128,6 @@ class NewsfeedStore {
this.loadFeed(true, false);
}
/**
* return service method based on filter
*/
get fetch() {
switch (this.filter) {
case 'subscribed':
return this.service.getFeed.bind(this.service);
case 'boostfeed':
return this.service.getBoosts.bind(this.service);
}
}
/**
* Load boosts
*/
......@@ -193,15 +142,9 @@ class NewsfeedStore {
}
prepend(entity) {
const model = ActivityModel.create(entity)
const model = ActivityModel.checkOrCreate(entity)
model.rowKey = `${model.guid}:0:${this.list.entities.length}`
if (featuresService.has('es-feeds')) {
this.feedStore.prepend(model);
} else {
this.list.prepend(model);
}
this.feedStore.prepend(model);
}
@action
......