Help with 3rd Person Camera Module

I have a problem with my 3rd person module script. I tried to adjust this script to controller, pc and mobile but currently have not luck. I even got ChatGPT to help me out but I still can’t do it. Any help would be appreciated.

local CLASS = {}

--// SERVICES //--

local PLAYERS_SERVICE = game:GetService("Players")
local USER_INPUT_SERVICE = game:GetService("UserInputService")

--// CONSTANTS //--

local LOCAL_PLAYER = PLAYERS_SERVICE.LocalPlayer
local INPUT_TYPES = {Enum.UserInputType.MouseMovement, Enum.UserInputType.Touch, Enum.UserInputType.Gamepad1, Enum.UserInputType.Keyboard}

--// VARIABLES //--

local cameraEnabled = false
local horizontalAngle = 0
local verticalAngle = 0
local shoulderDirection = 1
local activeCameraSettings = nil
local savedCameraSettings = nil
local savedMouseBehavior = nil

--// CONSTRUCTOR //--

function CLASS.new()

	--// Events //--
	local activeCameraSettingsChangedEvent = Instance.new("BindableEvent")
	local characterAlignmentChangedEvent = Instance.new("BindableEvent")
	local mouseStepChangedEvent = Instance.new("BindableEvent")
	local shoulderDirectionChangedEvent = Instance.new("BindableEvent")
	local enabledEvent = Instance.new("BindableEvent")
	local disabledEvent = Instance.new("BindableEvent")

	local dataTable = setmetatable(
		{
			--// Properties //--
			SavedCameraSettings = savedCameraSettings,
			SavedMouseBehavior = savedMouseBehavior,
			ActiveCameraSettings = activeCameraSettings,
			HorizontalAngle = horizontalAngle,
			VerticalAngle = verticalAngle,
			ShoulderDirection = shoulderDirection,

			--// Flags //--
			IsCharacterAligned = false,
			IsMouseSteppedIn = false,
			IsEnabled = cameraEnabled,

			--// Events //--
			ActiveCameraSettingsChangedEvent = activeCameraSettingsChangedEvent,
			ActiveCameraSettingsChanged = activeCameraSettingsChangedEvent.Event,
			CharacterAlignmentChangedEvent = characterAlignmentChangedEvent,
			CharacterAlignmentChanged = characterAlignmentChangedEvent.Event,
			MouseStepChangedEvent = mouseStepChangedEvent,
			MouseStepChanged = mouseStepChangedEvent.Event,
			ShoulderDirectionChangedEvent = shoulderDirectionChangedEvent,
			ShoulderDirectionChanged = shoulderDirectionChangedEvent.Event,
			EnabledEvent = enabledEvent,
			Enabled = enabledEvent.Event,
			DisabledEvent = disabledEvent,
			Disabled = disabledEvent.Event,

			--// Configurations //--
			VerticalAngleLimits = NumberRange.new(-45, 45),

			--// Camera Settings //--
			CameraSettings = {
				DefaultShoulder = {
					FieldOfView = 60,
					Offset = Vector3.new(2.5, 1, 9),
					Sensitivity = 3,
					LerpSpeed = 0.5
				},

				ZoomedShoulder = {
					FieldOfView = 48,
					Offset = Vector3.new(2.5, 1, 9),
					Sensitivity = 2.5,
					LerpSpeed = 0.5
				}

			}
		},
		CLASS
	)
	local proxyTable = setmetatable(
		{},
		{
			__index = function(self, index)
				return dataTable[index]
			end,
			__newindex = function(self, index, newValue)
				dataTable[index] = newValue
			end
		}
	)

	--// Input Handling //--
	USER_INPUT_SERVICE.InputBegan:Connect(function(inputObject)
		if (inputObject.UserInputType == Enum.UserInputType.MouseButton1 and not cameraEnabled) then
			cameraEnabled = true
			enabledEvent:Fire()

			-- save and store current camera settings
			savedCameraSettings = workspace.CurrentCamera.CameraSubject
			savedMouseBehavior = USER_INPUT_SERVICE.MouseBehavior
			USER_INPUT_SERVICE.MouseBehavior = Enum.MouseBehavior.LockCenter

			-- set the active camera settings
			activeCameraSettings = dataTable.CameraSettings.DefaultShoulder
			activeCameraSettingsChangedEvent:Fire()

			-- handle input for camera movement
			USER_INPUT_SERVICE.InputChanged:Connect(function(inputObject)
				if cameraEnabled and INPUT_TYPES:find(inputObject.UserInputType) then
					local sensitivity = activeCameraSettings.Sensitivity
					local dx = inputObject.Delta.x * sensitivity
					local dy = inputObject.Delta.y * sensitivity

					horizontalAngle = horizontalAngle + dx
					verticalAngle = verticalAngle + dy

					-- limit vertical angle
					verticalAngle = math.clamp(verticalAngle, dataTable.VerticalAngleLimits.Min, dataTable.VerticalAngleLimits.Max)

					-- apply camera rotation
					local rot = Vector3.new(verticalAngle, horizontalAngle, 0)
					workspace.CurrentCamera.CFrame = CFrame.new(LOCAL_PLAYER.Character.Head.Position) * CFrame.fromEulerAnglesXYZ(rot.x, rot.y, rot.z)
				end
			end)
		elseif
			
			(inputObject.UserInputType == Enum.UserInputType.MouseButton1 and cameraEnabled) then
			cameraEnabled = false
			disabledEvent:Fire()
			
			-- restore saved camera settings
			workspace.CurrentCamera.CameraSubject = savedCameraSettings
			USER_INPUT_SERVICE.MouseBehavior = savedMouseBehavior

			-- disconnect input event
			USER_INPUT_SERVICE.InputChanged:Disconnect()
		end

		if (inputObject.UserInputType == Enum.UserInputType.ButtonZ and cameraEnabled) then
			if (shoulderDirection == 1) then
				shoulderDirection = -1
				activeCameraSettings = dataTable.CameraSettings.ZoomedShoulder
				activeCameraSettingsChangedEvent:Fire()
				shoulderDirectionChangedEvent:Fire()
			else
				shoulderDirection = 1
				activeCameraSettings = dataTable.CameraSettings.DefaultShoulder
				activeCameraSettingsChangedEvent:Fire()
				shoulderDirectionChangedEvent:Fire()
			end
		end
	end)

	return proxyTable
	
end