Skip to content
Snippets Groups Projects
Commit 98ce7952 authored by Clément Pit-Claudel's avatar Clément Pit-Claudel
Browse files

client: Simplify implementation of home page

parent 960ee06b
No related branches found
No related tags found
1 merge request!38Customizable homepage + automatic reconnection
......@@ -29,7 +29,7 @@ abstract class Page:
List("app", appId)
case UIPage(appId, instanceId) =>
List("app", appId, instanceId)
case JoinPageLoader(appId, instanceId, uiId) =>
case JoinPage(appId, instanceId, uiId) =>
List("app", appId, instanceId, uiId)
case AppPage(appId, instanceId, uiId, userId) =>
List("app", appId, instanceId, uiId, userId)
......@@ -55,7 +55,7 @@ object Page:
case List("app", appId, instanceId) =>
UIPage(appId, instanceId)
case List("app", appId, instanceId, uiId) =>
JoinPageLoader(appId, instanceId, uiId)
JoinPage(appId, instanceId, uiId)
case List("app", appId, instanceId, uiId, userId) =>
AppPage(appId, instanceId, uiId, userId)
case _ =>
......@@ -65,18 +65,14 @@ object Page:
object HomePage extends Page:
val classList = "HomePage"
def renderInto(target: Element) =
Requests.listApps.map: response =>
AppSelectionPage(response.apps).renderInto(target)
/** The app selection menu, where the user can create a new app. */
case class AppSelectionPage(apps: Seq[AppInfo]) extends Page:
val classList = "AppSelectionPage"
def selectApp(appId: AppId): Unit =
WebClient.navigateTo(InstanceCreationPage(appId))
def renderInto(target: Element) = replaceChildren(target):
def renderInto(target: Element) =
Requests.listApps.map: resp =>
doRender(resp.apps)(target)
private def doRender(apps: Seq[AppInfo])(target: Element) = replaceChildren(target):
frag(
pageHeader("Select an app"),
apps.groupBy(_.year).toList.map: (year, appsOfYear) =>
......@@ -138,25 +134,25 @@ case class UIPage(appId: AppId, instanceId: InstanceId) extends Page:
private val handleKeyboardEvent: Function1[dom.KeyboardEvent, Unit] = (e: dom.KeyboardEvent) =>
if e.keyCode == KeyCode.Enter then
e.preventDefault()
joinPageLoader()
joinPage()
private def handleFormSubmission(e: dom.Event): Unit =
e.preventDefault()
joinPageLoader()
joinPage()
private def getSelected =
appUIs.zipWithIndex.find { (ui, i) =>
getElementById[Input](cssId(i)).checked
}.map(_._1)
private def joinPageLoader(): Unit =
private def joinPage(): Unit =
getSelected.map: ui =>
WebClient.navigateTo(JoinPageLoader(appId, instanceId, ui.uiId))
WebClient.navigateTo(JoinPage(appId, instanceId, ui.uiId))
def renderInto(target: Element) =
require(appUIs.nonEmpty, f"No UI found for app with id $appId.")
if appUIs.size == 1 then
WebClient.navigateTo(JoinPageLoader(appId, instanceId, appUIs(0).uiId), overwriteHistory = true)
WebClient.navigateTo(JoinPage(appId, instanceId, appUIs(0).uiId), overwriteHistory = true)
else replaceChildren(target):
dom.window.addEventListener("keydown", handleKeyboardEvent)
frag(
......@@ -183,14 +179,14 @@ case class UIPage(appId: AppId, instanceId: InstanceId) extends Page:
)
/** The pre-connection menu, which fetches the user list. */
case class JoinPageLoader(appId: AppId, instanceId: InstanceId, uiId: UIId) extends Page:
case class JoinPage(appId: AppId, instanceId: InstanceId, uiId: UIId) extends Page:
val classList = "JoinPageLoader"
def renderInto(target: Element) =
Requests.instanceInfo(instanceId).map: resp =>
JoinPage(appId, instanceId, uiId, resp.userIds).renderInto(target)
JoinPage_(appId, instanceId, uiId, resp.userIds).renderInto(target)
/** The connection menu, where a user joins an existing app. */
case class JoinPage(appId: AppId, instanceId: InstanceId, uiId: UIId, userIds: Seq[UserId])
case class JoinPage_(appId: AppId, instanceId: InstanceId, uiId: UIId, userIds: Seq[UserId])
extends Page:
require(userIds.size > 0)
val classList = "JoinPage"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment