/** * 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?.channels || [] 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, } }