Enjoy:
http://liftweb.blip.tv/file/4374370/The HTML Template:
<meta content="text/html; charset=UTF-8" http-equiv="content-type" />
<title>Home</title>
</head><body class="lift:content_id=main">
<div id="main" class="lift:surround?with=default;at=content">
<h2>Welcome to your project!</h2>
This is my chat app, baby<br />
<ul class="lift:comet?type=Chat">
<li>Chat Line 1</li>
<li class="clearable">Chat Line 2</li>
<li class="clearable">Chat line 3<br />
</li>
</ul>
<form action="/" class="lift:form.ajax"><input id="chat_in" class="lift:ChatIn" name="foo" /><br />
<input value="say something" type="submit" /></form>
<br />
<p> <span class="lift:helloWorld.howdy"> Welcome to your Lift app at <span id="time">Time goes here</span> </span> </p>
</div>
</body></html>
The Chat.scala file:
package code
package comet
import net.liftweb._
import http._
import actor._
import util._
import Helpers._
object ChatServer extends LiftActor with ListenerManager {
private var msgs = Vector("Welcome")
def createUpdate = msgs
override def lowPriority = {
case s: String => msgs :+= s; updateListeners()
}
}
class Chat extends CometActor with CometListener {
private var msgs: Vector[String] = Vector()
def registerWith = ChatServer
override def lowPriority = {
case v: Vector[String] => msgs = v; reRender()
}
def render = "li *" #> msgs & ClearClearable
}
And the ChatIn.scala snippet:
package code
package snippet
import net.liftweb._
import http._
import js._
import JsCmds._
import JE._
import comet.ChatServer
object ChatIn {
def render = SHtml.onSubmit(s => {
ChatServer ! s
SetValById("chat_in", "")
})
}