Files
FEDEO/frontend/composables/useDocumentInboxCount.ts
flfeders d7382e7319
All checks were successful
Build and Release FEDEO / verify (push) Successful in 56s
Build and Release FEDEO / build-and-release (push) Successful in 5m58s
feat(documents): prepare inbox suggestions and add entity assignments
2026-10-02 16:09:04 +02:00

32 lines
1.4 KiB
TypeScript

import { createSharedComposable } from "@vueuse/core"
export const useDocumentInboxCount = createSharedComposable(() => {
const auth = useAuthStore()
const { $api } = useNuxtApp()
const count = ref(0)
const scope = computed(() => auth.user?.id && auth.activeTenant && !auth.profile?.customer_for_portal && auth.activeTenantData?.features?.files !== false
? `${auth.user.id}:${auth.activeTenant}` : "")
let version = 0
let disposed = false
let controller: AbortController | undefined
let timer: ReturnType<typeof setTimeout> | undefined
const refresh = async () => {
const request = ++version
clearTimeout(timer)
controller?.abort()
if (!scope.value || disposed) { count.value = 0; return }
controller = new AbortController()
try {
const result = await $api<{ total: number }>("/api/document-inbox/count", { signal: controller.signal })
if (!disposed && request === version) count.value = Math.max(0, Number(result.total) || 0)
} catch {
if (request === version) count.value = 0
} finally {
if (!disposed && request === version && scope.value) timer = setTimeout(refresh, 10000)
}
}
watch(scope, () => { count.value = 0; void refresh() }, { immediate: true, flush: "sync" })
onScopeDispose(() => { disposed = true; version++; controller?.abort(); clearTimeout(timer) })
return { count, refresh }
})