32 lines
1.4 KiB
TypeScript
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 }
|
|
})
|