Flycro-Me/src/stores/post.ts

83 lines
2.3 KiB
TypeScript

import { acceptHMRUpdate, defineStore } from 'pinia'
import type { Ref } from 'vue'
import MarkdownIt from 'markdown-it'
import Prism from 'markdown-it-prism'
import LinkAttributes from 'markdown-it-link-attributes'
import type { Error, Post } from '~/types'
export const usePostStore = defineStore('post', () => {
const postList = ref([]) as Ref<Post[]>
const currentPost = ref({}) as Ref<Post>
const errors = ref([]) as Ref<Error[]>
const loading = ref(false) as Ref<boolean>
const initialLoad = ref(false) as Ref<boolean>
const router = useRouter()
async function fetchPosts() {
postList.value = []
errors.value = []
loading.value = true
const result = await fetch('https://api.flycro.me/items/Post')
if (!result.ok) errors.value.push({ message: 'Failed to fetch posts' })
const data = await result.json()
data.data.forEach((item) => {
postList.value.push({
title: item.title,
slug: item.slug,
body: item.body,
tags: item.tags,
user_created: item.user_created,
date_created: item.date_created,
status: item.status,
})
})
loading.value = false
initialLoad.value = true
}
async function getCurrentPostBySlug(slug: string) {
if (postList.value.length === 0) await fetchPosts()
const post = postList.value.find(item => item.slug === slug)
if (post) {
currentPost.value = post
const md = new MarkdownIt()
md.use(Prism)
md.use(LinkAttributes, {
pattern: /^https?:\/\//,
attrs: {
target: '_blank',
rel: 'noopener',
},
})
currentPost.value.body = md.render(currentPost.value.body)
}
if (currentPost.value && Object.keys(currentPost.value).length === 0 && initialLoad.value) router.push('/404')
}
/**
* Changes the current name of the user and saves the one that was used
* before.
*
* @param name - new name to set
*/
/* function setNewName(name: string) {
if (savedName.value)
previousNames.value.add(savedName.value)
savedName.value = name
} */
return {
fetchPosts,
getCurrentPostBySlug,
loading,
initialLoad,
postList,
currentPost,
errors,
}
})
if (import.meta.hot)
import.meta.hot.accept(acceptHMRUpdate(usePostStore, import.meta.hot))