feat: add useBoardPosts + useBoardChannels composables, remove useBoard
- useBoardPosts: CRUD with useState('board.posts','board.loading')
- useBoardChannels: fetch + resolveTagChannel + slackUrl helpers
- useBoard.js removed (old suggestions wrapper); only app/pages/board.vue still imports it, will be rewritten in Phase 5
This commit is contained in:
parent
1fc937a26a
commit
78db4be7ba
3 changed files with 87 additions and 6 deletions
|
|
@ -1,6 +0,0 @@
|
|||
export const useBoard = () => {
|
||||
const getSuggestions = (params = {}) =>
|
||||
$fetch('/api/board/suggestions', { params })
|
||||
|
||||
return { getSuggestions }
|
||||
}
|
||||
33
app/composables/useBoardChannels.js
Normal file
33
app/composables/useBoardChannels.js
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
/**
|
||||
* Board Channels Composable
|
||||
* Shared state + helpers for mapping board tags to Slack channels.
|
||||
*/
|
||||
export function useBoardChannels() {
|
||||
const channels = useState('board.channels', () => [])
|
||||
|
||||
async function fetchChannels() {
|
||||
const result = await $fetch('/api/board/channels')
|
||||
channels.value = result || []
|
||||
return channels.value
|
||||
}
|
||||
|
||||
function resolveTagChannel(tagSlugs = []) {
|
||||
if (!tagSlugs?.length) return null
|
||||
return (
|
||||
channels.value.find((channel) =>
|
||||
(channel.tagSlugs || []).some((slug) => tagSlugs.includes(slug))
|
||||
) || null
|
||||
)
|
||||
}
|
||||
|
||||
function slackUrl(channelId) {
|
||||
return `https://gammaspace.slack.com/archives/${channelId}`
|
||||
}
|
||||
|
||||
return {
|
||||
channels: readonly(channels),
|
||||
fetchChannels,
|
||||
resolveTagChannel,
|
||||
slackUrl,
|
||||
}
|
||||
}
|
||||
54
app/composables/useBoardPosts.js
Normal file
54
app/composables/useBoardPosts.js
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
/**
|
||||
* 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) {
|
||||
const created = await $fetch('/api/board/posts', {
|
||||
method: 'POST',
|
||||
body,
|
||||
})
|
||||
await fetchPosts()
|
||||
return created
|
||||
}
|
||||
|
||||
async function updatePost(id, body) {
|
||||
const updated = await $fetch(`/api/board/posts/${id}`, {
|
||||
method: 'PATCH',
|
||||
body,
|
||||
})
|
||||
await fetchPosts()
|
||||
return updated
|
||||
}
|
||||
|
||||
async function deletePost(id) {
|
||||
const result = await $fetch(`/api/board/posts/${id}`, {
|
||||
method: 'DELETE',
|
||||
})
|
||||
await fetchPosts()
|
||||
return result
|
||||
}
|
||||
|
||||
return {
|
||||
posts: readonly(posts),
|
||||
loading: readonly(loading),
|
||||
fetchPosts,
|
||||
createPost,
|
||||
updatePost,
|
||||
deletePost,
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue