local RobloxGui = game:GetService("CoreGui").RobloxGui local ShellModules = RobloxGui.Modules.Shell local ContextActionService = game:GetService("ContextActionService") local AccountManager = require(ShellModules.AccountManager) local AssetManager = require(ShellModules.AssetManager) local Errors = require(ShellModules.Errors) local ErrorOverlay = require(ShellModules.ErrorOverlay) local GlobalSettings = require(ShellModules.GlobalSettings) local LoadingWidget = require(ShellModules.LoadingWidget) local ScreenManager = require(ShellModules.ScreenManager) local SoundManager = require(ShellModules.SoundManager) local Strings = require(ShellModules.LocalizedStrings) local ThumbnailLoader = require(ShellModules.ThumbnailLoader) local UnlinkAccountOverlay = require(ShellModules.UnlinkAccountOverlay) local Utility = require(ShellModules.Utility) local XboxAppState = require(ShellModules.AppState) local function createAccountLinkingView() local this = {} local gamerTag = XboxAppState.store:getState().XboxUser.gamertag local robloxName = XboxAppState.store:getState().RobloxUser.robloxName local rbxuid = XboxAppState.store:getState().RobloxUser.rbxuid local linkedAsPhrase = string.format(Strings:LocalizedString("LinkedAsPhrase"), gamerTag, robloxName) local dummySelection = Utility.Create"Frame" { BackgroundTransparency = 1, } local Container = Utility.Create"Frame" { Name = "Container", Position = UDim2.new(0, 0, 0, 0), Size = UDim2.new(0, 765, 0, 630), BackgroundTransparency = 1, BorderSizePixel = 0, Selectable = true, SelectionImageObject = dummySelection, } Utility.Create"ImageLabel" { Name = "GamerPic", Position = UDim2.new(0, 40, 0, 25), Size = UDim2.new(0, 300, 0, 300), BackgroundTransparency = 0, BorderSizePixel = 0, Image = "rbxapp://xbox/localgamerpic", Parent = Container, } Utility.Create"ImageLabel" { Name = "AccountLinkIcon", Position = UDim2.new(0, 354, 0, 166), Size = UDim2.new(0, 58, 0, 20), BackgroundTransparency = 1, Image = "rbxasset://textures/ui/Shell/Icons/AccountLinkIcon.png", Parent = Container, } local ProfileImage = Utility.Create"ImageLabel" { Name = "ProfileImage", Position = UDim2.new(0, 425, 0, 25), Size = UDim2.new(0, 300, 0, 300), BackgroundTransparency = 0, BackgroundColor3 = GlobalSettings.CharacterBackgroundColor, BorderSizePixel = 0, Parent = Container, } if rbxuid then spawn(function() local thumbnailSize = ThumbnailLoader.AvatarSizes.Size352x352 local thumbLoader = ThumbnailLoader:LoadAvatarThumbnailAsync(ProfileImage, rbxuid, Enum.ThumbnailType.AvatarThumbnail, Enum.ThumbnailSize.Size352x352, true) thumbLoader:LoadAsync() ProfileImage.ImageRectSize = Vector2.new(thumbnailSize.X, (1) * thumbnailSize.X) end) end Utility.Create"TextLabel" { Name = "ProfileLabel", Position = UDim2.new(0, 575, 0, 335), Text = robloxName or "", TextXAlignment = "Center", TextYAlignment = "Top", BackgroundColor3 = Color3.new(1, 0, 0), TextColor3 = GlobalSettings.WhiteTextColor, Font = GlobalSettings.RegularFont, FontSize = GlobalSettings.SubHeaderSize, BackgroundTransparency = 1, Parent = Container, } Utility.Create"TextLabel" { Name = "GamerLabel", Text = gamerTag or "", TextXAlignment = "Center", TextYAlignment = "Top", Position = UDim2.new(0, 190, 0, 335), BackgroundColor3 = Color3.new(1,0,0), TextColor3 = GlobalSettings.WhiteTextColor, Font = GlobalSettings.RegularFont, FontSize = GlobalSettings.SubHeaderSize, BackgroundTransparency = 1, Parent = Container, } Utility.Create"TextLabel" { Name = "LinkedAsText", Position = UDim2.new(0, 40, 0, 395), Size = UDim2.new(0, 686, 0, 120), Text = linkedAsPhrase, TextXAlignment = "Center", TextYAlignment = "Top", BackgroundTransparency = 1, Font = GlobalSettings.RegularFont, TextColor3 = GlobalSettings.GreyTextColor, FontSize = GlobalSettings.SubHeaderSize, TextWrapped = true, Parent = Container, } local UnlinkButton = Utility.Create"ImageButton" { Name = "UnlinkButton", Position = UDim2.new(0, 220, 0, 520), Size = UDim2.new(0, 320, 0, 80), BackgroundTransparency = 1, ImageColor3 = GlobalSettings.GreySelectedButtonColor, Image = GlobalSettings.RoundCornerButtonImage, ScaleType = Enum.ScaleType.Slice, SliceCenter = Rect.new(Vector2.new(4, 4), Vector2.new(28, 28)), ZIndex = 2, Parent = Container, SoundManager:CreateSound("MoveSelection"), AssetManager.CreateShadow(1), } local DefaultButtonColor = GlobalSettings.GreyButtonColor local SelectedButtonColor = GlobalSettings.GreySelectedButtonColor local DefaultButtonTextColor = GlobalSettings.WhiteTextColor local SelectedButtonTextColor = GlobalSettings.TextSelectedColor local UnlinkText = Utility.Create"TextLabel" { Name = "UnlinkText", Size = UDim2.new(1, 0, 1, 0), BackgroundTransparency = 1, Font = GlobalSettings.RegularFont, FontSize = GlobalSettings.ButtonSize, TextColor3 = Color3.new(0, 0, 0), Text = Strings:LocalizedString("UnlinkGamerTagWord"), ZIndex = 2, Parent = UnlinkButton, } Utility.ResizeButtonWithText(UnlinkButton, UnlinkText, GlobalSettings.TextHorizontalPadding) Container.SelectionGained:connect(function() Utility.SetSelectedCoreObject(UnlinkButton) end) UnlinkButton.SelectionGained:connect(function() UnlinkButton.ImageColor3 = SelectedButtonColor UnlinkText.TextColor3 = SelectedButtonTextColor end) UnlinkButton.SelectionLost:connect(function() UnlinkButton.ImageColor3 = DefaultButtonColor UnlinkText.TextColor3 = DefaultButtonTextColor end) 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 isUnlinking = false local function unlinkAccountAsync() if isUnlinking then return end isUnlinking = true local unlinkResult = nil local loader = LoadingWidget( { Parent = Container }, { function() unlinkResult = AccountManager:UnlinkAccountAsync() end }) -- set up full screen loader ModalOverlay.Parent = RobloxGui ContextActionService:BindCoreAction("BlockB", function() end, false, Enum.KeyCode.ButtonB) UnlinkButton.SelectionImageObject = dummySelection UnlinkButton.ImageColor3 = GlobalSettings.GreyButtonColor UnlinkText.TextColor3 = GlobalSettings.WhiteTextColor -- call loader loader:AwaitFinished() -- clean up -- NOTE: Unlink success will fire the ThirdPartyUserService ActiveUserSignedOut event. -- This event will fire and listeners will run before the loader is finished. The below -- code needs to run in case of errors, but on success will not interfere with the reauth -- logic in AppHome.lua loader:Cleanup() UnlinkButton.SelectionImageObject = nil UnlinkButton.ImageColor3 = GlobalSettings.GreySelectedButtonColor UnlinkText.TextColor3 = GlobalSettings.TextSelectedColor ContextActionService:UnbindCoreAction("BlockB") ModalOverlay.Parent = nil if unlinkResult ~= AccountManager.AuthResults.Success then local err = unlinkResult and Errors.Authentication[unlinkResult] or Errors.Default ScreenManager:OpenScreen(ErrorOverlay(err), false) end isUnlinking = false end function this:Focus() end function this:RemoveFocus() end UnlinkButton.MouseButton1Click:connect(function() if isUnlinking then return end SoundManager:Play("ButtonPress") local confirmTitleAndMsg = { Title = Strings:LocalizedString("UnlinkTitle"), Msg = Strings:LocalizedString("UnlinkPhrase") } ScreenManager:OpenScreen(UnlinkAccountOverlay(confirmTitleAndMsg, unlinkAccountAsync), false) end) --[[ Public API ]]-- function this:SetParent(newParent) Container.Parent = newParent end function this:GetUnlinkButton() return UnlinkButton end return this end return createAccountLinkingView