import { Ref, ref } from 'vue'; import { defineStore } from 'pinia'; import { BlogGateway } from '@/database/blog/blog.gateway'; import { IBlog } from '@/database/blog/blog.types'; import { ICategory } from '@/database/baseTypes'; import isClientOr from '@/utils/static-helpers/storeHelper'; import { BaseGateway } from '@/database/base/base.gateway'; import { DirectusPaginationSlugs } from '@/utils/static-helpers/page-urls/dynamicRoutes.types'; interface State { post: Ref; postsPreview: Ref; categories: Ref; totalPostsCount: Ref; } export const useBlogStore = defineStore('blog', () => { const state: State = { post: ref({} as IBlog.Post), postsPreview: ref([]), categories: ref([]), totalPostsCount: ref(0), }; const actions = { async getPost(params: IBlog.GetPostsParams) { const isEmpty = !Object.keys(state.post.value).length; if (isEmpty) { state.post.value = await BlogGateway.getPost(params); } }, async getPostsPreview(params: IBlog.GetPostsParams) { if (!state.postsPreview.value.length) { state.postsPreview.value = await BlogGateway.getPostsPreview(params); } }, async getCategories() { if (!state.categories.value.length) { state.categories.value = await BlogGateway.getCategories(); } }, async getTotalPostsCount(categorySlug?: string) { if (!state.totalPostsCount.value) { state.totalPostsCount.value = await BaseGateway.getPostsCount( DirectusPaginationSlugs.Blog, categorySlug, ); } }, }; return { ...state, ...actions, }; });