diff --git a/src/components/NotFound.vue b/src/components/NotFound.vue new file mode 100644 index 0000000..7d72fdc --- /dev/null +++ b/src/components/NotFound.vue @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index 76cb7dd..18ff99c 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,6 +1,7 @@ import { createRouter, createWebHistory } from 'vue-router' import RequestsView from '../views/RequestsView.vue' import RequestView from '../views/RequestView.vue' +import NotFoundView from '../views/NotFoundView.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -23,6 +24,11 @@ const router = createRouter({ name: 'request', component: RequestView, props: true // pass :requestId to props in RequestView + }, + { + path: '/404', + name: 'NotFound', + component: NotFoundView } ] }) diff --git a/src/stores/requests.js b/src/stores/requests.js index 6b1ff69..5b83f1c 100644 --- a/src/stores/requests.js +++ b/src/stores/requests.js @@ -124,6 +124,9 @@ export const useRequestsStore = defineStore('request', () => { loading.value = false } }) + if (events.length === 0) { + loading.value = false + } // reqs.forEach((request, requestId) => requests.value.set(requestId, request)) } catch (error) { console.error(`failed to load past contract events: ${error.message}`) diff --git a/src/views/NotFoundView.vue b/src/views/NotFoundView.vue new file mode 100644 index 0000000..ad813a8 --- /dev/null +++ b/src/views/NotFoundView.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/views/RequestView.vue b/src/views/RequestView.vue index 1dba19c..b0de89a 100644 --- a/src/views/RequestView.vue +++ b/src/views/RequestView.vue @@ -2,24 +2,28 @@ import { computed, ref, watch } from 'vue' import { storeToRefs } from 'pinia' import { useRequestsStore } from '@/stores/requests' -import { useRoute } from 'vue-router' +import { useRoute, useRouter } from 'vue-router' import StorageRequest from '@/components/StorageRequest.vue' import SkeletonLoading from '@/components/SkeletonLoading.vue' const requestsStore = useRequestsStore() const { requests, loading } = storeToRefs(requestsStore) const route = useRoute() -const isLoading = computed( - () => - loading.value || - !requests.value || - requests.value.size === 0 || - !requests.value.has(route.params.requestId) -) +const router = useRouter() +const isLoading = computed(() => loading.value) const requestId = ref(route.params.requestId) const request = ref(requests?.value?.get(requestId.value)) +const requestNotFound = computed( + () => + !isLoading.value && requests.value !== undefined && !requests.value.get(route.params.requestId) +) function getRequestFromStore(_) { - request.value = requests?.value?.get(route.params.requestId) + let req = requests?.value?.get(route.params.requestId) + if (requestNotFound.value) { + router.push({ name: 'NotFound' }) + } else { + request.value = req + } } watch(() => route.params.requestId, getRequestFromStore) watch(() => isLoading.value, getRequestFromStore) @@ -28,6 +32,10 @@ watch(() => isLoading.value, getRequestFromStore) diff --git a/src/views/RequestsView.vue b/src/views/RequestsView.vue index 55819e5..8bc54df 100644 --- a/src/views/RequestsView.vue +++ b/src/views/RequestsView.vue @@ -7,9 +7,7 @@ import { computed } from 'vue' const requestsStore = useRequestsStore() const { loading, requests } = storeToRefs(requestsStore) -const isLoading = computed( - () => loading.value || !requests.value -) +const isLoading = computed(() => loading.value || !requests.value)