Event updates

- deduplicate events (for some reason contract event subscription callbacks are firing more than once
- order events by timestamp
- prettify event names
- give each event a unique id so they can be deleted one-by-one
This commit is contained in:
Eric 2024-07-06 12:42:24 +03:00
parent 17def5f4d3
commit b3bb759ba8
No known key found for this signature in database
3 changed files with 56 additions and 27 deletions

View File

@ -45,6 +45,11 @@ const buttonClass = computed(() => {
hover: showNotifCentre.value hover: showNotifCentre.value
} }
}) })
const eventsOrdered = computed(() => {
return Object.entries(events.value).sort(([eventIdA, eventA], [eventIdB, eventB]) => {
return eventB.timestamp - eventA.timestamp
})
})
</script> </script>
<template> <template>
@ -83,22 +88,25 @@ const buttonClass = computed(() => {
</a> </a>
</div> </div>
<div class="overflow-y-auto"> <div class="overflow-y-auto">
<div v-if="events.length === 0" class="pt-6 pb-4 text-gray-900 dark:text-white"> <div
v-if="!events.value || Object.keys(events.value).length === 0"
class="pt-6 pb-4 text-gray-900 dark:text-white"
>
No events No events
</div> </div>
<div class="flow-root"> <div class="flow-root">
<ul role="list" class="text-left divide-y divide-gray-200 dark:divide-gray-700"> <ul role="list" class="text-left divide-y divide-gray-200 dark:divide-gray-700">
<li <li
v-for="( v-for="(
{ event, blockNumber, requestId, slotIdx, state, timestamp, moderated }, idx [eventId, { event, blockNumber, requestId, slotIdx, state, timestamp, moderated }],
) in events" idx
:key="idx" ) in eventsOrdered"
class="py-3 pr-2 pl-4 pb-3 text-gray-900 dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700" :key="eventId"
class="cursor-pointer py-3 pr-2 pl-4 pb-3 text-gray-900 dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700"
@click="dismissAndRedirect(requestId)" @click="dismissAndRedirect(requestId)"
> >
<div class="flex items-center"> <div class="flex items-center">
<div class="flex-shrink-0"> <div class="flex-shrink-0">
<!-- <span class="w-8 h-8 rounded-full" alt="Neil image" /> -->
<CodexImage <CodexImage
:cid="request(requestId).request.content.cid" :cid="request(requestId).request.content.cid"
:moderated="moderated" :moderated="moderated"
@ -107,10 +115,10 @@ const buttonClass = computed(() => {
/> />
</div> </div>
<div class="flex-1 min-w-0 ms-4"> <div class="flex-1 min-w-0 ms-4">
<p class="text-md font-semibold"> <p class="text-md">
<ShortenValue :value="requestId"></ShortenValue> <ShortenValue :value="requestId"></ShortenValue>
</p> </p>
<p class="text-sm font-medium text-gray-900 truncate dark:text-white"> <p class="text-sm text-gray-900 truncate dark:text-white">
{{ event }} {{ event }}
</p> </p>
<div <div
@ -123,7 +131,7 @@ const buttonClass = computed(() => {
<div class="text-sm text-gray-500 truncate dark:text-gray-400"> <div class="text-sm text-gray-500 truncate dark:text-gray-400">
<RelativeTime :timestamp="new Date(timestamp * 1000)"></RelativeTime> <RelativeTime :timestamp="new Date(timestamp * 1000)"></RelativeTime>
</div> </div>
<div class="pl-2 cursor-pointer" @click="emit('clearEvent', idx)"> <div class="pl-2 cursor-pointer" @click.stop="emit('clearEvent', eventId)">
<svg <svg
class="w-5 h-5 text-gray-300 hover:text-gray-400 dark:text-gray-600 dark:hover:text-gray-400" class="w-5 h-5 text-gray-300 hover:text-gray-400 dark:text-gray-600 dark:hover:text-gray-400"
aria-hidden="true" aria-hidden="true"

View File

@ -20,29 +20,49 @@ export const useEventsStore = defineStore(
SlotFilled, SlotFilled,
SlotFreed SlotFreed
} = marketplace.filters } = marketplace.filters
const events = ref([]) // {event: 'SlotFreed',blockNumber,requestId,slotIdx,state: 'Free'} const events = ref({}) // {event: 'SlotFreed',blockNumber,requestId,slotIdx,state: 'Free'}
const id = (event, blockNumber, requestId, slotIdx) => {
return `${event}_${blockNumber}_${requestId}_${slotIdx}`
}
function add({ event, blockNumber, requestId, slotIdx, state, timestamp, moderated }) { function add({ event, blockNumber, requestId, slotIdx, state, timestamp, moderated }) {
events.value.push({ event, blockNumber, requestId, slotIdx, state, timestamp, moderated }) let eventId = id(event, blockNumber, requestId, slotIdx)
events.value[eventId] = {
event,
blockNumber,
requestId,
slotIdx,
state,
timestamp,
moderated
}
} }
function clearEvents() { function clearEvents() {
events.value = [] events.value = {}
} }
function clearEvent(idx) { function clearEvent(eventId) {
events.value = events.value.filter((_, index) => index !== idx) delete events.value[eventId]
// events.value = events.value.filter((_, index) => index !== idx)
} }
function updateModerated(requestId, moderated) { function updateModerated(requestId, moderated) {
events.value = events.value.map((event) => { for ([eventId, { reqId }] in Object.entries(events.value)) {
if (event) { if (reqId === requestId) {
if (event.requestId === requestId) { events.value[eventId].moderated = moderated
event.moderated = moderated break
}
return event
} }
}) }
// events.value = events.value.map((event) => {
// if (event) {
// if (event.requestId === requestId) {
// event.moderated = moderated
// }
// return event
// }
// })
} }
async function listenForNewEvents() { async function listenForNewEvents() {

View File

@ -1,10 +1,11 @@
export const StorageEvent = { export const StorageEvent = {
StorageRequested: 'StorageRequested', // storage was requested StorageRequested: 'Storage requested', // storage was requested
RequestFulfilled: 'RequestFulfilled', // request has started (all slots filled) RequestFulfilled: 'Request fulfilled (started)', // request has started (all slots filled)
RequestCancelled: 'RequestCancelled', // request was cancelled when not all slots were filled by the expiry RequestCancelled: 'Request cancelled', // request was cancelled when not all slots were filled by the expiry
RequestFailed: 'RequestFailed', // the request has failed (too many slots freed) RequestFailed: 'Request failed', // the request has failed (too many slots freed)
SlotFilled: 'SlotFilled', // slot was filled by provider (providing proof and collateral) SlotFilled: 'Slot filled', // slot was filled by provider (providing proof and collateral)
SlotFreed: 'SlotFreed' // slot freed after provider missed too many proofs SlotFreed: 'Slot freed', // slot freed after provider missed too many proofs
RequestFinished: 'Request finished'
} }
export function toSlotState(idx) { export function toSlotState(idx) {