mirror of
https://github.com/ragestudio/comty.git
synced 2025-06-10 02:54:15 +00:00
108 lines
3.2 KiB
JavaScript
108 lines
3.2 KiB
JavaScript
import { OpenContextMenu, DestroyContextMenu } from 'components/Layout/ContextMenu'
|
|
import { verbosity } from '@nodecorejs/utils'
|
|
|
|
const defaultState = {
|
|
xPos: 0,
|
|
yPos: 0,
|
|
renderList: null,
|
|
eventHandlers: [],
|
|
}
|
|
|
|
export default {
|
|
namespace: 'contextMenu',
|
|
state: defaultState,
|
|
subscriptions: {
|
|
setup({ dispatch }) {
|
|
window.contextMenu = {
|
|
open: (payload) => {
|
|
if (!payload) return false
|
|
dispatch({ type: "open", payload })
|
|
},
|
|
destroy: () => {
|
|
dispatch({ type: "destroy" })
|
|
},
|
|
addEventListener: (payload) => {
|
|
if (!payload) return false
|
|
dispatch({ type: "handleAddEvent", payload: payload })
|
|
}
|
|
}
|
|
|
|
document.getElementById("root").addEventListener("contextmenu", (e) => {
|
|
dispatch({ type: "handleEvents", payload: e })
|
|
}, false)
|
|
|
|
dispatch({ type: "setup" })
|
|
}
|
|
},
|
|
effects: {
|
|
*setup({payload}, { select, put }){
|
|
const state = yield select(state => state.contextMenu)
|
|
window.contextMenu = { ...window.contextMenu, ...state }
|
|
},
|
|
*handleEvents({payload}, { select, put }){
|
|
const eventHandlers = yield select(state => state.contextMenu.eventHandlers)
|
|
verbosity.log("New event recived =>", payload) // TODO: Add verbosity color > { color: "magenta"}
|
|
|
|
if (Array.isArray(eventHandlers)) {
|
|
let byIndex = []
|
|
let prioritys = []
|
|
|
|
eventHandlers.forEach((e) => {
|
|
if (typeof(e.ref) !== "undefined") {
|
|
if (e.ref.contains(payload.srcElement)) {
|
|
byIndex[e.priority] = e
|
|
prioritys = Object.keys(byIndex).sort()
|
|
}
|
|
}
|
|
})
|
|
|
|
prioritys = prioritys.reverse()
|
|
const prioritaryEvent = byIndex[prioritys[0]]
|
|
|
|
if (prioritaryEvent != null && typeof(prioritaryEvent.onEventRender) !== "undefined") {
|
|
payload.preventDefault()
|
|
window.contextMenu.open({
|
|
renderList: prioritaryEvent.onEventRender,
|
|
...prioritaryEvent.props,
|
|
yPos: payload.clientY,
|
|
xPos: payload.clientX,
|
|
event: payload
|
|
})
|
|
}else{
|
|
yield put({ type: "close" })
|
|
verbosity.log('not valid events detected')
|
|
}
|
|
|
|
}else{
|
|
verbosity.log('eventHandlers is not an array, exiting')
|
|
}
|
|
|
|
},
|
|
*open({payload}, { select, put }){
|
|
OpenContextMenu(payload)
|
|
}
|
|
},
|
|
reducers: {
|
|
updateState(state, { payload }) {
|
|
return {
|
|
...state,
|
|
...payload,
|
|
};
|
|
},
|
|
handleAddEvent(state, { payload }){
|
|
let tmp = []
|
|
tmp.push(payload)
|
|
|
|
const concated = state.eventHandlers.concat(tmp)
|
|
state.eventHandlers = concated
|
|
},
|
|
open(state, { payload }){
|
|
state = {...state, ...payload}
|
|
},
|
|
close(state){
|
|
state = defaultState
|
|
DestroyContextMenu()
|
|
}
|
|
},
|
|
}
|