223 lines
7.3 KiB
Lua
223 lines
7.3 KiB
Lua
--[[
|
|
Creates a PresenceCard component
|
|
Props:
|
|
gamertag: string - Xbox Gamertag.
|
|
robloxName: string - Roblox name.
|
|
robloxuid: int - Roblox user id.
|
|
xuid: int - Xbox user id.
|
|
robloxStatus: string - User's roblox xboxStatus.
|
|
xboxStatus: string - User's xbox xboxStatus.
|
|
lastLocation: string - User's last location info.
|
|
layoutOrder: int - Controls the sorting priority of this button.
|
|
size: UDim2 - The size of the presence card.
|
|
onSelectionGained : function(guiObject : Ref<GuiObject>) -
|
|
Fires when the GuiObject is being focused on with the Gamepad selector.
|
|
onSelectionLost : function(guiObject : Ref<GuiObject>) -
|
|
Fires when the Gamepad selector stops focusing on the GuiObject.
|
|
onActivated : function(guiObject : Ref<GuiObject>) -
|
|
Fires when the button is activated.
|
|
]]
|
|
local Modules = game:GetService("CoreGui").RobloxGui.Modules
|
|
|
|
local Roact = require(Modules.Common.Roact)
|
|
local GlobalSettings = require(Modules.Shell.GlobalSettings)
|
|
local Components = Modules.Shell.Components
|
|
local UserThumbnailLoader = require(Components.Common.UserThumbnailLoader)
|
|
local Strings = require(Modules.Shell.LocalizedStrings)
|
|
local Utility = require(Modules.Shell.Utility)
|
|
local SoundComponent = require(Modules.Shell.Components.Common.SoundComponent)
|
|
|
|
local PresenceCard = Roact.PureComponent:extend("PresenceCard")
|
|
|
|
function PresenceCard:init()
|
|
self.selectionImageObject = Utility.Create "ImageLabel"({
|
|
Name = "SelectorImage",
|
|
Image = GlobalSettings.Images.ButtonSelector,
|
|
Position = UDim2.new(0, -7, 0, -7),
|
|
Size = UDim2.new(1, 14, 1, 14),
|
|
BackgroundTransparency = 1,
|
|
ScaleType = Enum.ScaleType.Slice,
|
|
SliceCenter = Rect.new(31, 31, 63, 63),
|
|
})
|
|
self.onCreate = function(rbx)
|
|
self.ref = rbx
|
|
end
|
|
self.defaultProps = {
|
|
buttonColor3 = GlobalSettings.Colors.WhiteButton,
|
|
buttonTransparency = 0.8,
|
|
textColor3 = GlobalSettings.Colors.WhiteText,
|
|
iconColor3 = GlobalSettings.Colors.WhiteText,
|
|
}
|
|
self.focusedProps = {
|
|
buttonColor3 = GlobalSettings.Colors.BlueButton,
|
|
buttonTransparency = 0,
|
|
textColor3 = GlobalSettings.Colors.BlackText,
|
|
iconColor3 = GlobalSettings.Colors.BlackText,
|
|
}
|
|
self.buttonImage = GlobalSettings.Images.ButtonDefault
|
|
end
|
|
|
|
function PresenceCard:render()
|
|
local props = self.props
|
|
|
|
local focused = self.props.focused
|
|
local currProps = focused and self.focusedProps or self.defaultProps
|
|
local gamertagText = props.gamertag or ""
|
|
local robloxNameText = props.robloxName or ""
|
|
local showGamertag = gamertagText ~= ""
|
|
local showRobloxName = robloxNameText ~= ""
|
|
local statusText = ""
|
|
local statusImageColor3 = GlobalSettings.Colors.GreySelectedButton
|
|
|
|
local function setPresence(statusStr, statusColor)
|
|
statusImageColor3 = statusColor
|
|
if statusStr and statusStr ~= "" then
|
|
statusText = statusStr
|
|
end
|
|
end
|
|
if props.robloxStatus == "InGame" then
|
|
setPresence(props.lastLocation, GlobalSettings.Colors.GreenText)
|
|
elseif props.robloxStatus == "InStudio" then
|
|
setPresence(props.lastLocation, GlobalSettings.Colors.OrangeText)
|
|
elseif props.robloxStatus == "Online" then
|
|
setPresence("Roblox", GlobalSettings.Colors.BlueText)
|
|
else
|
|
if props.xboxStatus and props.xboxStatus == "Online" then
|
|
setPresence(Strings:LocalizedString("OnlineWord"), GlobalSettings.Colors.BlueText)
|
|
else
|
|
setPresence(Strings:LocalizedString("OfflineWord"), GlobalSettings.Colors.GreyText)
|
|
end
|
|
end
|
|
|
|
return Roact.createElement("ImageButton", {
|
|
Image = self.buttonImage,
|
|
Position = UDim2.new(0.5, 0, 0.5, 0),
|
|
AnchorPoint = Vector2.new(0.5, 0.5),
|
|
LayoutOrder = props.layoutOrder,
|
|
Size = props.size or UDim2.new(0, 440, 0, 120),
|
|
ImageColor3 = currProps.buttonColor3,
|
|
ImageTransparency = currProps.buttonTransparency,
|
|
ScaleType = Enum.ScaleType.Slice,
|
|
SliceCenter = Rect.new(8, 8, 9, 9),
|
|
SelectionImageObject = self.selectionImageObject,
|
|
BackgroundTransparency = 1,
|
|
[Roact.Event.SelectionGained] = props.onSelectionGained,
|
|
[Roact.Event.SelectionLost] = props.onSelectionLost,
|
|
[Roact.Event.Activated] = props.onActivated,
|
|
[Roact.Ref] = self.onCreate,
|
|
},{
|
|
MoveSelection = Roact.createElement(SoundComponent, {
|
|
SoundName = "MoveSelection",
|
|
}),
|
|
|
|
AvatarImage = Roact.createElement(UserThumbnailLoader, {
|
|
rbxuid = props.robloxuid,
|
|
thumbnailType = Enum.ThumbnailType.HeadShot,
|
|
thumbnailSize = Enum.ThumbnailSize.Size100x100,
|
|
position = UDim2.new(0, 10, 0, 10),
|
|
size = UDim2.new(0, 100, 0, 100),
|
|
}),
|
|
|
|
ContentContainer = Roact.createElement("Frame",{
|
|
Size = UDim2.new(1, -140, 1, 0),
|
|
Position = UDim2.new(0, 126, 0, 0),
|
|
BackgroundTransparency = 1,
|
|
ClipsDescendants = true,
|
|
}, {
|
|
UIPadding = Roact.createElement("UIPadding", {
|
|
PaddingTop = UDim.new(0, 10),
|
|
PaddingBottom = UDim.new(0, 10)
|
|
}),
|
|
|
|
UIListLayout = Roact.createElement("UIListLayout", {
|
|
Padding = UDim.new(0, 7),
|
|
SortOrder = Enum.SortOrder.LayoutOrder,
|
|
HorizontalAlignment = Enum.HorizontalAlignment.Left,
|
|
VerticalAlignment = Enum.VerticalAlignment.Center,
|
|
}),
|
|
|
|
GamertagContainer = showGamertag and Roact.createElement("Frame", {
|
|
Size = UDim2.new(1, 0, 0, 30),
|
|
LayoutOrder = 1,
|
|
BackgroundTransparency = 1
|
|
},{
|
|
GamertagLabel = Roact.createElement("TextLabel", {
|
|
Text = gamertagText,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
Position = UDim2.new(0, 0, 0, 0),
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextColor3 = currProps.textColor3,
|
|
Font = GlobalSettings.Fonts.Regular,
|
|
TextSize = 30,
|
|
TextScaled = true,
|
|
BackgroundTransparency = 1,
|
|
}),
|
|
}),
|
|
|
|
RobloxNameContainer = showRobloxName and Roact.createElement("Frame", {
|
|
Size = UDim2.new(1, 0, 0, 30),
|
|
LayoutOrder = 2,
|
|
BackgroundTransparency = 1
|
|
},{
|
|
RobloxIcon = Roact.createElement("ImageLabel", {
|
|
BackgroundTransparency = 1,
|
|
Image = GlobalSettings.Images.RobloxIcon,
|
|
ImageColor3 = currProps.iconColor3,
|
|
Position = UDim2.new(0, 0, 0, 1),
|
|
Size = UDim2.new(0, 28, 0, 28),
|
|
}),
|
|
RobloxNameLabel = Roact.createElement("TextLabel", {
|
|
Text = robloxNameText,
|
|
Size = UDim2.new(1, -38, 1, 0),
|
|
Position = UDim2.new(0, 38, 0, 0),
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextColor3 = currProps.textColor3,
|
|
Font = GlobalSettings.Fonts.Regular,
|
|
TextSize = 30,
|
|
TextScaled = true,
|
|
BackgroundTransparency = 1,
|
|
})
|
|
}),
|
|
|
|
StatusContainer = Roact.createElement("Frame", {
|
|
Size = UDim2.new(1, 0, 0, 26),
|
|
LayoutOrder = 3,
|
|
BackgroundTransparency = 1
|
|
},{
|
|
PresenceStatusImage = Roact.createElement("ImageLabel", {
|
|
BackgroundTransparency = 1,
|
|
Image = GlobalSettings.Images.OnlineStatusIcon,
|
|
Size = UDim2.new(0, 18, 0, 18),
|
|
Position = UDim2.new(0, 5, 0, 4),
|
|
ImageColor3 = statusImageColor3,
|
|
}),
|
|
PresenceLabel = Roact.createElement("TextLabel", {
|
|
Text = statusText,
|
|
Size = UDim2.new(1, -38, 1, 0),
|
|
Position = UDim2.new(0, 33, 0, 0),
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextColor3 = currProps.textColor3,
|
|
Font = GlobalSettings.Fonts.Regular,
|
|
TextSize = 26,
|
|
BackgroundTransparency = 1,
|
|
})
|
|
}),
|
|
})
|
|
})
|
|
end
|
|
|
|
function PresenceCard:didMount()
|
|
delay(0, function()
|
|
if self.props.selected then
|
|
Utility.SetSelectedCoreObject(self.ref)
|
|
end
|
|
end)
|
|
end
|
|
|
|
function PresenceCard:didUpdate(previousProps, previousState)
|
|
if not previousProps.selected and self.props.selected then
|
|
Utility.SetSelectedCoreObject(self.ref)
|
|
end
|
|
end
|
|
|
|
return PresenceCard |