fix(RolePicker): add error handling to help with tracing

This commit is contained in:
41666 2020-02-10 23:47:19 -05:00
parent 0e70e2590b
commit 288fc3e80a
4 changed files with 37 additions and 2 deletions

View file

@ -1,3 +1,7 @@
const ksuid = require('ksuid')
const log = new (require('../logger'))('api/servers')
module.exports = (R, $) => {
const getGm = async (id, userId) => {
let gm
@ -41,9 +45,16 @@ module.exports = (R, $) => {
return
}
const server = await $.P.presentableServer(srv, gm)
try {
const server = await $.P.presentableServer(srv, gm)
ctx.body = server
} catch (e) {
const txid = await ksuid.random()
log.error(`presentable render failed -- txid: ${txid}`, id, userId, gm)
ctx.status = 500
ctx.body = { err: 'render_failed', txid }
}
ctx.body = server
})
R.get('/api/server/:id/slug', async ctx => {

View file

@ -6,6 +6,16 @@ export const setup = id => async dispatch => {
const rsp = await superagent.get(`/api/server/${id}`)
const data = rsp.body
if (rsp.status === 500) {
dispatch({
type: Symbol.for('rp: error'),
data: {
txid: data.txid,
}
})
}
dispatch({
type: Symbol.for('server: set'),
data: {

View file

@ -67,6 +67,12 @@ class RolePicker extends Component {
dispatch(Actions.closeMessageEditor)
}
renderError() {
return <div className={`inner role-picker`}>
<pre>Something went terribly wrong. Please share this magical incantation in the Roleypoly Discord: {this.props.data.error.txid}</pre>
</div>
}
renderServerMessage(server) {
const isEditing = this.props.data.get('isEditingMessage')
const roleManager = server.getIn(['perms', 'canManageRoles'])
@ -140,6 +146,10 @@ class RolePicker extends Component {
const { data, server, dispatch } = this.props
const vm = data.get('viewMap')
if (data.error) {
return this.renderError()
}
if (server === undefined) {
return null
}

View file

@ -8,6 +8,7 @@ const initialState = Map({
viewMap: OrderedMap({}), // roles in categories
originalRolesSelected: Map({}), // Map<role id, bool> -- original roles for diffing against selected
rolesSelected: Map({}), // Map<role id, bool> -- new roles for diffing
error: null,
})
export default (state = initialState, { type, data }) => {
@ -38,6 +39,9 @@ export default (state = initialState, { type, data }) => {
// case Symbol.for('rp: zero role picker'):
// return initialState
case Symbol.for('rp: error'):
return state.set('error', data)
default:
return state
}