More things

This commit is contained in:
2026-10-01 02:29:21 +02:00
parent e1df4d3ae1
commit 13b659662e
54 changed files with 4409 additions and 911 deletions

View File

@@ -0,0 +1,39 @@
/* How many edit requests wait for an admin. The sidebar wears this number on
the door to the review desk, so the waiting pile shows without opening it.
Shared state rather than a ref: the sidebar draws the count, and the desk —
which already holds every request — lays the honest number on it each time
it loads or a request is decided. */
export function usePendingRequests() {
const api = `${useRuntimeConfig().public.apiBase}/api`
const { isAdmin, authHeaders } = useAuth()
const pending = useState<number>('proposals:pending', () => 0)
/* Ask the API how many wait. Only an admin is answered, so nobody else
carries a count — and a request that never got through (the backend is
restarting) leaves the last number standing rather than emptying the door. */
async function refresh() {
if (!isAdmin.value) {
pending.value = 0
return
}
try {
const { pending: waiting } = await $fetch<{ pending: number }>(
`${api}/admin/proposals/count`,
{ headers: authHeaders() }
)
pending.value = waiting
} catch {
/* keep what the door already said */
}
}
/* The desk counts its own loaded pile — same fetch that brought the requests
answers the door too, so approving or refusing keeps the number in step
without asking the API twice. */
function report(count: number) {
pending.value = count
}
return { pending, refresh, report }
}