ArticleList.js 2.79 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
import Vue from "vue";
import ArticleItem from "@theme/components/Blog/ArticleItem.vue";
import EmptyIcon from "@theme/icons/EmptyIcon.vue";
import MyTransition from "@theme/components/MyTransition.vue";
import { filterArticle, sortArticle } from "@theme/utils/article";
import { getPathMatchedKeys } from "@theme/utils/encrypt";
export default Vue.extend({
    name: "ArticleList",
    components: { ArticleItem, EmptyIcon, MyTransition },
    data: () => ({
        currentPage: 1,
        articleList: [],
    }),
    computed: {
        blogConfig() {
            return this.$themeConfig.blog || {};
        },
        articlePerPage() {
            return this.blogConfig.perPage || 10;
        },
        filter() {
            const { path } = this.$route;
            return path.includes("/article")
                ? (page) => page.frontmatter.layout !== "Slide"
                : path.includes("/star")
                    ? (page) => Boolean(page.frontmatter.star || page.frontmatter.sticky)
                    : path.includes("/encrypt")
                        ? (page) => getPathMatchedKeys(this.$themeConfig.encrypt, page.path).length !==
                            0 || Boolean(page.frontmatter.password)
                        : path.includes("/slide")
                            ? (page) => page.frontmatter.layout === "Slide"
                            : undefined;
        },
        $articles() {
            // filter then sort
            return sortArticle(filterArticle(this.$site.pages, this.filter), "sticky");
        },
        /** Articles in this page */
        articles() {
            return this.articleList.slice((this.currentPage - 1) * this.articlePerPage, this.currentPage * this.articlePerPage);
        },
    },
    watch: {
        // update article list when route is changed
        $route(to, from) {
            if (to.path !== from.path) {
                this.articleList = this.getArticleList();
                // reset page to 1
                this.currentPage = 1;
            }
        },
        currentPage() {
            // list top border distance
            const distance = document.querySelector("#article-list").getBoundingClientRect().top + window.scrollY;
            setTimeout(() => {
                window.scrollTo(0, distance);
            }, 100);
        },
    },
    mounted() {
        this.articleList = this.getArticleList();
    },
    methods: {
        getArticleList() {
            try {
                return this.$pagination
                    ? // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
                        this.$pagination._matchedPages
                    : this.$articles;
            }
            catch (err) {
                return this.$articles;
            }
        },
    },
});
//# sourceMappingURL=ArticleList.js.map