import type { mastodon } from 'masto' import type { Ref } from 'vue' // Batch requests for relationships when used in the UI // We don't want to hold to old values, so every time a Relationship is needed it // is requested again from the server to show the latest state const requestedRelationships = new Map>() let timeoutHandle: NodeJS.Timeout | undefined export function useRelationship(account: mastodon.v1.Account): Ref { if (!currentUser.value) return ref() let relationship = requestedRelationships.get(account.id) if (relationship) return relationship relationship = ref() requestedRelationships.set(account.id, relationship) if (timeoutHandle) clearTimeout(timeoutHandle) timeoutHandle = setTimeout(() => { timeoutHandle = undefined fetchRelationships() }, 100) return relationship } async function fetchRelationships() { const requested = Array.from(requestedRelationships.entries()).filter(([, r]) => !r.value) const relationships = await useMasto().v1.accounts.fetchRelationships(requested.map(([id]) => id)) for (let i = 0; i < requested.length; i++) requested[i][1].value = relationships[i] }