diff --git a/src/components/StorageRequest.vue b/src/components/StorageRequest.vue index 257afda..6d28b33 100644 --- a/src/components/StorageRequest.vue +++ b/src/components/StorageRequest.vue @@ -11,6 +11,7 @@ import StateIndicator from '@/components/StateIndicator.vue' import RelativeTime from '@/components/RelativeTime.vue' import ShortenValue from '@/components/ShortenValue.vue' import Slots from './Slots.vue' +import SkeletonLoading from './SkeletonLoading.vue' const request = defineModel() const props = defineProps({ @@ -21,6 +22,14 @@ const props = defineProps({ enableModeration: { type: Boolean, default: false + }, + slotsLoading: { + type: Boolean, + default: false + }, + slotsFetched: { + type: Boolean, + default: false } }) @@ -179,7 +188,8 @@ const stateColour = computed(() => getStateColour(request.value.state)) - + + diff --git a/src/stores/requests.js b/src/stores/requests.js index dea39bf..7a9a3f3 100644 --- a/src/stores/requests.js +++ b/src/stores/requests.js @@ -144,7 +144,6 @@ export const useRequestsStore = defineStore( } return events.map((event, i) => handleStorageRequestEvent(event)) //{ - } catch (error) { console.error(`failed to load past contract events: ${error.message}`) return [] @@ -175,31 +174,41 @@ export const useRequestsStore = defineStore( } async function fetchRequestDetails(requestId) { - let start = Date.now() - console.log('fetching request', requestId) - const preFetched = requests.value[requestId] || {} - if (preFetched?.detailsFetched) { - console.log('request', requestId, 'already fetched') - return - } - loading.value = true try { - let arrRequest = await marketplace.getRequest(requestId) - let request = arrayToObject(arrRequest) - let slots = await getSlots(requestId, request.ask.slots) - const reqExisting = requests.value[requestId] || {} + // const reqExisting = requests.value[requestId] || {} + if (!requests.value[requestId]) { + requests.value[requestId] = {} + } + requests.value[requestId].detailsLoading = true + + let request = requests.value[requestId] + // fetch request details if not previously fetched + if (request?.detailsFetched !== true) { + console.log('request', requestId, ' details already fetched') + request = arrayToObject(await marketplace.getRequest(requestId)) + } + + // always fetch slots + console.log('fetching slots for request', requestId) + getSlots(requestId, request.ask.slots).then((slots) => { + requests.value[requestId].slots = slots + requests.value[requestId].slotsLoading = false + requests.value[requestId].slotsFetched = true + }) + + // update state requests.value[requestId] = { - ...reqExisting, // state, requestedAt, requestFinishedId (null) + ...requests.value[requestId], // state, requestedAt, requestFinishedId (null) ...request, - slots, - detailsFetched: true + slotsLoading: true, + detailsFetched: true, + detailsLoading: false } } catch (error) { console.error(`failed to load slots for request ${requestId}: ${error}`) throw error } finally { - console.log(`fetched request in ${(Date.now() - start) / 1000}s`) - loading.value = false + requests.value[requestId].detailsLoading = false } } diff --git a/src/views/RequestView.vue b/src/views/RequestView.vue index 3106afe..fa6e029 100644 --- a/src/views/RequestView.vue +++ b/src/views/RequestView.vue @@ -26,26 +26,21 @@ async function fetchRequest(requestId) { } const request = computed(() => requests.value[route.params.requestId]) +const detailsLoading = computed(() => requests.value[route.params.requestId].detailsLoading) -function watchRequestId() { - watch(() => route.params.requestId, fetchRequest, { immediate: true }) -} - -if (fetched.value) { - watchRequestId() -} else { - watch(() => fetched.value, watchRequestId, { once: true }) -} +watch(() => route.params.requestId, fetchRequest, { immediate: true })