diff --git a/package-lock.json b/package-lock.json index 135724b8..9cddb1c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,6 +35,7 @@ "vue-codemirror-lite": "^1.0.4", "vue-gtag": "^1.16.1", "vue-json-pretty": "^1.7.1", + "vue-meta": "^2.4.0", "vue-router": "^3.1.6", "vue-virtual-scroll-list": "^1.4.6", "vue2-dropzone": "^3.6.0", @@ -21327,6 +21328,22 @@ "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", "dev": true }, + "node_modules/vue-meta": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/vue-meta/-/vue-meta-2.4.0.tgz", + "integrity": "sha512-XEeZUmlVeODclAjCNpWDnjgw+t3WA6gdzs6ENoIAgwO1J1d5p1tezDhtteLUFwcaQaTtayRrsx7GL6oXp/m2Jw==", + "dependencies": { + "deepmerge": "^4.2.2" + } + }, + "node_modules/vue-meta/node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/vue-router": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.1.6.tgz", @@ -39413,6 +39430,21 @@ } } }, + "vue-meta": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/vue-meta/-/vue-meta-2.4.0.tgz", + "integrity": "sha512-XEeZUmlVeODclAjCNpWDnjgw+t3WA6gdzs6ENoIAgwO1J1d5p1tezDhtteLUFwcaQaTtayRrsx7GL6oXp/m2Jw==", + "requires": { + "deepmerge": "^4.2.2" + }, + "dependencies": { + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + } + } + }, "vue-router": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.1.6.tgz", diff --git a/package.json b/package.json index fd97ccb3..fa886893 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "vue-codemirror-lite": "^1.0.4", "vue-gtag": "^1.16.1", "vue-json-pretty": "^1.7.1", + "vue-meta": "^2.4.0", "vue-router": "^3.1.6", "vue-virtual-scroll-list": "^1.4.6", "vue2-dropzone": "^3.6.0", diff --git a/src/components/Cards/EmptyState.vue b/src/components/Cards/EmptyState.vue index 590ac600..128eff65 100644 --- a/src/components/Cards/EmptyState.vue +++ b/src/components/Cards/EmptyState.vue @@ -2,7 +2,8 @@ {{ icon }} {{ title }} - {{ text }} + {{ text }} + @@ -13,7 +14,13 @@ export default { icon: String, title: String, text: String, + htmlText: String, color: String + }, + computed: { + hasDescriptionSlot() { + return !!this.$slots.description; + } } } \ No newline at end of file diff --git a/src/constants/errors_messages_responses.js b/src/constants/errors_messages_responses.js new file mode 100644 index 00000000..8af3918a --- /dev/null +++ b/src/constants/errors_messages_responses.js @@ -0,0 +1 @@ +export const ERROR_MESSAGE_404 = 'Request failed with status code 404'; \ No newline at end of file diff --git a/src/main.js b/src/main.js index 62bb1d49..6afef3d6 100644 --- a/src/main.js +++ b/src/main.js @@ -8,6 +8,7 @@ import store from '@/store' import router from '@/router' import VueGtag from "vue-gtag"; +import VueMeta from 'vue-meta' import * as Sentry from "@sentry/vue"; import { BrowserTracing } from "@sentry/tracing"; @@ -136,23 +137,20 @@ api.getConfig().then(response => { beforeEnter: async function (to, from, next) { return await api.getContractBySlug(to.params.slug) .then(res => next(`/${res.network}/${res.address}`)) - .catch(() => next(`/search?text=${to.params.slug}`)) + .catch(() => next(`/not_found`)) } }, { path: '*', redirect: to => { const text = urlExtractBase58(to.path) || to.path.split('/').join(' '); - if (to.query.redirected) { - return { name: 'search', query: { text, redirected: 'true' } }; - } if (isKT1Address(text) || isTzAddress(text)) { return `/mainnet/${text}/operations`; } if (isOperationHash(text)) { return `/mainnet/opg/${text}/contents`; } - return { name: 'search', query: { text, redirected: 'true' } }; + return { name: 'not_found' }; } } ]); @@ -193,6 +191,8 @@ api.getConfig().then(response => { }); } + Vue.use(VueMeta); + new Vue({ router, store, diff --git a/src/router/index.js b/src/router/index.js index c49364f3..7dbd8f4b 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -32,6 +32,7 @@ import BigMapHistory from '@/views/big_map/HistoryTab.vue' import DAppList from '@/views/dapps/List.vue' import DApp from '@/views/dapps/DApp.vue' import MainDApp from '@/views/dapps/Main.vue' +import NotFound from "../views/errors/NotFound"; Vue.use(VueRouter) @@ -47,6 +48,13 @@ const router = new Router({ }, name: 'home' }, + { + path: '/not_found', + components: { + default: NotFound, + }, + name: 'not_found', + }, { path: '/search', components: { diff --git a/src/views/contract/Contract.vue b/src/views/contract/Contract.vue index 3bef7a12..1d5262f5 100644 --- a/src/views/contract/Contract.vue +++ b/src/views/contract/Contract.vue @@ -124,9 +124,13 @@ export default { return this.address.startsWith("KT"); }, }, + destroyed() { + this.hideError(); + }, methods: { ...mapActions({ showError: "showError", + hideError: "hideError", }), pushTo(obj) { return Object.assign({ @@ -175,7 +179,13 @@ export default { this.contract = res; }) .catch((err) => { - this.showError(err.message); + if (err.code === 204) { + return this.$router.push({ + name: 'not_found', + }); + } else { + this.showError(err); + } }) .finally(() => (this.contractLoading = false)); }, diff --git a/src/views/contract/OperationsTab.vue b/src/views/contract/OperationsTab.vue index aa2555ae..8014d7ce 100644 --- a/src/views/contract/OperationsTab.vue +++ b/src/views/contract/OperationsTab.vue @@ -217,8 +217,11 @@ export default { return this.address.startsWith("KT"); }, }, + destroyed() { + this.hideError(); + }, methods: { - ...mapActions(["showError"]), + ...mapActions(["showError", "hideError"]), compareOperations(a, b) { if (a.timestamp < b.timestamp) { return 1; @@ -296,7 +299,6 @@ export default { } }) .catch((err) => { - console.error(err); this.showError(err); this.downloaded = true; }) diff --git a/src/views/errors/NotFound.vue b/src/views/errors/NotFound.vue new file mode 100644 index 00000000..0e31fce0 --- /dev/null +++ b/src/views/errors/NotFound.vue @@ -0,0 +1,55 @@ + + + + + + Please, try again or write to our team in + Discord. + + + + + + GO TO HOMEPAGE + + + ADVANCED SEARCH + + + + + + + + \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index d5495798..707c6334 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11815,6 +11815,13 @@ "vue-hot-reload-api" "^2.3.0" "vue-style-loader" "^4.1.0" +"vue-meta@^2.4.0": + "integrity" "sha512-XEeZUmlVeODclAjCNpWDnjgw+t3WA6gdzs6ENoIAgwO1J1d5p1tezDhtteLUFwcaQaTtayRrsx7GL6oXp/m2Jw==" + "resolved" "https://registry.npmjs.org/vue-meta/-/vue-meta-2.4.0.tgz" + "version" "2.4.0" + dependencies: + "deepmerge" "^4.2.2" + "vue-router@^3.1.6": "integrity" "sha512-GYhn2ynaZlysZMkFE5oCHRUTqE8BWs/a9YbKpNLi0i7xD6KG1EzDqpHQmv1F5gXjr8kL5iIVS8EOtRaVUEXTqA==" "resolved" "https://registry.npmjs.org/vue-router/-/vue-router-3.1.6.tgz"