add gs
This commit is contained in:
@@ -0,0 +1,344 @@
|
||||
local Players = game:GetService("Players")
|
||||
local CoreGui = game:GetService("CoreGui")
|
||||
|
||||
local Modules = CoreGui.RobloxGui.Modules
|
||||
local Common = Modules.Common
|
||||
local LuaChat = Modules.LuaChat
|
||||
|
||||
local Signal = require(Common.Signal)
|
||||
local Create = require(LuaChat.Create)
|
||||
local Constants = require(LuaChat.Constants)
|
||||
local Functional = require(Common.Functional)
|
||||
local DialogInfo = require(LuaChat.DialogInfo)
|
||||
|
||||
local Components = LuaChat.Components
|
||||
local HeaderLoader = require(Components.HeaderLoader)
|
||||
local SectionComponent = require(Components.ListSection)
|
||||
local ActionEntryComponent = require(Components.ActionEntry)
|
||||
local UserListComponent = require(Components.UserList)
|
||||
local ListEntryComponent = require(Components.ListEntry)
|
||||
local ResponseIndicator = require(Components.ResponseIndicator)
|
||||
local GenericDialogType = require(Components.GroupDetailDialogs.GenericDialogType)
|
||||
|
||||
local getConversationDisplayTitle = require(LuaChat.Utils.getConversationDisplayTitle)
|
||||
|
||||
local ConversationModel = require(LuaChat.Models.Conversation)
|
||||
|
||||
local SetRoute = require(LuaChat.Actions.SetRoute)
|
||||
|
||||
local Intent = DialogInfo.Intent
|
||||
|
||||
local FFlagLuaChatToSplitRbxConnections = settings():GetFFlag("LuaChatToSplitRbxConnections")
|
||||
|
||||
local PARTICIPANT_VIEW = 1
|
||||
local PARTICIPANT_REPORT = 2
|
||||
local PARTICIPANT_REMOVE = 3
|
||||
|
||||
local function getAsset(name)
|
||||
return "rbxasset://textures/ui/LuaChat/"..name..".png"
|
||||
end
|
||||
|
||||
local SeeMoreButton = {}
|
||||
SeeMoreButton.__index = SeeMoreButton
|
||||
|
||||
function SeeMoreButton.new(appState)
|
||||
local self = {}
|
||||
setmetatable(self, SeeMoreButton)
|
||||
|
||||
local listEntry = ListEntryComponent.new(appState, 40)
|
||||
|
||||
self.rbx = listEntry.rbx
|
||||
self.tapped = listEntry.tapped
|
||||
|
||||
local label = Create.new"TextLabel" {
|
||||
Name = "Label",
|
||||
BackgroundTransparency = 1,
|
||||
Size = UDim2.new(1, -12, 1, 0),
|
||||
Position = UDim2.new(0, 12, 0, 0),
|
||||
TextSize = Constants.Font.FONT_SIZE_16,
|
||||
TextColor3 = Constants.Color.BLUE_PRIMARY,
|
||||
Font = Enum.Font.SourceSans,
|
||||
TextXAlignment = Enum.TextXAlignment.Left,
|
||||
Text = appState.localization:Format("Feature.Chat.Action.SeeMoreFriends"),
|
||||
}
|
||||
label.Parent = self.rbx
|
||||
|
||||
local divider = Create.new"Frame" {
|
||||
Name = "Divider",
|
||||
BackgroundColor3 = Constants.Color.GRAY4,
|
||||
BorderSizePixel = 0,
|
||||
Size = UDim2.new(1, 0, 0, 1),
|
||||
Position = UDim2.new(0, 0, 1, -1),
|
||||
}
|
||||
divider.Parent = self.rbx
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
function SeeMoreButton:Update(text)
|
||||
self.rbx.Label.Text = text
|
||||
end
|
||||
|
||||
local GroupDetail = {}
|
||||
GroupDetail.__index = GroupDetail
|
||||
|
||||
function GroupDetail.new(appState, convoId)
|
||||
local self = {}
|
||||
self.connections = {}
|
||||
if FFlagLuaChatToSplitRbxConnections then
|
||||
self.rbx_connections = {}
|
||||
end
|
||||
setmetatable(self, GroupDetail)
|
||||
|
||||
self.appState = appState
|
||||
self.conversationId = convoId
|
||||
self.AddFriendsPressed = Signal.new()
|
||||
|
||||
self.oldState = nil
|
||||
self.header = HeaderLoader.GetHeader(appState, Intent.GroupDetail)
|
||||
self.header:SetTitle(appState.localization:Format("Feature.Chat.Label.ChatDetails"))
|
||||
self.header:SetDefaultSubtitle()
|
||||
self.header:SetBackButtonEnabled(true)
|
||||
|
||||
self.rbx = Create.new"Frame" {
|
||||
Size = UDim2.new(1, 0, 1, 0),
|
||||
BackgroundColor3 = Constants.Color.GRAY5,
|
||||
BorderSizePixel = 0,
|
||||
|
||||
self.header.rbx,
|
||||
Create.new "ScrollingFrame" {
|
||||
Size = UDim2.new(1, 0, 1, 0),
|
||||
BackgroundTransparency = 1,
|
||||
BorderSizePixel = 0,
|
||||
ScrollBarThickness = 0,
|
||||
Create.new"Frame" {
|
||||
Name = "Content",
|
||||
Size = UDim2.new(1, 0, 1, 0),
|
||||
BackgroundColor3 = Constants.Color.GRAY5,
|
||||
BorderSizePixel = 0,
|
||||
Create.new"UIListLayout" {
|
||||
Name = "ListLayout",
|
||||
SortOrder = Enum.SortOrder.LayoutOrder,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
local scrollingFrame = self.rbx.ScrollingFrame
|
||||
local content = scrollingFrame.Content
|
||||
|
||||
self.BackButtonPressed = self.header.BackButtonPressed
|
||||
|
||||
scrollingFrame.Position = UDim2.new(0, 0, 0, self.header.rbx.Size.Y.Offset)
|
||||
scrollingFrame.Size = UDim2.new(1, 0, 1, -self.header.rbx.Size.Y.Offset)
|
||||
|
||||
self.general = SectionComponent.new(appState, "Feature.Chat.Label.General")
|
||||
self.general.rbx.LayoutOrder = 1
|
||||
self.general.rbx.Parent = content
|
||||
|
||||
self.groupName = ActionEntryComponent.new(appState, getAsset("icons/ic-nametag"), "Feature.Chat.Label.ChatGroupName")
|
||||
self.groupName.rbx.LayoutOrder = 2
|
||||
self.groupName.rbx.Parent = content
|
||||
local groupNameConnection = self.groupName.tapped.Event:Connect(function()
|
||||
self.appState.store:dispatch(SetRoute(Intent.GenericDialog, {
|
||||
dialog = GenericDialogType.EditChatGroupNameDialog,
|
||||
dialogParameters = {
|
||||
titleLocalizationKey = "Feature.Chat.Label.ChatGroupName",
|
||||
maxChar = 150,
|
||||
conversation = self.conversation,
|
||||
}
|
||||
}
|
||||
))
|
||||
end)
|
||||
if FFlagLuaChatToSplitRbxConnections then
|
||||
table.insert(self.rbx_connections, groupNameConnection)
|
||||
else
|
||||
table.insert(self.connections, groupNameConnection)
|
||||
end
|
||||
|
||||
self.responseIndicator = ResponseIndicator.new(appState)
|
||||
self.responseIndicator:SetVisible(false)
|
||||
self.responseIndicator.rbx.Parent = self.rbx
|
||||
|
||||
local members = SectionComponent.new(appState, "Feature.Chat.Label.Members")
|
||||
members.rbx.LayoutOrder = 5
|
||||
members.rbx.Parent = content
|
||||
|
||||
self.addFriends = ActionEntryComponent.new(appState, getAsset("icons/ic-add-friends"),
|
||||
"Feature.Chat.Label.AddFriends", 36)
|
||||
self.addFriends.rbx.LayoutOrder = 6
|
||||
self.addFriends:SetDividerOffset(60)
|
||||
self.addFriends.rbx.Parent = content
|
||||
|
||||
self.AddFriendsPressed = self.addFriends.tapped.Event
|
||||
|
||||
self.participantsList = UserListComponent.new(appState, getAsset("icons/ic-more"))
|
||||
self.participantsList.rbx.LayoutOrder = 7
|
||||
self.participantsList.rbx.Parent = content
|
||||
local userSelectedConnection = self.participantsList.userSelected:connect(function(user)
|
||||
if user.id ~= tostring(Players.LocalPlayer.UserId) then
|
||||
self.appState.store:dispatch(SetRoute(Intent.GenericDialog, {
|
||||
dialog = GenericDialogType.ParticipantDialog,
|
||||
dialogParameters = {
|
||||
titleKey = "Feature.Chat.Heading.Option",
|
||||
options = {
|
||||
[PARTICIPANT_VIEW] = "Feature.Chat.Label.ViewProfile",
|
||||
[PARTICIPANT_REPORT] = "Feature.Chat.Action.ReportUser",
|
||||
[PARTICIPANT_REMOVE] = "Feature.Chat.Action.RemoveFromGroup",
|
||||
},
|
||||
conversationId = self.conversationId,
|
||||
conversation = self.conversation,
|
||||
userId = user.id
|
||||
}
|
||||
}
|
||||
))
|
||||
end
|
||||
end)
|
||||
table.insert(self.connections, userSelectedConnection)
|
||||
|
||||
self.seeMore = SeeMoreButton.new(appState)
|
||||
self.seeMore.rbx.LayoutOrder = 9
|
||||
self.seeMore.rbx.Parent = content
|
||||
self.showAllParticipants = false
|
||||
local seeMoreConnection = self.seeMore.tapped:connect(function()
|
||||
if self.showAllParticipants then
|
||||
self.showAllParticipants = false
|
||||
self:Update(appState.store:getState())
|
||||
else
|
||||
self.showAllParticipants = true
|
||||
self:Update(appState.store:getState())
|
||||
end
|
||||
end)
|
||||
table.insert(self.connections, seeMoreConnection)
|
||||
|
||||
self.blankSection = SectionComponent.new(appState)
|
||||
self.blankSection.rbx.LayoutOrder = 10
|
||||
self.blankSection.rbx.Parent = content
|
||||
|
||||
self.leaveGroup = ActionEntryComponent.new(appState, getAsset("icons/ic-leave"), "Feature.Chat.Heading.LeaveGroup")
|
||||
self.leaveGroup.rbx.LayoutOrder = 11
|
||||
self.leaveGroup.rbx.Parent = content
|
||||
local leaveGroupConnection = self.leaveGroup.tapped.Event:Connect(function()
|
||||
self.appState.store:dispatch(SetRoute(Intent.GenericDialog, {
|
||||
dialog = GenericDialogType.LeaveGroupDialog,
|
||||
dialogParameters = {
|
||||
titleKey = "Feature.Chat.Heading.LeaveGroup",
|
||||
messageKey = "Feature.Chat.Message.LeaveGroup",
|
||||
cancelTitleKey = "Feature.Chat.Action.Stay",
|
||||
confirmationTitleKey = "Feature.Chat.Action.Leave",
|
||||
conversation = self.conversation
|
||||
}
|
||||
}
|
||||
))
|
||||
end)
|
||||
if FFlagLuaChatToSplitRbxConnections then
|
||||
table.insert(self.rbx_connections, leaveGroupConnection)
|
||||
else
|
||||
table.insert(self.connections, leaveGroupConnection)
|
||||
end
|
||||
|
||||
content.ListLayout:ApplyLayout()
|
||||
|
||||
self.conversation = ConversationModel.empty()
|
||||
|
||||
self:Update(appState.store:getState())
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
function GroupDetail:Update(state)
|
||||
local conversationId = state.ChatAppReducer.Location.current.parameters.conversationId
|
||||
local conversation = state.ChatAppReducer.Conversations[conversationId]
|
||||
self.header:SetConnectionState(state.ConnectionState)
|
||||
if conversation ~= nil then --if conversation ~= self.conversation then
|
||||
if conversation.id ~= self.conversation.id then
|
||||
self.showAllParticipants = false
|
||||
end
|
||||
|
||||
if conversation.isUserLeaving ~= self.conversation.isUserLeaving then
|
||||
self.responseIndicator:SetVisible(conversation.isUserLeaving)
|
||||
end
|
||||
|
||||
if conversation.isDefaultTitle then
|
||||
local notSetLocalized = self.appState.localization:Format("Feature.Chat.Label.NotSet")
|
||||
self.groupName:Update(notSetLocalized)
|
||||
else
|
||||
self.groupName:Update(getConversationDisplayTitle(conversation))
|
||||
end
|
||||
|
||||
local count = 0
|
||||
local users = Functional.Map(conversation.participants, function(userId)
|
||||
count = count + 1
|
||||
return (count <= 3 or self.showAllParticipants) and state.Users[userId] or nil
|
||||
end)
|
||||
|
||||
if count > 3 and not self.showAllParticipants then
|
||||
local messageArguments = {
|
||||
NUMBER_OF_FRIENDS = tostring(count-3)
|
||||
}
|
||||
local message = self.appState.localization:Format("Feature.Chat.Action.SeeMoreFriends", messageArguments)
|
||||
self.seeMore:Update(message)
|
||||
self.seeMore.rbx.Visible = true
|
||||
elseif count > 3 then
|
||||
self.seeMore:Update(self.appState.localization:Format("Feature.Chat.Label.SeeLess"))
|
||||
self.seeMore.rbx.Visible = true
|
||||
else
|
||||
self.seeMore.rbx.Visible = false
|
||||
end
|
||||
|
||||
self.participantsList:Update(users)
|
||||
|
||||
if conversation.conversationType == ConversationModel.Type.MULTI_USER_CONVERSATION then
|
||||
self.general.rbx.Visible = true
|
||||
self.groupName.rbx.Visible = true
|
||||
self.leaveGroup.rbx.Visible = true
|
||||
self.blankSection.rbx.Visible = true
|
||||
elseif conversation.conversationType == ConversationModel.Type.ONE_TO_ONE_CONVERSATION then
|
||||
self.general.rbx.Visible = false
|
||||
self.groupName.rbx.Visible = false
|
||||
self.leaveGroup.rbx.Visible = false
|
||||
self.blankSection.rbx.Visible = false
|
||||
end
|
||||
|
||||
self.conversation = conversation
|
||||
end
|
||||
if self.oldState == nil or state.ChatAppReducer.Location.current ~= self.oldState.ChatAppReducer.Location.current then
|
||||
if self.oldState ~= nil and state.ChatAppReducer.Location.current.intent == Intent.GroupDetail then
|
||||
-- If any Dialog is mounted on ModalBase, close them.
|
||||
if self.oldState.ChatAppReducer.Location.current.intent == Intent.GenericDialog then
|
||||
self.oldState.ChatAppReducer.Location.current.parameters.dialog:Close()
|
||||
end
|
||||
end
|
||||
end
|
||||
local highestYValue = 0
|
||||
for _, element in pairs(self.rbx.ScrollingFrame.Content:GetChildren()) do
|
||||
if element:IsA("GuiObject") then
|
||||
highestYValue = highestYValue + element.Size.Y.Offset
|
||||
end
|
||||
end
|
||||
self.rbx.ScrollingFrame.CanvasSize = UDim2.new(1, 0, 0, highestYValue)
|
||||
self.rbx.ScrollingFrame.Content.Size = UDim2.new(1, 0, 0, highestYValue)
|
||||
|
||||
self.oldState = state
|
||||
end
|
||||
|
||||
function GroupDetail:Stop()
|
||||
for _, connection in ipairs(self.connections) do
|
||||
connection:disconnect()
|
||||
end
|
||||
self.connections = {}
|
||||
|
||||
if FFlagLuaChatToSplitRbxConnections then
|
||||
for _, connection in ipairs(self.rbx_connections) do
|
||||
connection:Disconnect()
|
||||
end
|
||||
self.rbx_connections = {}
|
||||
end
|
||||
end
|
||||
|
||||
function GroupDetail:Destruct()
|
||||
self.responseIndicator:Destruct()
|
||||
|
||||
self.rbx:Destroy()
|
||||
end
|
||||
|
||||
return GroupDetail
|
||||
Reference in New Issue
Block a user