Adding a ton of stuff

This commit is contained in:
2026-07-17 04:39:18 -07:00
parent 8d9fe8e75d
commit de28a67417
63 changed files with 2027 additions and 613 deletions
+83
View File
@@ -0,0 +1,83 @@
import { type Ref, reactive, toRefs, unref, watch } from "vue"
import { isNil } from "lodash"
import blogPostsApi, { type BlogPost } from "@/api/blog-posts-api"
export { type BlogPost }
export function useBlogPost(idOrSlug: Ref<number | string | null | undefined>) {
const state = reactive<{
blogPost: BlogPost | null
isLoading: boolean
isErrored: boolean
}>({
blogPost: null,
isLoading: false,
isErrored: false,
})
async function fetch(): Promise<BlogPost> {
const staticIdOrSlug = unref(idOrSlug)
if (isNil(staticIdOrSlug)) {
throw new Error("idOrSlug is required")
}
state.isLoading = true
try {
const { blogPost } = await blogPostsApi.get(staticIdOrSlug)
state.isErrored = false
state.blogPost = blogPost
return blogPost
} catch (error) {
console.error("Failed to fetch blog post:", error)
state.isErrored = true
throw error
} finally {
state.isLoading = false
}
}
async function save(): Promise<BlogPost> {
const staticIdOrSlug = unref(idOrSlug)
if (isNil(staticIdOrSlug)) {
throw new Error("idOrSlug is required")
}
if (isNil(state.blogPost)) {
throw new Error("No blog post to save")
}
state.isLoading = true
try {
const { blogPost } = await blogPostsApi.update(staticIdOrSlug, state.blogPost)
state.isErrored = false
state.blogPost = blogPost
return blogPost
} catch (error) {
console.error("Failed to save blog post:", error)
state.isErrored = true
throw error
} finally {
state.isLoading = false
}
}
watch(
() => unref(idOrSlug),
async (newIdOrSlug) => {
if (isNil(newIdOrSlug)) return
await fetch()
},
{ immediate: true }
)
return {
...toRefs(state),
fetch,
refresh: fetch,
save,
}
}
export default useBlogPost