229 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
		
			Vendored
		
	
	
	
			
		
		
	
	
			229 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
		
			Vendored
		
	
	
	
import { collect } from "collect.js";
 | 
						|
 | 
						|
/**
 | 
						|
 * Feed items actions
 | 
						|
 */
 | 
						|
export default {
 | 
						|
    /**
 | 
						|
     * Load feed items for specified feeds
 | 
						|
     */
 | 
						|
    async index({ getters, commit }, documents) {
 | 
						|
        const feeds = collect(documents)
 | 
						|
            .pluck("feeds")
 | 
						|
            .flatten(1)
 | 
						|
            .pluck("id")
 | 
						|
            .all();
 | 
						|
 | 
						|
        let nextPage = 0;
 | 
						|
        let feedItems = [];
 | 
						|
        const currentlySelectedItem = getters.selectedFeedItem;
 | 
						|
 | 
						|
        if (feeds.length > 0) {
 | 
						|
            const data = await api.get(route("feed_item.index"), {
 | 
						|
                feeds: feeds,
 | 
						|
            });
 | 
						|
 | 
						|
            feedItems = data.data;
 | 
						|
            nextPage = data.next_page_url !== null ? data.current_page + 1 : 0;
 | 
						|
        }
 | 
						|
 | 
						|
        if (currentlySelectedItem) {
 | 
						|
            const itemFeeds = collect(currentlySelectedItem.feeds)
 | 
						|
                .pluck("id")
 | 
						|
                .flatten(1);
 | 
						|
 | 
						|
            if (itemFeeds.intersect(feeds)) {
 | 
						|
                let collection = collect(feedItems);
 | 
						|
 | 
						|
                if (!collection.where("id", currentlySelectedItem.id).first()) {
 | 
						|
                    feedItems.push(currentlySelectedItem);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        commit("setNextPage", nextPage);
 | 
						|
        commit("setFeeds", feeds);
 | 
						|
        commit("setFeedItems", feedItems);
 | 
						|
    },
 | 
						|
 | 
						|
    /**
 | 
						|
     * Infinite loading
 | 
						|
     */
 | 
						|
    async loadMoreFeedItems({ getters, commit }) {
 | 
						|
        if (!getters.nextPage || !getters.feeds) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        const items = getters.feedItems;
 | 
						|
        const data = await api.get(route("feed_item.index"), {
 | 
						|
            page: getters.nextPage,
 | 
						|
            feeds: getters.feeds,
 | 
						|
        });
 | 
						|
 | 
						|
        const newItems = [...items, ...data.data];
 | 
						|
 | 
						|
        commit(
 | 
						|
            "setNextPage",
 | 
						|
            data.next_page_url !== null ? data.current_page + 1 : 0
 | 
						|
        );
 | 
						|
 | 
						|
        commit("setFeeds", getters.feeds);
 | 
						|
        commit("setFeedItems", newItems);
 | 
						|
    },
 | 
						|
 | 
						|
    /**
 | 
						|
     * Change selected feed items
 | 
						|
     */
 | 
						|
    async selectFeedItems({ commit }, feedItems) {
 | 
						|
        if (feedItems.length === 1) {
 | 
						|
            const data = await api.get(route("feed_item.show", feedItems[0]));
 | 
						|
            commit("update", { feedItem: feedItems[0], newProperties: data });
 | 
						|
        }
 | 
						|
 | 
						|
        commit("setSelectedFeedItems", feedItems);
 | 
						|
    },
 | 
						|
 | 
						|
    /**
 | 
						|
     * Select first unread item in current list
 | 
						|
     */
 | 
						|
    selectFirstUnreadFeedItem({ getters, dispatch }, exclude) {
 | 
						|
        if (!exclude) {
 | 
						|
            exclude = [];
 | 
						|
        }
 | 
						|
 | 
						|
        const nextFeedItem = collect(getters.feedItems)
 | 
						|
            .where("feed_item_states_count", ">", 0)
 | 
						|
            .whereNotIn("id", exclude)
 | 
						|
            .first();
 | 
						|
 | 
						|
        if (nextFeedItem) {
 | 
						|
            dispatch("selectFeedItems", [nextFeedItem]);
 | 
						|
        } else {
 | 
						|
            dispatch(
 | 
						|
                "documents/selectFirstDocumentWithUnreadItems",
 | 
						|
                { selectFirstUnread: true },
 | 
						|
                {
 | 
						|
                    root: true,
 | 
						|
                }
 | 
						|
            );
 | 
						|
        }
 | 
						|
    },
 | 
						|
 | 
						|
    selectNextUnreadFeedItem({ getters, dispatch }, currentId) {
 | 
						|
        if (!currentId) {
 | 
						|
            return dispatch("selectFirstUnreadFeedItem");
 | 
						|
        }
 | 
						|
 | 
						|
        const nextFeedItem = collect(getters.feedItems)
 | 
						|
            .where("feed_item_states_count", ">", 0)
 | 
						|
            .skipUntil((item) => item.id === currentId)
 | 
						|
            .skip(1)
 | 
						|
            .shift();
 | 
						|
 | 
						|
        if (nextFeedItem) {
 | 
						|
            dispatch("selectFeedItems", [nextFeedItem]);
 | 
						|
        } else {
 | 
						|
            dispatch(
 | 
						|
                "documents/selectFirstDocumentWithUnreadItems",
 | 
						|
                { selectFirstUnread: true },
 | 
						|
                {
 | 
						|
                    root: true,
 | 
						|
                }
 | 
						|
            );
 | 
						|
        }
 | 
						|
    },
 | 
						|
 | 
						|
    /**
 | 
						|
     * Mark feed items as read
 | 
						|
     */
 | 
						|
    markAsRead({ dispatch, commit, getters }, data) {
 | 
						|
        const nextPage = getters.nextPage;
 | 
						|
 | 
						|
        // Avoid unwanted reloading
 | 
						|
        commit("setNextPage", null);
 | 
						|
 | 
						|
        if ("feed_items" in data) {
 | 
						|
            dispatch("selectNextUnreadFeedItem", data.feed_items[0]);
 | 
						|
        } else if ("documents" in data) {
 | 
						|
            dispatch(
 | 
						|
                "documents/selectFirstDocumentWithUnreadItems",
 | 
						|
                { exclude: data.documents },
 | 
						|
                { root: true }
 | 
						|
            );
 | 
						|
        }
 | 
						|
 | 
						|
        api.post(route("feed_item.mark_as_read"), data).then(function (
 | 
						|
            response
 | 
						|
        ) {
 | 
						|
            dispatch("updateUnreadFeedItemsCount", response);
 | 
						|
            commit("setNextPage", nextPage);
 | 
						|
        });
 | 
						|
    },
 | 
						|
 | 
						|
    /**
 | 
						|
     * Change number of unread feed items everywhere it's necessary
 | 
						|
     */
 | 
						|
    updateUnreadFeedItemsCount({ commit, dispatch, getters }, data) {
 | 
						|
        if ("updated_feed_items" in data && data.updated_feed_items !== null) {
 | 
						|
            const feedItems = collect(getters.feedItems).whereIn(
 | 
						|
                "id",
 | 
						|
                data.updated_feed_items
 | 
						|
            );
 | 
						|
 | 
						|
            feedItems.each(function (feedItem) {
 | 
						|
                commit("update", {
 | 
						|
                    feedItem: feedItem,
 | 
						|
                    newProperties: {
 | 
						|
                        feed_item_states_count: 0,
 | 
						|
                    },
 | 
						|
                });
 | 
						|
            });
 | 
						|
        }
 | 
						|
 | 
						|
        if ("documents" in data) {
 | 
						|
            for (var documentId in data.documents) {
 | 
						|
                dispatch(
 | 
						|
                    "documents/update",
 | 
						|
                    {
 | 
						|
                        documentId: documentId,
 | 
						|
                        newProperties: {
 | 
						|
                            feed_item_states_count: data.documents[documentId],
 | 
						|
                        },
 | 
						|
                    },
 | 
						|
                    { root: true }
 | 
						|
                );
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if ("folders" in data) {
 | 
						|
            for (var folderId in data.folders) {
 | 
						|
                dispatch(
 | 
						|
                    "folders/updateProperties",
 | 
						|
                    {
 | 
						|
                        folderId: folderId,
 | 
						|
                        newProperties: {
 | 
						|
                            feed_item_states_count: data.folders[folderId],
 | 
						|
                        },
 | 
						|
                    },
 | 
						|
                    { root: true }
 | 
						|
                );
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if ("groups" in data) {
 | 
						|
            for (var groupId in data.groups) {
 | 
						|
                dispatch(
 | 
						|
                    "groups/updateProperties",
 | 
						|
                    {
 | 
						|
                        groupId: groupId,
 | 
						|
                        newProperties: {
 | 
						|
                            feed_item_states_count: data.groups[groupId],
 | 
						|
                        },
 | 
						|
                    },
 | 
						|
                    { root: true }
 | 
						|
                );
 | 
						|
            }
 | 
						|
        }
 | 
						|
    },
 | 
						|
};
 |