So I have been making a shop for my game, and when you press the buy button, it gives you the item, but when you press the button on a different item, it doesn't give you the item, but still charges you for the item. I think it's that the game saves the variable and when you buy a different item, it gives you the first one. Also, this game's inventory is only supposed to have one item at a time, so the item gets replaced instead of added to the inventory. Here's the code:

BuyButton Script:

local img = script.Parent.ItemImage
local cost = script.Parent.ToolCost
local name = script.Parent.ToolName
local desc = script.Parent.Description
local buy = script.Parent.Buy

local replicatedStorage = game:GetService("ReplicatedStorage")
local tools = replicatedStorage:WaitForChild("Tools")
local buyTool = replicatedStorage:WaitForChild("BuyTool")

local mainShop = script.Parent:WaitForChild("MainShop")
local template = mainShop:WaitForChild("Template")

function GetChildrenAlphabetical(instance)
	local children = instance:GetChildren()
	table.sort(children, function(c1, c2)
		return c1.Name:lower() < c2.Name:lower()
	end)
	return children
end

--

local tool = GetChildrenAlphabetical(tools)

for index, tool in pairs(tool) do
	if tool:IsA("Tool") then
		local toolElement = template:Clone()
		toolElement.Parent = mainShop
		toolElement.Name = tool.Name
		if tool.TextureId ~= "" then
			toolElement.Image = tool.TextureId
		end
		toolElement.Visible = true
		
		img.Visible = false
		cost.Visible = false
		name.Visible = false
		desc.Visible = false
		buy.Visible = false
		
		toolElement.MouseButton1Click:Connect(function()
			img.Image = toolElement.Image
			name.Text = tool.name.Value
			desc.Text = tool.Desc.Value
			if tool.Cost.Value == 0 then
				cost.Text = "Free"
			else
				cost.Text = "$" .. tool.Cost.Value				
			end
			img.Visible = true
			cost.Visible = true
			name.Visible = true
			desc.Visible = true
			buy.Visible = true
			
			buy.MouseButton1Click:Connect(function()
				local buyTool = replicatedStorage:WaitForChild("BuyTool")
				local result = buyTool:InvokeServer(tool, tool.Cost)

				print(result)
			end)
		end)
	end
end

GiveItem Script:

game.ReplicatedStorage.BuyTool.OnServerInvoke = function(player, item, cost)
	if game.ReplicatedStorage.Tools:FindFirstChild(item.Name) and item:FindFirstChild("Cost") then
		if player.leaderstats.blinds.Value >= item.Cost.Value then
			local tool = game.ReplicatedStorage.Tools[item.Name]:Clone()
			player.Backpack:ClearAllChildren()
			player.StarterGear:ClearAllChildren()
			tool.Parent = player.Backpack
			
			local starterTool = tool:Clone()
			starterTool.Parent = player.StarterGear
			
			player.leaderstats.blinds.Value = player.leaderstats.blinds.Value - cost.Value
			
			return "BoughtItem"
		else
			return "NotEnoughCash"
		end
	else
		return "NoItemOrNoCostValue"
	end
end

If someone could give me an answer, that would be great. Thanks!