ud-chatroom.psm1

function Start-UDChatroom {
    param($Port = 10000, [Switch]$AllowHttpForLogin)
    $loginPage = New-UDLoginPage -AuthenticationMethod @(
        New-UDAuthenticationMethod -Endpoint {
            param([PSCredential]$Credentials)
    
            New-UDAuthenticationResult -Success -UserName $Credentials.UserName
        }   
    ) 
    
    $dashboard = New-UDDashboard -Title "PowerShell Universal Dashboard Chatroom" -Content {
        New-UDRow -Columns { 
            New-UDColumn -Size 12 -Endpoint {
                $Messages = Invoke-PostgreSqlQuery -Sql "SELECT timestamp, message, user_name FROM chat_log ORDER BY Timestamp DESC LIMIT 10" -ConnectionString $ConnectionString
    
                [array]::Reverse($Messages)
    
                New-UDElement -Tag "ul" -Id "chatroom" -Attributes @{ className = "collection" } -Content {
                    Foreach($Message in $Messages) {
                        New-UDElement -Tag "li" -Attributes @{ className = "collection-item" } -Content {
                            "$($Message.timestamp) $($Message.user_name) : $($Message.message)"
                        }
                    }
                }
            }
        }
    
        New-UDRow -Columns { 
            New-UDColumn -Size 8 {
                New-UDElement -Id "message" -Tag "input" -Attributes @{
                    type = "text"
                    value = ''
                    placeholder = "Type a chat message"
                }
            }
    
            New-UDColumn -Size 2 {
                New-UDElement -Tag "a" -Attributes @{
                    className = "btn"
                    onClick = {
                        $MessageTimestamp = Get-Date
                        $txtMessage = Get-UDElement -Id "message" 
                        $MessageContent = $txtMessage.Attributes['value']
    
                        if ([String]::IsNullOrEmpty($MessageContent)) {
                            return
                        }
    
                        $params = @{"ts"=$MessageTimestamp; "m"=$MessageContent; "u"=$User}
    
                        "INSERT INTO chat_log (timestamp, message, user_name) VALUES (@ts, @m, @u);" | Invoke-PostgreSqlQuery -Parameters $params -ConnectionString $ConnectionString -CUD
    
                        $message = New-UDElement -Tag "li" -Attributes @{ className = "collection-item" } -Content {
                            
                            "$MessageTimestamp $User : $MessageContent "
                        }
                        
                        Set-UDElement -Id "message" -Attributes @{ 
                            type = "text"
                            value = ''
                            placeholder = "Type a chat message" 
                        }
    
                        Add-UDElement -ParentId "chatroom" -Content { $message } -Broadcast
                    }
                } -Content {"Send"}
            }
    
            New-UDColumn -Size 2 {
                New-UDElement -Tag "a" -Attributes @{
                    className = "btn"
                    onClick = {
                        Clear-UDElement -Id "chatroom"
                    }
                } -Content {"Clear Messages"}
            }
        }
    } -LoginPage $LoginPage -EndpointInitializationScript {
        Import-Module InvokeQuery
        $ConnectionString = "User Id=postgres;host=localhost;Database=udchatroom"
    }
    
    Start-UDDashboard -Port $Port -Dashboard $dashboard -AllowHttpForLogin:$AllowHttpForLogin
}