Better error handling

This commit is contained in:
taehoon 2019-02-26 12:26:04 -05:00
parent e687b58091
commit b78227456e
5 changed files with 36 additions and 10 deletions

View file

@ -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')
}
}) })
} }
}, },

View file

@ -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>

View file

@ -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",

View file

@ -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))
} }

View file

@ -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