Skip to content

Commit 9199bc5

Browse files
committed
Refactor ScalaComponent.Mounted types for consistency
1 parent 2176028 commit 9199bc5

File tree

10 files changed

+46
-63
lines changed

10 files changed

+46
-63
lines changed

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

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,11 @@ object Scala {
3131
P, CT, Unmounted[P, S, B],
3232
Box[P], CT, JsUnmounted[P, S, B]]
3333

34-
// type Component[P, S, B, CT[-p, +u] <: CtorType[p, u]] =
35-
// Js.MappedComponent[Effect.Id, P, S, CT, RawMounted[P, S, B], Box[P], Box[S], CT]
36-
37-
type Unmounted [P, S, B] = Js.UnmountedWithRoot[P, Mounted[P, S, B], Box[P], JsMounted[P, S, B]]
38-
type Mounted [P, S, B] = MountedRoot[Effect.Id, P, S, B]
39-
type MountedPure [P, S, B] = MountedRoot[CallbackTo, P, S, B]
40-
type BackendScope[P, S] = Generic.MountedRoot[CallbackTo, P, S]
34+
type Unmounted [P, S, B] = Js.UnmountedWithRoot[P, MountedImpure[P, S, B], Box[P], JsMounted[P, S, B]]
35+
type Mounted[F[_], P, S, B] = MountedRoot[F, P, S, B]
36+
type MountedImpure[P, S, B] = Mounted[Effect.Id, P, S, B]
37+
type MountedPure [P, S, B] = Mounted[CallbackTo, P, S, B]
38+
type BackendScope [P, S] = Generic.MountedRoot[CallbackTo, P, S]
4139

4240
type JsComponent[P, S, B, CT[-p, +u] <: CtorType[p, u]] = Js.ComponentWithFacade[Box[P], Box[S], CT, Vars[P, S, B]]
4341
type JsUnmounted[P, S, B] = Js.UnmountedWithFacade[Box[P], Box[S], Vars[P, S, B]]
@@ -47,9 +45,9 @@ object Scala {
4745

4846
@js.native
4947
trait Vars[P, S, B] extends js.Object {
50-
var mounted : Mounted [P, S, B]
51-
var mountedPure: MountedPure[P, S, B]
52-
var backend : B
48+
var mountedImpure: MountedImpure[P, S, B]
49+
var mountedPure : MountedPure[P, S, B]
50+
var backend : B
5351
}
5452

5553
// private[this] def sanityCheckCU[P, S, B](c: Component[P, S, B, CtorType.Void]): Unmounted[P, S, B] = c.ctor()
@@ -63,7 +61,7 @@ object Scala {
6361
override type WithMappedState[S2] <: MountedSimple[F, P, S2, B]
6462

6563
// B instead of F[B] because
66-
// . Builder takes a MountedCB but needs immediate access to this.
64+
// 1. Builder takes a MountedPure but needs immediate access to this.
6765
// 2. It never changes once initialised.
6866
// Note: Keep this is def instead of val because the builder sets it after creation.
6967
def backend: B
@@ -124,7 +122,7 @@ object Scala {
124122
override def mapped[F3[_], P3, S3](mp: P1 => P3, ls: Lens[S1, S3])(implicit ft: Effect.Trans[Effect.Id, F3]) = mappedM(from)(mp, ls)(ft)
125123
}
126124

127-
def mountRaw[P, S, B](x: RawMounted[P, S, B]): Mounted[P, S, B] =
125+
def mountRaw[P, S, B](x: RawMounted[P, S, B]): MountedImpure[P, S, B] =
128126
mountedRoot(Js.mountedRoot(x))
129127

130128
// ===================================================================================================================
@@ -134,11 +132,11 @@ object Scala {
134132

135133
final class MutableRef[P, S, B, CT[-p, +u] <: CtorType[p, u]](c: Component[P, S, B, CT]) {
136134

137-
var value: Mounted[P, S, B] = null
135+
var value: MountedImpure[P, S, B] = null
138136

139137
private def refSet: raw.RefFn =
140138
(i: js.Any) => value =
141-
if (i == null) null else i.asInstanceOf[RawMounted[P, S, B]].mounted
139+
if (i == null) null else i.asInstanceOf[RawMounted[P, S, B]].mountedImpure
142140

143141
val component: CT[P, Unmounted[P, S, B]] =
144142
CtorType.hackBackToSelf(c.ctor)(c.ctor.withRawProp("ref", refSet))

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

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -334,13 +334,13 @@ object ScalaBuilder {
334334

335335
val setup: raw.ReactComponent => Unit =
336336
$ => {
337-
val jMounted : JsMounted [P, S, B] = Js.mounted[Box[P], Box[S]]($).addFacade[Vars[P, S, B]]
338-
val sMounted : Mounted [P, S, B] = Scala.mountedRoot(jMounted)
339-
val sMountedP: MountedPure[P, S, B] = sMounted.withEffect
340-
val backend : B = backendFn(sMountedP)
341-
jMounted.raw.mounted = sMounted
342-
jMounted.raw.mountedPure = sMountedP
343-
jMounted.raw.backend = backend
337+
val jMounted : JsMounted [P, S, B] = Js.mounted[Box[P], Box[S]]($).addFacade[Vars[P, S, B]]
338+
val sMountedI: MountedImpure[P, S, B] = Scala.mountedRoot(jMounted)
339+
val sMountedP: MountedPure [P, S, B] = sMountedI.withEffect
340+
val backend : B = backendFn(sMountedP)
341+
jMounted.raw.mountedImpure = sMountedI
342+
jMounted.raw.mountedPure = sMountedP
343+
jMounted.raw.backend = backend
344344
}
345345
spec.componentWillMount = lifecycle.componentWillMount match {
346346
case None => setup
@@ -354,9 +354,9 @@ object ScalaBuilder {
354354
val teardown: raw.ReactComponent => Unit =
355355
$ => {
356356
val vars = castV($)
357-
vars.mounted = null
358-
vars.mountedPure = null
359-
vars.backend = null.asInstanceOf[B]
357+
vars.mountedImpure = null
358+
vars.mountedPure = null
359+
vars.backend = null.asInstanceOf[B]
360360
}
361361
spec.componentWillUnmount = lifecycle.componentWillUnmount match {
362362
case None => teardown
@@ -427,27 +427,12 @@ object ScalaBuilder {
427427
def empty[P, S, B]: Lifecycle[P, S, B] =
428428
new Lifecycle(None, None, None, None, None, None, None)
429429

430-
// Reads are untyped
431-
// - Safe because of implementation in builder (creating a new Callback on demand).
432-
// - Preferred because use is easier. (TODO is it really?)
433-
434-
// Writes are Callbacks
435-
// - All state modification from within a component should return a Callback.
436-
// Consistency, type-safe, protects API & future changes.
437-
438-
// Missing from all below:
439-
// - def isMounted: F[Boolean]
440-
// - def withEffect[G[_]](implicit t: Effect.Trans[F, G]): Props[G, P]
441-
// - def mapProps[X](f: P => X): Mounted[F, X, S] =
442-
// - def xmapState[X](f: S => X)(g: X => S): Mounted[F, P, X] =
443-
// - def zoomState[X](get: S => X)(set: X => S => S): Mounted[F, P, X] =
444-
445430
sealed trait Base[P, S, B] extends Any {
446431
def raw: RawMounted[P, S, B]
447432

448-
final def backend : B = raw.backend
449-
final def mountedImpure: Mounted [P, S, B] = raw.mounted
450-
final def mountedPure : MountedPure[P, S, B] = raw.mountedPure
433+
final def backend : B = raw.backend
434+
final def mountedImpure: MountedImpure[P, S, B] = raw.mountedImpure
435+
final def mountedPure : MountedPure[P, S, B] = raw.mountedPure
451436
}
452437

453438
sealed trait StateW[P, S, B] extends Any with Base[P, S, B] {

extra/src/main/scala/japgolly/scalajs/react/extra/EventListener.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ object EventListener {
99

1010
def apply[E <: Event] = new OfEventType[E](true)
1111

12-
def defaultTarget[P, S, B]: ScalaComponent.Mounted[P, S, B] => EventTarget =
12+
def defaultTarget[P, S, B]: ScalaComponent.MountedImpure[P, S, B] => EventTarget =
1313
_.getDOMNode
1414

1515
final class OfEventType[E <: Event](private val _unused: Boolean) extends AnyVal {
@@ -28,7 +28,7 @@ object EventListener {
2828
*/
2929
def install[P, C <: Children, S, B <: OnUnmount](eventType : String,
3030
listener : ScalaComponent.MountedPure[P, S, B] => E => Callback,
31-
target : ScalaComponent.Mounted[P, S, B] => EventTarget = defaultTarget[P, S, B],
31+
target : ScalaComponent.MountedImpure[P, S, B] => EventTarget = defaultTarget[P, S, B],
3232
useCapture: Boolean = false) =
3333
OnUnmount.install[P, C, S, B] andThen (_.componentDidMount { $ =>
3434
val et = target($.mountedImpure)
@@ -44,7 +44,7 @@ object EventListener {
4444
/** See [[OfEventType.install()]]. */
4545
def install[P, C <: Children, S, B <: OnUnmount](eventType : String,
4646
listener : ScalaComponent.MountedPure[P, S, B] => Callback,
47-
target : ScalaComponent.Mounted[P, S, B] => EventTarget = defaultTarget[P, S, B],
47+
target : ScalaComponent.MountedImpure[P, S, B] => EventTarget = defaultTarget[P, S, B],
4848
useCapture: Boolean = false) =
4949
EventListener[Event].install[P, C, S, B](
5050
eventType,

extra/src/main/scala/japgolly/scalajs/react/extra/ReusabilityOverlay.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ import ReusabilityOverlay.Comp
1414
* Heavily inspired by https://github.com/redsunsoft/react-render-visualizer
1515
*/
1616
object ReusabilityOverlay {
17-
type Comp = ScalaComponent.Mounted[_, _, _]
17+
type Comp = ScalaComponent.MountedImpure[_, _, _]
1818

1919
private val key = "reusabilityOverlay"
2020

21-
def install[P: Reusability, C <: Children, S: Reusability, B](newOverlay: ScalaComponent.Mounted[P, S, B] => ReusabilityOverlay): ScalaComponentConfig[P, C, S, B] = {
21+
def install[P: Reusability, C <: Children, S: Reusability, B](newOverlay: ScalaComponent.MountedImpure[P, S, B] => ReusabilityOverlay): ScalaComponentConfig[P, C, S, B] = {
2222

2323
// Store the overlay stats on each instance
2424
def get(raw: ScalaComponent.RawMounted[P, S, B]): ReusabilityOverlay = {

extra/src/main/scala/japgolly/scalajs/react/extra/components/TriStateCheckbox.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ object TriStateCheckbox {
7272
^.onKeyDown ==> handleKey)
7373
}
7474

75-
private def updateDom($: ScalaComponent.Mounted[_, _, _], nextProps: Props): Callback = {
75+
private def updateDom($: ScalaComponent.MountedImpure[_, _, _], nextProps: Props): Callback = {
7676
val s = nextProps.state
7777
Callback {
7878
val d = $.getDOMNode.domCast[Input]

extra/src/main/scala/japgolly/scalajs/react/extra/router/package.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import japgolly.scalajs.react._
44

55
package object router {
66

7-
type Router [P] = ScalaComponent [Unit, Resolution[P], OnUnmount.Backend, CtorType.Nullary]
8-
type RouterU[P] = ScalaComponent.Unmounted[Unit, Resolution[P], OnUnmount.Backend]
9-
type RouterM[P] = ScalaComponent.Mounted [Unit, Resolution[P], OnUnmount.Backend]
7+
type Router [P] = ScalaComponent [Unit, Resolution[P], OnUnmount.Backend, CtorType.Nullary]
8+
type RouterU[P] = ScalaComponent.Unmounted [Unit, Resolution[P], OnUnmount.Backend]
9+
type RouterM[P] = ScalaComponent.MountedImpure[Unit, Resolution[P], OnUnmount.Backend]
1010

1111
private[router] implicit class OptionFnExt[A, B](private val f: A => Option[B]) extends AnyVal {
1212
def ||(g: A => Option[B]): A => Option[B] = a => f(a) orElse g(a)

test/src/test/scala/japgolly/scalajs/react/ScalazTest.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ object ScalazTest extends TestSuite {
2626

2727
val reactSIO: ReactST[IO, S, Int] = ReactS retM IO(3)
2828

29-
"runState(s.liftS)" - test[StateT[M,S,A] ](s => bs.runState(s.liftS) ).expect[CallbackTo[A]]
30-
"runStateFn(f.liftS)" - test[B => StateT[M,S,A] ](s => bs.runStateFn(s.liftS)).expect[B => CallbackTo[A]]
31-
"BackendScope" - test[BackendScope[Unit, S] ](_.runState(reactSIO) ).expect[CallbackTo[Int]]
32-
"RenderScope" - test[Render ](_.runState(reactSIO) ).expect[CallbackTo[Int]]
33-
"ScalaMountedId" - test[ScalaComponent.Mounted [U, S, U]](_.runState(reactSIO) ).expect[Int]
34-
"ScalaMountedCB" - test[ScalaComponent.MountedPure[U, S, U]](_.runState(reactSIO) ).expect[CallbackTo[Int]]
29+
"runState(s.liftS)" - test[StateT[M,S,A] ](s => bs.runState(s.liftS) ).expect[CallbackTo[A]]
30+
"runStateFn(f.liftS)" - test[B => StateT[M,S,A] ](s => bs.runStateFn(s.liftS)).expect[B => CallbackTo[A]]
31+
"BackendScope" - test[BackendScope[Unit, S] ](_.runState(reactSIO) ).expect[CallbackTo[Int]]
32+
"RenderScope" - test[Render ](_.runState(reactSIO) ).expect[CallbackTo[Int]]
33+
"ScalaMountedId" - test[ScalaComponent.MountedImpure[U, S, U]](_.runState(reactSIO) ).expect[Int]
34+
"ScalaMountedCB" - test[ScalaComponent.MountedPure [U, S, U]](_.runState(reactSIO) ).expect[CallbackTo[Int]]
3535
}
3636

3737
'runState {

test/src/test/scala/japgolly/scalajs/react/core/ScalaComponentTest.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ object ScalaComponentPTest extends TestSuite {
3434
import InferenceUtil._
3535
import ScalaComponent._
3636
'cu - test[Component[P, S, B, CtorType.Nullary]](_.ctor()).expect[Unmounted[P, S, B]]
37-
'um - test[Unmounted[P, S, B]](_.renderIntoDOM(null)).expect[Mounted[P, S, B]]
37+
'um - test[Unmounted[P, S, B]](_.renderIntoDOM(null)).expect[MountedImpure[P, S, B]]
3838
}
3939

4040
'basic {

test/src/test/scala/japgolly/scalajs/react/test/InferenceUtil.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ object InferenceUtil {
5555
type Render = ScalaComponent.Lifecycle.RenderScope[P, S, B]
5656
type Backend = BackendScope[P, S]
5757
type JsMounted = JsComponent.Mounted[JP, JS]
58-
type ScalaMountedId = ScalaComponent.Mounted[P, S, B]
58+
type ScalaMountedId = ScalaComponent.MountedImpure[P, S, B]
5959
type ScalaMountedCB = ScalaComponent.MountedPure[P, S, B]
6060
type StateAccessP = StateAccessPure[S]
6161
type StateAccessI = StateAccessImpure[S]

test/src/test/scala/japgolly/scalajs/react/test/TestTest.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ object TestTest extends TestSuite {
181181
}
182182

183183
'withRenderedIntoDocument {
184-
var m: ScalaComponent.Mounted[Unit, Boolean, Unit] = null
184+
var m: ScalaComponent.MountedImpure[Unit, Boolean, Unit] = null
185185
ReactTestUtils.withRenderedIntoDocument(IC()) { mm =>
186186
m = mm
187187
val n = m.getDOMNode
@@ -194,7 +194,7 @@ object TestTest extends TestSuite {
194194
'withRenderedIntoBody {
195195
def inspectBody() = document.body.childElementCount
196196
val body1 = inspectBody()
197-
var m: ScalaComponent.Mounted[Unit, Boolean, Unit] = null
197+
var m: ScalaComponent.MountedImpure[Unit, Boolean, Unit] = null
198198
ReactTestUtils.withRenderedIntoBody(IC()) { mm =>
199199
m = mm
200200
val n = m.getDOMNode
@@ -212,7 +212,7 @@ object TestTest extends TestSuite {
212212
}
213213

214214
'withRenderedIntoDocumentAsync {
215-
var m: ScalaComponent.Mounted[Unit, Boolean, Unit] = null
215+
var m: ScalaComponent.MountedImpure[Unit, Boolean, Unit] = null
216216
val promise: Promise[Unit] = Promise[Unit]()
217217
ReactTestUtils.withRenderedIntoDocumentAsync(IC()) { mm =>
218218
m = mm
@@ -230,7 +230,7 @@ object TestTest extends TestSuite {
230230
'withRenderedIntoBodyAsync {
231231
def inspectBody() = document.body.childElementCount
232232
val body1 = inspectBody()
233-
var m: ScalaComponent.Mounted[Unit, Boolean, Unit] = null
233+
var m: ScalaComponent.MountedImpure[Unit, Boolean, Unit] = null
234234
val promise: Promise[Unit] = Promise[Unit]()
235235
val future = ReactTestUtils.withRenderedIntoBodyAsync(IC()) { mm =>
236236
m = mm

0 commit comments

Comments
 (0)