From 98ce79520d69fe66c85fb17cee9c38aa80625471 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20Pit-Claudel?= <clement.pit-claudel@epfl.ch>
Date: Sun, 22 Dec 2024 01:46:31 +0100
Subject: [PATCH] client: Simplify implementation of home page

---
 .../scala/cs214/webapp/client/Pages.scala     | 34 ++++++++-----------
 1 file changed, 15 insertions(+), 19 deletions(-)

diff --git a/js/src/main/scala/cs214/webapp/client/Pages.scala b/js/src/main/scala/cs214/webapp/client/Pages.scala
index 0b54847..d70fb37 100644
--- a/js/src/main/scala/cs214/webapp/client/Pages.scala
+++ b/js/src/main/scala/cs214/webapp/client/Pages.scala
@@ -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"
-- 
GitLab