- import React from 'react';
- import { ScrollView, FlatList, Platform, Text, View, Dimensions, TouchableOpacity, Share } from 'react-native';
- import { SafeAreaView } from 'react-native-safe-area-context';
- import styles from '../styles/Collections';
- import drawerStyles from '../styles/DrawerMenu';
- import CustomIcons from '../components/CustomIcon';
- import CustomAlert from '../components/CustomAlert';
- import ActionSheet from '../components/ActionSheet';
- import EmptyScreen from '../components/EmptyScreen';
- import Chip from '../components/Chip';
- import { moderateScale } from '../utils/Scaling';
- import EStyleSheet from 'react-native-extended-stylesheet';
- import * as colProvider from '../utils/ColProvider';
- import * as apiProvider from '../utils/ApiProvider';
- import * as varProvider from '../utils/VarProvider';
- import * as analyticsProvider from '../utils/AnalyticsProvider';
- import * as setProvider from '../utils/SetProvider';
- import * as notProvider from '../utils/NotProvider';
- import screenNames from '../config/screenNames';
- import * as connection from '../utils/Connection';
- import config from '../config/config';
- import DrawerLayout from 'react-native-drawer-layout';
- import { translate } from '../locales/i18n';
- import Spinner from 'react-native-spinkit';
- import RNFetchBlob from 'rn-fetch-blob';
- import * as MD5 from '../utils/MD5';
- import humanize from 'tiny-human-time';
- import Toast from '@remobile/react-native-toast';
- import MVMyloftPDFViewerNativeModuleIos from '../components/MVMyloftPDFViewerNativeModule.ios';
- import ArticleLoader from '../components/ArticleLoader';
- // import ArticleListView from '../components/ArticleListView';
- import ArticleListNewView from '../components/ArticleList/index';
- import ArticleCardNewView from '../components/ArticleCard/index';
- import LinearGradient from 'react-native-linear-gradient';
- import ShareIntentModule from '../components/ShareIntentModule';
- import ShareActionSheet from '../components/ShareActionSheet';
- import AsyncStorage from '@react-native-async-storage/async-storage';
- import staticConfig from '../config/staticConfig';
- import imageJson from '../config/imageJson';
- import guideImageJson from '../config/guideImageJson';
- import GuideView from '../components/GuideView';
- import TagBottomSheet from '../components/TagBottomSheet';
- var asList, articleList, collectionList, filteredColList, tagList, imagePath, title, text, isLink, links;
- var cloneIt, cardWidth, numberOfCards, modalWidth, modalHeight, cardLeftWidth, closeFlag;
- var noMoreData, isFirstTime, alreadyLoaded, alreadySubscribed, isInfiniteOn, graphError;
- var pagingCount = config.articlePagingCount, screenWidth, isEditMode, drawerLockMode, startParentResponderTouch = true, startChildResponderTouch, modalObserver;
- //need for showing favorite articles in side menu
- var favoriteArticles = {
- "id": "favoriteArticles",
- "title": translate("FAVORITE_ARTICLES"),
- "description": "",
- "isDefault": false,
- "active": false
- };
- export default class Collections extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isCardView: varProvider.isCardView,
- modalVisible: false,
- articleList: [],
- articleLoading: true,
- articleLength: 0,
- footerLoading: false,
- errorLoading: false,
- deleteModal: false,
- asList: [],
- activeFilters: [],
- refreshCollection: false,
- loadHint: false,
- articleType: "",
- showGuide: false
- };
- graphError = "";
- isEditMode = false;
- drawerLockMode = "unlocked";
- collectionList = [];
- filteredColList = [];
- articleList = [];
- tagList = [];
- modalHeight = null;
- alreadyLoaded = true;
- isInfiniteOn = false;
- if (varProvider.selectedCollectionName == undefined) {
- varProvider.selectedCollectionName = "";
- }
- AsyncStorage.getItem("articleTimestamp").then((value) => {
- if (!value) {
- isFirstTime = true;
- }
- });
- //this function is here because it just creates array for action sheet
- this.initActionSheetList();
- this.openMenu = this.openMenu.bind(this);
- this.closeEditTitleModal = this.closeEditTitleModal.bind(this);
- this.closeDeleteArticleModal = this.closeDeleteArticleModal.bind(this);
- this.getEditTitleText = this.getEditTitleText.bind(this);
- this.onSaveEditTitle = this.onSaveEditTitle.bind(this);
- this.onDeleteArticle = this.onDeleteArticle.bind(this);
- this.onOpenWithExternalView = this.onOpenWithExternalView.bind(this);
- this.closeActionSheetModal = this.closeActionSheetModal.bind(this);
- this.hideActionSheetModal = this.hideActionSheetModal.bind(this);
- this.callbackFun = this.callbackFun.bind(this);
- this.openArticleView = this.openArticleView.bind(this);
- this.callbackAddTag = this.callbackAddTag.bind(this);
- this.callbackDeleteArticle = this.callbackDeleteArticle.bind(this);
- this.callbackRead = this.callbackRead.bind(this);
- this.buttonCallback = this.buttonCallback.bind(this);
- this.setDefaultCollection = this.setDefaultCollection.bind(this);
- this.closeAddCollectionModal = this.closeAddCollectionModal.bind(this);
- this.onSaveAddCollection = this.onSaveAddCollection.bind(this);
- this.getAddCollectionText = this.getAddCollectionText.bind(this);
- this.closeEditTitleCollectionModal = this.closeEditTitleCollectionModal.bind(this);
- this.getEditTitleCollectionText = this.getEditTitleCollectionText.bind(this);
- this.onSaveEditTitleCollection = this.onSaveEditTitleCollection.bind(this);
- this.closeDeleteCollectionModal = this.closeDeleteCollectionModal.bind(this);
- this.onDeleteCollection = this.onDeleteCollection.bind(this);
- this.closeEditMode = this.closeEditMode.bind(this);
- this.selectColAndLoadArticle = this.selectColAndLoadArticle.bind(this);
- this.startArticleSubscription = this.startArticleSubscription.bind(this);
- this.startCollectionSubscription = this.startCollectionSubscription.bind(this);
- this.favoriteArticle = this.favoriteArticle.bind(this);
- this.openModal = this.openModal.bind(this);
- this.initMaxHeight = this.initMaxHeight.bind(this);
- }
- static navigationOptions = () => {
- return {
- headerShown: false
- }
- }
- componentDidMount() {
- varProvider.currentScreen = screenNames.Collections;
- this.loadCollectionList();
- this.startCollectionSubscription();
- this.startArticleSubscription();
- this.initMaxHeight();
- Dimensions.addEventListener("change", this.initMaxHeight);
- setProvider.showGuide("isCollectionsGuideShown", screenNames.Collections).then((res) => {
- if (res) {
- this.setState({ showGuide: true });
- }
- })
- varProvider.connectionObserver.subscribe(() => {
- asList[1].isGrayedOut = connection.isConnectedFun() ? false : true
- this.setState({
- isConnected: connection.isConnectedFun(),
- asList: asList,
- });
- });
- modalObserver = varProvider.modalClosedObserver.subscribe((data) => {
- if (varProvider.currentScreen === screenNames.Collections && data.other) {
- if (this.state.actionSheetModal || this.state.sharedOpened || this.state.editTitleModal || this.state.deleteArticleModal || this.state.addCollectionModal || this.state.deleteCollectionModal || this.state.editTitleCollectionModal || this.state.showGuide) {
- this.setState({
- actionSheetModal: false,
- sharedOpened: false,
- editTitleModal: false,
- deleteArticleModal: false,
- addCollectionModal: false,
- deleteCollectionModal: false,
- editTitleCollectionModal: false,
- showGuide: false,
- });
- }
- if (varProvider.modalClosedObserver) {
- let resJson = {
- "home": true,
- "other": false,
- "screen": screenNames.Collections,
- }
- varProvider.modalClosedObserver.next(resJson);
- }
- }
- });
- this._unsubscribe = this.props.navigation.addListener('focus', () => {
- this.isFocused();
- });
- //this is used for showing and hiding collection hint
- AsyncStorage.getItem("isFirstTime").then((value) => {
- if (value != "false")
- this.setState({ loadHint: true })
- })
- }
- componentWillUnmount() {
- this._unsubscribe();
- modalObserver.unsubscribe();
- }
- isFocused() {
- const { params } = this.props.route;
- if (params) {
- var isSearchText = false;
- // [deep link] if collectionId is received from params, then set it as a selected collection to load articles of that collection
- if (params.collectionId) {
- varProvider.selectedCollectionId = params.collectionId;
- }
- // [deep link] if collectionId is "favoriteArticles", then load favorite articles
- if (varProvider.selectedCollectionId == "favoriteArticles") {
- varProvider.selectedCollectionName = favoriteArticles.title;
- favoriteArticles.active = true;
- }
- // [deep link] if searchText is received from params, then set it as a active filter and load article list accordingly
- if (params.searchText) {
- isSearchText = true;
- let originalSearchText = params.searchText;
- let trimmedSearchText = originalSearchText.trim();
- var filterJson = [
- {
- "active": false,
- "chipTitle": "",
- "value": "",
- "originalSearchText": ""
- },
- {
- "active": false,
- "chipTitle": "",
- "value": "",
- "originalSearchText": ""
- },
- {
- "active": false,
- "chipTitle": "",
- "value": "",
- "originalSearchText": ""
- },
- {
- "active": false,
- "chipTitle": "",
- "value": "",
- "originalSearchText": ""
- },
- {
- "active": false,
- "chipTitle": "",
- "value": "",
- "originalSearchText": ""
- },
- {
- "active": true,
- "chipTitle": 'Search text: "' + originalSearchText + '"',
- "value": trimmedSearchText,
- "originalSearchText": originalSearchText
- }
- ];
- this.setState({
- isFilter: true,
- activeFilters: filterJson
- });
- }
- params.contentType = "";
- params.searchText = "";
- }
- varProvider.currentScreen = screenNames.Collections;
- if (varProvider.isCollectionTabChanged) {
- varProvider.isCollectionTabChanged = false;
- if (varProvider.fromBroswerView) {
- for (var i = 0; i < collectionList.length; i++) {
- if (varProvider.selectedCollectionId == collectionList[i].id) {
- collectionList[i].active = true;
- }
- else {
- collectionList[i].active = false;
- }
- }
- varProvider.fromBroswerView = false;
- this.setState({ refreshCollection: !this.state.refreshCollection });
- }
- //don't call when component will mount called
- if (!alreadyLoaded) {
- // [deep link] get collection item based on received collectionId from params
- let activeCollectionItem;
- if (varProvider.selectedCollectionId == "favoriteArticles") {
- activeCollectionItem = favoriteArticles;
- } else {
- for (var i = 0; i < collectionList.length; i++) {
- if (collectionList[i].id == varProvider.selectedCollectionId) {
- activeCollectionItem = collectionList[i];
- break;
- }
- }
- }
- if (activeCollectionItem) {
- if (!isSearchText) {
- // [deep link] if searchText is not received than first disable all active filter
- var tempFilters = this.state.activeFilters;
- for (var i = 0; i < tempFilters.length; i++) {
- tempFilters[i].active = false;
- }
- }
- // [deep link] below method is for loading the article list of specific collection
- this.menuItemPress(activeCollectionItem);
- } else {
- if (!this.state.isFilter) {
- //no filters is applied, so reload the article list by updated timestamp from sqlite
- var lastArticleTimestamp;
- var artLength = articleList.length;
- if (artLength != 0) {
- lastArticleTimestamp = articleList[artLength - 1].createdAt;
- }
- var tempJson = {
- "limit": pagingCount,
- "offset": 0
- };
- if (artLength > pagingCount) {
- tempJson["lastTimestamp"] = lastArticleTimestamp;
- }
- this.loadSyncedSql(tempJson);
- //sync article list when switching between tabs
- if (!varProvider.isSyncInProgress) {
- colProvider.getSyncArticles(0);
- }
- } else {
- //TO DO: filter is applied
- }
- }
- }
- let screenViewJson = {
- "name": screenNames.Collections,
- "previous": varProvider.lastTabName
- };
- analyticsProvider.logAnalyticsJson("ScreenView", screenViewJson);
- varProvider.lastTabName = screenNames.Collections;
- }
- alreadyLoaded = false;
- }
- _handleOpenURL(event) {
- // console.log("collection handle open url");
- // console.log(event.url);
- //parse and check if url is welcome mail url or shared url
- //if welcome mail then navigate to screen with option to logout from current account and login to new account
- //if shared url then navigate to browser
- }
- initActionSheetList() {
- asList = [
- {
- title: translate("FILE_DOWNLOAD_OPEN"),
- icon: "icon_open_with",
- isVisible: true,
- isGrayedOut: false,
- onPressFun: this.onOpenWithExternalView.bind(this)
- },
- {
- title: translate("SHARE"),
- icon: Platform.OS == "ios" ? "icon_share_ios" : "icon_share",
- isVisible: true,
- isGrayedOut: false,
- onPressFun: this.shareArticle.bind(this)
- },
- {
- title: translate("ADD_TAGS"),
- icon: "icon_add_tag",
- isVisible: true,
- isGrayedOut: false,
- onPressFun: this.addTags.bind(this)
- },
- {
- title: translate("EDIT_TITLE"),
- icon: "icon_edit",
- isVisible: true,
- isGrayedOut: false,
- onPressFun: this.editTitleArticle.bind(this)
- },
- {
- title: translate("MOVE_TO_COLLECTION"),
- icon: "icon_move",
- isVisible: true,
- isGrayedOut: false,
- onPressFun: this.moveToCollection.bind(this)
- },
- {
- title: translate("DELETE"),
- icon: "icon_delete",
- isVisible: true,
- isGrayedOut: false,
- onPressFun: this.deleteArticle.bind(this)
- },
- {
- title: translate("MARK_AS") + translate("UNREAD"),
- icon: "icon_visible",
- isVisible: true,
- isGrayedOut: false,
- onPressFun: this.markAsRead.bind(this)
- },
- ]
- }
- //initially load the collection list from sqlite
- loadCollectionList() {
- colProvider.getCollectionSql().then((data) => {
- // console.log(data);
- this.processCollectionList(data);
- this.loadArticleList();
- });
- //whenever sync process will finish it will fetch collections from api
- //we will get the fetched data in subscribe section
- varProvider.collectionObservable.subscribe((data) => {
- // console.log("collection observable get data");
- // console.log(data)
- if (data.isSetColId) {
- if (data.data) {
- for (var j = 0; j < collectionList.length; j++) {
- if (collectionList[j].title === data.data.title) {
- collectionList[j].id = data.data.id
- break
- }
- }
- }
- }
- else {
- this.processCollectionList(data.data);
- }
- });
- }
- processCollectionList(data) {
- collectionList = [];
- var isActive;
- for (var i = 0; i < data.length; i++) {
- // [deep link] get collection name of selected collection and set it as active based on params
- if (varProvider.selectedCollectionId == data[i].id) {
- varProvider.selectedCollectionName = data[i].title;
- isActive = true;
- }
- isActive = (varProvider.selectedCollectionName == data[i].title);
- if (data[i].isDefault == 1 && data[i].title == "General Collection")
- isFirstTime = false;
- if (data[i].isDefault == 1) {
- varProvider.defaultCollectionId = data[i].id;
- varProvider.defaultCollectionName = data[i].title;
- varProvider.defaultCollectionType = data[i].type;
- if (!varProvider.selectedCollectionName && !varProvider.selectedCollectionId) {
- varProvider.selectedCollectionId = data[i].id;
- varProvider.selectedCollectionName = data[i].title;
- isActive = true;
- }
- AsyncStorage.multiSet([
- ["defaultCollectionId", varProvider.defaultCollectionId],
- ["defaultCollectionName", varProvider.defaultCollectionName],
- ["defaultCollectionType", varProvider.defaultCollectionType]
- ]);
- //collection marked as default should be on top so used unshift instead of push
- collectionList.unshift({
- "id": data[i].id,
- "title": data[i].title,
- "description": data[i].description,
- "isDefault": data[i].isDefault == 1 ? true : false,
- "type": data[i].type,
- "createdAt": data[i].createdAt,
- "updatedAt": data[i].updatedAt,
- "pressed": false,
- "active": isActive,
- });
- }
- else {
- collectionList.push({
- "id": data[i].id,
- "title": data[i].title,
- "description": data[i].description,
- "isDefault": data[i].isDefault == 1 ? true : false,
- "type": data[i].type,
- "createdAt": data[i].createdAt,
- "updatedAt": data[i].updatedAt,
- "pressed": false,
- "active": isActive,
- });
- }
- }
- // console.log(collectionList);
- filteredColList = collectionList;
- this.setState({ refreshCollection: !this.state.refreshCollection });
- }
- loadArticleList() {
- // console.log("load article list init");
- noMoreData = false;
- colProvider.getArticleList().then((data) => {
- // console.log(data);
- articleList = [];
- if (data.length != 0) {
- this.processArticleList(data, 0);
- }
- else {
- //no article in local db
- if (!isFirstTime) {
- this.setState({ refresh: !this.state.refresh, articleLoading: false, articleLength: articleList.length });
- }
- }
- // [deep link] if filter is active then again load the article list
- if (this.state.isFilter) {
- this.callbackFun(this.state.activeFilters);
- }
- });
- //subscribe to article observable if not subscribed
- if (!alreadySubscribed) {
- alreadySubscribed = true;
- //whenever article list gets fetched, here we get the response
- varProvider.articleObserver.subscribe((resJson) => {
- // console.log("article observable get data");
- // console.log(resJson);
- if (!resJson.error) {
- if (!resJson.isForHome) {
- if (resJson.alreadySynced) {
- if (!this.state.isFilter) {
- var lastArticleTimestamp;
- var artLength = articleList.length;
- if (artLength != 0) {
- lastArticleTimestamp = articleList[artLength - 1].createdAt;
- }
- var tempJson = {
- "limit": pagingCount,
- "offset": 0
- };
- if (artLength > pagingCount) {
- tempJson["lastTimestamp"] = lastArticleTimestamp;
- }
- this.loadSyncedSql(tempJson);
- } else {
- //TO DO: filter is applied
- }
- } else {
- var tempJson = {
- "limit": pagingCount,
- "offset": 0
- };
- articleList = [];
- this.loadSqlArticle(tempJson);
- }
- }
- } else {
- // console.log("article observable error else");
- this.setState({ refresh: !this.state.refresh, articleLoading: false, articleLength: articleList.length });
- }
- },
- () => {
- // console.log("article observable error");
- this.setState({ refresh: !this.state.refresh, articleLoading: false, articleLength: articleList.length });
- }
- );
- }
- }
- processArticleList(data, articleCount) {
- for (var i = 0; i < data.length; i++) {
- var tagList = [];
- if (data[i]["tagList"]) {
- tagList = data[i]["tagList"].split("*");
- }
- tagList.sort(colProvider.SortByNameArray);
- var currentTimestamp = new Date();
- var articleTimestamp = new Date(data[i].createdAt);
- var timeAgo = humanize(currentTimestamp, articleTimestamp);
- var articleType = data[i].type;
- var phImage = colProvider.getPlaceholderImage(articleType);
- var phImageBig = articleType == "HTML" && colProvider.getPlaceholderImageBig(articleType);
- var bgColor = colProvider.getArticleBg(articleType);
- articleList.push({
- "id": data[i].id,
- "title": data[i].title,
- "url": data[i].url,
- "timeAgo": timeAgo.time + translate(staticConfig[timeAgo.timeUnit]),
- "imageURL": data[i].imageURL,
- "image": phImage,
- "cardImage": phImageBig,
- "collectionName": data[i].collectionName,
- "collectionId": data[i].collectionId,
- "collectionType": data[i].collectionType,
- "type": articleType,
- "hostname": colProvider.getHostname(data[i].url),
- "highlightData": [],
- "tagList": tagList,
- "isReadable": data[i].isReadable == 1 ? true : false,
- "viaTemplate": data[i].viaTemplate == 1 ? true : false,
- "isImageAvailable": data[i].isImageAvailable == 1 ? true : false,
- "isFavorite": data[i].isFavorite == 1 ? true : false,
- "readStatus": data[i].readStatus == 1 ? true : false,
- "isImageFailed": data[i].isImageFailed == 1 ? true : false,
- "isDataFailed": data[i].isDataFailed == 1 ? true : false,
- "createdAt": data[i].createdAt,
- "updatedAt": data[i].updatedAt,
- "bgColor": bgColor,
- "contentURL": data[i].contentURL,
- "isPushed": data[i].isPushed == 1 ? true : false,
- "pushType": data[i].pushType
- });
- if (articleList[articleCount].isImageAvailable && !articleList[articleCount].isImageFailed) {
- this.loadArticleImage(articleList[articleCount]);
- }
- if (articleList[articleCount].type == "PDF") {
- this.loadPDFFileStatus(articleList[articleCount]);
- }
- articleCount++;
- }
- // console.log(articleList);
- this.setState({ refresh: !this.state.refresh, articleLoading: false, footerLoading: false, articleLength: articleList.length });
- }
- //to fetch the article list from sqlite
- loadSyncedSql(tempJson) {
- colProvider.getArticleSql(tempJson).then((data) => {
- // console.log(data);
- if (data.length < pagingCount) {
- noMoreData = true;
- }
- if (data.length != 0) {
- var articleCount = 0;
- var tp = [];
- var artLength = articleList.length;
- var firstArticleTimestamp;
- var urlMD, shortPath;
- var loadedPDFId = [], loadedPDFStatus = [];
- for (var k = 0; k < articleList.length; k++) {
- if (articleList[k].isPDFAvailable) {
- loadedPDFId.push(articleList[k].id);
- loadedPDFStatus.push(articleList[k].isPDFAvailable);
- }
- }
- if (artLength != 0) {
- firstArticleTimestamp = articleList[0].createdAt;
- }
- var currentArticleTimestamp, isImagePath;
- for (var i = 0; i < data.length; i++) {
- var tagList = [];
- if (data[i]["tagList"]) {
- tagList = data[i]["tagList"].split("*");
- }
- tagList.sort(colProvider.SortByNameArray);
- var currentTimestamp = new Date();
- var articleTimestamp = new Date(data[i].createdAt);
- var timeAgo = humanize(currentTimestamp, articleTimestamp);
- currentArticleTimestamp = data[i].createdAt;
- isImagePath = false;
- urlMD = MD5.MD5(data[i].url);
- shortPath = RNFetchBlob.fs.dirs.DocumentDir + "/" + urlMD + ".jpg";
- if (currentArticleTimestamp <= firstArticleTimestamp) {
- isImagePath = true;
- }
- var articleType = data[i].type;
- var isPDFAvailable = null;
- if (articleType == "PDF") {
- if (loadedPDFId.length != 0) {
- var pdfIndex = loadedPDFId.indexOf(data[i].id);
- if (pdfIndex != -1) {
- isPDFAvailable = loadedPDFStatus[pdfIndex];
- }
- }
- }
- var phImage;
- if (isImagePath && data[i].isImageAvailable == 1 && data[i].isImageFailed != 1) {
- phImage = "file://" + shortPath;
- } else {
- phImage = (isPDFAvailable == "false") ? colProvider.getPdfNAImage() : colProvider.getPlaceholderImage(articleType);
- }
- var phImageBig = articleType == "HTML" && colProvider.getPlaceholderImageBig(articleType);
- var bgColor = (isPDFAvailable == "false") ? colProvider.getPdfNABg() : colProvider.getArticleBg(articleType);
- tp.push({
- "id": data[i].id,
- "title": data[i].title,
- "url": data[i].url,
- "timeAgo": timeAgo.time + translate(staticConfig[timeAgo.timeUnit]),
- "imageURL": data[i].imageURL,
- "image": phImage,
- "cardImage": phImageBig,
- "collectionName": data[i].collectionName,
- "collectionId": data[i].collectionId,
- "collectionType": data[i].collectionType,
- "type": articleType,
- "hostname": colProvider.getHostname(data[i].url),
- "highlightData": [],
- "tagList": tagList,
- "isReadable": data[i].isReadable == 1 ? true : false,
- "viaTemplate": data[i].viaTemplate == 1 ? true : false,
- "isImageAvailable": data[i].isImageAvailable == 1 ? true : false,
- "isFavorite": data[i].isFavorite == 1 ? true : false,
- "readStatus": data[i].readStatus == 1 ? true : false,
- "isImageFailed": data[i].isImageFailed == 1 ? true : false,
- "isDataFailed": data[i].isDataFailed == 1 ? true : false,
- "isPDFAvailable": isPDFAvailable,
- "createdAt": data[i].createdAt,
- "updatedAt": data[i].updatedAt,
- "bgColor": bgColor,
- "contentURL": data[i].contentURL,
- "isPushed": data[i].isPushed == 1 ? true : false,
- "pushType": data[i].pushType
- });
- if (!isImagePath && tp[articleCount].isImageAvailable && !tp[articleCount].isImageFailed) {
- this.loadArticleImage(tp[articleCount]);
- }
- if (tp[articleCount].type == "PDF" && !isPDFAvailable) {
- this.loadPDFFileStatus(tp[articleCount]);
- }
- articleCount++;
- }
- articleList = tp;
- // console.log(articleList);
- this.setState({ refresh: !this.state.refresh, articleLoading: false, footerLoading: false, articleLength: articleList.length });
- } else {
- articleList = [];
- this.setState({ refresh: !this.state.refresh, articleLoading: false, footerLoading: false, articleLength: articleList.length });
- }
- });
- }
- async loadPDFFileStatus(articleItem) {
- var isExist = await colProvider.checkIfPDFFileAvailable(articleItem);
- var isExistStr = isExist.toString();
- articleItem.isPDFAvailable = isExistStr;
- if (articleItem.isPDFAvailable == "false") {
- articleItem.bgColor = colProvider.getPdfNABg();
- articleItem.image = colProvider.getPdfNAImage();
- }
- this.setState({
- refresh: !this.state.refresh
- });
- }
- //load the article image from file storage
- loadArticleImage(articleItem, failureCount) {
- var urlMD = MD5.MD5(articleItem.url);
- var path = RNFetchBlob.fs.dirs.DocumentDir + "/" + urlMD + ".jpg";
- RNFetchBlob.fs.exists(path).then((exist) => {
- if (exist) {
- for (var i = 0; i < articleList.length; i++) {
- if (articleList[i].id == articleItem.id) {
- articleList[i].image = "file://" + path;
- break;
- }
- }
- this.setState({ refresh: !this.state.refresh });
- }
- else {
- AsyncStorage.getItem("accountId").then((accountId) => {
- var path = accountId + "/" + urlMD + "/" + urlMD + ".jpg";
- if (articleItem.isPushed) {
- if (!failureCount) {
- failureCount = 3;
- }
- this.writeArticleImage(articleItem.imageURL, urlMD, articleItem, failureCount);
- }
- else {
- colProvider.getArticleImageGraph(path).then((data) => {
- if (!failureCount) {
- failureCount = 3;
- }
- this.writeArticleImage(data, urlMD, articleItem, failureCount);
- });
- }
- });
- }
- });
- }
- //download the article image to file storage
- writeArticleImage(data, urlMD, articleItem, failureCount) {
- var path = RNFetchBlob.fs.dirs.DocumentDir + "/" + urlMD + ".jpg";
- RNFetchBlob
- .config({
- fileCache: true,
- path: path
- })
- .fetch('GET', data, {
- })
- .then((res) => {
- if (res["respInfo"] && res["respInfo"]["headers"]) {
- var types = colProvider.findValueOfProperty(res["respInfo"]["headers"], "content-type");
- if (types.length != 0) {
- var ctype = types[0];
- if (res["respInfo"]["status"] == 200) {
- if (ctype.indexOf("xml") == -1 && ctype.indexOf("html") == -1) {
- // content type is neither 'xml' nor 'html', so save and set the image
- var aPath = "file://" + res.path();
- for (var i = 0; i < articleList.length; i++) {
- if (articleList[i].id == articleItem.id) {
- articleList[i].image = aPath;
- break;
- }
- }
- this.setState({ refresh: !this.state.refresh });
- } else {
- // content type is either 'xml' or 'html', so set imageFailed to true and remove the image file
- this.updateImageFailedArticle(articleItem, res.path(), failureCount);
- }
- } else if (res["respInfo"]["status"] == 404) {
- // image file not found on server
- this.updateImageFailedArticle(articleItem, res.path(), failureCount);
- } else {
- // some other status code, so remove the image file(it will be retried on next app launch or sync)
- RNFetchBlob.fs.unlink(res.path());
- }
- } else {
- //content type is application/xml
- this.updateImageFailedArticle(articleItem, res.path(), failureCount);
- }
- }
- })
- }
- updateImageFailedArticle(articleItem, filePath, failureCount) {
- if (failureCount <= 1) {
- var queryArg = "isImageFailed = 1";
- var queryData = [articleItem.id];
- colProvider.updateSingleArticleSql(queryArg, queryData);
- RNFetchBlob.fs.unlink(filePath);
- } else {
- failureCount--;
- RNFetchBlob.fs.unlink(filePath);
- setTimeout(() => {
- this.loadArticleImage(articleItem, failureCount);
- }, 3000);
- }
- }
- openSearch() {
- const { navigate } = this.props.navigation;
- navigate('Search', { screenName: "Collection" });
- }
- openMenu() {
- this.drawer.openDrawer();
- }
- //initialize all required values when switched between portrait and landscape
- initMaxHeight() {
- var sheight = Dimensions.get('window').height;
- var swidth = Dimensions.get('window').width;
- screenWidth = swidth;
- if (sheight < 480) {
- this.setState({ isMaxHeight: true });
- }
- else {
- this.setState({ isMaxHeight: false });
- }
- if (sheight < 480) {
- modalHeight = 250;
- }
- else {
- modalHeight = null;
- }
- if (swidth < 480) {
- numberOfCards = 1;
- cardWidth = swidth - 32;
- modalWidth = "100%";
- }
- else if (swidth < 920) {
- numberOfCards = 2;
- cardWidth = (swidth / 2) - 24;
- modalWidth = "70%";
- }
- else {
- numberOfCards = 3;
- cardWidth = (swidth / 3) - 22;
- modalWidth = "60%";
- }
- var tempCardWidth = cardWidth - moderateScale(94, 0.2);
- cardLeftWidth = tempCardWidth;
- this.setState({ refresh: !this.state.refresh });
- }
- //to switch between listview and cardview
- changeView() {
- var viewState = !this.state.isCardView;
- this.setState({ isCardView: viewState });
- AsyncStorage.setItem("isCardView", viewState.toString());
- // apiProvider.refreshToken();
- }
- //start local subscription of articles for remote subscription
- startArticleSubscription() {
- // colProvider.startArticleSubscriptionGraph().subscribe((resJson) => {
- varProvider.artSubObserver.subscribe((resJson) => {
- // console.log("article subscription");
- // console.log(resJson);
- if (!resJson.error) {
- var data = resJson.data;
- var subObject = data["data"]["articleSubscribe"];
- var articleNode = data["data"]["articleSubscribe"]["node"];
- var prevArticleNode = data["data"]["articleSubscribe"]["previousValues"];
- /*if (subObject.mutation == "UPDATED") {
- var updatedFields = subObject["updatedFields"];
- if (updatedFields && updatedFields.length != 0) {
- for (var i = 0; i < articleList.length; i++) {
- if (articleList[i].id == articleNode.id) {
- for (var j = 0; j < updatedFields.length; j++) {
- articleList[i][updatedFields[j]] = articleNode[updatedFields[j]];
- }
- }
- }
- } else {
- //collection and tags case
- var tagLength = articleNode["tags"].length;
- var inCollection = false;
- for (var i = 0; i < articleList.length; i++) {
- if (articleList[i].id == articleNode.id) {
- inCollection = true;
- //delete article if moved from collection
- if (articleList[i].collectionId != articleNode["collection"][0]["id"]) {
- articleList.splice(i, 1);
- break;
- }
- //update taglist of article
- var tagList = [];
- if (tagLength != 0) {
- var arrTag = articleNode["tags"];
- for (var m = 0; m < arrTag.length; m++) {
- tagList.push(arrTag[m].name);
- }
- articleList[i]["tagList"] = tagList;
- } else {
- articleList[i]["tagList"] = [];
- }
- }
- }
- //article not in current collection so insert article
- if (!inCollection) {
- //check if articles collection id has changed and updated to current collectionid
- var tempJson = {
- "id": articleNode.id
- };
- colProvider.getSingleArticleSql(tempJson).then((articleItem) => {
- // console.log(articleItem);
- if (articleItem[0].collectionId != articleNode["collection"][0]["id"]) {
- if (articleNode["collection"][0]["id"] == varProvider.selectedCollectionId) {
- var tagList = [];
- if (articleItem[0]["tagList"]) {
- tagList = articleItem[0]["tagList"].split("*");
- }
- var currentTimestamp = new Date();
- var articleTimestamp = new Date(articleItem[0].createdAt);
- var timeAgo = humanize(currentTimestamp, articleTimestamp);
- articleList.unshift({
- "id": articleItem[0].id,
- "title": articleItem[0].title,
- "url": articleItem[0].url,
- "timeAgo": timeAgo,
- "imageURL": articleItem[0].imageURL,
- "collectionName": articleItem[0].collectionName,
- "collectionId": articleItem[0].collectionId,
- "type": articleItem[0].type,
- "hostname": colProvider.getHostname(articleItem[0].url),
- "highlightData": [],
- "tagList": tagList,
- "isReadable": articleItem[0].isReadable == 1 ? true : false,
- "isImageAvailable": articleItem[0].isImageAvailable == 1 ? true : false,
- "isFavorite": articleItem[0].isFavorite == 1 ? true : false,
- "readStatus": articleItem[0].readStatus == 1 ? true : false,
- "createdAt": articleItem[0].createdAt,
- "updatedAt": articleItem[0].updatedAt
- });
- if (articleList[0].isImageAvailable) {
- this.loadArticleImage(articleList[0]);
- }
- }
- }
- });
- }
- }
- }*/
- if (subObject.mutation == "CREATED") {
- var alreadyAdded = false;
- for (var i = 0; i < articleList.length; i++) {
- if (articleList[i].url == articleNode.url) {
- alreadyAdded = true;
- break;
- }
- }
- // console.log("subscription already added: " + alreadyAdded);
- if (!alreadyAdded) {
- var tagList = [];
- if (articleNode["tags"].length != 0) {
- var arrTag = articleNode["tags"];
- for (var m = 0; m < arrTag.length; m++) {
- tagList.push(arrTag[m].name);
- }
- }
- tagList.sort(colProvider.SortByNameArray);
- var collectionName = "", collectionId = "", collectionType = "";
- if (articleNode["collection"].length != 0) {
- collectionId = articleNode["collection"][0]["id"];
- collectionName = articleNode["collection"][0]["title"];
- collectionType = articleNode["collection"][0]["type"];
- }
- if (varProvider.selectedCollectionId == collectionId) {
- var currentTimestamp = new Date();
- var articleTimestamp = new Date(articleNode.createdAt);
- var timeAgo = humanize(currentTimestamp, articleTimestamp);
- var articleType = articleNode.isPushed ? articleNode.refArticle.type : articleNode.type;
- var phImage = colProvider.getPlaceholderImage(articleType);
- var phImageBig = articleType == "HTML" && colProvider.getPlaceholderImageBig(articleType);
- var bgColor = colProvider.getArticleBg(articleType);
- articleList.unshift({
- "id": articleNode.id,
- "title": articleNode.isPushed ? articleNode.refArticle.title : articleNode.title,
- "url": articleNode.isPushed ? articleNode.refArticle.url : articleNode.url,
- "timeAgo": timeAgo.time + translate(staticConfig[timeAgo.timeUnit]),
- "imageURL": articleNode.isPushed ? articleNode.refArticle.imageURL : articleNode.imageURL,
- "image": phImage,
- "cardImage": phImageBig,
- "collectionName": collectionName,
- "collectionId": collectionId,
- "collectionType": collectionType,
- "type": articleType,
- "hostname": colProvider.getHostname(articleNode.url),
- "highlightData": [],
- "tagList": tagList,
- "isReadable": articleNode.isPushed ? articleNode.refArticle.isScraped : articleNode.isReadable,
- "viaTemplate": articleNode.viaTemplate,
- "isImageAvailable": articleNode.isPushed ? articleNode.refArticle.isImageAvailable : articleNode.isImageAvailable,
- "isFavorite": articleNode.isFavorite,
- "readStatus": articleNode.readStatus,
- "isImageFailed": false,
- "isDataFailed": false,
- "createdAt": new Date(articleNode.createdAt).getTime(),
- "updatedAt": new Date(articleNode.updatedAt).getTime(),
- "bgColor": bgColor,
- "contentURL": articleNode.isPushed ? articleNode.refArticle.contentURL : articleNode.contentURL,
- "isPushed": articleNode.isPushed,
- "pushType": articleNode.isPushed ? articleNode.refArticle.pushType : ""
- });
- if (articleList[0].isImageAvailable) {
- this.loadArticleImage(articleList[0]);
- }
- if (articleList[0].type == "PDF") {
- this.loadPDFFileStatus(articleList[0]);
- }
- }
- }
- } else if (subObject.mutation == "DELETED") {
- for (var i = 0; i < articleList.length; i++) {
- if (articleList[i].id == prevArticleNode.id) {
- articleList.splice(i, 1);
- if (articleList.length < pagingCount && !noMoreData) {
- setTimeout(() => {
- this.handleLoadMore({ distanceFromEnd: "NeedToFetch" });
- }, 1000);
- }
- break;
- }
- }
- }
- this.setState({ refresh: !this.state.refresh });
- }
- });
- }
- //start local subscription of collections for remote subscription
- startCollectionSubscription() {
- // colProvider.startCollectionSubscriptionGraph().subscribe((resJson) => {
- varProvider.colSubObserver.subscribe((resJson) => {
- // console.log("collection subscription");
- // console.log(resJson);
- if (!resJson.error) {
- var data = resJson.data;
- var subObject = data["data"]["collectionsSubscribe"];
- var collectionNode = data["data"]["collectionsSubscribe"]["node"];
- var prevCollectionNode = data["data"]["collectionsSubscribe"]["previousValues"];
- /*if (subObject.mutation == "UPDATED") {
- var updatedFields = subObject["updatedFields"];
- if (updatedFields && updatedFields.length != 0) {
- for (var i = 0; i < collectionList.length; i++) {
- if (collectionList[i].id == collectionNode.id) {
- for (var j = 0; j < updatedFields.length; j++) {
- //update collection item according to updated field
- collectionList[i][updatedFields[j]] = collectionNode[updatedFields[j]];
- //if collection title has changed, update in article list
- //if same collection is selected, update that title also
- if (updatedFields[j] == "title") {
- if (varProvider.selectedCollectionName == prevCollectionNode["title"]) {
- varProvider.selectedCollectionName = collectionNode["title"];
- for (var m = 0; m < articleList.length; m++) {
- if (articleList[m].collectionName == prevCollectionNode["title"]) {
- articleList[m].collectionName = collectionNode["title"];
- }
- }
- }
- }
- //if collection's isDefault has changed, update default collection id and default collection
- //title in asyncstorage and global variable
- //set all other collection's isDefault to false
- else if (updatedFields[j] == "isDefault") {
- varProvider.defaultCollectionId = collectionNode.id;
- varProvider.defaultCollectionName = collectionNode.title;
- AsyncStorage.setItem("defaultCollectionId", varProvider.defaultCollectionId);
- AsyncStorage.setItem("defaultCollectionName", varProvider.defaultCollectionName);
- for (var t = 0; t < collectionList.length; t++) {
- if (collectionList[t].id != collectionNode.id) {
- collectionList[t].isDefault = false;
- }
- }
- }
- }
- }
- }
- }
- }*/
- if (subObject.mutation == "CREATED") {
- var alreadyAdded = false;
- for (var i = 0; i < collectionList.length; i++) {
- if (collectionList[i].title == collectionNode.title) {
- alreadyAdded = true;
- break;
- }
- }
- if (!alreadyAdded) {
- var tempColList = JSON.parse(JSON.stringify(collectionList));
- tempColList.splice(0, 1);
- var toInsertIndex = colProvider.getSortedIndex(tempColList, collectionNode.title, "title");
- collectionList.splice(toInsertIndex + 1, 0, {
- "id": collectionNode.id,
- "title": collectionNode.title,
- "description": collectionNode.description,
- "isDefault": collectionNode.isDefault,
- "createdAt": collectionNode.createdAt,
- "updatedAt": collectionNode.updatedAt,
- "pressed": false,
- "active": false
- });
- }
- } else if (subObject.mutation == "DELETED") {
- var index, colIdToDelete;
- for (var i = 0; i < collectionList.length; i++) {
- if (collectionList[i].id == prevCollectionNode.id) {
- colIdToDelete = collectionList[i].id;
- collectionList.splice(i, 1);
- index = i;
- break;
- }
- }
- if (varProvider.selectedCollectionId == colIdToDelete) {
- if (index) {
- if (index == 0) {
- //select collection and load its article
- this.selectColAndLoadArticle(index);
- } else {
- //select collection i-1 and load its articles
- this.selectColAndLoadArticle(index - 1);
- }
- }
- }
- }
- this.setState({ refreshCollection: !this.state.refreshCollection, refresh: !this.state.refresh });
- }
- });
- }
- buttonCallback() {
- this.callbackFun(this.state.activeFilters);
- }
- //if filter is applied
- callbackFun(activeFilters) {
- // console.log(activeFilters);
- graphError = "";
- this.setState({ activeFilters: activeFilters, articleLoading: true, errorLoading: false, articleLength: 0 });
- var isFilter = false;
- var appliedFilter = [];
- for (var i = 0; i < activeFilters.length; i++) {
- if (activeFilters[i].active) {
- isFilter = true;
- var topKey, bottomKey, dataKey, dataValue, sqlKey, sqlValue;
- //filter by days
- if (i == 0) {
- let minimumDate = activeFilters[0].value[0];
- let maximumDate = activeFilters[0].value[1];
- topKey = "$createdAt_gte: DateTime, $createdAt_lte: DateTime";
- bottomKey = "createdAt_gte: $createdAt_gte, createdAt_lte: $createdAt_lte";
- dataKey = "dateRange";
- dataValue = [minimumDate, maximumDate];
- sqlKey = "al.createdAt >= ? AND al.createdAt <= ?";
- sqlValue = [new Date(minimumDate).getTime(), new Date(maximumDate).getTime()];
- }
- //filter favorite
- if (i == 3) {
- topKey = "$isFavorite: Boolean";
- bottomKey = "isFavorite: $isFavorite";
- dataKey = "isFavorite";
- dataValue = true;
- sqlKey = "al.isFavorite = ?";
- sqlValue = 1;
- }
- //filter by tag
- if (i == 4) {
- topKey = "$tagName: [String!]";
- bottomKey = "tags_some: { name_in: $tagName }";
- dataKey = "tagName";
- dataValue = activeFilters[4].value;
- sqlKey = "tl.title = ?";
- sqlValue = activeFilters[4].value;
- }
- //filter by search text
- if (i == 5) {
- topKey = "$searchText: String";
- bottomKey = "title_contains: $searchText ";
- dataKey = "searchText";
- dataValue = activeFilters[5].value;
- sqlKey = "al.title LIKE ?";
- sqlValue = "%" + activeFilters[5].value + "%";
- }
- if (i == 1 || i == 2) {
- } else {
- appliedFilter.push({
- "topKey": topKey,
- "bottomKey": bottomKey,
- "dataKey": dataKey,
- "dataValue": dataValue,
- "sqlKey": sqlKey,
- "sqlValue": sqlValue
- });
- }
- }
- }
- var typeFilter;
- if (activeFilters[1].active) {
- typeFilter = "HTML";
- }
- if (activeFilters[2].active) {
- typeFilter = "PDF";
- }
- if (activeFilters[1].active && activeFilters[2].active) {
- typeFilter = "";
- }
- if (!activeFilters[1].active && !activeFilters[2].active) {
- typeFilter = "";
- }
- if (typeFilter) {
- appliedFilter.push({
- "topKey": "$type: ArticleType",
- "bottomKey": "type: $type",
- "dataKey": "type",
- "dataValue": typeFilter,
- "sqlKey": "al.type = ?",
- "sqlValue": typeFilter
- });
- }
- if (appliedFilter.length == 0) {
- this.setState({
- "isFilter": false,
- appliedFilter: appliedFilter
- });
- } else {
- this.setState({
- "isFilter": true,
- appliedFilter: appliedFilter
- });
- }
- //load favorite articles if favorite articles is selected
- //and add search filter if already applied
- if (varProvider.selectedCollectionId == "favoriteArticles") {
- var filLength = appliedFilter.length;
- var searchText = (filLength == 0) ? "" : appliedFilter[0].sqlValue;
- var tempJson = {
- "isFilter": (filLength != 0),
- "offset": 0,
- "searchText": searchText
- };
- articleList = [];
- noMoreData = false;
- //sql query to filter favorite article list
- this.loadFavoriteArticles(tempJson);
- } else {
- //if internet is connected load article list from api
- //else load article list from sqlite
- if (connection.isConnectedFun()) {
- if (appliedFilter.length != 0) {
- var tempJson = {
- "isFilter": isFilter,
- "appliedFilter": appliedFilter,
- "first": pagingCount,
- "skip": 0
- };
- articleList = [];
- noMoreData = false;
- //graphql query to filter article list
- this.loadGraphArticle(tempJson);
- } else {
- isFirstTime = false;
- this.loadArticleList();
- }
- } else {
- if (appliedFilter.length != 0) {
- var tempJson = {
- "isFilter": isFilter,
- "appliedFilter": appliedFilter,
- "limit": pagingCount,
- "offset": 0
- };
- articleList = [];
- noMoreData = false;
- //sql query to filter article list
- this.loadSqlArticle(tempJson);
- }
- else {
- isFirstTime = false;
- this.loadArticleList();
- }
- }
- }
- }
- //load article list from api
- loadGraphArticle(tempJson) {
- colProvider.getArticleListGraph(tempJson).then((data) => {
- // console.log("load graph article data");
- // console.log(data);
- if (data.length < pagingCount) {
- noMoreData = true;
- }
- if (data.length != 0) {
- var articleCount = articleList.length;
- for (var i = 0; i < data.length; i++) {
- var tagList = [];
- if (data[i]["tags"].length != 0) {
- var arrTag = data[i]["tags"];
- for (var m = 0; m < arrTag.length; m++) {
- tagList.push(arrTag[m].name);
- }
- }
- tagList.sort(colProvider.SortByNameArray);
- var collectionName = "", collectionId = "", collectionType = "";
- if (data[i]["collection"].length != 0) {
- collectionId = data[i]["collection"][0]["id"];
- collectionName = data[i]["collection"][0]["title"];
- collectionType = data[i]["collection"][0]["type"];
- }
- var currentTimestamp = new Date();
- var articleTimestamp = new Date(data[i].createdAt);
- var timeAgo = humanize(currentTimestamp, articleTimestamp);
- var articleType = data[i].isPushed ? data[i].refArticle.type : data[i].type;
- var phImage = colProvider.getPlaceholderImage(articleType);
- var phImageBig = articleType == "HTML" && colProvider.getPlaceholderImageBig(articleType);
- var bgColor = colProvider.getArticleBg(articleType);
- articleList.push({
- "id": data[i].id,
- "title": data[i].isPushed ? data[i].refArticle.title : data[i].title,
- "url": data[i].isPushed ? data[i].refArticle.url : data[i].url,
- "timeAgo": timeAgo.time + translate(staticConfig[timeAgo.timeUnit]),
- "imageURL": data[i].isPushed ? data[i].refArticle.imageURL : data[i].imageURL,
- "image": phImage,
- "cardImage": phImageBig,
- "collectionName": collectionName,
- "collectionId": collectionId,
- "collectionType": collectionType,
- "type": articleType,
- "hostname": colProvider.getHostname(data[i].url),
- "highlightData": [],
- "tagList": tagList,
- "isReadable": data[i].isPushed ? data[i].refArticle.isScraped : data[i].isReadable,
- "viaTemplate": data[i].viaTemplate,
- "isImageAvailable": data[i].isPushed ? data[i].refArticle.isImageAvailable : data[i].isImageAvailable,
- "isFavorite": data[i].isFavorite,
- "readStatus": data[i].readStatus,
- "isImageFailed": false,
- "isDataFailed": false,
- "createdAt": new Date(data[i].createdAt).getTime(),
- "updatedAt": new Date(data[i].updatedAt).getTime(),
- "bgColor": bgColor,
- "contentURL": data[i].isPushed ? data[i].refArticle.contentURL : data[i].contentURL,
- "isPushed": data[i].isPushed,
- "pushType": data[i].isPushed ? data[i].refArticle.pushType : ""
- });
- if (articleList[articleCount].isImageAvailable && !articleList[articleCount].isImageFailed) {
- this.loadArticleImage(articleList[articleCount]);
- }
- if (articleList[articleCount].type == "PDF") {
- this.loadPDFFileStatus(articleList[articleCount]);
- }
- articleCount++;
- }
- this.setState({ refresh: !this.state.refresh, articleLoading: false, footerLoading: false, articleLength: articleList.length });
- } else {
- this.setState({ refresh: !this.state.refresh, articleLoading: false, footerLoading: false, articleLength: articleList.length });
- }
- setTimeout(() => {
- isInfiniteOn = false;
- }, 400);
- }).catch((error) => {
- // console.log(error);
- connection.getGraphError(error.error).then((data) => {
- graphError = data;
- this.setState({ refresh: !this.state.refresh, articleLoading: false, footerLoading: false, errorLoading: true, articleLength: articleList.length });
- })
- isInfiniteOn = false;
- });
- }
- //load article list from sqlite
- loadSqlArticle(tempJson) {
- colProvider.getArticleSql(tempJson).then((data) => {
- // console.log(data);
- if (data.length < pagingCount) {
- noMoreData = true;
- }
- if (data.length != 0) {
- var articleCount = articleList.length;
- this.processArticleList(data, articleCount);
- } else {
- this.setState({ refresh: !this.state.refresh, articleLoading: false, footerLoading: false, articleLength: articleList.length });
- }
- isInfiniteOn = false;
- });
- }
- openFilters() {
- const { navigate } = this.props.navigation;
- navigate('ColFilters', { "callbackFun": this.callbackFun, "activeFilters": this.state.activeFilters });
- }
- // to handle scroll pagination to load more articles
- handleLoadMore = (calledFrom) => {
- if (articleList.length > pagingCount - 1 || calledFrom.distanceFromEnd == "NeedToFetch") {
- var tempOffset = articleList.length;
- if (!noMoreData) {
- if (!isInfiniteOn) {
- this.setState({ footerLoading: true });
- isInfiniteOn = true;
- //load favorite articles if favorite articles is selected
- //and add search filter if already applied
- if (varProvider.selectedCollectionId == "favoriteArticles") {
- if (this.state.isFilter) {
- var filLength = this.state.appliedFilter.length;
- var searchText = (filLength == 0) ? "" : this.state.appliedFilter[0].sqlValue;
- var tempJson = {
- "isFilter": (filLength != 0),
- "offset": tempOffset,
- "searchText": searchText
- };
- } else {
- var tempJson = {
- "offset": tempOffset
- };
- }
- this.loadFavoriteArticles(tempJson);
- } else {
- if (this.state.isFilter && connection.isConnectedFun()) {
- //filter is applied
- var tempSkip = articleList.length;
- var tempJson = {
- "isFilter": this.state.isFilter,
- "appliedFilter": this.state.appliedFilter,
- "first": pagingCount,
- "skip": tempSkip
- };
- this.loadGraphArticle(tempJson);
- } else {
- //no filter
- var tempOffset = articleList.length;
- var tempJson = {
- "isFilter": this.state.isFilter,
- "appliedFilter": this.state.appliedFilter,
- "limit": pagingCount,
- "offset": tempOffset
- };
- this.loadSqlArticle(tempJson);
- }
- }
- }
- } else {
- // console.log("no more data else");
- }
- } else {
- noMoreData = true;
- }
- };
- renderFooter = () => {
- if (!this.state.footerLoading) return null;
- return (
- <View style={styles.loaderIndicator}>
- <Spinner style={styles.spinner} size={22} type="Circle" color={EStyleSheet.value("$spinner")} />
- </View>
- );
- };
- gotIt = () => {
- AsyncStorage.setItem("isFirstTime", "false");
- this.setState({ loadHint: false })
- }
- renderEmpty = () => {
- if (imagePath == undefined) {
- imagePath = imageJson.collection_empty;
- title = translate("ARTICLES_EMPTY1")
- text = ""
- links = [{ name: translate("ERESOURCES"), onPressFun: this.openEResources.bind(this) }, { name: translate("WEB"), onPressFun: this.openWeb.bind(this) }];
- isLink = true;
- }
- return (
- <View>
- {this.state.errorLoading ?
- <View>
- <EmptyScreen
- imagePath={graphError && graphError.success == undefined ? imageJson.httpError_img : imageJson.something_wrong_here}
- Title={graphError ? graphError.shortDesc : translate("TECHNICAL_EMPTY")}
- Text={graphError ? graphError.desc : translate("TECHNICAL_EMPTY_DATA1")}
- isButton={true}
- buttonText={translate("SU_EMPTY")}
- buttonCallback={this.buttonCallback}
- />
- </View>
- :
- this.state.isFilter ?
- <View>
- <EmptyScreen
- imagePath={imageJson.no_search_result}
- Title={translate("COL_FILTER_EMPTY")}
- Text={translate("COL_FILTER_EMPTY_DATA")}
- />
- </View>
- :
- <View>
- <EmptyScreen
- imagePath={imagePath}
- Title={title}
- Text={text}
- Links={links}
- isLink={isLink}
- />
- </View>
- }
- </View>
- );
- }
- renderHeader = () => {
- return (
- <View style={{ paddingBottom: 16 }}>
- {this.state.loadHint && varProvider.selectedCollectionName == varProvider.defaultCollectionName &&
- <View style={styles.hintContainer}>
- <View style={styles.hintToolTipContainer}>
- <CustomIcons style={styles.tipPinIcon} name="icon_checkmark_crl" />
- </View>
- <View style={styles.hintTextContainer}>
- <Text style={styles.hintText}>{translate("COLLECTON_TIP")}</Text>
- <TouchableOpacity onPress={this.gotIt}>
- <Text style={[styles.hintText, { color: EStyleSheet.value("$secondary") }]}>{"\n"}{translate("GOT_IT")}</Text>
- </TouchableOpacity>
- </View>
- </View>
- }
- </View>
- )
- }
- renderCollectionEmpty = () => {
- return (
- <View>
- </View>
- );
- }
- // open/export pdf function view
- onOpenWithExternalView() {
- closeFlag = "externalPdfOpen";
- this.closeActionSheetModal();
- }
- openArticleView(item) {
- cloneIt = item;
- const { navigate } = this.props.navigation;
- if (item.type == "PDF") {
- var urlMD = MD5.MD5(item.url);
- var path = RNFetchBlob.fs.dirs.DocumentDir + "/" + urlMD + ".pdf";
- RNFetchBlob.fs.exists(path).then((exist) => {
- if (exist) {
- if (Platform.OS == "android") {
- navigate("PdfView", { "article": item, "path": path, "isModal": true, "callbackAddTag": this.callbackAddTag, "callbackDeleteArticle": this.callbackDeleteArticle, "refScreen": screenNames.Collections });
- } else {
- // let aPDFpath = urlMD + ".pdf"
- var pdfObject = MVMyloftPDFViewerNativeModuleIos.openViewer(item.url, item.id);
- this.iosPdfEvent(pdfObject);
- }
- varProvider.currentScreen = screenNames.PDFView;
- this.logPdfScreenViewEvent(false);
- this.updateReadStatus(item);
- this.logArticleReadEvent(item);
- }
- else {
- Toast.showShortCenter(translate("PDF_NA"));
- }
- });
- } else {
- if (item.isReadable) {
- navigate('ArticleView', { "article": item, "callbackAddTag": this.callbackAddTag, "callbackDeleteArticle": this.callbackDeleteArticle, "callbackRead": this.callbackRead, "isModal": true, "refScreen": screenNames.Collections });
- }
- else {
- if (connection.isConnectedFun()) {
- navigate("BrowserView", { url: item.url, "refScreen": screenNames.Collections });
- this.updateReadStatus(item);
- }
- else {
- Toast.showShortCenter(translate("PLEASE_CONNECT"));
- }
- }
- }
- }
- logPdfScreenViewEvent(isNavigatingBack) {
- let screenViewJson = {
- "name": isNavigatingBack ? screenNames.Collections : screenNames.PDFView,
- "previous": isNavigatingBack ? screenNames.PDFView : screenNames.Collections
- };
- analyticsProvider.logAnalyticsJson("ScreenView", screenViewJson);
- }
- logArticleReadEvent(item) {
- let articleReadJson = {
- "name": item.title,
- "url": item.url,
- "type": item.type,
- "source": "Collections"
- };
- analyticsProvider.logAnalyticsJson("ArticleRead", articleReadJson);
- }
- iosPdfEvent(pdfObject) {
- const getAllTagSubscription = pdfObject.addListener(
- 'GetAllTags',
- () => {
- colProvider.getTagList().subscribe((data) => {
- MVMyloftPDFViewerNativeModuleIos.refreshAllTagList(data);
- });
- }
- );
- const getTagSubscription = pdfObject.addListener(
- 'GetTags',
- () => {
- MVMyloftPDFViewerNativeModuleIos.refreshTagList(cloneIt.tagList);
- }
- );
- const getHighlightSubscription = pdfObject.addListener(
- 'GetHighlights',
- () => {
- var tempList = {};
- tempList["articleId"] = cloneIt.id;
- colProvider.getArticleHighlightList(tempList).subscribe((data) => {
- var aNewData = [];
- for (var key in data) {
- let aData = data[key];
- aData.text = aData.highlightText;
- aData.rangyid = aData.rangyId;
- aData.createdAt = new Date(aData.createdAt).toISOString();
- aNewData.push(aData);
- }
- MVMyloftPDFViewerNativeModuleIos.refreshHighlightList(aNewData);
- });
- }
- );
- const addTagSubscription = pdfObject.addListener(
- 'AddTags',
- (addTagObject) => {
- this.addTagToPdf(addTagObject);
- }
- );
- const highlightAddSubscription = pdfObject.addListener(
- 'HighlightAdded',
- (highlightObject) => {
- this.addHighlightToPdf(highlightObject);
- this.logArticleHighlightEvent();
- }
- );
- const highlightDelSubscription = pdfObject.addListener(
- 'HighlightDeleted',
- (highlightObject) => {
- this.deleteHighlightFromPdf(highlightObject);
- }
- );
- const viewerDismissedSubscription = pdfObject.addListener(
- 'ViewerWillDismiss',
- () => {
- // console.log("ViewerWillDismiss Collection screen");
- // console.log(highlightObject);
- varProvider.isPDFOpen = false;
- getAllTagSubscription.remove();
- getTagSubscription.remove();
- getHighlightSubscription.remove();
- addTagSubscription.remove();
- highlightAddSubscription.remove();
- highlightDelSubscription.remove();
- viewerDismissedSubscription.remove();
- deletePDFSubscription.remove();
- this.logPdfScreenViewEvent(true);
- varProvider.currentScreen = screenNames.Collections;
- }
- );
- const deletePDFSubscription = pdfObject.addListener(
- 'DeletePDFArticle',
- () => {
- MVMyloftPDFViewerNativeModuleIos.closeViewer();
- setTimeout(() => {
- this.onDeleteArticle();
- }, 100)
- }
- );
- }
- logArticleHighlightEvent() {
- let articleHighlightJson = {
- "type": "PDF"
- };
- analyticsProvider.logAnalyticsJson("ArticleHighlight", articleHighlightJson)
- }
- addTagToPdf(addTagObject) {
- if (addTagObject && addTagObject["AddTags"]) {
- var tagNames = addTagObject["AddTags"]["tagNames"];
- var tagIds = addTagObject["AddTags"]["tags"];
- var articleTagNames = addTagObject["AddTags"]["articleTags"];
- var analyticsTags = [];
- if (cloneIt && cloneIt.tagList && cloneIt.tagList.length != 0) {
- var existingTags = cloneIt.tagList;
- for (var k = 0; k < articleTagNames.length; k++) {
- if (existingTags.indexOf(articleTagNames[k]) == -1) {
- analyticsTags.push(articleTagNames[k]);
- }
- }
- } else {
- analyticsTags = articleTagNames;
- }
- this.callbackAddTag(articleTagNames);
- if (tagNames.length != 0 || tagIds.length != 0) {
- var randomId = [];
- for (var i = 0; i < tagNames.length; i++) {
- randomId.push("");
- }
- var tempList = {};
- tempList["articleId"] = cloneIt.id;
- tempList["tagName"] = tagNames;
- tempList["tagId"] = tagIds;
- tempList["randomId"] = randomId;
- // console.log(tempList);
- colProvider.addArticleTags(tempList).subscribe(() => {
- });
- this.logTagSaveEvent(analyticsTags, "AddTags");
- }
- var deleteIds = addTagObject["AddTags"]["deletedTags"];
- if (deleteIds.length != 0) {
- var tempList1 = {};
- tempList1["articleId"] = cloneIt.id;
- tempList1["tagId"] = deleteIds;
- // console.log(tempList1);
- colProvider.deleteArticleTags(tempList1).subscribe(() => {
- });
- }
- }
- }
- logTagSaveEvent(name, source) {
- let tagSaveJson = {
- "name": name.toString(),
- "source": source
- }
- analyticsProvider.logAnalyticsJson("TagSave", tagSaveJson);
- }
- addHighlightToPdf(highlightObject) {
- if (highlightObject && highlightObject["HighlightAdded"]) {
- var hjson = highlightObject["HighlightAdded"];
- var jsonData = [];
- jsonData.push({
- "start": 0,
- "end": 0,
- "root": hjson["root"],
- "text": hjson["text"],
- "class": "myloft_highlight",
- "rangyid": hjson["rangyid"]
- });
- var highId = apiProvider.generateUUID();
- var randomId = [];
- randomId.push(highId);
- var tempList = {};
- tempList["articleId"] = cloneIt.id;
- tempList["highlightData"] = jsonData;
- tempList["randomId"] = randomId;
- colProvider.addArticleHighlight(tempList).subscribe((data) => {
- MVMyloftPDFViewerNativeModuleIos.refreshHighlightList(data);
- });
- }
- }
- deleteHighlightFromPdf(highlightObject) {
- if (highlightObject && highlightObject["HighlightDeleted"]) {
- var hjson = highlightObject["HighlightDeleted"];
- var tempList = {};
- var hid = [];
- hid.push(hjson.id);
- tempList["articleId"] = cloneIt.id;
- tempList["highlightId"] = hid;
- colProvider.deleteArticleHighlight(tempList).subscribe(() => {
- });
- }
- }
- updateReadStatus(articleItem) {
- if (!articleItem.readStatus) {
- articleItem.readStatus = true;
- colProvider.readArticle(articleItem).subscribe(() => {
- });
- this.setState({ refresh: !this.state.refresh });
- }
- }
- closeGuide = () => {
- this.setState({ showGuide: false })
- setProvider.closeGuide("isCollectionsGuideShown");
- }
- _renderListView = ({ item }) => (
- <ArticleListNewView
- id={item.id}
- title={item.title}
- timeAgo={item.timeAgo}
- readStatus={item.readStatus}
- hostname={item.hostname}
- bgColor={item.bgColor}
- image={item.image}
- tagList={item.tagList}
- isFavorite={item.isFavorite}
- isPDFAvailable={item.isPDFAvailable}
- data={item}
- openArticleView={this.openArticleView}
- favoriteArticle={this.favoriteArticle}
- openModal={this.openModal}
- navigation={this.props.navigation}
- openTagModal={this.openTagModal}
- />
- );
- _renderCardView = ({ item, index }) => (
- <ArticleCardNewView
- id={item.id}
- title={item.title}
- timeAgo={item.timeAgo}
- readStatus={item.readStatus}
- hostname={item.hostname}
- bgColor={item.bgColor}
- image={item.image}
- tagList={item.tagList}
- isFavorite={item.isFavorite}
- shouldDisplayCollection={false}
- cardWidth={cardWidth}
- numberOfCards={numberOfCards}
- cardLeftWidth={cardLeftWidth}
- isPDFAvailable={item.isPDFAvailable}
- data={item}
- openArticleView={this.openArticleView}
- favoriteArticle={this.favoriteArticle}
- openModal={this.openModal}
- navigation={this.props.navigation}
- index={index}
- />
- );
- openTagModal = (item) => {
- tagList = [];
- if (item.tagList?.length > 0)
- tagList = item.tagList;
- this.setState({ openTagModal: true })
- }
- childResponser = () => {
- startParentResponderTouch = false;
- startChildResponderTouch = true;
- }
- parentResponser = () => {
- if (startParentResponderTouch) {
- if (startChildResponderTouch)
- startChildResponderTouch = false;
- else
- this.closeEditMode();
- }
- else {
- startParentResponderTouch = true;
- }
- }
- render() {
- var renderFavArticleFooter =
- <TouchableOpacity
- activeOpacity={0.7}
- style={drawerStyles.favMenuItem}
- onPress={() => this.menuItemPress(favoriteArticles)}
- >
- <View style={drawerStyles.menuLeftIconView}>
- <CustomIcons style={[drawerStyles.menuLeftIcon, favoriteArticles.active && drawerStyles.menuLeftIconActive]} name="icon_fav_content" />
- </View>
- <Text style={[drawerStyles.menuItemText, favoriteArticles.active && drawerStyles.menuItemTextDefault]}>{favoriteArticles.title}</Text>
- <View style={drawerStyles.menuItemRightView}>
- </View>
- </TouchableOpacity>;
- var menu =
- <SafeAreaView
- edges={["left", "top", "right"]}
- style={drawerStyles.mainContainer}>
- <View style={drawerStyles.headerContainer}>
- <View style={drawerStyles.headerTop}>
- <Text style={drawerStyles.headerTopLeft}>{translate("COLLECTIONS")}
- </Text>
- <View style={drawerStyles.headerTopRight}>
- <TouchableOpacity activeOpacity={0.5} style={drawerStyles.headerIconContainer} onPress={() => this.addCollection()}>
- <CustomIcons style={drawerStyles.headerIcon} name="icon_add_new_collection" />
- </TouchableOpacity>
- </View>
- </View>
- </View>
- {this.state.noData ?
- <View>
- <Text style={drawerStyles.noSearchResult}>{translate("SEARCH_EMPTY")}</Text>
- </View>
- :
- <View style={{ flex: 1 }}>
- <FlatList
- data={filteredColList}
- extraData={this.state.refreshCollection}
- ListEmptyComponent={this.renderCollectionEmpty}
- renderItem={({ item }) =>
- <View>
- <TouchableOpacity
- activeOpacity={0.7}
- key={item.id}
- style={[drawerStyles.menuItem, item.pressed && drawerStyles.menuItemPressed]}
- onLongPress={() => { this.menuItemLongPress(item) }}
- onPress={() => this.menuItemPress(item)}
- >
- <View style={drawerStyles.menuLeftIconView}>
- <CustomIcons style={[drawerStyles.menuLeftIcon, item.active && drawerStyles.menuLeftIconActive]} name={item.title === "General Collection" ? "icon_collection_folder" : "icon_user_folder"} />
- </View>
- <Text style={[drawerStyles.menuItemText, item.active && drawerStyles.menuItemTextDefault]}>{item.title}</Text>
- <View style={drawerStyles.menuItemRightView}>
- {item.isDefault &&
- <CustomIcons style={[drawerStyles.menuItemIcon, item.active && drawerStyles.menuItemSelectedIcon]} name="icon_checkmark_crl" />
- }
- </View>
- </TouchableOpacity>
- {item.pressed &&
- <View style={drawerStyles.menuItemPressedView}>
- <View style={drawerStyles.gradientView}>
- <LinearGradient
- start={{ x: 0, y: 0 }}
- end={{ x: 1, y: 0 }}
- locations={[0.7, 1]}
- colors={["#ffffff00", "#eee"]}
- style={drawerStyles.gradientView} />
- </View>
- <View style={drawerStyles.menuItemActionsView} onTouchStart={() => { this.childResponser() }}>
- {this.state.cloneItem.type != staticConfig.collectionType && <TouchableOpacity activeOpacity={0.5} style={drawerStyles.headerIconContainer} onPress={() => this.editTitle()}>
- <CustomIcons style={drawerStyles.headerIcon} name="icon_edit" />
- </TouchableOpacity>}
- {!this.state.cloneItem.isDefault && this.state.cloneItem.type != staticConfig.collectionType && <TouchableOpacity activeOpacity={0.5} style={drawerStyles.headerIconContainer} onPress={() => this.deleteCollection()}>
- <CustomIcons style={drawerStyles.headerIcon} name="icon_delete" />
- </TouchableOpacity>}
- {!this.state.cloneItem.isDefault && <TouchableOpacity activeOpacity={0.5} style={drawerStyles.headerIconContainer} onPress={() => this.setDefaultCollection()}>
- <CustomIcons style={drawerStyles.headerIcon} name="icon_checkmark_crl" />
- </TouchableOpacity>}
- <TouchableOpacity activeOpacity={0.5} style={drawerStyles.headerIconContainer} onPress={() => { this.closeEditMode(); drawerLockMode = "unlocked" }}>
- <CustomIcons style={drawerStyles.headerIcon} name="icon_cancel" />
- </TouchableOpacity>
- </View></View>
- }
- </View>
- }
- />
- {renderFavArticleFooter}
- </View>
- }
- {this.state.addCollectionModal &&
- <CustomAlert
- title={translate("NC_TITLE")}
- isInput={true}
- subTitle=""
- placeholder={translate("ADD_COLLECTION_DATA")}
- autoFocus={true}
- inputTextCallback={this.getAddCollectionText}
- validationText={this.state.addCollectionValidationText}
- preConfirm={true}
- isValid={this.state.addCollectionValid}
- maxLength={config.collectionMax}
- leftButtonText={translate("ALERT_CANCEL")}
- rightButtonText={translate("ALERT_SAVE")}
- closeCallback={this.closeAddCollectionModal}
- leftButtonCallback={this.closeAddCollectionModal}
- rightButtonCallback={this.onSaveAddCollection}
- swidth={screenWidth}
- />
- }
- {this.state.editTitleCollectionModal &&
- <CustomAlert
- title={translate("RENAME_COLLECTION")}
- subTitle=""
- placeholder={translate("RENAME_COLLECTION_DATA")}
- isInput={true}
- initialValue={this.state.initialValue}
- autoFocus={true}
- inputTextCallback={this.getEditTitleCollectionText}
- validationText={this.state.editTitleCollectionValidationText}
- preConfirm={true}
- isValid={this.state.editTitleCollectionValid}
- maxLength={config.collectionMax}
- leftButtonText={translate("ALERT_CANCEL")}
- rightButtonText={translate("ALERT_SAVE")}
- closeCallback={this.closeEditTitleCollectionModal}
- leftButtonCallback={this.closeEditTitleCollectionModal}
- rightButtonCallback={this.onSaveEditTitleCollection}
- swidth={screenWidth}
- />
- }
- {this.state.deleteCollectionModal &&
- <CustomAlert
- title={translate("DELETE_COLLECTION")}
- subTitle={translate("DELETE_COLLECTION_DATA")}
- leftButtonText={translate("ALERT_CANCEL")}
- rightButtonText={translate("ALERT_DELETE")}
- closeCallback={this.closeDeleteCollectionModal}
- leftButtonCallback={this.closeDeleteCollectionModal}
- rightButtonCallback={this.onDeleteCollection}
- swidth={screenWidth}
- />
- }
- {this.state.openTagModal && tagList?.length > 0 ?
- <TagBottomSheet
- tagList={tagList}
- hideCallback={this.closeTagBottomSheet}
- modalWidth={modalWidth}
- modalHeight={modalHeight} /> : null}
- <GuideView slides={guideImageJson.Collections} screen={"Collections"} showGuide={this.state.showGuide} closeGuide={this.closeGuide} />
- </SafeAreaView>;
- var headerBar =
- <View style={Platform.OS === 'ios' ? styles.newHeaderContainer : styles.newHeaderContainerAndroid}>
- <View style={Platform.OS === 'ios' ? styles.newTopHeaderContainer : styles.newTopHeaderContainerAndroid}>
- <TouchableOpacity activeOpacity={0.7} style={styles.newMenuButtonContainer} onPress={() => this.openMenu()}>
- <CustomIcons style={styles.newMenuButtonIcon} name="icon_side_menu" />
- <View style={styles.newMenuButtonRedDot}><View style={styles.newMenuButtonRedDotChild}></View></View>
- </TouchableOpacity>
- <View style={styles.newHeaderLeftButtonView}>
- <Text style={styles.newHeaderLeftButtonText} numberOfLines={1}>{varProvider.selectedCollectionName}</Text>
- </View>
- <TouchableOpacity activeOpacity={0.5} disabled={this.state.articleLength == 0} style={[styles.newHeaderRightButtonView, styles.newHeaderSecondRightButtonView]} onPress={() => this.changeView()}>
- <CustomIcons style={[styles.newHeaderRightButtonIcon, this.state.articleLength == 0 && { color: EStyleSheet.value("$disableIcon") }]} name={this.state.isCardView ? "icon_list_view" : "icon_card_view"} />
- </TouchableOpacity>
- <TouchableOpacity activeOpacity={0.5} disabled={this.state.articleLength == 0 && !this.state.isFilter} style={styles.newHeaderRightButtonView} onPress={() => this.openFilters()}>
- <CustomIcons style={[styles.newHeaderRightButtonIcon, this.state.articleLength == 0 && !this.state.isFilter && { color: EStyleSheet.value("$disableIcon") }]} name="icon_filter" />
- </TouchableOpacity>
- </View>
- </View>
- return (
- <View style={{ flex: 1 }} onTouchStart={() => { this.parentResponser() }}>
- <DrawerLayout
- drawerWidth={300}
- // useNativeAnimations={true}
- drawerBackgroundColor="white"
- ref={(_drawer) => { this.drawer = _drawer; varProvider.colDrawer = _drawer; }}
- onDrawerClose={() => { this.onDrawerClose() }}
- drawerPosition={DrawerLayout.positions.Left}
- drawerLockMode={drawerLockMode}
- renderNavigationView={() => menu}>
- <SafeAreaView
- edges={["left", "top", "right"]}
- style={{ backgroundColor: "#fff", flex: 1 }}>
- {headerBar}
- <View style={styles.mainContainer}>
- <View>
- <ScrollView style={styles.chipScrollView} horizontal={true}>
- {this.state.activeFilters.map((item, key) =>
- (
- <View key={key}>
- {item.chipTitle == "tagName" ?
- <View style={{ flexDirection: 'row' }}>
- {item.value.map((subItem) =>
- (
- <View key={subItem}>
- <Chip
- rootStyle={styles.chipContainer}
- chipTitle={subItem}
- removeCallback={() => this.removeFilter(subItem, true)}
- />
- </View>
- ))
- }
- </View>
- :
- <View>
- {item.active &&
- <Chip
- rootStyle={styles.chipContainer}
- chipTitle={item.chipTitle}
- removeCallback={() => this.removeFilter(item)}
- />
- }
- </View>
- }
- </View>
- ))
- }
- </ScrollView>
- </View>
- {this.state.articleLoading &&
- <ArticleLoader />
- }
- {!this.state.isCardView && !this.state.articleLoading &&
- <FlatList
- bounces={articleList.length == 0 ? false : true}
- style={{ marginBottom: 0 }}
- contentContainerStyle={[{ paddingBottom: 8 }, articleList.length == 0 && { justifyContent: this.state.loadHint && varProvider.selectedCollectionName == varProvider.defaultCollectionName ? 'flex-start' : 'center', height: this.state.loadHint && varProvider.selectedCollectionName == varProvider.defaultCollectionName ? "120%" : "100%" }]}
- data={articleList}
- extraData={this.state.refresh}
- ListFooterComponent={this.renderFooter}
- ListEmptyComponent={this.renderEmpty}
- ListHeaderComponent={this.renderHeader}
- onEndReached={this.handleLoadMore}
- onEndReachedThreshold={0.5}
- renderItem={this._renderListView}
- />
- }
- {this.state.isCardView && !this.state.articleLoading &&
- <FlatList
- bounces={articleList.length == 0 ? false : true}
- style={{ marginBottom: 0 }}
- contentContainerStyle={[{ paddingBottom: 8 }, articleList.length == 0 && { justifyContent: this.state.loadHint && varProvider.selectedCollectionName == varProvider.defaultCollectionName ? 'flex-start' : 'center', height: this.state.loadHint && varProvider.selectedCollectionName == varProvider.defaultCollectionName ? "120%" : "100%" }]}
- data={articleList}
- columnWrapperStyle={numberOfCards > 1 && { marginHorizontal: 8 }}
- extraData={this.state.refresh}
- numColumns={numberOfCards}
- key={numberOfCards}
- ListFooterComponent={this.renderFooter}
- ListEmptyComponent={this.renderEmpty}
- ListHeaderComponent={this.renderHeader}
- onEndReached={this.handleLoadMore}
- onEndReachedThreshold={0.5}
- renderItem={this._renderCardView}
- />
- }
- <ActionSheet
- isVisible={this.state.actionSheetModal}
- closeCallback={this.closeActionSheetModal}
- hideCallback={this.hideActionSheetModal}
- modalWidth={modalWidth}
- modalHeight={modalHeight}
- backdropColor="#333"
- backdropOpacity={0.3}
- data={this.state.asList}
- />
- <ShareActionSheet
- backdropColor="#333"
- backdropOpacity={0.3}
- isVisible={this.state.sharedOpened}
- hideCallback={this.hideActionSheetModal}
- onBackButtonPress={() => { this.setState({ sharedOpened: false }) }}
- onBackdropPress={() => { this.setState({ sharedOpened: false }) }}
- modalHeight={modalHeight}
- modalWidth={modalWidth}
- sendTo={this.sendTo.bind(this)}
- shareNativeArticle={this.shareNativeArticle.bind(this)}
- isConnected={connection.isConnectedFun()}
- />
- {this.state.editTitleModal &&
- <CustomAlert
- title={translate("ARTICLE_RENAME")}
- subTitle=""
- placeholder={translate("ARTICLE_RENAME_DATA")}
- isInput={true}
- initialValue={this.state.initialValue}
- autoFocus={true}
- inputTextCallback={this.getEditTitleText}
- validationText={this.state.editTitleValidationText}
- preConfirm={true}
- maxLength={config.articleTitleMax}
- isValid={this.state.editTitleValid}
- leftButtonText={translate("ALERT_CANCEL")}
- rightButtonText={translate("ALERT_SAVE")}
- closeCallback={this.closeEditTitleModal}
- leftButtonCallback={this.closeEditTitleModal}
- rightButtonCallback={this.onSaveEditTitle}
- swidth={screenWidth}
- />
- }
- {this.state.deleteArticleModal &&
- <CustomAlert
- title={translate("DELETE_ARTICLE")}
- subTitle={translate("DELETE_ARTICLE_DATA")}
- leftButtonText={translate("ALERT_CANCEL")}
- rightButtonText={translate("ALERT_DELETE")}
- closeCallback={this.closeDeleteArticleModal}
- leftButtonCallback={this.closeDeleteArticleModal}
- rightButtonCallback={this.onDeleteArticle}
- swidth={screenWidth}
- />
- }
- </View>
- </SafeAreaView>
- </DrawerLayout>
- </View>
- );
- }
- removeFilter(item, isTag) {
- var tempFilters = this.state.activeFilters;
- if (isTag) {
- var tagList = tempFilters[4].value;
- for (var i = 0; i < tagList.length; i++) {
- if (item == tagList[i]) {
- tempFilters[4].value.splice(i, 1);
- if (tempFilters[4].value.length == 0) {
- tempFilters[4].active = false;
- }
- break;
- }
- }
- } else {
- for (var i = 0; i < tempFilters.length; i++) {
- if (item.chipTitle == tempFilters[i].chipTitle) {
- tempFilters[i].active = false;
- break;
- }
- }
- }
- this.callbackFun(tempFilters);
- }
- closeActionSheetModal() {
- this.setState({ actionSheetModal: false });
- }
- // here we get callback that action sheet/share action sheet is closed, now we can perform action according to value of closeFlag
- hideActionSheetModal() {
- if (closeFlag == "editArticle") {
- this.setState({ editTitleModal: true });
- }
- else if (closeFlag == "deleteArticle") {
- this.setState({ deleteArticleModal: true });
- }
- else if (closeFlag == "actionSheet") {
- this.setState({ sharedOpened: true });
- }
- else if (closeFlag == "externalPdfOpen") {
- colProvider.onOpenWithExternalView(this.props.navigation, cloneIt)
- }
- else if (closeFlag == "shareVia") {
- setTimeout(() => {
- if (Platform.OS == "ios") {
- Share.share({
- message: cloneIt.url,
- url: cloneIt.url,
- title: cloneIt.title
- }, {
- // Android only:
- dialogTitle: cloneIt.title,
- }).then(() => {
- // console.log(data);
- }).catch(() => {
- // console.log(err);
- });
- } else {
- ShareIntentModule.openShareIntent(cloneIt.title, cloneIt.url, () => {
- });
- }
- }, 400)
- this.logShareEvent(cloneIt.url, "Other");
- }
- closeFlag = "";
- }
- shareArticle() {
- if (connection.isConnectedFun()) {
- this.closeActionSheetModal();
- closeFlag = "actionSheet"
- } else {
- Toast.showShortCenter(translate("PLEASE_CONNECT"));
- }
- }
- sendTo() {
- const { navigate } = this.props.navigation;
- if (connection.isConnectedFun()) {
- this.setState({ sharedOpened: false });
- navigate('ShareArticle', { "article": cloneIt, "isModal": true, "refScreen": screenNames.Collections });
- } else {
- Toast.showShortCenter(translate("PLEASE_CONNECT"));
- }
- }
- shareNativeArticle() {
- if (connection.isConnectedFun()) {
- closeFlag = "shareVia"
- this.setState({ sharedOpened: false });
- }
- else {
- Toast.showShortCenter(translate("PLEASE_CONNECT"));
- }
- }
- logShareEvent(url, medium) {
- let shareJson = {
- "medium": medium,
- "url": url
- };
- analyticsProvider.logAnalyticsJson("Share", shareJson);
- }
- getEditTitleText(e) {
- this.setState({ editTitleText: e });
- }
- onSaveEditTitle() {
- if (!this.state.editTitleText) {
- this.setState({ editTitleValid: true, editTitleValidationText: translate("ARTICLE_RENAME_VALIDATION") });
- } else {
- var trimmedTitle = this.state.editTitleText.trim();
- if (trimmedTitle) {
- cloneIt.title = trimmedTitle;
- colProvider.editArticle(cloneIt).subscribe(() => {
- });
- this.setState({ editTitleValid: false, refresh: !this.state.refresh });
- this.closeEditTitleModal();
- } else {
- this.setState({ editTitleValid: true, editTitleValidationText: translate("ARTICLE_RENAME_VALIDATION") });
- }
- }
- }
- closeEditTitleModal() {
- this.setState({ editTitleModal: false })
- }
- closeDeleteArticleModal() {
- this.setState({ deleteArticleModal: false })
- }
- onDeleteArticle() {
- this.closeDeleteArticleModal();
- //added timeout to remove lag in UI
- setTimeout(() => {
- for (var i = 0; i < articleList.length; i++) {
- if (articleList[i].id == cloneIt.id) {
- articleList.splice(i, 1);
- if (articleList.length < pagingCount && !noMoreData) {
- setTimeout(() => {
- this.handleLoadMore({ distanceFromEnd: "NeedToFetch" });
- }, 1000);
- }
- break;
- }
- }
- Toast.showShortCenter(translate("ARTICLE_DELETED"));
- var tempList = [];
- tempList.push(cloneIt);
- colProvider.deleteArticle(tempList).subscribe(() => {
- });
- this.setState({ refresh: !this.state.refresh });
- }, 500);
- }
- favoriteArticle(item) {
- if (item.isFavorite) {
- item.isFavorite = false;
- }
- else {
- item.isFavorite = true;
- }
- //if favorite articles is selected then remove the unfavorited article from list
- if (varProvider.selectedCollectionId == "favoriteArticles")
- this.removeFromFavorite(item);
- colProvider.favoriteArticle(item).subscribe(() => {
- });
- this.setState({ refresh: !this.state.refresh });
- }
- openModal(item) {
- if (item?.isPDFAvailable == 'false') {
- asList[0].isGrayedOut = true;
- } else {
- asList[0].isGrayedOut = false;
- }
- if (item.readStatus) {
- asList[6].title = translate("MARK_AS") + translate("UNREAD")
- }
- else {
- asList[6].title = translate("MARK_AS") + translate("READ");
- }
- if (item.type == "PDF") {
- asList[1].isVisible = false;
- asList[0].isVisible = true; //check type is pdf then we will show open with option
- } else {
- asList[1].isVisible = true;
- asList[0].isVisible = false;
- }
- this.setState({ asList: asList, actionSheetModal: true });
- cloneIt = item;
- }
- callbackAddTag(tagList) {
- tagList.sort(colProvider.SortByNameArray);
- cloneIt.tagList = tagList;
- this.setState({ refresh: !this.state.refresh });
- }
- callbackDeleteArticle() {
- this.onDeleteArticle();
- }
- callbackRead() {
- cloneIt.readStatus = true;
- this.setState({ refresh: !this.state.refresh });
- }
- callbackCollection() {
- if (varProvider.selectedCollectionName != translate("FAVORITE_ARTICLES")) {
- for (var i = 0; i < articleList.length; i++) {
- if (articleList[i].title == cloneIt.title) {
- articleList.splice(i, 1);
- if (articleList.length < pagingCount && !noMoreData) {
- setTimeout(() => {
- this.handleLoadMore({ distanceFromEnd: "NeedToFetch" });
- }, 1000);
- }
- }
- }
- this.setState({ refresh: !this.state.refresh });
- }
- }
- addTags() {
- this.closeActionSheetModal();
- const { navigate } = this.props.navigation;
- navigate('AddTags', { article: cloneIt, "callbackAddTag": this.callbackAddTag, "isModal": true, "refScreen": screenNames.Collections });
- }
- editTitleArticle() {
- this.closeActionSheetModal();
- if (Platform.OS == "ios") {
- this.setState({ initialValue: cloneIt.title, editTitleText: cloneIt.title, editTitleValid: false });
- }
- else {
- this.setState({ editTitleModal: true, initialValue: cloneIt.title, editTitleText: cloneIt.title, editTitleValid: false });
- }
- closeFlag = "editArticle";
- }
- moveToCollection() {
- this.closeActionSheetModal();
- const { navigate } = this.props.navigation;
- navigate('MoveToCollection', { "isModal": true, collectionList: collectionList, article: cloneIt, "callbackCollection": this.callbackCollection.bind(this), "refScreen": screenNames.Collections });
- }
- deleteArticle() {
- this.closeActionSheetModal();
- if (Platform.OS == "ios") {
- }
- else {
- this.setState({ deleteArticleModal: true });
- }
- closeFlag = "deleteArticle";
- }
- markAsRead() {
- this.closeActionSheetModal();
- var alertMsg;
- if (cloneIt.readStatus) {
- cloneIt.readStatus = false;
- alertMsg = translate("UNREAD");
- }
- else {
- cloneIt.readStatus = true;
- alertMsg = translate("READ");
- }
- colProvider.readArticle(cloneIt).subscribe(() => {
- });
- this.setState({ refresh: !this.state.refresh });
- }
- //collection side menu functions
- closeEditMode() {
- if (cloneIt) {
- cloneIt.pressed = false;
- }
- setTimeout(() => {
- isEditMode = false;
- drawerLockMode = "unlocked"
- }, 200)
- this.setState({ editMode: false, refreshCollection: !this.state.refreshCollection });
- }
- setDefaultCollection() {
- for (var i = 0; i < collectionList.length; i++) {
- if (collectionList[i].isDefault) {
- collectionList[i].isDefault = false;
- }
- }
- cloneIt.isDefault = true;
- cloneIt.pressed = false;
- collectionList.sort(colProvider.SortByName);
- //add collection marked as default to front
- for (var j = 0; j < collectionList.length; j++) {
- if (collectionList[j].id == cloneIt.id) {
- collectionList.splice(j, 1);
- collectionList.unshift(cloneIt);
- break;
- }
- }
- varProvider.defaultCollectionId = cloneIt.id;
- varProvider.defaultCollectionName = cloneIt.title;
- varProvider.defaultCollectionType = cloneIt.type;
- AsyncStorage.multiSet([
- ["defaultCollectionId", varProvider.defaultCollectionId],
- ["defaultCollectionName", varProvider.defaultCollectionName],
- ["defaultCollectionType", varProvider.defaultCollectionType]
- ]);
- colProvider.setDefaultCollection(cloneIt).subscribe(() => {
- });
- this.logCollectionUpdateEvent(cloneIt.title);
- isEditMode = false;
- drawerLockMode = "unlocked"
- this.setState({ editMode: false, refreshCollection: !this.state.refreshCollection });
- }
- logCollectionUpdateEvent(name) {
- let collectionUpdateJson = {
- "name": name
- };
- analyticsProvider.logAnalyticsJson("CollectionUpdate", collectionUpdateJson)
- }
- addCollection() {
- if (isEditMode) {
- this.closeEditMode();
- }
- else {
- this.setState({ addCollectionModal: true, addCollectionText: "", addCollectionValid: false });
- }
- }
- getAddCollectionText(e) {
- this.setState({ addCollectionText: e });
- }
- closeAddCollectionModal() {
- this.setState({ addCollectionModal: false });
- }
- onSaveAddCollection() {
- if (!this.state.addCollectionText) {
- this.setState({ addCollectionValid: true, addCollectionValidationText: translate("NC_EMPTY") });
- }
- else {
- var trimmedTitle = this.state.addCollectionText.trim();
- if (trimmedTitle) {
- if (config.collectionRegex.test(trimmedTitle)) {
- var flagCollection = false;
- for (var i = 0; i < collectionList.length; i++) {
- if (collectionList[i].title.toLowerCase() == trimmedTitle.toLowerCase()) {
- flagCollection = true;
- }
- }
- if (trimmedTitle.toLowerCase() == translate("FAVORITE_ARTICLES").toLowerCase()) {
- flagCollection = true;
- }
- if (flagCollection) {
- this.setState({ addCollectionValid: true, addCollectionValidationText: translate("NC_EXIST") });
- } else {
- var uuid = apiProvider.generateUUID();
- var title = trimmedTitle;
- var updatedAt = new Date().getTime();
- var tempColList = JSON.parse(JSON.stringify(collectionList));
- tempColList.splice(0, 1);
- var toInsertIndex = colProvider.getSortedIndex(tempColList, title, "title");
- collectionList.splice(toInsertIndex + 1, 0, {
- "id": uuid,
- "title": title,
- "description": "",
- "isDefault": false,
- "createdAt": updatedAt,
- "updatedAt": updatedAt,
- "pressed": false,
- "active": false
- });
- colProvider.addCollection(uuid, title, updatedAt).subscribe((data) => {
- varProvider.newAddedCollection["oldId"] = data.oldId;
- varProvider.newAddedCollection["newId"] = data.id;
- var colLen = collectionList.length;
- for (var i = 0; i < colLen; i++) {
- if (collectionList[i].id == data["oldId"]) {
- collectionList[i]["id"] = data.id;
- collectionList[i]["updatedAt"] = data.updatedAt;
- break;
- }
- }
- });
- this.logCollectionSaveEvent(title);
- this.setState({ addCollectionValid: false, refreshCollection: !this.state.refreshCollection });
- this.closeAddCollectionModal();
- }
- } else {
- this.setState({ addCollectionValid: true, addCollectionValidationText: translate("NC_VALIDATION") });
- }
- } else {
- this.setState({ addCollectionValid: true, addCollectionValidationText: translate("NC_EMPTY") });
- }
- }
- }
- logCollectionSaveEvent(name) {
- let collectionSaveJson = {
- "name": name,
- "source": "Collection"
- }
- analyticsProvider.logAnalyticsJson("CollectionSave", collectionSaveJson);
- }
- editTitle() {
- this.setState({ editTitleCollectionModal: true, initialValue: cloneIt.title, editTitleCollectionText: cloneIt.title, editTitleCollectionValid: false });
- }
- getEditTitleCollectionText(e) {
- this.setState({ editTitleCollectionText: e });
- }
- closeEditTitleCollectionModal() {
- this.setState({ editTitleCollectionModal: false });
- }
- onSaveEditTitleCollection() {
- if (!this.state.editTitleCollectionText) {
- this.setState({ editTitleCollectionValid: true, editTitleCollectionValidationText: translate("NC_EMPTY") });
- }
- else {
- var trimmedTitle = this.state.editTitleCollectionText.trim();
- if (trimmedTitle) {
- if (config.collectionRegex.test(trimmedTitle)) {
- var flagCollection = false;
- for (var i = 0; i < collectionList.length; i++) {
- if (collectionList[i].title.toLowerCase() == trimmedTitle.toLowerCase()) {
- if (collectionList[i].title == cloneIt.title) {
- if (trimmedTitle == cloneIt.title) {
- flagCollection = true;
- }
- }
- else {
- flagCollection = true;
- }
- }
- }
- if (trimmedTitle.toLowerCase() == translate("FAVORITE_ARTICLES").toLowerCase()) {
- flagCollection = true;
- }
- if (flagCollection) {
- this.setState({ editTitleCollectionValid: true, editTitleCollectionValidationText: translate("NC_EXIST") });
- } else {
- cloneIt.title = trimmedTitle;
- cloneIt.pressed = false;
- //update the title of collection
- for (var j = 0; j < collectionList.length; j++) {
- if (collectionList[j].id == cloneIt.id) {
- collectionList[j].title = cloneIt.title;
- if (collectionList[j].active === true) {
- varProvider.selectedCollectionName = cloneIt.title;
- }
- collectionList[j].pressed = false;
- break;
- }
- }
- //sort the collection list
- collectionList.sort(colProvider.SortByName);
- //move collection marked as default to front
- for (var j = 0; j < collectionList.length; j++) {
- if (collectionList[j].isDefault) {
- let tempobj = collectionList[j];
- collectionList.splice(j, 1);
- collectionList.unshift(tempobj);
- break;
- }
- }
- colProvider.editCollection(cloneIt).subscribe(() => {
- });
- isEditMode = false;
- drawerLockMode = "unlocked";
- this.setState({ editTitleCollectionValid: false, editMode: false, refreshCollection: !this.state.refreshCollection });
- this.closeEditTitleCollectionModal();
- }
- } else {
- this.setState({ editTitleCollectionValid: true, editTitleCollectionValidationText: translate("NC_VALIDATION") });
- }
- } else {
- this.setState({ editTitleCollectionValid: true, editTitleCollectionValidationText: translate("NC_EMPTY") });
- }
- }
- }
- deleteCollection() {
- this.setState({ deleteCollectionModal: true });
- }
- closeDeleteCollectionModal() {
- this.setState({ deleteCollectionModal: false });
- }
- onDeleteCollection() {
- var index, colIdToDelete;
- for (var i = 0; i < collectionList.length; i++) {
- if (collectionList[i].title == cloneIt.title) {
- colIdToDelete = collectionList[i].id;
- collectionList.splice(i, 1);
- index = i;
- break;
- }
- }
- colProvider.deleteCollection(cloneIt).subscribe(() => {
- if (varProvider.selectedCollectionId != colIdToDelete || varProvider.selectedCollectionId == varProvider.defaultCollectionId) {
- if (!varProvider.isSyncInProgress) {
- colProvider.getSyncArticles(0);
- }
- }
- });
- isEditMode = false;
- drawerLockMode = "unlocked",
- this.setState({ editMode: false });
- this.closeDeleteCollectionModal();
- if (varProvider.selectedCollectionId == colIdToDelete) {
- if (index == 0) {
- //select collection and load its article
- this.selectColAndLoadArticle(index);
- } else {
- //select collection i-1 and load its articles
- this.selectColAndLoadArticle(index - 1);
- }
- }
- }
- closeTagBottomSheet = () => {
- this.setState({ openTagModal: false });
- }
- menuItemLongPress(item) {
- if (item.isDefault && item.type != staticConfig.collectionType || !item.isDefault) {
- for (var i = 0; i < collectionList.length; i++) {
- if (collectionList[i].pressed) {
- collectionList[i].pressed = false;
- }
- }
- item.pressed = true;
- isEditMode = true;
- drawerLockMode = "locked-open",
- this.setState({ editMode: true, cloneItem: item, refreshCollection: !this.state.refreshCollection });
- cloneIt = item;
- }
- }
- menuItemPress(item) {
- // console.log(item)
- if (isEditMode) {
- this.closeEditMode();
- }
- else {
- this.drawer.closeDrawer();
- for (var i = 0; i < collectionList.length; i++) {
- if (collectionList[i].active) {
- collectionList[i].active = false;
- }
- }
- item.active = true;
- if (item.id != "favoriteArticles") {
- favoriteArticles.active = false;
- imagePath = imageJson.collection_empty;
- title = translate("ARTICLES_EMPTY1")
- text = ""
- links = [{ name: translate("ERESOURCES"), onPressFun: this.openEResources.bind(this) }, { name: translate("WEB"), onPressFun: this.openWeb.bind(this) }];
- isLink = true;
- }
- else {
- imagePath = imageJson.fav_article_empty;
- title = translate("ARTICLES_FAV_EMPTY")
- text = translate("ARTICLES_FAV_EMPTY_DATA1")
- isLink = false;
- }
- noMoreData = false;
- articleList = [];
- varProvider.selectedCollectionName = item.title;
- varProvider.selectedCollectionId = item.id;
- graphError = ""
- this.setState({ refreshCollection: !this.state.refreshCollection, articleLoading: true, errorLoading: false, articleLength: 0 });
- setTimeout(() => {
- if (item.id == "favoriteArticles") {
- if (this.state.isFilter) {
- this.callbackFun(this.state.activeFilters);
- } else {
- var tempJson = {
- "offset": 0
- };
- this.loadFavoriteArticles(tempJson);
- }
- } else {
- if (this.state.isFilter) {
- this.callbackFun(this.state.activeFilters);
- } else {
- isFirstTime = false;
- this.loadArticleList();
- }
- }
- }, 450);
- }
- }
- openEResources() {
- varProvider.activeTabIndex = 1;
- const { navigate } = this.props.navigation;
- navigate('Content');
- }
- openWeb() {
- if (connection.isConnectedFun()) {
- varProvider.openSearch = true;
- varProvider.activeTabIndex = 0;
- const { navigate } = this.props.navigation;
- navigate('Home');
- }
- else {
- Toast.showShortCenter(translate("PLEASE_CONNECT"));
- }
- }
- loadFavoriteArticles(tempJson) {
- if (tempJson.offset == 0)
- articleList = [];
- colProvider.getFavoriteArticleSql(tempJson).then((data) => {
- if (data.length < pagingCount) {
- noMoreData = true;
- }
- if (data.length != 0) {
- var articleCount = articleList.length;
- this.processArticleList(data, articleCount);
- } else {
- this.setState({ refresh: !this.state.refresh, articleLoading: false, footerLoading: false, articleLength: articleList.length });
- }
- isInfiniteOn = false;
- })
- }
- removeFromFavorite(item) {
- for (var i = 0; i < articleList.length; i++) {
- if (articleList[i].id == item.id) {
- articleList.splice(i, 1);
- break;
- }
- }
- this.setState({ refresh: !this.state.refresh });
- }
- selectColAndLoadArticle(index) {
- for (var i = 0; i < collectionList.length; i++) {
- if (collectionList[i].active) {
- collectionList[i].active = false;
- }
- }
- collectionList[index].active = true;
- graphError = ""
- this.setState({ refreshCollection: !this.state.refreshCollection, articleLoading: true, errorLoading: false, articleLength: 0 });
- noMoreData = false;
- articleList = [];
- varProvider.selectedCollectionName = collectionList[index].title;
- varProvider.selectedCollectionId = collectionList[index].id;
- if (this.state.isFilter) {
- this.callbackFun(this.state.activeFilters);
- } else {
- isFirstTime = false;
- this.loadArticleList();
- }
- cloneIt = collectionList[index];
- }
- onDrawerClose() {
- if (cloneIt) {
- cloneIt.pressed = false;
- }
- if (this.refs["searchInput"]) {
- this.refs["searchInput"].blur();
- }
- isEditMode = false;
- drawerLockMode = "unlocked";
- this.setState({ editMode: false, refreshCollection: !this.state.refreshCollection });
- }
- }