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