Clients/Client2018/content/internal/AppShell/Modules/Shell/Components/Social/FriendsView.lua

158 lines
5.2 KiB
Lua

local Modules = game:GetService("CoreGui").RobloxGui.Modules
local Roact = require(Modules.Common.Roact)
local memoize = require(Modules.Common.memoize)
local RoactRodux = require(Modules.Common.RoactRodux)
local CategoryMenuView = require(Modules.Shell.Components.Common.CategoryMenuView)
local SplitViewLR = require(Modules.Shell.Components.Common.SplitViewLR)
local Utility = require(Modules.Shell.Utility)
local SoundManager = require(Modules.Shell.SoundManager)
local Strings = require(Modules.Shell.LocalizedStrings)
local FriendsScrollingView = require(Modules.Shell.Components.Social.FriendsScrollingView)
local NoFriendsView = require(Modules.Shell.Components.Social.NoFriendsView)
local PageKeys = require(Modules.Shell.PageKeys)
local FriendsView = Roact.PureComponent:extend("FriendsView")
local MenuKey = PageKeys.FriendCategories.Key
local FriendCategoriesKeys = {
OnlineFriends = PageKeys.FriendCategories.OnlineFriends.Key,
AllFriends = PageKeys.FriendCategories.AllFriends.Key,
}
local FriendCategories = {}
FriendCategories[FriendCategoriesKeys.OnlineFriends] = { Order = 1, StringKey = "OnlineWord" }
FriendCategories[FriendCategoriesKeys.AllFriends] = { Order = 2, StringKey = "AllWord" }
local function onSelectSection(self, key)
if self.state.currentPage ~= key then
self:setState({
currentPage = key,
selectedPage = MenuKey,
})
end
end
function FriendsView:init()
self.selectedPage = MenuKey
self.onSelectionGained = function(key)
onSelectSection(self,key)
end
self.state = {
currentPage = FriendCategoriesKeys.OnlineFriends,
selectedPage = MenuKey,
}
self.enterSection = function()
SoundManager:Play("OverlayOpen")
Utility.SetSelectedCoreObject(nil)
self:setState({
selectedPage = self.state.currentPage,
})
end
self.exitSection = function()
SoundManager:Play("PopUp")
self:setState({
selectedPage = MenuKey,
})
end
end
function FriendsView:render()
local actionPriority = self.props.actionPriority or 0
local currentPage = self.state.currentPage
local friendsViewInFocus = self.props.inFocus
local friendsViewHide = self.props.hide
local friendCategoriesMenuInFocus = false
local friendPagesInFocus = false
if not friendsViewHide and friendsViewInFocus then
if self.state.selectedPage == MenuKey then
friendCategoriesMenuInFocus = true
end
if self.state.selectedPage ~= MenuKey then
friendPagesInFocus = true
end
end
local enterSection = self.enterSection
if currentPage == PageKeys.FriendCategories.OnlineFriends.Key and #self.props.onlineFriendsData == 0 then
enterSection = nil
elseif currentPage == PageKeys.FriendCategories.AllFriends.Key and #self.props.allFriendsData == 0 then
enterSection = nil
end
return Roact.createElement("Frame", {
Size = UDim2.new(1, -58, 1, 0),
Position = UDim2.new(0, 58, 0, 0),
BackgroundTransparency = 1,
},{
Mainview = Roact.createElement(SplitViewLR, {
Bias = 0.265,
LeftView = Roact.createElement(CategoryMenuView, {
Key = MenuKey,
Categories = FriendCategories,
InFocus = friendCategoriesMenuInFocus,
DefaultCategoryFocus = FriendCategoriesKeys.OnlineFriends,
OnSelectSection = self.onSelectionGained,
EnterSection = enterSection,
RedirectUp = self.props.redirectUp,
ActionPriority = actionPriority,
}),
RightView = Roact.createElement("Frame", {
Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1,
},{
OnlineFriendsView = Roact.createElement(FriendsScrollingView, {
friendsData = self.props.onlineFriendsData,
initialized = self.props.initialized,
hide = currentPage ~= PageKeys.FriendCategories.OnlineFriends.Key,
inFocus = friendPagesInFocus,
redirectLeft = self.exitSection,
redirectBack = self.exitSection,
redirectUp = self.props.redirectUp,
redirectRight = self.props.redirectRight,
size = UDim2.new(0, 440, 0, 770),
noFriendsView = Roact.createElement(NoFriendsView, {
text = Strings:LocalizedString("NoFriendsOnlinePhrase"),
}),
actionPriority = actionPriority + 1,
}),
AllFriendsView = Roact.createElement(FriendsScrollingView, {
friendsData = self.props.allFriendsData,
initialized = self.props.initialized,
hide = currentPage ~= PageKeys.FriendCategories.AllFriends.Key,
inFocus = friendPagesInFocus,
redirectLeft = self.exitSection,
redirectBack = self.exitSection,
redirectUp = self.props.redirectUp,
redirectRight = self.props.redirectRight,
size = UDim2.new(0, 440, 0, 770),
noFriendsView = Roact.createElement(NoFriendsView, {
text = Strings:LocalizedString("PlayAndMakeFriendsPhrase"),
}),
actionPriority = actionPriority + 1,
}),
}),
}),
})
end
local filterOnlineFriends = memoize(function(friendsData)
local onlineFriendsData = {}
for _, data in ipairs(friendsData) do
if data.robloxStatus ~= "Offline" or data.xboxStatus == "Online" then
table.insert(onlineFriendsData, data)
end
end
return onlineFriendsData
end)
local function mapStateToProps(state, props)
local friendsData = state.RenderedFriends.data
return {
allFriendsData = friendsData,
onlineFriendsData = filterOnlineFriends(friendsData),
initialized = state.RenderedFriends.initialized
}
end
return RoactRodux.UNSTABLE_connect2(mapStateToProps)(FriendsView)