Skip to content

Commit

Permalink
Fix: SessionStorage; add rawStorageValues
Browse files Browse the repository at this point in the history
  • Loading branch information
raquo committed Nov 11, 2024
1 parent 6d9e33c commit 5e20165
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 8 deletions.
12 changes: 9 additions & 3 deletions src/main/scala/com/raquo/airstream/web/WebStorageVar.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.raquo.airstream.web

import com.raquo.airstream.core.{BaseObservable, EventStream, Observer}
import com.raquo.airstream.core.{BaseObservable, EventStream, Observer, Signal}
import com.raquo.airstream.ownership.{ManualOwner, Owner}
import com.raquo.airstream.state.SourceVar
import org.scalajs.dom
Expand Down Expand Up @@ -51,7 +51,7 @@ class WebStorageVar[A] private[web] (
/** Stream of updates of this sessionStorage/localStorage value
* from other browser tabs and frames that have shared access to it.
*/
val externalUpdates: EventStream[dom.StorageEvent] =
lazy val externalUpdates: EventStream[dom.StorageEvent] =
DomEventStream[dom.StorageEvent](
eventTarget = dom.window,
eventKey = "storage"
Expand All @@ -62,6 +62,12 @@ class WebStorageVar[A] private[web] (
maybeStorage().contains(ev.storageArea) && ev.key == key
}

/** Signal of raw values in the browser storage.
* Note: Updates are triggered only when this Var is updated.
*/
lazy val rawStorageValues: Signal[Option[String]] =
signal.mapTo(maybeStorage().flatMap(s => Option(s.getItem(key))))

// When user writes to this var, update the value in web storage
// #Note we filter out duplicate values not here, but when we
// pull/sync this var. Here we only look at non-error values,
Expand Down Expand Up @@ -203,7 +209,7 @@ object WebStorageVar {
key: String,
syncOwner: Option[Owner]
): WebStorageBuilder = {
val maybeStorage = () => Try(dom.window.localStorage).toOption
val maybeStorage = () => Try(dom.window.sessionStorage).toOption
new WebStorageBuilder(maybeStorage, key, syncOwner)
}

Expand Down
14 changes: 9 additions & 5 deletions src/test/scala/com/raquo/airstream/web/WebStorageVarSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ class WebStorageVarSpec extends UnitSpec with BeforeAndAfter {

it("localStorage basics") {

assertEquals(WebStorageVar.localStorageIsAvailable(), true)

val fooVar = WebStorageVar
.localStorage(key = "foo", syncOwner = None)
.withCodec[Foo](
Expand Down Expand Up @@ -92,6 +94,8 @@ class WebStorageVarSpec extends UnitSpec with BeforeAndAfter {

it("sessionStorage basics") {

assertEquals(WebStorageVar.sessionStorageIsAvailable(), true)

val fooVar = WebStorageVar
.sessionStorage(key = "foo", syncOwner = None)
.withCodec[Foo](
Expand All @@ -100,21 +104,21 @@ class WebStorageVarSpec extends UnitSpec with BeforeAndAfter {
default = Success(Foo(-1))
)

assertEquals(dom.window.localStorage.getItem("foo"), "-1")
assertEquals(dom.window.sessionStorage.getItem("foo"), "-1")
assertEquals(fooVar.tryNow(), Success(Foo(-1)))

// --

fooVar.update(_.copy(id = 2))

assertEquals(dom.window.localStorage.getItem("foo"), "2")
assertEquals(dom.window.sessionStorage.getItem("foo"), "2")
assertEquals(fooVar.tryNow(), Success(Foo(2)))

// --

fooVar.set(Foo(id = 3))

assertEquals(dom.window.localStorage.getItem("foo"), "3")
assertEquals(dom.window.sessionStorage.getItem("foo"), "3")
assertEquals(fooVar.tryNow(), Success(Foo(3)))

assertEquals(errorEffects.toList, Nil)
Expand All @@ -123,7 +127,7 @@ class WebStorageVarSpec extends UnitSpec with BeforeAndAfter {

fooVar.setTry(Failure(err1))

assertEquals(dom.window.localStorage.getItem("foo"), "3")
assertEquals(dom.window.sessionStorage.getItem("foo"), "3")
assertEquals(fooVar.tryNow(), Failure(err1))

assertEquals(errorEffects.toList, List(
Expand All @@ -135,7 +139,7 @@ class WebStorageVarSpec extends UnitSpec with BeforeAndAfter {

fooVar.pullOnce()

assertEquals(dom.window.localStorage.getItem("foo"), "3")
assertEquals(dom.window.sessionStorage.getItem("foo"), "3")
assertEquals(fooVar.tryNow(), Success(Foo(3)))

}
Expand Down

0 comments on commit 5e20165

Please sign in to comment.