ghostguild-org/app/composables/useBoardPosts.js

54 lines
1.2 KiB
JavaScript

/**
* Board Posts Composable
* Shared state + CRUD for board posts.
*/
export function useBoardPosts() {
const posts = useState('board.posts', () => [])
const loading = useState('board.loading', () => false)
async function fetchPosts(params = {}) {
loading.value = true
try {
const result = await $fetch('/api/board/posts', { params })
posts.value = result || []
return posts.value
} finally {
loading.value = false
}
}
async function createPost(body, refreshParams = {}) {
const created = await $fetch('/api/board/posts', {
method: 'POST',
body,
})
await fetchPosts(refreshParams)
return created
}
async function updatePost(id, body, refreshParams = {}) {
const updated = await $fetch(`/api/board/posts/${id}`, {
method: 'PATCH',
body,
})
await fetchPosts(refreshParams)
return updated
}
async function deletePost(id, refreshParams = {}) {
const result = await $fetch(`/api/board/posts/${id}`, {
method: 'DELETE',
})
await fetchPosts(refreshParams)
return result
}
return {
posts: readonly(posts),
loading: readonly(loading),
fetchPosts,
createPost,
updatePost,
deletePost,
}
}