first bit of the role picker

This commit is contained in:
41666 2019-03-21 03:18:25 -05:00
parent 4b6e6f194b
commit 456da9cd0c
3 changed files with 145 additions and 26 deletions

View file

@ -2,6 +2,7 @@
import { dynamicPropertyConfig } from 'fast-redux'
// import { Map } from 'immutable'
import type { PresentableServer } from '../../services/presentation'
import type { Category } from '../../models/Server'
import RPC from '../config/rpc'
import { action } from './servers'
@ -15,7 +16,8 @@ const DEFAULT_STATE: $Shape<PresentableServer> | { id: ?string } = {
},
gm: {
nickname: 'person',
color: '#ff00ff'
color: '#ff00ff',
roles: ['0000']
},
categories: {},
perms: {
@ -46,7 +48,7 @@ export const fetchServerIfNeed = (id: string, rpc?: typeof RPC) => async (dispat
if (state.id == null || state.id !== id) {
const server = await rpc.getServer(id)
dispatch(updateCurrentServer(id, server))
console.log({ state, server, fullStore: getState() })
// console.log({ state, server, fullStore: getState() })
} else {
console.log('did not update')
}

View file

@ -1,10 +1,105 @@
// @flow
// import { action } from './servers'
import { namespaceConfig } from 'fast-redux'
import { getCurrentServerState } from './currentServer'
import { OrderedMap, OrderedSet, Set } from 'immutable'
import { getCurrentServerState, type ServerState } from './currentServer'
export const { action, getState: getCurrentRoles } = namespaceConfig('roles', {})
export const updateCurrentRoles = action('updateCurrentRoles', (state, data) => data)
export const renderRoles = (dispatch, getState) => {
const server = getCurrentServerState(getState())
type RenderedRole = {
id: string,
name: string,
color: string
}
type RenderedCategory = {
id: string,
name: string,
_roles?: RenderedRole[],
roles: string[],
type: 'single' | 'multi',
hidden: boolean,
position?: number,
}
const MOCK_DATA: RenderedCategory = {
id: '00000',
name: 'Placeholder Category',
hidden: false,
type: 'multi',
roles: [ '00000' ],
_roles: OrderedSet([
{ id: '00000', name: 'Placeholder Role', color: '#ff00ff' }
])
}
const DEFAULT_VIEW_STATE = { server: '000', invalidated: true, categories: [ MOCK_DATA ], selected: Set<string>([]), originalSelected: Set<string>([]), dirty: false }
export type ViewState = typeof DEFAULT_VIEW_STATE
export const { action, getState: getCategoryViewState } = namespaceConfig('currentCategoryView', DEFAULT_VIEW_STATE)
export const toggleRole = action('toggleRole', (state: ViewState, role: string, nextState: boolean) => {
let selected = state.selected
if (nextState === true) {
selected = selected.add(role)
} else {
selected = selected.delete(role)
}
const dirty = !selected.equals(state.originalSelected)
return {
...state,
selected,
dirty
}
})
const getUncategorized = (roleMap: OrderedMap<RenderedRole>, allCategories): RenderedCategory => {
const roles = Set(roleMap.keys())
const knownRoles = Set([...Object.values(allCategories).map((c: any) => c.roles)])
const rolesLeft = roles.subtract(knownRoles)
// console.log({ roles, knownRoles, rolesLeft })
return {
id: 'Uncategorized',
name: 'Uncategorized',
position: -1,
roles: rolesLeft,
_roles: OrderedSet(rolesLeft.map(r => roleMap.get(r))).sortBy(v => -v.position),
hidden: true,
type: 'multi'
}
}
export const updateCurrentView = action('updateCurrentView', (state, data) => ({ ...state, ...data }))
export const invalidateView = action('invalidateView', (state, data) => ({ ...state, invalidated: true }))
export const renderRoles = (id: string) => (dispatch: *, getState: *) => {
const active = getCategoryViewState(getState())
const current: ServerState = getCurrentServerState(getState(), id)
if (!active.invalidated && current.id === active.id && active.id === id) {
return
}
const { roles, categories } = current
if (roles == null) {
return
}
// console.log({ roles, categories })
const roleMap: OrderedMap<RenderedRole> = roles.reduce((acc: OrderedMap<RenderedRole>, r) => acc.set(r.id, r), OrderedMap())
let render = OrderedSet()
for (let catId in categories) {
const category = categories[catId]
category._roles = OrderedSet(category.roles.map(r => roleMap.get(r))).sortBy(v => -v.position)
render = render.add(category)
}
// console.log({id})
render = render.add(getUncategorized(roleMap, categories))
render = render.sortBy(h => h.position || 0)
dispatch(updateCurrentView({ server: id, categories: render, invalidated: false, selected: Set(current.gm.roles), originalSelected: Set(current.gm.roles) }))
}