diff --git a/apps/web/src/pages/AdminHomePage.vue b/apps/web/src/pages/AdminHomePage.vue index 783ee08..010e68e 100644 --- a/apps/web/src/pages/AdminHomePage.vue +++ b/apps/web/src/pages/AdminHomePage.vue @@ -4,10 +4,12 @@ import { RouterLink } from 'vue-router'; import { useAuth } from '@/composables/useAuth.js'; import { createAdminInventory, createAdminProduct, listAdminCategories, listAdminConditions, listAdminInventory, listAdminProducts } from '@/services/admin-catalog-service.js'; +import { createAdminListing, listAdminListings, markListingPending, publishAdminListing } from '@/services/admin-listing-service.js'; const { principal } = useAuth(); const products = ref([]); const inventory = ref([]); +const listings = ref([]); const categories = ref([]); const conditions = ref([]); const isLoading = ref(true); @@ -17,6 +19,8 @@ const productName = ref(''); const categoryId = ref(''); const inventoryProductId = ref(''); const conditionId = ref(''); +const listingInventoryId = ref(''); +const askingPrice = ref(''); function csrfToken() { return document.cookie.split('; ').find((value) => value.startsWith('pokemon_inventory_csrf='))?.split('=')[1] ?? ''; @@ -25,7 +29,7 @@ function csrfToken() { async function load() { isLoading.value = true; try { - [products.value, inventory.value, categories.value, conditions.value] = await Promise.all([listAdminProducts(), listAdminInventory(), listAdminCategories(), listAdminConditions()]); + [products.value, inventory.value, categories.value, conditions.value, listings.value] = await Promise.all([listAdminProducts(), listAdminInventory(), listAdminCategories(), listAdminConditions(), listAdminListings()]); } catch (requestError) { error.value = requestError; } finally { isLoading.value = false; } } @@ -49,6 +53,27 @@ async function createInventory() { finally { isSaving.value = false; } } +async function createListing() { + const item = inventory.value.find((candidate) => candidate.id === listingInventoryId.value); + const product = products.value.find((candidate) => candidate.id === item?.productId); + isSaving.value = true; + try { + const listing = await createAdminListing({ inventoryItemId: item.id, productName: product.name, categoryId: product.categoryId, conditionId: item.conditionId, askingPriceMinor: Number(askingPrice.value) }, csrfToken()); + listings.value.push(listing); + askingPrice.value = ''; + } catch (requestError) { error.value = requestError; } + finally { isSaving.value = false; } +} + +async function transitionListing(action, id) { + isSaving.value = true; + try { + const listing = await action(id, csrfToken()); + listings.value = listings.value.map((candidate) => candidate.id === listing.id ? listing : candidate); + } catch (requestError) { error.value = requestError; } + finally { isSaving.value = false; } +} + onMounted(load); @@ -86,6 +111,17 @@ onMounted(load); +
No physical copies yet.
No listings yet.
+