Skip to content

Commit 4d3d1f9

Browse files
committed
Refactor Js{,Fn}Component.apply methods
1 parent 46f0f1b commit 4d3d1f9

File tree

3 files changed

+29
-27
lines changed

3 files changed

+29
-27
lines changed

core/src/main/scala/japgolly/scalajs/react/component/Js.scala

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,22 @@ package japgolly.scalajs.react.component
22

33
import scala.scalajs.js
44
import japgolly.scalajs.react.internal._
5-
import japgolly.scalajs.react.{Callback, Children, CtorType, Key, PropsChildren, vdom, raw => RAW}
5+
import japgolly.scalajs.react.{Callback, Children, CtorType, PropsChildren, vdom, raw => RAW}
66

77
object Js extends JsBaseComponentTemplate[RAW.ReactClass] {
88

9-
def apply[P <: js.Object, C <: Children, S <: js.Object](r: RAW.ReactClass)
10-
(implicit s: CtorType.Summoner[P, C]): Component[P, S, s.CT] =
9+
def apply[P <: js.Object, C <: Children, S <: js.Object](r: RAW.ReactClass)(implicit s: CtorType.Summoner[P, C]): Component[P, S, s.CT] =
1110
component[P, C, S](r)(s)
1211

13-
def apply[P <: js.Object, C <: Children, S <: js.Object](name: String)
14-
(implicit s: CtorType.Summoner[P, C]): Component[P, S, s.CT] = {
15-
val reactClass = findInScope(name.split('.').toList) match {
16-
case Some(x: js.Function) => x
12+
def apply[P <: js.Object, C <: Children, S <: js.Object](d: js.Dynamic)(implicit s: CtorType.Summoner[P, C]): Component[P, S, s.CT] =
13+
apply[P, C, S](d.asInstanceOf[RAW.ReactClass])(s)
14+
15+
def apply[P <: js.Object, C <: Children, S <: js.Object](name: String)(implicit s: CtorType.Summoner[P, C]): Component[P, S, s.CT] =
16+
JsUtil.evalName(name) match {
17+
case Some(d: js.Function) => apply[P, C, S](d)(s)
1718
case Some(_) => throw new IllegalArgumentException(s"React constructor $name is not a function")
1819
case None => throw new IllegalArgumentException(s"React constructor $name is not defined")
1920
}
20-
apply[P, C, S](reactClass)(s)
21-
}
22-
23-
private[this] def findInScope(path: List[String], scope: js.Dynamic = js.Dynamic.global): Option[js.Dynamic] = {
24-
path match {
25-
case Nil => Some(scope)
26-
case name :: tail =>
27-
val nextScope = scope.selectDynamic(name).asInstanceOf[js.UndefOr[js.Dynamic]].toOption
28-
nextScope.flatMap(findInScope(tail, _))
29-
}
30-
}
31-
32-
def apply[P <: js.Object, C <: Children, S <: js.Object](d: js.Dynamic)
33-
(implicit s: CtorType.Summoner[P, C]): Component[P, S, s.CT] =
34-
apply[P, C, S](d.asInstanceOf[RAW.ReactClass])(s)
3521

3622
// ===================================================================================================================
3723

core/src/main/scala/japgolly/scalajs/react/component/JsFn.scala

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@ object JsFn extends JsBaseComponentTemplate[RAW.ReactFunctionalComponent] {
1010
type Unmounted[P <: js.Object] = UnmountedRoot[P]
1111
type Mounted = Unit
1212

13-
def apply[P <: js.Object, C <: Children](rc: RAW.ReactFunctionalComponent)
14-
(implicit s: CtorType.Summoner[P, C]): Component[P, s.CT] =
13+
def apply[P <: js.Object, C <: Children](rc: RAW.ReactFunctionalComponent)(implicit s: CtorType.Summoner[P, C]): Component[P, s.CT] =
1514
componentRoot[P, s.CT, Unmounted[P]](rc, s.pf.rmap(s.summon(rc))(unmountedRoot))(s.pf)
1615

17-
def apply[P <: js.Object, C <: Children](name: String)
18-
(implicit s: CtorType.Summoner[P, C]): Component[P, s.CT] =
19-
apply[P, C](js.Dynamic.global.selectDynamic(name).asInstanceOf[RAW.ReactFunctionalComponent])(s)
16+
def apply[P <: js.Object, C <: Children](d: js.Dynamic)(implicit s: CtorType.Summoner[P, C]): Component[P, s.CT] =
17+
apply[P, C](d.asInstanceOf[RAW.ReactFunctionalComponent])(s)
18+
19+
def apply[P <: js.Object, C <: Children](name: String)(implicit s: CtorType.Summoner[P, C]): Component[P, s.CT] =
20+
JsUtil.evalName(name) match {
21+
case Some(d) => apply[P, C](d)(s)
22+
case None => throw new IllegalArgumentException(s"React constructor $name is not defined")
23+
}
2024

2125
private def staticDisplayName = "<FnComponent>"
2226

core/src/main/scala/japgolly/scalajs/react/internal/JsUtil.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,16 @@ object JsUtil {
4545
array
4646
}
4747

48+
def evalName(name: String, scope: js.Dynamic = js.Dynamic.global): Option[js.Dynamic] =
49+
evalPath(name.split('.').toList, scope)
50+
51+
def evalPath(path: List[String], scope: js.Dynamic = js.Dynamic.global): Option[js.Dynamic] = {
52+
path match {
53+
case Nil => Some(scope)
54+
case name :: tail =>
55+
val nextScope = scope.selectDynamic(name).asInstanceOf[js.UndefOr[js.Dynamic]].toOption
56+
nextScope.flatMap(evalPath(tail, _))
57+
}
58+
}
59+
4860
}

0 commit comments

Comments
 (0)