54 lines
1.2 KiB
JavaScript
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?.posts || []
|
|
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,
|
|
}
|
|
}
|