v1/UI/src/components/role-picker/actions.js

94 lines
2.5 KiB
JavaScript

import { Map, Set, fromJS } from 'immutable'
import superagent from 'superagent'
import * as UIActions from '../../actions/ui'
export const setup = id => async dispatch => {
// const rsp = await superagent.get(`/api/server/${id}`)
// const data = rsp.body
// dispatch({
// type: Symbol.for('update server roles'),
// data: {
// id,
// roles: data
// }
// })
dispatch(constructView(id))
}
export const constructView = id => (dispatch, getState) => {
const server = getState().servers.get(id)
const roles = server.get('roles')
const categories = server.get('categories')
const allRoles = server.get('roles').filter(v => v.get('safe')).map(r => r.get('id')).toSet()
const accountedRoles = categories.map(c => c.get('roles')).toSet().flatten()
const unaccountedRoles = allRoles.subtract(accountedRoles)
// console.log('roles', allRoles.toJS(), accountedRoles.toJS(), unaccountedRoles.toJS())
const vm = categories.set('Uncategorized', fromJS({
roles: unaccountedRoles,
hidden: false,
type: 'multi'
})).map(c => {
const roles = c.get('roles')
.map(r =>
server.get('roles').find(sr => sr.get('id') === r)
)
.sort((a, b) => a.position > b.position)
return c.set('roles_map', roles)
})
const selected = roles.reduce((acc, r) => acc.set(r.get('id'), r.get('selected')), Map())
console.log(categories, selected)
dispatch({
type: Symbol.for('setup role picker'),
data: {
viewMap: vm,
rolesSelected: selected,
originalRolesSelected: selected,
hidden: false
}
})
dispatch(UIActions.fadeIn)
}
export const resetSelected = (dispatch) => {
dispatch({
type: Symbol.for('reset selected')
})
}
export const submitSelected = serverId => async (dispatch, getState) => {
const { rolePicker } = getState()
const original = rolePicker.get('originalRolesSelected')
const current = rolePicker.get('rolesSelected')
const diff = original.reduce((acc, v, k) => {
if (current.get(k) !== v) {
// if original value is false, then we know we're adding, otherwise removing.
if (v !== true) {
return acc.set('added', acc.get('added').add(k))
} else {
return acc.set('removed', acc.get('removed').add(k))
}
}
return acc
}, Map({ added: Set(), removed: Set() }))
await superagent.patch(`/api/servers/${serverId}/roles`).send(diff.toJS())
dispatch({
type: Symbol.for('sync selected roles')
})
}
export const updateRoles = roles => ({
type: Symbol.for('update selected roles'),
data: roles
})