bug fixes

- prevent reload of page when clicking alert "view details" button
- when on the request details page, navigating to a different request, eg via an alert button, works without refreshing the page (data is fetched from the store)
- fixed bug with inserting data into the store on StorageRequested event
- fixed blockNumber not being inserted into the store
This commit is contained in:
Eric 2024-06-12 17:46:19 +10:00
parent d53f5b8aca
commit 28bdd3f3e7
No known key found for this signature in database
8 changed files with 63 additions and 28 deletions

View File

@ -12,6 +12,7 @@ ${CODEX_PATH}/build/codex \
--log-level='INFO;TRACE:marketplace,node,statemachine,erasure' \
--api-port=8080 \
--api-bindaddr=0.0.0.0 \
--api-cors-origin='*' \
--metrics=true \
--listen-addrs=/ip4/0.0.0.0/tcp/8070 \
--disc-port=8090 \

View File

@ -18,7 +18,7 @@ function addAlert(type, event, state) {
type,
event,
blockNumber: 123456,
requestId: 1234567890 + ++id.value,
requestId: '0x1a93c8ea68a45dadc599f38858b3fdcb3c442aea0f6180c20e3f08614c251041',
state
})
}
@ -29,7 +29,7 @@ function addSlotAlert(type, event, state) {
type,
event,
blockNumber: 123456,
requestId: 1234567890 + ++id.value,
requestId: '0x0d08d8fa3df9d79f1c57a34ebc6a8050ae91fca2c0d6f7191470cbbf38a048bd',
slotIdx: 1,
state
})

View File

@ -14,7 +14,11 @@ onMounted(() => {
v-for="{ event, blockNumber, requestId, slotIdx, state, type } in alerts"
:key="event + blockNumber + requestId"
>
<AlertWithContent :id="event + blockNumber + requestId" :title="event" :type="type"
<AlertWithContent
:id="event + blockNumber + requestId"
:title="event"
:type="type"
:btn-more-url="`/request/${requestId}`"
><p>request {{ requestId }} at block {{ blockNumber }}</p>
<p v-if="slotIdx">Slot index: {{ slotIdx }}</p>
<p>State: {{ state }}</p></AlertWithContent

View File

@ -1,6 +1,7 @@
<script setup>
import { computed } from 'vue'
import { getStateColour, price } from '@/utils/requests'
import { autoPluralize } from '@/utils/strings'
import CodexImage from '@/components/CodexImage.vue'
import StateIndicator from '@/components/StateIndicator.vue'
@ -19,6 +20,9 @@ const props = defineProps({
})
const totalPrice = computed(() => price(props.request))
const maxSlotLoss = computed(() => autoPluralize(props.request.ask.maxSlotLoss, 'slot'))
const slots = computed(() => autoPluralize(props.request.ask.slots, 'slot'))
const stateColour = computed(() => getStateColour(props.request.state))
</script>
<template>
@ -33,7 +37,7 @@ const totalPrice = computed(() => price(props.request))
</h2>
<StateIndicator
:text="request.state"
:color="getStateColour(request.state)"
:color="stateColour"
size="lg"
></StateIndicator>
</div>
@ -115,6 +119,16 @@ const totalPrice = computed(() => price(props.request))
</td>
<td class="px-6 py-2 font-light">{{ request.ask.collateral }} CDX</td>
</tr>
<tr
class="bg-white dark:bg-transparent hover:bg-gray-50 dark:hover:tbg-gray-600 text-base"
>
<td
class="flex items-center pr-1 py-2 font-medium text-gray-900 whitespace-nowrap dark:text-white border-r"
>
Slots
</td>
<td class="px-6 py-2 font-light">{{ slots }}</td>
</tr>
<tr class="bg-white dark:bg-transparent hover:bg-gray-50 dark:hover:bg-gray-600 text-base">
<td
class="flex items-center pr-1 py-2 font-medium text-gray-900 whitespace-nowrap dark:text-white border-r"
@ -122,7 +136,7 @@ const totalPrice = computed(() => price(props.request))
Max slot loss
</td>
<td class="px-6 py-2 font-light">
{{ request.ask.maxSlotLoss }} {{ request.ask.maxSlotLoss == 1 ? 'slot' : 'slots' }}
{{ maxSlotLoss }}
</td>
</tr>
</tbody>

View File

@ -1,6 +1,7 @@
<script setup>
import { onMounted, reactive, ref } from 'vue'
import { initDismisses } from 'flowbite'
import { RouterLink } from 'vue-router'
const props = defineProps({
id: {
@ -26,7 +27,7 @@ const props = defineProps({
default: 'View more'
},
btnMoreUrl: {
type: URL,
type: String,
required: true
}
})
@ -174,8 +175,8 @@ onMounted(() => {
<slot></slot>
</div>
<div class="flex">
<a
href="{{ btnMoreUrl }}"
<RouterLink
:to="btnMoreUrl"
class="text-white focus:ring-4 focus:outline-none font-medium rounded-lg text-xs px-3 py-1.5 me-2 text-center inline-flex items-center"
:class="theme.btnMore"
>
@ -191,7 +192,7 @@ onMounted(() => {
/>
</svg>
{{ btnMoreText }}
</a>
</RouterLink>
<button
type="button"
class="bg-transparent border hover:text-white focus:ring-4 focus:outline-none font-medium rounded-lg text-xs px-3 py-1.5 text-center dark:hover:text-white"

View File

@ -152,12 +152,17 @@ export const useRequestsStore = defineStore('request', () => {
onSlotFilled
) {
marketplace.on(StorageRequested, async (requestId, ask, expiry, event) => {
let { blockNumber } = event
let request = await marketplace.getRequest(requestId)
let { blockNumber } = event.log
let arrRequest = await marketplace.getRequest(requestId)
let request = arrayToObject(arrRequest)
let state = await getRequestState(requestId)
let slots = getSlots(requestId, request)
requests.value.set(requestId, { request, state, slots, requestFinishedId: null })
let slots = await getSlots(requestId, request.ask.slots)
requests.value.set(requestId, {
...request,
state,
slots,
requestFinishedId: null
})
// callback
if (onStorageRequested) {
@ -176,7 +181,7 @@ export const useRequestsStore = defineStore('request', () => {
updateRequestState(requestId, 'Fulfilled')
updateRequestFinishedId(requestId, requestFinishedId)
let { blockNumber } = event
let { blockNumber } = event.log
if (onRequestFulfilled) {
onRequestFulfilled(blockNumber, requestId)
}
@ -184,7 +189,7 @@ export const useRequestsStore = defineStore('request', () => {
marketplace.on(RequestCancelled, async (requestId, event) => {
updateRequestState(requestId, 'Cancelled')
let { blockNumber } = event
let { blockNumber } = event.log
if (onRequestCancelled) {
onRequestCancelled(blockNumber, requestId)
}
@ -193,7 +198,7 @@ export const useRequestsStore = defineStore('request', () => {
updateRequestState(requestId, 'Failed')
cancelWaitForRequestFinished(requestId)
let { blockNumber } = event
let { blockNumber } = event.log
if (onRequestFailed) {
onRequestFailed(blockNumber, requestId)
}
@ -201,7 +206,7 @@ export const useRequestsStore = defineStore('request', () => {
marketplace.on(SlotFreed, async (requestId, slotIdx, event) => {
updateRequestSlotState(requestId, slotIdx, 'Freed')
let { blockNumber } = event
let { blockNumber } = event.log
if (onSlotFreed) {
onSlotFreed(blockNumber, requestId, slotIdx)
}
@ -209,7 +214,7 @@ export const useRequestsStore = defineStore('request', () => {
marketplace.on(SlotFilled, async (requestId, slotIdx, event) => {
updateRequestSlotState(requestId, slotIdx, 'Filled')
let { blockNumber } = event
let { blockNumber } = event.log
if (onSlotFilled) {
onSlotFilled(blockNumber, requestId, slotIdx)
}

3
src/utils/strings.js Normal file
View File

@ -0,0 +1,3 @@
export function autoPluralize(amount, singular) {
return `${amount} ${amount == 1 ? singular : singular + 's'}`
}

View File

@ -1,5 +1,5 @@
<script setup>
import { computed } from 'vue'
import { computed, ref, watch } from 'vue'
import { storeToRefs } from 'pinia'
import { useRequestsStore } from '@/stores/requests'
import { useRoute } from 'vue-router'
@ -8,15 +8,22 @@ import SkeletonLoading from '@/components/SkeletonLoading.vue'
const requestsStore = useRequestsStore()
const { requests, loading, fetched } = storeToRefs(requestsStore)
const isLoading = computed(() =>
!fetched.value ||
loading.value ||
!requests.value ||
requests.value.size === 0 ||
!requests.value.has(route.params.requestId)
)
const request = computed(() => requests?.value?.get(route.params.requestId) )
const route = useRoute()
const isLoading = computed(
() =>
!fetched.value ||
loading.value ||
!requests.value ||
requests.value.size === 0 ||
!requests.value.has(route.params.requestId)
)
const requestId = ref(route.params.requestId)
const request = ref(requests?.value?.get(requestId.value))
function getRequestFromStore(_) {
request.value = requests?.value?.get(route.params.requestId)
}
watch(() => route.params.requestId, getRequestFromStore)
watch(() => isLoading.value, getRequestFromStore)
</script>
<template>