Scripts/resources/[standalone]/ox_lib/resource/interface/client/context.lua

118 lines
3.0 KiB
Lua
Raw Normal View History

2024-12-29 20:02:43 +00:00
local contextMenus = {}
local openContextMenu = nil
---@class ContextMenuItem
---@field title? string
---@field menu? string
---@field icon? string | {[1]: IconProp, [2]: string};
---@field iconColor? string
---@field image? string
---@field progress? number
---@field onSelect? fun(args: any)
---@field arrow? boolean
---@field description? string
---@field metadata? string | { [string]: any } | string[]
---@field disabled? boolean
2024-12-30 10:15:34 +00:00
---@field readOnly? boolean
2024-12-29 20:02:43 +00:00
---@field event? string
---@field serverEvent? string
---@field args? any
---@class ContextMenuArrayItem : ContextMenuItem
---@field title string
---@class ContextMenuProps
---@field id string
---@field title string
---@field menu? string
---@field onExit? fun()
---@field onBack? fun()
---@field canClose? boolean
---@field options { [string]: ContextMenuItem } | ContextMenuArrayItem[]
local function closeContext(_, cb, onExit)
if cb then cb(1) end
lib.resetNuiFocus()
if not openContextMenu then return end
if (cb or onExit) and contextMenus[openContextMenu].onExit then contextMenus[openContextMenu].onExit() end
if not cb then SendNUIMessage({ action = 'hideContext' }) end
openContextMenu = nil
end
---@param id string
function lib.showContext(id)
if not contextMenus[id] then error('No context menu of such id found.') end
local data = contextMenus[id]
openContextMenu = id
lib.setNuiFocus(false)
SendNuiMessage(json.encode({
action = 'showContext',
data = {
title = data.title,
canClose = data.canClose,
menu = data.menu,
options = data.options
}
}, { sort_keys = true }))
end
---@param context ContextMenuProps | ContextMenuProps[]
function lib.registerContext(context)
for k, v in pairs(context) do
if type(k) == 'number' then
contextMenus[v.id] = v
else
contextMenus[context.id] = context
break
end
end
end
---@return string?
function lib.getOpenContextMenu() return openContextMenu end
---@param onExit boolean?
function lib.hideContext(onExit) closeContext(nil, nil, onExit) end
RegisterNUICallback('openContext', function(data, cb)
if data.back and contextMenus[openContextMenu].onBack then contextMenus[openContextMenu].onBack() end
cb(1)
lib.showContext(data.id)
end)
RegisterNUICallback('clickContext', function(id, cb)
cb(1)
if math.type(tonumber(id)) == 'float' then
id = math.tointeger(id)
elseif tonumber(id) then
id += 1
end
local data = contextMenus[openContextMenu].options[id]
if not data.event and not data.serverEvent and not data.onSelect then return end
openContextMenu = nil
SendNUIMessage({ action = 'hideContext' })
lib.resetNuiFocus()
if data.onSelect then data.onSelect(data.args) end
if data.event then TriggerEvent(data.event, data.args) end
if data.serverEvent then TriggerServerEvent(data.serverEvent, data.args) end
end)
RegisterNUICallback('closeContext', closeContext)