add gs
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
local CoreGui = game:GetService("CoreGui")
|
||||
local Players = game:GetService("Players")
|
||||
|
||||
local Modules = CoreGui.RobloxGui.Modules
|
||||
local Common = Modules.Common
|
||||
local LuaChat = Modules.LuaChat
|
||||
|
||||
local Constants = require(LuaChat.Constants)
|
||||
local ConversationActions = require(LuaChat.Actions.ConversationActions)
|
||||
local ConversationModel = require(LuaChat.Models.Conversation)
|
||||
local Create = require(LuaChat.Create)
|
||||
local DialogInfo = require(LuaChat.DialogInfo)
|
||||
local Immutable = require(Common.Immutable)
|
||||
local Signal = require(Common.Signal)
|
||||
|
||||
|
||||
local Components = LuaChat.Components
|
||||
local FriendSearchBoxComponent = require(Components.FriendSearchBox)
|
||||
local HeaderLoader = require(Components.HeaderLoader)
|
||||
local ResponseIndicator = require(Components.ResponseIndicator)
|
||||
|
||||
local SetRoute = require(LuaChat.Actions.SetRoute)
|
||||
|
||||
local Intent = DialogInfo.Intent
|
||||
|
||||
local EditChatGroup = {}
|
||||
EditChatGroup.__index = EditChatGroup
|
||||
|
||||
function EditChatGroup.new(appState, maxSize, convoId)
|
||||
local self = {
|
||||
appState = appState,
|
||||
maxSize = maxSize,
|
||||
convoId = convoId,
|
||||
}
|
||||
self.connections = {}
|
||||
setmetatable(self, EditChatGroup)
|
||||
|
||||
self.conversation = ConversationModel.empty()
|
||||
self.alreadyParticipants = {}
|
||||
|
||||
local oldConversation = self.appState.store:getState().ChatAppReducer.Conversations[self.convoId]
|
||||
self.fromType = oldConversation.conversationType
|
||||
for _, userId in pairs(oldConversation.participants) do
|
||||
self.alreadyParticipants[userId] = true
|
||||
end
|
||||
|
||||
self.searchComponent = FriendSearchBoxComponent.new(
|
||||
appState,
|
||||
self.conversation.participants,
|
||||
self.maxSize,
|
||||
function(user)
|
||||
local isNotPlayer = user.id ~= tostring(Players.LocalPlayer.UserId)
|
||||
local isNotInList = not self.alreadyParticipants[user.id]
|
||||
return user.isFriend and isNotPlayer and isNotInList
|
||||
end
|
||||
)
|
||||
local addParticipantConnection = self.searchComponent.addParticipant:connect(function(id)
|
||||
self.searchComponent.search:ReleaseFocus()
|
||||
self:ChangeParticipants(Immutable.Set(self.conversation.participants, #self.conversation.participants+1, id))
|
||||
end)
|
||||
table.insert(self.connections, addParticipantConnection)
|
||||
|
||||
local removeParticipantConnection = self.searchComponent.removeParticipant:connect(function(id)
|
||||
self.searchComponent.search:ReleaseFocus()
|
||||
self:ChangeParticipants(Immutable.RemoveValueFromList(self.conversation.participants, id))
|
||||
end)
|
||||
table.insert(self.connections, removeParticipantConnection)
|
||||
|
||||
-- Header:
|
||||
self.header = HeaderLoader.GetHeader(appState, Intent.EditChatGroup)
|
||||
self.header:SetDefaultSubtitle()
|
||||
self.header:SetTitle(appState.localization:Format("Feature.Chat.Label.AddFriends"))
|
||||
self.header:SetBackButtonEnabled(true)
|
||||
|
||||
self.responseIndicator = ResponseIndicator.new(appState)
|
||||
self.responseIndicator:SetVisible(false)
|
||||
|
||||
self.rbx = Create.new"Frame" {
|
||||
Size = UDim2.new(1, 0, 1, 0),
|
||||
BackgroundColor3 = Constants.Color.GRAY5,
|
||||
BorderSizePixel = 0,
|
||||
BackgroundTransparency = 1,
|
||||
|
||||
self.header.rbx,
|
||||
Create.new"Frame" {
|
||||
Name = "Content",
|
||||
Size = UDim2.new(1, 0, 1, 0),
|
||||
BackgroundColor3 = Constants.Color.GRAY5,
|
||||
BorderSizePixel = 0,
|
||||
|
||||
self.searchComponent.rbx,
|
||||
},
|
||||
self.responseIndicator.rbx,
|
||||
}
|
||||
|
||||
self.saveGroup = self.header:CreateHeaderButton("SaveGroup", "Feature.Chat.Action.Add")
|
||||
self.saveGroup:SetEnabled(false)
|
||||
|
||||
self.header:AddButton(self.saveGroup)
|
||||
local saveGroupConnection = self.saveGroup.Pressed:connect(function()
|
||||
self.searchComponent.search:ReleaseFocus()
|
||||
if #self.conversation.participants == 0 then
|
||||
return
|
||||
end
|
||||
if self.fromType == ConversationModel.Type.MULTI_USER_CONVERSATION then
|
||||
self.responseIndicator:SetVisible(true)
|
||||
|
||||
self.appState.store:dispatch(
|
||||
ConversationActions.AddUsersToConversation(self.convoId, self.conversation.participants, function()
|
||||
self.responseIndicator:SetVisible(false)
|
||||
self.appState.store:dispatch(SetRoute(
|
||||
Intent.Conversation,
|
||||
{conversationId = self.convoId},
|
||||
Intent.ConversationHub
|
||||
))
|
||||
end)
|
||||
)
|
||||
elseif self.fromType == ConversationModel.Type.ONE_TO_ONE_CONVERSATION then
|
||||
self.responseIndicator:SetVisible(true)
|
||||
|
||||
local originalConvo = self.appState.store:getState().ChatAppReducer.Conversations[self.convoId]
|
||||
local allParticipants = Immutable.Append(self.conversation.participants)
|
||||
for _, userId in ipairs(originalConvo.participants) do
|
||||
if userId ~= tostring(Players.LocalPlayer.UserId) then
|
||||
table.insert(allParticipants, userId)
|
||||
end
|
||||
end
|
||||
local newConvo = Immutable.JoinDictionaries(originalConvo, {
|
||||
participants = allParticipants,
|
||||
clientId = self.conversation.clientId,
|
||||
title = "",
|
||||
})
|
||||
|
||||
self.appState.store:dispatch(
|
||||
ConversationActions.CreateConversation(newConvo, function(passedConversationId)
|
||||
self.responseIndicator:SetVisible(false)
|
||||
self.appState.store:dispatch(
|
||||
SetRoute(Intent.Conversation, {conversationId = passedConversationId}, Intent.ConversationHub)
|
||||
)
|
||||
end)
|
||||
)
|
||||
end
|
||||
end)
|
||||
table.insert(self.connections, saveGroupConnection)
|
||||
|
||||
self.rbx.Content.Position = UDim2.new(0, 0, 0, self.header.rbx.Size.Y.Offset)
|
||||
self.rbx.Content.Size = UDim2.new(1, 0, 1, -self.header.rbx.Size.Y.Offset)
|
||||
|
||||
self.BackButtonPressed = Signal.new()
|
||||
self.header.BackButtonPressed:connect(function()
|
||||
self.searchComponent.search:ReleaseFocus()
|
||||
self.BackButtonPressed:fire()
|
||||
end)
|
||||
|
||||
spawn(function()
|
||||
self.appState.store:dispatch(ConversationActions.GetAllFriendsAsync())
|
||||
end)
|
||||
|
||||
self.tooManyFriendsAlertId = nil
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
function EditChatGroup:ChangeParticipants(participants)
|
||||
self.conversation = Immutable.Set(self.conversation, "participants", participants)
|
||||
self.searchComponent:Update(participants)
|
||||
self.saveGroup:SetEnabled(#participants > 0)
|
||||
end
|
||||
|
||||
function EditChatGroup:Update(current, previous)
|
||||
self.header:SetConnectionState(current.ConnectionState)
|
||||
self.searchComponent:Update(self.conversation.participants)
|
||||
|
||||
self.saveGroup:SetEnabled(#self.conversation.participants ~= #self.alreadyParticipants)
|
||||
end
|
||||
|
||||
function EditChatGroup:Destruct()
|
||||
for _, connection in ipairs(self.connections) do
|
||||
connection:disconnect()
|
||||
end
|
||||
self.connections = {}
|
||||
|
||||
self.header:Destroy()
|
||||
self.responseIndicator:Destruct()
|
||||
self.searchComponent:Destruct()
|
||||
self.rbx:Destroy()
|
||||
end
|
||||
|
||||
return EditChatGroup
|
||||
Reference in New Issue
Block a user