SyntaxGameServer/RCCService2018/content/internal/Chat/Modules/LuaChat/Components/UserEntry.lua

169 lines
4.6 KiB
Lua

local CoreGui = game:GetService("CoreGui")
local Players = game:GetService("Players")
local Modules = CoreGui.RobloxGui.Modules
local Common = Modules.Common
local LuaApp = Modules.LuaApp
local LuaChat = Modules.LuaChat
local Constants = require(LuaChat.Constants)
local Create = require(LuaChat.Create)
local Signal = require(Common.Signal)
local User = require(LuaApp.Models.User)
local Components = LuaChat.Components
local ListEntry = require(Components.ListEntry)
local UserThumbnail = require(Components.UserThumbnail)
local ICON_CELL_WIDTH = 60
local HEIGHT = 56
local function userPresenceToText(localization, presence, lastLocation)
if presence == User.PresenceType.OFFLINE then
return localization:Format("Common.Presence.Label.Offline")
elseif presence == User.PresenceType.ONLINE then
return localization:Format("Common.Presence.Label.Online")
elseif presence == User.PresenceType.IN_GAME then
if lastLocation ~= nil then
return lastLocation
else
return localization:Format("Common.Presence.Label.Online")
end
elseif presence == User.PresenceType.IN_STUDIO then
if lastLocation ~= nil then
return lastLocation
else
return localization:Format("Common.Presence.Label.Online")
end
end
end
local UserEntry = {}
UserEntry.__index = UserEntry
function UserEntry.new(appState, user, icon, selected)
local self = {
user = user,
appState = appState,
}
setmetatable(self, UserEntry)
self.icon = icon or "rbxasset://textures/ui/LuaChat/graphic/ic-checkbox.png"
local listEntry = ListEntry.new(appState, HEIGHT)
self.rbx = listEntry.rbx
local userThumbnail = UserThumbnail.new(appState, user.id, true)
userThumbnail.rbx.Size = UDim2.new(0, 36, 0, 36)
userThumbnail.rbx.Position = UDim2.new(0.5, 0, 0.5, 0)
userThumbnail.rbx.AnchorPoint = Vector2.new(0.5, 0.5)
self.userThumbnail = userThumbnail
local userThumbnailFrame = Create.new"Frame" {
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(0, ICON_CELL_WIDTH, 1, 0),
Position = UDim2.new(0, 0, 0, 0),
userThumbnail.rbx,
}
userThumbnailFrame.Parent = self.rbx
local label = Create.new"TextLabel" {
Name = "Label",
BackgroundTransparency = 1,
Size = UDim2.new(1, -ICON_CELL_WIDTH, 0.75, 0),
Position = UDim2.new(0, ICON_CELL_WIDTH, 0.5, 1 - Constants.Font.FONT_SIZE_18),
TextSize = Constants.Font.FONT_SIZE_18,
TextColor3 = Constants.Color.GRAY1,
Font = Enum.Font.SourceSans,
Text = user.name,
TextXAlignment = Enum.TextXAlignment.Left,
TextYAlignment = Enum.TextYAlignment.Top,
}
label.Parent = self.rbx
local sublabel = Create.new"TextLabel" {
Name = "SubLabel",
BackgroundTransparency = 1,
Size = UDim2.new(1, -ICON_CELL_WIDTH, 0.35, 0),
Position = UDim2.new(0, ICON_CELL_WIDTH, 0.5, 1),
TextSize = Constants.Font.FONT_SIZE_14,
TextColor3 = Constants.Color.GRAY2,
Font = Enum.Font.SourceSans,
Text = userPresenceToText(appState.localization, user.presence, user.lastLocation),
TextXAlignment = Enum.TextXAlignment.Left,
TextYAlignment = Enum.TextYAlignment.Top,
}
sublabel.Parent = self.rbx
local value = Create.new"ImageLabel" {
Name = "Icon",
BackgroundTransparency = 1,
Size = UDim2.new(0, 20, 0, 20),
Position = UDim2.new(1, -32, .5, 0),
Image = self.icon,
AnchorPoint = Vector2.new(0.5, 0.5),
Visible = user.id ~= tostring(Players.LocalPlayer.UserId),
}
value.Parent = self.rbx
local divider = Create.new"Frame" {
Name = "Divider",
BackgroundColor3 = Constants.Color.GRAY4,
BorderSizePixel = 0,
Size = UDim2.new(1, -ICON_CELL_WIDTH, 0, 1),
Position = UDim2.new(0, ICON_CELL_WIDTH, 1, -1),
}
divider.Parent = self.rbx
self:SetIsSelected(selected)
self.tapped = Signal.new()
listEntry.tapped:connect(function()
self.tapped:fire()
end)
listEntry.beginHover:connect(function()
userThumbnail.rbx.Overlay.ImageColor3 = Constants.Color.GRAY5
end)
listEntry.endHover:connect(function()
userThumbnail.rbx.Overlay.ImageColor3 = Constants.Color.WHITE
end)
return self
end
function UserEntry:SetIsSelected(selected)
if selected then
self.rbx.Icon.Image = "rbxasset://textures/ui/LuaChat/graphic/ic-checkbox-on.png"
else
self.rbx.Icon.Image = self.icon
end
end
function UserEntry:Update(user, selected)
self.user = user
self.rbx.Label.Text = user.name
self.rbx.SubLabel.Text = userPresenceToText(self.appState.localization, user.presence, user.lastLocation)
self:SetIsSelected(selected)
if user.id == tostring(Players.LocalPlayer.UserId) then
self.rbx.Icon.Visible = false
else
self.rbx.Icon.Visible = true
end
self.userThumbnail:Update(user)
end
function UserEntry:Destruct()
self.userThumbnail:Destruct()
self.rbx:Destroy()
end
return UserEntry