local StudioService = game:GetService("StudioService") local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin local Packages = Rojo.Packages local Roact = require(Packages.Roact) local Log = require(Packages.Log) local Theme = require(Plugin.App.Theme) local Assets = require(Plugin.Assets) local TextButton = require(Plugin.App.Components.TextButton) local e = Roact.createElement local FullscreenNotification = Roact.Component:extend("FullscreeFullscreenNotificationnNotification") function FullscreenNotification:init() self.transparency, self.setTransparency = Roact.createBinding(0) self.lifetime = self.props.timeout self.dismissed = false end function FullscreenNotification:dismiss() if self.dismissed then return end self.dismissed = true if self.props.onClose then self.props.onClose() end end function FullscreenNotification:didMount() self.props.soundPlayer:play(Assets.Sounds.Notification) self.timeout = task.spawn(function() local clock = os.clock() local seen = false while task.wait(1 / 10) do local now = os.clock() local dt = now - clock clock = now if not seen then seen = StudioService.ActiveScript == nil end if not seen then -- Don't run down timer before being viewed continue end self.lifetime -= dt if self.lifetime <= 0 then self:dismiss() break end end self.timeout = nil end) end function FullscreenNotification:willUnmount() if self.timeout and coroutine.status(self.timeout) == "suspended" then task.cancel(self.timeout) end end function FullscreenNotification:render() return Theme.with(function(theme) local actionButtons = {} if self.props.actions then for key, action in self.props.actions do actionButtons[key] = e(TextButton, { text = action.text, style = action.style, onClick = function() self:dismiss() if action.onClick then local success, err = pcall(action.onClick, self) if not success then Log.warn("Error in notification action: " .. tostring(err)) end end end, layoutOrder = -action.layoutOrder, transparency = self.transparency, }) end end return e("Frame", { BackgroundColor3 = theme.BackgroundColor, Size = UDim2.fromScale(1, 1), ZIndex = self.props.layoutOrder, }, { Padding = e("UIPadding", { PaddingLeft = UDim.new(0, 17), PaddingRight = UDim.new(0, 15), PaddingTop = UDim.new(0, 10), PaddingBottom = UDim.new(0, 10), }), Layout = e("UIListLayout", { SortOrder = Enum.SortOrder.LayoutOrder, FillDirection = Enum.FillDirection.Vertical, HorizontalAlignment = Enum.HorizontalAlignment.Center, VerticalAlignment = Enum.VerticalAlignment.Center, Padding = UDim.new(0, 10), }), Logo = e("ImageLabel", { ImageTransparency = self.transparency, Image = Assets.Images.Logo, ImageColor3 = theme.Header.LogoColor, BackgroundTransparency = 1, Size = UDim2.fromOffset(60, 27), LayoutOrder = 1, }), Info = e("TextLabel", { Text = self.props.text, FontFace = theme.Font.Main, TextSize = theme.TextSize.Body, TextColor3 = theme.Notification.InfoColor, TextTransparency = self.transparency, TextXAlignment = Enum.TextXAlignment.Center, TextYAlignment = Enum.TextYAlignment.Center, TextWrapped = true, BackgroundTransparency = 1, AutomaticSize = Enum.AutomaticSize.Y, Size = UDim2.fromScale(0.4, 0), LayoutOrder = 2, }), Actions = if self.props.actions then e("Frame", { Size = UDim2.new(1, -40, 0, 37), BackgroundTransparency = 1, LayoutOrder = 3, }, { Layout = e("UIListLayout", { FillDirection = Enum.FillDirection.Horizontal, HorizontalAlignment = Enum.HorizontalAlignment.Center, VerticalAlignment = Enum.VerticalAlignment.Center, SortOrder = Enum.SortOrder.LayoutOrder, Padding = UDim.new(0, 5), }), Buttons = Roact.createFragment(actionButtons), }) else nil, }) end) end return FullscreenNotification