bilhej/frontend/src/composables/useAdminOrders.ts
Joakim Mörling c7eeaf6a6b
All checks were successful
CI / Lint, type check, unit tests, coverage (pull_request) Successful in 2m9s
CI / E2E browser tests (pull_request) Successful in 4m1s
Refactor admin fulfillment into focused modules.
Extract AdminOrderWorkflowService and status rules API; split AdminPage
into composables and components; share order status constants; update tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-28 14:34:03 +02:00

89 lines
2.3 KiB
TypeScript

import { ref, computed } from 'vue'
import { fetchAllOrders, type AdminOrder } from '@/api/admin'
import { PAID_GROUP_STATUSES } from '@/constants/orderStatus'
export type AdminOrderFilter =
| 'all'
| 'processing'
| 'paid_group'
| 'pending_payment'
export function useAdminOrders() {
const orders = ref<AdminOrder[]>([])
const loading = ref(true)
const error = ref('')
const activeFilter = ref<AdminOrderFilter>('all')
const searchQuery = ref('')
const stats = computed(() => {
const total = orders.value.length
const todo = orders.value.filter((o) => o.status === 'processing').length
const paid = orders.value.filter((o) =>
PAID_GROUP_STATUSES.includes(
o.status as (typeof PAID_GROUP_STATUSES)[number],
),
).length
const pending = orders.value.filter(
(o) => o.status === 'pending_payment',
).length
return { total, todo, paid, pending }
})
const filteredOrders = computed(() => {
let result = orders.value
if (activeFilter.value === 'processing') {
result = result.filter((o) => o.status === 'processing')
} else if (activeFilter.value === 'paid_group') {
result = result.filter((o) =>
PAID_GROUP_STATUSES.includes(
o.status as (typeof PAID_GROUP_STATUSES)[number],
),
)
} else if (activeFilter.value === 'pending_payment') {
result = result.filter((o) => o.status === 'pending_payment')
}
const query = searchQuery.value.trim().toLowerCase()
if (query) {
result = result.filter(
(o) =>
o.id.toLowerCase().includes(query) ||
o.plate.toLowerCase().includes(query),
)
}
return result
})
async function loadOrders() {
loading.value = true
error.value = ''
try {
orders.value = await fetchAllOrders()
} catch {
error.value = 'Kunde inte hämta beställningar. Försök igen senare.'
} finally {
loading.value = false
}
}
function replaceOrder(updated: AdminOrder) {
const index = orders.value.findIndex((o) => o.id === updated.id)
if (index !== -1) {
orders.value[index] = updated
}
}
return {
orders,
loading,
error,
activeFilter,
searchQuery,
stats,
filteredOrders,
loadOrders,
replaceOrder,
}
}