Skip to content
Commits on Source (2)
......@@ -3,5 +3,6 @@ export default {
logout: jest.fn(),
isLoggedIn: jest.fn(),
setInitialScreen: jest.fn(),
onLogin: jest.fn()
onLogin: jest.fn(),
onSession: jest.fn()
}
\ No newline at end of file
import apiService from "./api.service";
// @flow
import FeedsService from "./feeds.service";
import sessionService from "./session.service";
// types
import type ActivityModel from "../../newsfeed/ActivityModel";
/**
* Boosted content service
*/
......@@ -24,7 +27,7 @@ class BoostedContentService {
/**
* Reload boosts list
*/
load = async() => {
load = async(): Promise<any> => {
await this.feedsService
.setLimit(12)
.setOffset(0)
......@@ -37,7 +40,7 @@ class BoostedContentService {
/**
* Fetch one boost
*/
fetch() {
fetch(): ?ActivityModel {
this.offset++;
if (this.offset >= this.boosts.length) {
......
import apiService from "./api.service";
import blockListService from "./block-list.service";
import { first } from "rxjs/operators";
import { BehaviorSubject } from "rxjs";
// @flow
import _ from 'lodash';
import apiService from "./api.service";
import sessionService from "./session.service";
import blockListService from "./block-list.service";
import GroupModel from "../../groups/GroupModel";
import UserModel from "../../channel/UserModel";
import BlogModel from "../../blogs/BlogModel";
import ActivityModel from "../../newsfeed/ActivityModel";
import stores from "../../../AppStores";
import { abort } from "../helpers/abortableFetch";
import entitiesStorage from "./sql/entities.storage";
import sessionService from "./session.service";
// types
import type { FeedRecordType } from "./feeds.service";
import type BaseModel from "../BaseModel";
const CACHE_TTL_MINUTES = 15;
......@@ -24,7 +24,7 @@ class EntitiesService {
/**
* @var {Map} entities
*/
entities: Map = new Map();
entities: Map<string, BaseModel> = new Map();
/**
* Contructor
......@@ -38,7 +38,7 @@ class EntitiesService {
* @param {string} urn
* @param {boolean} updateLast
*/
getFromCache(urn, updateLast = true) {
getFromCache(urn: string, updateLast: boolean = true): ?BaseModel {
const record = this.entities.get(urn)
if (record && updateLast) record.last = Date.now() / 1000;
return record ? record.entity : null;
......@@ -62,7 +62,7 @@ class EntitiesService {
* Delete an entity from the cache
* @param {string} urn
*/
deleteFromCache(urn) {
deleteFromCache(urn: string) {
this.entities.delete(urn);
entitiesStorage.remove(urn);
}
......@@ -73,13 +73,12 @@ class EntitiesService {
* @param {Mixed} abortTag
* @param {boolean} asActivities
*/
async getFromFeed(feed, abortTag, asActivities = false): Promise<EntityObservable[]> {
async getFromFeed(feed: Array<FeedRecordType>, abortTag: any, asActivities: boolean = false): Promise<Array<BaseModel>> {
if (!feed || !feed.length) {
return [];
}
const blockedGuids = blockListService.blocked;
let urnsToFetch = [];
const urnsToResync = [];
const entities = [];
......@@ -98,14 +97,14 @@ class EntitiesService {
}
}
// if we have urnstoFetch we try to load from the sql storage first
// if we have urnsToFetch we try to load from the sql storage first
if (urnsToFetch.length > 0) {
const localEntities = await entitiesStorage.readMany(urnsToFetch);
urnsToFetch = _.difference(urnsToFetch, localEntities.map(m => m.urn));
urnsToFetch = _.difference(urnsToFetch, localEntities.map((m: any): string => m.urn));
// we add to resync list
localEntities.forEach(e => {
urnsToResync.push(e.urn);
this.addEntity(e, false)
localEntities.forEach((entity: any) => {
urnsToResync.push(entity.urn);
this.addEntity(entity, false)
});
}
......@@ -146,7 +145,7 @@ class EntitiesService {
* @param {boolean} asActivities
* @return Object
*/
async single(urn: string, defaultEntity, asActivities = false): EntityObservable {
async single(urn: string, defaultEntity: BaseModel, asActivities: boolean = false): BaseModel {
if (!urn.startsWith('urn:')) { // not a urn, so treat as a guid
urn = `urn:activity:${urn}`; // and assume activity
}
......@@ -186,7 +185,7 @@ class EntitiesService {
* @param {boolean} asActivities
* @return []
*/
async fetch(urns: Array<string>, abortTag: any, asActivities = false): Promise<Array<Object>> {
async fetch(urns: Array<string>, abortTag: any, asActivities: boolean = false): Promise<Array<Object>> {
try {
const response: any = await apiService.get('api/v2/entities/', { urns, as_activities: asActivities ? 1 : 0}, abortTag);
......@@ -206,9 +205,8 @@ class EntitiesService {
* Add or resync an entity
* @param {Object} entity
* @param {boolean} store
* @return void
*/
addEntity(entity, store = true): void {
addEntity(entity: Object, store: boolean = true) {
this.cleanEntity(entity);
......@@ -225,13 +223,13 @@ class EntitiesService {
* Clean properties to save memory and storage space
* @param {Object} entity
*/
cleanEntity(entity) {
cleanEntity(entity: Object) {
if (entity['thumbs:up:user_guids']) {
entity['thumbs:up:user_guids'] = entity['thumbs:up:user_guids'].filter(guid => guid == sessionService.guid);
entity['thumbs:up:user_guids'] = entity['thumbs:up:user_guids'].filter((guid: string): boolean => guid == sessionService.guid);
}
if (entity['thumbs:down:user_guids']) {
entity['thumbs:down:user_guids'] = entity['thumbs:down:user_guids'].filter(guid => guid == sessionService.guid);
entity['thumbs:down:user_guids'] = entity['thumbs:down:user_guids'].filter((guid: string): boolean => guid == sessionService.guid);
}
}
......@@ -239,7 +237,7 @@ class EntitiesService {
* Map object to model
* @param {Object} entity
*/
mapToModel(entity) {
mapToModel(entity: Object): BaseModel {
switch (entity.type) {
case 'activity':
return ActivityModel.create(entity)
......
// @flow
import logService from './log.service';
import apiService from './api.service';
import { abort, isNetworkFail } from '../helpers/abortableFetch';
......@@ -7,8 +8,15 @@ import { showMessage } from 'react-native-flash-message';
import i18n from './i18n.service';
import connectivityService from './connectivity.service';
import Colors from '../../styles/Colors';
import { toJS } from 'mobx';
import boostedContentService from './boosted-content.service';
import BaseModel from '../BaseModel';
export type FeedRecordType = {
owner_guid: string,
timestamp: string,
urn: string,
entity?: Object
};
/**
* Feed store
......@@ -48,7 +56,7 @@ export default class FeedsService {
/**
* @var {Array}
*/
feed: Array = [];
feed: Array<FeedRecordType> = [];
/**
* @var {string}
......@@ -68,7 +76,7 @@ export default class FeedsService {
/**
* Get entities from the current page
*/
async getEntities() {
async getEntities(): Promise<Array<any>> {
const end = this.limit + this.offset;
if (this.paginated && end >= this.feed.length && !this.endReached) {
......@@ -83,7 +91,7 @@ export default class FeedsService {
const feedPage = this.feed.slice(this.offset, end);
const result = await entitiesService.getFromFeed(feedPage, this, this.asActivities);
const result: Array<any> = await entitiesService.getFromFeed(feedPage, this, this.asActivities);
if (!this.injectBoost) return result;
......@@ -104,7 +112,7 @@ export default class FeedsService {
* @param {Array<ActivityModel>} entities
* @param {number} end
*/
injectBoosted(position, entities, end) {
injectBoosted(position: number, entities: Array<BaseModel>, end: number) {
if (this.offset <= position && end >= position) {
const boost = boostedContentService.fetch();
if (boost) entities.splice( position + this.offset, 0, boost );
......@@ -115,7 +123,7 @@ export default class FeedsService {
* Prepend entity
* @param {BaseModel} entity
*/
prepend(entity) {
prepend(entity: BaseModel) {
this.feed.unshift({
owner_guid: entity.owner_guid,
timestamp: Date.now().toString(),
......@@ -134,16 +142,16 @@ export default class FeedsService {
/**
* getter has More
*/
get hasMore() {
get hasMore(): boolean {
return this.feed.length > this.limit + this.offset;
}
/**
* Set feed
* @param {Array} feed
* @param {Array<FeedRecordType>} feed
* @returns {FeedsService}
*/
setFeed(feed): FeedsService {
setFeed(feed: Array<FeedRecordType>): FeedsService {
this.feed = feed;
return this;
}
......@@ -153,17 +161,17 @@ export default class FeedsService {
* @param {boolean} injectBoost
* @returns {FeedsService}
*/
setInjectBoost(injectBoost): FeedsService {
setInjectBoost(injectBoost: boolean): FeedsService {
this.injectBoost = injectBoost;
return this;
}
/**
* Set limit
* @param {integer} limit
* @param {number} limit
* @returns {FeedsService}
*/
setLimit(limit): FeedsService {
setLimit(limit: number): FeedsService {
this.limit = limit;
return this;
}
......@@ -173,7 +181,7 @@ export default class FeedsService {
* @param {integer} offset
* @returns {FeedsService}
*/
setOffset(offset): FeedsService {
setOffset(offset: number): FeedsService {
this.offset = offset;
return this;
}
......@@ -192,7 +200,7 @@ export default class FeedsService {
* Set parameters
* @param {Object} params
*/
setParams(params): FeedsService {
setParams(params: Object): FeedsService {
this.params = params;
if (!params.sync) {
this.params.sync = 1;
......@@ -231,7 +239,7 @@ export default class FeedsService {
* Fetch
* @param {boolean} more
*/
async fetch(more = false) {
async fetch(more: boolean = false): Promise<void> {
abort(this);
const params = {...this.params, ...{ limit: 150, as_activities: this.asActivities ? 1 : 0 }};
......@@ -261,15 +269,16 @@ export default class FeedsService {
/**
* Fetch feed from local cache
* @returns {boolean} true if there is local data or false otherwise
*/
async fetchLocal() {
async fetchLocal(): Promise<boolean> {
try {
const feed = await feedsStorage.read(this);
if (feed) {
// support old format
if (Array.isArray(feed)) {
this.feed = feed;
this.pagingToken = this.feed[this.feed.length - 1].timestamp - 1;
this.pagingToken = (this.feed[this.feed.length - 1].timestamp - 1).toString();
} else {
this.feed = feed.feed;
this.pagingToken = feed.next;
......@@ -286,7 +295,7 @@ export default class FeedsService {
/**
* Fetch feed from local cache or from the remote endpoint if there is no cached data
*/
async fetchLocalOrRemote() {
async fetchLocalOrRemote(): Promise<void> {
const status = await this.fetchLocal();
try {
......@@ -305,7 +314,7 @@ export default class FeedsService {
/**
* Fetch from the remote endpoint and if it fails from local cache
*/
async fetchRemoteOrLocal() {
async fetchRemoteOrLocal(): Promise<void> {
try {
await this.fetch();
} catch (err) {
......@@ -336,7 +345,7 @@ export default class FeedsService {
/**
* Move offset to next page
*/
next(): FeedStore {
next(): FeedsService {
this.offset += this.limit;
return this;
}
......@@ -344,7 +353,7 @@ export default class FeedsService {
/**
* Clear the store
*/
clear(): FeedStore {
clear(): FeedsService {
this.offset = 0;
this.limit = 12;
this.pagingToken = '';
......