From 82f8e019762fc246cc2ec1e2d8a5a86e5eeeac88 Mon Sep 17 00:00:00 2001 From: Ygor Leal Date: Mon, 30 Mar 2026 05:27:09 +0200 Subject: [PATCH] fix(client): close active NUI elements before opening new ones Prevents NUI focus bugs when multiple ox_lib UI elements overlap. The keepInput variable in main.lua is a single scalar that gets overwritten when a second UI opens, causing broken focus state when either UI closes. Adds lib.closeAllNui(except) which cleanly closes all other open NUI elements before a new one opens, ensuring keepInput always captures the true pre-NUI state. --- resource/interface/client/alert.lua | 1 + resource/interface/client/context.lua | 1 + resource/interface/client/input.lua | 1 + resource/interface/client/main.lua | 18 ++++++++++++++++++ resource/interface/client/menu.lua | 1 + 5 files changed, 22 insertions(+) diff --git a/resource/interface/client/alert.lua b/resource/interface/client/alert.lua index f2feac936..516dec33f 100644 --- a/resource/interface/client/alert.lua +++ b/resource/interface/client/alert.lua @@ -23,6 +23,7 @@ local alertId = 0 ---@param timeout? number Force the window to timeout after `x` milliseconds. ---@return 'cancel' | 'confirm' | nil function lib.alertDialog(data, timeout) + lib.closeAllNui('alert') if alert then return end local id = alertId + 1 diff --git a/resource/interface/client/context.lua b/resource/interface/client/context.lua index 0bb379eb3..85acf1524 100644 --- a/resource/interface/client/context.lua +++ b/resource/interface/client/context.lua @@ -54,6 +54,7 @@ end ---@param id string function lib.showContext(id) + lib.closeAllNui('context') if not contextMenus[id] then error('No context menu of such id found.') end local data = contextMenus[id] diff --git a/resource/interface/client/input.lua b/resource/interface/client/input.lua index 3ab7a701f..31f6f8231 100644 --- a/resource/interface/client/input.lua +++ b/resource/interface/client/input.lua @@ -42,6 +42,7 @@ local input ---@param options InputDialogOptionsProps[]? ---@return string[] | number[] | boolean[] | nil function lib.inputDialog(heading, rows, options) + lib.closeAllNui('input') if input then return end input = promise.new() diff --git a/resource/interface/client/main.lua b/resource/interface/client/main.lua index af07e262b..c49254b77 100644 --- a/resource/interface/client/main.lua +++ b/resource/interface/client/main.lua @@ -20,3 +20,21 @@ function lib.resetNuiFocus() SetNuiFocus(false, false) SetNuiFocusKeepInput(keepInput) end + +function lib.closeAllNui(except) + if except ~= 'context' and lib.getOpenContextMenu() then + lib.hideContext(false) + end + if except ~= 'menu' and lib.getOpenMenu() then + lib.hideMenu(false) + end + if except ~= 'input' then + lib.closeInputDialog() + end + if except ~= 'alert' then + lib.closeAlertDialog() + end + if except ~= 'radial' then + lib.hideRadial() + end +end diff --git a/resource/interface/client/menu.lua b/resource/interface/client/menu.lua index e8de16d11..f5baecc92 100644 --- a/resource/interface/client/menu.lua +++ b/resource/interface/client/menu.lua @@ -54,6 +54,7 @@ end ---@param id string ---@param startIndex? number function lib.showMenu(id, startIndex) + lib.closeAllNui('menu') local menu = registeredMenus[id] if not menu then error(('No menu with id %s was found'):format(id))