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 | 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 } })