69 lines
		
	
	
		
			No EOL
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			No EOL
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local pinRes
 | 
						|
 | 
						|
FM.pin = {}
 | 
						|
 | 
						|
---@class PinProps
 | 
						|
---@field title? string
 | 
						|
---@field subtitle? string
 | 
						|
---@field maxNumbers? number
 | 
						|
---@field canClose? boolean
 | 
						|
---@field useSfx? boolean
 | 
						|
---@field hidden? boolean
 | 
						|
---@field reactiveUI? { correctPin: number, closeOnWrong?: boolean }
 | 
						|
 | 
						|
local function setDefaultProps(props)
 | 
						|
    if not props then props = {} end
 | 
						|
    props.maxNumbers = (props.maxNumbers and props.maxNumbers <= 8 and props.maxNumbers > 0) and props.maxNumbers or 4
 | 
						|
    if props.useSfx == nil then props.useSfx = true end
 | 
						|
    if props.hidden == nil then props.hidden = false end
 | 
						|
    if props.reactiveUI then
 | 
						|
        props.reactiveUI = props.reactiveUI.correctPin and props.reactiveUI or nil
 | 
						|
        if props.reactiveUI and props.reactiveUI.closeOnWrong == nil then props.reactiveUI.closeOnWrong = true end
 | 
						|
    end
 | 
						|
    if props.canClose == nil then props.canClose = true end
 | 
						|
 | 
						|
    return props
 | 
						|
end
 | 
						|
 | 
						|
---@param props PinProps | nil
 | 
						|
function FM.pin.open(props)
 | 
						|
    if pinRes then FM.console.err('Pin already open') return end
 | 
						|
    
 | 
						|
    props = setDefaultProps(props)
 | 
						|
    pinRes = promise.new()
 | 
						|
    
 | 
						|
    SetNuiFocus(true, true)
 | 
						|
    SetNuiFocusKeepInput(false)
 | 
						|
 | 
						|
    SendNUIMessage({
 | 
						|
        action = 'openPin',
 | 
						|
        data = props
 | 
						|
    })
 | 
						|
 | 
						|
    return Citizen.Await(pinRes)
 | 
						|
end
 | 
						|
 | 
						|
function FM.pin.close()
 | 
						|
    if not pinRes then FM.console.err('No pin open') return end
 | 
						|
 | 
						|
    SendNUIMessage({
 | 
						|
        action = 'closePin',
 | 
						|
    })
 | 
						|
end
 | 
						|
 | 
						|
RegisterNUICallback('pinClosed', function(res, cb)
 | 
						|
    SetNuiFocus(false, false)
 | 
						|
    SetNuiFocusKeepInput(false)
 | 
						|
 | 
						|
    if pinRes then
 | 
						|
        pinRes:resolve(res)
 | 
						|
        pinRes = nil
 | 
						|
    end
 | 
						|
 | 
						|
    cb(true)
 | 
						|
end)
 | 
						|
 | 
						|
---@return boolean
 | 
						|
function FM.pin.isOpen()
 | 
						|
    return pinRes ~= nil
 | 
						|
end |