From be99e16e34d6213f1527aab12565a3641d1e158d Mon Sep 17 00:00:00 2001 From: Luke <39926192+LukeWasTakenn@users.noreply.github.com> Date: Sat, 4 Feb 2023 22:13:12 +0100 Subject: [PATCH] refactor(web/menu): radial sub menu chaining still some quirks to figure out but it's working well --- resource/interface/client/radial.lua | 45 ++++++++++++++++++++++++++ web/src/features/menu/radial/index.tsx | 21 ++++++++---- 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/resource/interface/client/radial.lua b/resource/interface/client/radial.lua index 9a1db0e..649ab5b 100644 --- a/resource/interface/client/radial.lua +++ b/resource/interface/client/radial.lua @@ -1,5 +1,25 @@ local isOpen = false +local menus = {} local menuItems = {} +local currentRadial = nil + + +function lib.registerRadial(radial) + menus[radial.id] = radial +end + +function lib.showRadial(id) + local radial = menus[id] + if not radial then return error('No radial menu with such id found.') end + currentRadial = radial + SendNUIMessage({ + action = 'openRadialMenu', + data = { + items = radial.items, + sub = true + } + }) +end function lib.addRadialItem(items) if table.type(items) == 'array' then @@ -28,6 +48,29 @@ function lib.removeRadialItem(key) end end +RegisterNUICallback('radialClick', function(index, cb) + cb(1) + local item = not currentRadial and menuItems[index + 1] or currentRadial.items[index + 1] + if item.menu then lib.showRadial(item.menu) end + if item.onSelect then item.onSelect() end +end) + +-- TODO: fix transition? +RegisterNUICallback('radialBack', function(_, cb) + cb(1) + if currentRadial.menu then + lib.showRadial(currentRadial.menu) + else + currentRadial = nil + SendNUIMessage({ + action = 'openRadialMenu', + data = { + items = menuItems + } + }) + end +end) + local function openRadial() isOpen = true SendNUIMessage({ @@ -38,6 +81,7 @@ local function openRadial() }) SetNuiFocus(true, true) SetNuiFocusKeepInput(true) + SetCursorLocation(0.5, 0.5) CreateThread(function() while isOpen do DisablePlayerFiring(cache.playerId, true) @@ -55,6 +99,7 @@ local function closeRadial() }) SetNuiFocus(false, false) isOpen = false + if currentRadial then currentRadial = nil end end RegisterCommand('+ox_lib-radial', openRadial) diff --git a/web/src/features/menu/radial/index.tsx b/web/src/features/menu/radial/index.tsx index 9ad6173..2d9fd95 100644 --- a/web/src/features/menu/radial/index.tsx +++ b/web/src/features/menu/radial/index.tsx @@ -6,8 +6,6 @@ import { useNuiEvent } from '../../../hooks/useNuiEvent'; import { fetchNui } from '../../../utils/fetchNui'; import ScaleFade from '../../../transitions/ScaleFade'; -const radius = 60; - export interface MenuItem { icon: IconProp; label: string; @@ -62,8 +60,12 @@ const RadialMenu: React.FC = () => { sub: false, }); - useNuiEvent('openRadialMenu', (data: { items: MenuItem[]; sub?: boolean } | false) => { + useNuiEvent('openRadialMenu', async (data: { items: MenuItem[]; sub?: boolean } | false) => { if (!data) return setVisible(false); + if (visible) { + setVisible(false); + await new Promise((resolve) => setTimeout(resolve, 100)); + } setMenu(data); setVisible(true); }); @@ -72,7 +74,7 @@ const RadialMenu: React.FC = () => { setMenu({ ...menu, items: data }); }); - const handleClick = (index: number) => { + const handleClick = async (index: number) => { fetchNui('radialClick', index); // TODO: shouldClose setVisible(false); @@ -124,11 +126,18 @@ const RadialMenu: React.FC = () => { ); })} - setVisible(false)}> + {/* TODO: rotate go back icon */} + { + setVisible(false); + menu.sub && fetchNui('radialBack'); + }} + >