Clients/Client2018/content/internal/AppShell/Modules/Shell/VoteView.lua

299 lines
9.2 KiB
Lua

--[[
// VoteView.lua
// Manages the vote view for the game details page
]]
local CoreGui = game:GetService("CoreGui")
local GuiRoot = CoreGui:FindFirstChild("RobloxGui")
local Modules = GuiRoot:FindFirstChild("Modules")
local ShellModules = Modules:FindFirstChild("Shell")
local EventHub = require(ShellModules:FindFirstChild('EventHub'))
local GlobalSettings = require(ShellModules:FindFirstChild('GlobalSettings'))
local Strings = require(ShellModules:FindFirstChild('LocalizedStrings'))
local Utility = require(ShellModules:FindFirstChild('Utility'))
local VoteFrame = require(ShellModules:FindFirstChild('VoteFrame'))
local ScreenManager = require(ShellModules:FindFirstChild('ScreenManager'))
local ErrorOverlayModule = require(ShellModules:FindFirstChild('ErrorOverlay'))
local Errors = require(ShellModules:FindFirstChild('Errors'))
local SoundManager = require(ShellModules:FindFirstChild('SoundManager'))
local UserData = require(ShellModules:FindFirstChild('UserData'))
local function createVoteView()
local this = {}
local canVote = false
local myVote = nil
local upVotes = 0
local downVotes = 0
local thisGameData = nil
local defaultSelection = nil
this.Container = Utility.Create'Frame'
{
Name = "VoteContainer";
Size = UDim2.new(1, 0, 0, 114);
BackgroundTransparency = 1;
Visible = false;
}
-- Can't Vote Objects
-- override selection image
local SelectionImage = Utility.Create'ImageLabel'
{
Name = "SelectionImage";
Size = UDim2.new(1, 32, 1, 32);
Position = UDim2.new(0, -16, 0, -16);
Image = 'rbxasset://textures/ui/SelectionBox.png';
ScaleType = Enum.ScaleType.Slice;
SliceCenter = Rect.new(21,21,41,41);
BackgroundTransparency = 1;
}
local CannotVoteSelection = Utility.Create'TextButton'
{
Name = "CannotVoteSelection";
Text = '';
Size = UDim2.new(1, 0, 0, 94);
Position = UDim2.new(0, 0, 0, 5);
BackgroundTransparency = 1;
Selectable = true;
SelectionImageObject = SelectionImage;
SoundManager:CreateSound('MoveSelection');
}
local CannotVoteText = Utility.Create'TextLabel'
{
Name = "CannotVoteText";
Size = UDim2.new(0.8, 0, 1, 0);
Position = UDim2.new(0.1, 0, 0, 0);
BackgroundTransparency = 1;
Font = GlobalSettings.BoldFont;
FontSize = GlobalSettings.SubHeaderSize;
TextColor3 = GlobalSettings.WhiteTextColor;
Visible = false;
TextWrapped = true;
Text = Strings:LocalizedString("CannotVoteWord");
Parent = CannotVoteSelection;
}
-- Vote Objects
local VoteWidget = VoteFrame(this.Container, UDim2.new(0, 88, 0, 34))
local VoteContainer = VoteWidget:GetContainer()
local ThumbsUpImage = Utility.Create'ImageLabel'
{
Name = "ThumbsUpImage";
Size = UDim2.new(0, 48, 0, 48);
BackgroundTransparency = 1;
}
local ThumbsDownImage = ThumbsUpImage:Clone()
ThumbsDownImage.Name = "ThumbsDownImage"
-- Buttons act as buffers for selection gui
local ThumbsUpButton = Utility.Create'ImageButton'
{
Name = "ThumbsUpButton";
Size = UDim2.new(0, ThumbsUpImage.Size.X.Offset + 18, 0, ThumbsUpImage.Size.Y.Offset + 18);
BackgroundTransparency = 1;
Image = "";
Parent = VoteContainer;
SoundManager:CreateSound('MoveSelection');
}
ThumbsUpButton.Position = UDim2.new(0, -ThumbsUpButton.Size.X.Offset - 12, 0,
-ThumbsUpButton.Size.Y.Offset / 2 + VoteContainer.Size.Y.Offset / 2)
local ThumbsDownButton = ThumbsUpButton:Clone()
ThumbsDownButton.Name = "ThumbsDownButton"
ThumbsDownButton.Position = UDim2.new(1, 12, 0, ThumbsDownButton.Position.Y.Offset)
ThumbsDownButton.Parent = VoteContainer
this.ThumbsUpButton = ThumbsUpButton
this.ThumbsDownButton = ThumbsDownButton
ThumbsUpImage.Parent = ThumbsUpButton
ThumbsDownImage.Parent = ThumbsDownButton
ThumbsUpImage.Position = UDim2.new(0.5, -ThumbsUpImage.Size.X.Offset / 2, 0.5, -ThumbsUpImage.Size.Y.Offset / 2)
ThumbsDownImage.Position = UDim2.new(0.5, -ThumbsDownImage.Size.X.Offset / 2, 0.5, -ThumbsDownImage.Size.Y.Offset / 2)
local RatingText = Utility.Create'TextLabel'
{
Name = "RatingText";
Size = UDim2.new(0, 0, 0, 0);
Position = UDim2.new(0, VoteContainer.Position.X.Offset + VoteContainer.Size.X.Offset / 2, 1, -20);
BackgroundTransparency = 1;
Font = GlobalSettings.BoldFont;
FontSize = GlobalSettings.SubHeaderSize;
Text = "";
Parent = this.Container;
}
local UpCountText = Utility.Create'TextLabel'
{
Name = "UpCountText";
Size = UDim2.new(0, 0, 0, 0);
Position = UDim2.new(0, 43, 1, RatingText.Position.Y.Offset);
BackgroundTransparency = 1;
Font = GlobalSettings.RegularFont;
FontSize = GlobalSettings.SubHeaderSize;
TextColor3 = GlobalSettings.GreenTextColor;
Text = "";
Parent = this.Container;
}
local DownCountText = UpCountText:Clone()
DownCountText.Name = "DownCountText"
DownCountText.Position = UDim2.new(0, 336, 1, RatingText.Position.Y.Offset)
DownCountText.TextColor3 = GlobalSettings.RedTextColor;
DownCountText.Parent = this.Container;
local function setImagesAndText(vote, noVote)
ThumbsUpImage.Image = vote == true and "rbxasset://textures/ui/Shell/Icons/ThumbsUpFilled@1080.png"
or "rbxasset://textures/ui/Shell/Icons/ThumbsUp@1080.png"
ThumbsUpImage.Size = UDim2.new(0,48,0,48)
ThumbsDownImage.Image = vote == false and "rbxasset://textures/ui/Shell/Icons/ThumbsDownFilled@1080.png"
or "rbxasset://textures/ui/Shell/Icons/ThumbsDown@1080.png"
ThumbsDownImage.Size = UDim2.new(0,48,0,48)
RatingText.TextColor3 =
(vote == true and GlobalSettings.GreenTextColor) or
(vote == false and GlobalSettings.RedTextColor) or GlobalSettings.GreyTextColor
local textWord = (noVote and "FirstToRateWord") or
(vote == true and "LikedWord") or (vote == false and "DislikedWord") or nil
RatingText.Text = textWord and Strings:LocalizedString(textWord) or ""
end
local function updateView(newVote)
local noVote = upVotes == 0 and downVotes == 0
VoteWidget:SetPercentFilled(not noVote and (upVotes / (upVotes + downVotes)) or nil)
setImagesAndText(newVote, noVote)
UpCountText.Text = Utility.FormatNumberString(noVote and "" or upVotes)
DownCountText.Text = Utility.FormatNumberString(noVote and "" or downVotes)
ThumbsUpButton.Selectable = canVote
ThumbsDownButton.Selectable = canVote
CannotVoteSelection.Parent = not canVote and this.Container.Parent or nil
defaultSelection = not canVote and CannotVoteSelection or ThumbsUpButton
end
local function updateVoteCount(prevVote, newVote)
-- we must check for a unique vote before sending off the achivement event
-- unique votes are when prevVote is null.
if prevVote == nil then
UserData:IncrementVote()
elseif newVote == nil then
UserData:DecrementVote()
end
EventHub:dispatchEvent(EventHub.Notifications["VotedOnPlace"])
end
local isVotingDebouce = false
local function postVoteAsync(newVote)
if isVotingDebouce then return end
isVotingDebouce = true
local success, reason = nil, nil
if thisGameData then
success, reason = thisGameData:PostVoteAsync(newVote)
else
success = false
end
if success then
local prevVote = myVote
if newVote == true then
upVotes = upVotes + 1
if prevVote == false then
downVotes = downVotes - 1
end
elseif newVote == false then
downVotes = downVotes + 1
if prevVote == true then
upVotes = upVotes - 1
end
elseif newVote == nil then
if prevVote == true then
upVotes = upVotes - 1
elseif prevVote == false then
downVotes = downVotes - 1
end
end
myVote = newVote
updateView(newVote)
updateVoteCount(prevVote, newVote)
else
if reason and Errors.Vote[reason] then
ScreenManager:OpenScreen(ErrorOverlayModule(Errors.Vote[reason]), false)
else
ScreenManager:OpenScreen(ErrorOverlayModule(Errors.Default), false)
end
end
isVotingDebouce = false
end
local function toggleCannotVoteDisplay()
CannotVoteText.Visible = not CannotVoteText.Visible
this.Container.Visible = not this.Container.Visible
end
CannotVoteSelection.SelectionGained:connect(toggleCannotVoteDisplay)
CannotVoteSelection.SelectionLost:connect(toggleCannotVoteDisplay)
ThumbsUpButton.MouseButton1Click:connect(function()
local newVote = true
if myVote == true then
newVote = nil
end
postVoteAsync(newVote)
end)
ThumbsDownButton.MouseButton1Click:connect(function()
local newVote = false
if myVote == false then
newVote = nil
end
postVoteAsync(newVote)
end)
--[[ Public API ]]--
function this:SetParent(newParent)
self.Container.Parent = newParent
updateView(myVote)
end
function this:SetPosition(newPosition)
self.Container.Position = newPosition
CannotVoteSelection.Position = UDim2.new(0, 0, 0, self.Container.Position.Y.Offset + 5)
end
function this:SetVisible(value)
self.Container.Visible = value
end
function this:GetDefaultSelection()
return defaultSelection
end
function this:SetCanVote(value)
canVote = value
if thisGameData then
thisGameData:SetCanVote(value)
end
updateView(myVote)
end
function this:GetCanVote()
return canVote
end
function this:InitializeAsync(gameData)
thisGameData = gameData
local voteData = gameData:GetVoteDataAsync()
if voteData then
upVotes = voteData.UpVotes
downVotes = voteData.DownVotes
myVote = voteData.UserVote
canVote = voteData.CanVote or (voteData.CantVoteReason ~= "PlayGame")
end
updateView(myVote)
VoteWidget:SetVisible(true)
end
return this
end
return createVoteView