Better error handling
This commit is contained in:
parent
e687b58091
commit
b78227456e
|
@ -1,3 +1,4 @@
|
||||||
|
import get from 'lodash/get'
|
||||||
import UserCardContent from '../user_card_content/user_card_content.vue'
|
import UserCardContent from '../user_card_content/user_card_content.vue'
|
||||||
import UserCard from '../user_card/user_card.vue'
|
import UserCard from '../user_card/user_card.vue'
|
||||||
import Timeline from '../timeline/timeline.vue'
|
import Timeline from '../timeline/timeline.vue'
|
||||||
|
@ -18,8 +19,15 @@ const UserProfile = {
|
||||||
this.startFetchFavorites()
|
this.startFetchFavorites()
|
||||||
if (!this.user.id) {
|
if (!this.user.id) {
|
||||||
this.$store.dispatch('fetchUser', this.fetchBy)
|
this.$store.dispatch('fetchUser', this.fetchBy)
|
||||||
.catch(() => {
|
.catch((reason) => {
|
||||||
this.error = true
|
const errorMessage = get(reason, 'error.error')
|
||||||
|
if (errorMessage === 'No user with such user_id') { // Known error
|
||||||
|
this.error = this.$t('user_profile.profile_does_not_exist')
|
||||||
|
} else if (errorMessage) {
|
||||||
|
this.error = errorMessage
|
||||||
|
} else {
|
||||||
|
this.error = this.$t('user_profile.profile_loading_error')
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<span v-if="error">{{ $t('user_profile.profile_does_not_exist') }}</span>
|
<span v-if="error">{{ error }}</span>
|
||||||
<i class="icon-spin3 animate-spin" v-else></i>
|
<i class="icon-spin3 animate-spin" v-else></i>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -384,7 +384,8 @@
|
||||||
},
|
},
|
||||||
"user_profile": {
|
"user_profile": {
|
||||||
"timeline_title": "User Timeline",
|
"timeline_title": "User Timeline",
|
||||||
"profile_does_not_exist": "Sorry, this profile does not exist."
|
"profile_does_not_exist": "Sorry, this profile does not exist.",
|
||||||
|
"profile_loading_error": "Sorry, there was an error loading this profile."
|
||||||
},
|
},
|
||||||
"who_to_follow": {
|
"who_to_follow": {
|
||||||
"more": "More",
|
"more": "More",
|
||||||
|
|
|
@ -47,6 +47,7 @@ const MASTODON_USER_FAVORITES_TIMELINE_URL = '/api/v1/favourites'
|
||||||
import { each, map } from 'lodash'
|
import { each, map } from 'lodash'
|
||||||
import { parseStatus, parseUser, parseNotification } from '../entity_normalizer/entity_normalizer.service.js'
|
import { parseStatus, parseUser, parseNotification } from '../entity_normalizer/entity_normalizer.service.js'
|
||||||
import 'whatwg-fetch'
|
import 'whatwg-fetch'
|
||||||
|
import { StatusCodeError } from '../errors/errors'
|
||||||
|
|
||||||
const oldfetch = window.fetch
|
const oldfetch = window.fetch
|
||||||
|
|
||||||
|
@ -244,13 +245,15 @@ const denyUser = ({id, credentials}) => {
|
||||||
const fetchUser = ({id, credentials}) => {
|
const fetchUser = ({id, credentials}) => {
|
||||||
let url = `${USER_URL}?user_id=${id}`
|
let url = `${USER_URL}?user_id=${id}`
|
||||||
return fetch(url, { headers: authHeaders(credentials) })
|
return fetch(url, { headers: authHeaders(credentials) })
|
||||||
.then((data) => {
|
.then((response) => {
|
||||||
if (!data.ok) {
|
return new Promise((resolve, reject) => response.json()
|
||||||
throw Error(data.statusText)
|
.then((json) => {
|
||||||
|
if (!response.ok) {
|
||||||
|
return reject(new StatusCodeError(response.status, json, { url }, response))
|
||||||
}
|
}
|
||||||
return data
|
return resolve(json)
|
||||||
|
}))
|
||||||
})
|
})
|
||||||
.then((data) => data.json())
|
|
||||||
.then((data) => parseUser(data))
|
.then((data) => parseUser(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
export function StatusCodeError (statusCode, body, options, response) {
|
||||||
|
this.name = 'StatusCodeError'
|
||||||
|
this.statusCode = statusCode
|
||||||
|
this.message = statusCode + ' - ' + (JSON && JSON.stringify ? JSON.stringify(body) : body)
|
||||||
|
this.error = body // legacy attribute
|
||||||
|
this.options = options
|
||||||
|
this.response = response
|
||||||
|
|
||||||
|
if (Error.captureStackTrace) { // required for non-V8 environments
|
||||||
|
Error.captureStackTrace(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
StatusCodeError.prototype = Object.create(Error.prototype)
|
||||||
|
StatusCodeError.prototype.constructor = StatusCodeError
|
Loading…
Reference in New Issue