Clients/Client2018/content/internal/AppShell/Modules/Shell/LinkAccountScreen.lua

153 lines
5.0 KiB
Lua

--[[
// LinkAccountScreen.lua
]]
local CoreGui = game:GetService("CoreGui")
local GuiRoot = CoreGui:FindFirstChild("RobloxGui")
local Modules = GuiRoot:FindFirstChild("Modules")
local ShellModules = Modules:FindFirstChild("Shell")
local ContextActionService = game:GetService('ContextActionService')
local GuiService = game:GetService('GuiService')
local AccountManager = require(ShellModules:FindFirstChild('AccountManager'))
local BaseSignInScreen = require(ShellModules:FindFirstChild('BaseSignInScreen'))
local Errors = require(ShellModules:FindFirstChild('Errors'))
local ErrorOverlay = require(ShellModules:FindFirstChild('ErrorOverlay'))
local EventHub = require(ShellModules:FindFirstChild('EventHub'))
local GlobalSettings = require(ShellModules:FindFirstChild('GlobalSettings'))
local LoadingWidget = require(ShellModules:FindFirstChild('LoadingWidget'))
local ScreenManager = require(ShellModules:FindFirstChild('ScreenManager'))
local SoundManager = require(ShellModules:FindFirstChild('SoundManager'))
local Strings = require(ShellModules:FindFirstChild('LocalizedStrings'))
local Utility = require(ShellModules:FindFirstChild('Utility'))
local Analytics = require(ShellModules:FindFirstChild('Analytics'))
local function createLinkAccountScreen()
local this = BaseSignInScreen()
this:SetTitle(Strings:LocalizedString("LinkAccountTitle"))
this:SetDescriptionText(Strings:LocalizedString("LinkAccountPhrase"))
local ModalOverlay = Utility.Create'Frame'
{
Name = "ModalOverlay";
Size = UDim2.new(1, 0, 1, 0);
BackgroundTransparency = GlobalSettings.ModalBackgroundTransparency;
BackgroundColor3 = GlobalSettings.ModalBackgroundColor;
BorderSizePixel = 0;
ZIndex = 4;
}
local myUsername = nil
local myPassword = nil
this.UsernameObject:SetDefaultText(Strings:LocalizedString("UsernameWord"))
this.UsernameObject:SetKeyboardTitle(Strings:LocalizedString("UsernameWord"))
local usernameChangedCn = nil
this.PasswordObject:SetDefaultText(Strings:LocalizedString("PasswordWord"))
this.PasswordObject:SetKeyboardTitle(Strings:LocalizedString("PasswordWord"))
if not UserSettings().GameSettings:InStudioMode() then
this.PasswordObject:SetKeyboardType(Enum.XboxKeyBoardType.Password)
end
local passwordChangedCn = nil
local function linkAccountAsync()
local linkResult = nil
local signInResult = nil
local function doLinkAccountAsync()
linkResult = AccountManager:LinkAccountAsync(myUsername, myPassword)
if linkResult == AccountManager.AuthResults.Success then
signInResult = AccountManager:LoginAsync()
end
end
local loader = LoadingWidget(
{ Parent = this.Container }, { doLinkAccountAsync })
-- set up full screen loader
ModalOverlay.Parent = GuiRoot
ContextActionService:BindCoreAction("BlockB", function() end, false, Enum.KeyCode.ButtonB)
local selectedObject = GuiService.SelectedCoreObject
Utility.SetSelectedCoreObject(nil)
-- call loader
loader:AwaitFinished()
-- clean up
loader:Cleanup()
loader = nil
Utility.SetSelectedCoreObject(selectedObject)
ContextActionService:UnbindCoreAction("BlockB")
ModalOverlay.Parent = nil
if linkResult ~= AccountManager.AuthResults.Success then
local err = linkResult and Errors.Authentication[linkResult] or Errors.Default
ScreenManager:OpenScreen(ErrorOverlay(err), false)
else
if signInResult == AccountManager.AuthResults.Success then
ScreenManager:CloseCurrent()
EventHub:dispatchEvent(EventHub.Notifications["AuthenticationSuccess"])
else
local err = signInResult and Errors.Authentication[signInResult] or Errors.Default
ScreenManager:OpenScreen(ErrorOverlay(err), false)
end
end
end
local isSigningIn = false
this.SignInButton.MouseButton1Click:connect(function()
if isSigningIn then return end
isSigningIn = true
SoundManager:Play('ButtonPress')
if (myUsername and #myUsername > 0) and (myPassword and #myPassword > 0) then
linkAccountAsync()
else
local err = Errors.SignIn.NoUsernameOrPasswordEntered
ScreenManager:OpenScreen(ErrorOverlay(err), false)
end
isSigningIn = false
end)
--[[ Public API ]]--
--override
function this:GetAnalyticsInfo()
return {[Analytics.WidgetNames('WidgetId')] = Analytics.WidgetNames('LinkAccountScreenId')}
end
local baseFocus = this.Focus
function this:Focus()
baseFocus(self)
usernameChangedCn = this.UsernameObject.OnTextChanged:connect(function(text)
myUsername = text
if #myUsername > 0 then
Utility.SetSelectedCoreObject(this.PasswordSelection)
else
Utility.SetSelectedCoreObject(this.UsernameSelection)
end
end)
passwordChangedCn = this.PasswordObject.OnTextChanged:connect(function(text)
myPassword = text
if #myPassword > 0 then
Utility.SetSelectedCoreObject(this.SignInButton)
else
Utility.SetSelectedCoreObject(this.PasswordSelection)
end
end)
end
--override
local baseRemoveFocus = this.RemoveFocus
function this:RemoveFocus()
baseRemoveFocus(self)
Utility.DisconnectEvent(usernameChangedCn)
Utility.DisconnectEvent(passwordChangedCn)
end
return this
end
return createLinkAccountScreen