funkwhale/front/src/init/webSocket.ts

78 wiersze
2.2 KiB
TypeScript

import type { InitModule } from '~/types'
import { watchEffect, watch } from 'vue'
import { useWebSocket, whenever } from '@vueuse/core'
import useWebSocketHandler from '~/composables/useWebSocketHandler'
import useLogger from '~/composables/useLogger'
import { CLIENT_RADIOS } from '~/utils/clientRadios'
export const install: InitModule = ({ store }) => {
const logger = useLogger()
watch(() => store.state.instance.instanceUrl, () => {
const url = store.getters['instance/absoluteUrl']('/api/v1/activity')
.replace(/^http/, 'ws')
const { data, status, open, close } = useWebSocket(url, {
autoReconnect: import.meta.env.DEV ? { retries: 3 } : true,
immediate: false
})
watch(() => store.state.auth.authenticated, (authenticated) => {
if (authenticated) return open()
close()
}, { immediate: true })
whenever(data, () => {
return store.dispatch('ui/websocketEvent', JSON.parse(data.value))
})
watchEffect(() => {
logger.log('Websocket status:', status.value)
})
}, { immediate: true })
// WebSocket handlers
useWebSocketHandler('inbox.item_added', () => {
store.commit('ui/incrementNotifications', { type: 'inbox', count: 1 })
})
useWebSocketHandler('mutation.created', (event) => {
store.commit('ui/incrementNotifications', {
type: 'pendingReviewEdits',
value: event.pending_review_count
})
})
useWebSocketHandler('mutation.updated', (event) => {
store.commit('ui/incrementNotifications', {
type: 'pendingReviewEdits',
value: event.pending_review_count
})
})
useWebSocketHandler('report.created', (event) => {
store.commit('ui/incrementNotifications', {
type: 'pendingReviewReports',
value: event.unresolved_count
})
})
useWebSocketHandler('user_request.created', (event) => {
store.commit('ui/incrementNotifications', {
type: 'pendingReviewRequests',
value: event.pending_count
})
})
useWebSocketHandler('Listen', async (event) => {
if (store.state.radios.current && store.state.radios.running) {
const { current } = store.state.radios
if (current.clientOnly) {
await CLIENT_RADIOS[current.type].handleListen(current, event)
}
}
})
}