Clients/Client2018/content/internal/Chat/Modules/LuaChat/Views/DialogFrame.lua

232 lines
6.1 KiB
Lua

local TweenService = game:GetService("TweenService")
local Modules = script.Parent.Parent
local BaseScreen = require(Modules.Views.Phone.BaseScreen)
local Create = require(Modules.Create)
local Constants = require(Modules.Constants)
local DialogInfo = require(Modules.DialogInfo)
local DefaultScreenComponent = require(Modules.Components.DefaultScreen)
local DialogFrame = BaseScreen:Template()
DialogFrame.__index = DialogFrame
--Constants
local RIGHT_SIDE_POS = UDim2.new(1, 0, 0, 0)
local LEFT_SIDE_POS = UDim2.new(-1, 0, 0, 0)
local CENTERED_POS = UDim2.new(0, 0, 0, 0)
local FFlagLuaChatUsesZIndexSibling = settings():GetFFlag("LuaChatUsesZIndexSibling")
DialogFrame.TransitionType = {
Start = "Start",
Stop = "Stop",
Resume = "Resume",
Pause = "Pause",
}
local LuaChatDisplayInFront = settings():GetFFlag("LuaChatDisplayInFront")
function DialogFrame.new(appState, route)
local self = {}
self.appState = appState
self.route = route
setmetatable(self, DialogFrame)
self.rbx = Instance.new("ScreenGui")
if FFlagLuaChatUsesZIndexSibling then
self.rbx.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
end
self.rbx.Name = "ChatScreen"
if LuaChatDisplayInFront then
--Offseting the display order by 2 in hopes of working around
--un-reproducable bug where the AE screenGui isn't being de-parented
self.rbx.DisplayOrder = 3
else
self.rbx.DisplayOrder = 1
end
self.baseFrame = Create.new "Frame" {
Visible = false,
Name = "BaseFrame",
Size = UDim2.new(1, 0, 1, 0),
BackgroundColor3 = Constants.Color.GRAY6,
BorderSizePixel = 0,
Create.new "Frame" {
Name = "LeftHandFrame",
Size = UDim2.new(0.37, 0, 1, 0),
BackgroundTransparency = 1.0,
},
Create.new "Frame" {
Name = "RightHandFrame",
Size = UDim2.new(0.63, 0, 1, 0),
Position = UDim2.new(0.37, 0, 0, 0),
BackgroundTransparency = 1.0,
},
Create.new "Frame" {
Name = "Divider",
BackgroundColor3 = Constants.Color.GRAY1,
BackgroundTransparency = Constants.Color.ALPHA_SHADOW_HOVER,
BorderSizePixel = 0.0,
Size = UDim2.new(0, 1, 1, 0),
Position = UDim2.new(0.37, 0, 0, 0),
},
Create.new "Frame" {
Name = "ModalFrameBase",
Size = UDim2.new(1, 0, 1, 0),
Position = UDim2.new(0, 0, 0, 0),
BackgroundColor3 = Color3.fromRGB(0, 0, 0),
BackgroundTransparency = Constants.Color.ALPHA_SHADOW_PRIMARY,
Visible = false,
Create.new "TextButton" {
Name = "TapBlocker",
Size = UDim2.new(1, 0, 1, 0),
Position = UDim2.new(0, 0, 0, 0),
BackgroundTransparency = 1
},
Create.new "ImageLabel" {
Name = "ModalFrame",
AnchorPoint = Vector2.new(0.5, 0.5),
Size = UDim2.new(1, -360, 1, -36 -36),
Position = UDim2.new(0.5, 0, 0.5, 0),
BackgroundTransparency = 1,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(5,5,6,6),
Image = "rbxasset://textures/ui/LuaChat/9-slice/modal.png",
Create.new "UIPadding" {
PaddingBottom = UDim.new(0, Constants.ModalDialog.CLEARANCE_CORNER_ROUNDING)
}
}
}
}
self.baseFrame.Parent = self.rbx
self.leftHandFrame = self.baseFrame.LeftHandFrame
self.rightHandFrame = self.baseFrame.RightHandFrame
self.modalFrameBase = self.baseFrame.ModalFrameBase
self.modalFrame = self.modalFrameBase.ModalFrame
self.initialized = false
return self
end
function DialogFrame:Initialize()
self.baseFrame.Visible = true
self.initialized = true
local defaultScreen = DefaultScreenComponent.new(self.appState)
defaultScreen.rbx.Parent = self.rightHandFrame
end
function DialogFrame:AddDialogFrame(intent)
if not self.initialized then
self:Initialize()
end
local dialogType = DialogInfo.GetTypeBasedOnIntent(self.appState.store:getState().FormFactor, intent)
local newFrame = Create.new "Frame" {
Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1.0,
}
if dialogType == DialogInfo.DialogType.Centered then
newFrame.Parent = self.baseFrame
elseif dialogType == DialogInfo.DialogType.Left then
newFrame.Parent = self.leftHandFrame
elseif dialogType == DialogInfo.DialogType.Right then
newFrame.Parent = self.rightHandFrame
elseif dialogType == DialogInfo.DialogType.Modal then
newFrame.Parent = self.modalFrame
elseif dialogType == DialogInfo.DialogType.Popup then
newFrame.Parent = self.baseFrame
end
self:ConfigureModalFrame()
return newFrame
end
function DialogFrame:ConfigureModalFrame()
local hasGuis = false
for _, child in pairs(self.modalFrame:GetChildren()) do
if child:IsA("GuiBase") then
hasGuis = true
break
end
end
if hasGuis then
self.modalFrameBase.Visible = true
else
self.modalFrameBase.Visible = false
end
end
function DialogFrame:TransitionDialogFrame(frame, intent, otherIntent, transitionType, callback)
if (not self.appState) or (not intent) or (not otherIntent) then
if callback ~= nil then
callback(Enum.PlaybackState.Completed)
end
return
end
local dialogType = DialogInfo.GetTypeBasedOnIntent(self.appState.store:getState().FormFactor, intent)
local otherDialogType = DialogInfo.GetTypeBasedOnIntent(self.appState.store:getState().FormFactor, otherIntent)
if dialogType ~= DialogInfo.DialogType.Centered or otherDialogType ~= DialogInfo.DialogType.Centered then
if callback ~= nil then
callback(Enum.PlaybackState.Completed)
end
return
end
local startingPos
local endingPos
if transitionType == self.TransitionType.Start then
startingPos = RIGHT_SIDE_POS
endingPos = CENTERED_POS
elseif transitionType == self.TransitionType.Stop then
startingPos = CENTERED_POS
endingPos = RIGHT_SIDE_POS
elseif transitionType == self.TransitionType.Resume then
startingPos = LEFT_SIDE_POS
endingPos = CENTERED_POS
elseif transitionType == self.TransitionType.Pause then
startingPos = CENTERED_POS
endingPos = LEFT_SIDE_POS
end
frame.rbx.Position = startingPos
local tweenPosition = TweenService:Create(
frame.rbx,
TweenInfo.new(
Constants.Tween.DEFAULT_TWEEN_TIME,
Constants.Tween.DEFAULT_TWEEN_STYLE,
Constants.Tween.DEFAULT_TWEEN_EASING_DIRECTION
),
{
Position = endingPos,
}
)
tweenPosition:Play()
if callback then
spawn(function()
local playbackState = tweenPosition.Completed:wait()
callback(playbackState)
end)
end
end
return DialogFrame