Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
  • Dec 03 17:01

    cornerman on master

    update versions manually for on… (compare)

  • Dec 03 16:55

    fdietze on master

    Deploy website Deploy website … (compare)

  • Dec 03 16:53

    cornerman on master

    show latest maven release in do… (compare)

  • Dec 03 16:28

    fdietze on master

    Deploy website Deploy website … (compare)

  • Dec 03 16:27

    cornerman on v1.0.0-RC4

    (compare)

  • Dec 03 16:25

    cornerman on master

    handle errors properly in dynam… (compare)

  • Dec 03 16:25
    cornerman closed #545
  • Dec 03 16:25
    cornerman closed #544
  • Nov 30 08:48

    fdietze on master

    Deploy website Deploy website … (compare)

  • Nov 30 08:46
    mergify[bot] closed #547
  • Nov 30 08:46

    mergify[bot] on master

    Update domtypes to 0.15.1 (#547) (compare)

  • Nov 30 08:40
    mergify[bot] labeled #547
  • Nov 30 08:40
    scala-steward opened #547
  • Nov 29 11:06
    cornerman synchronize #441
  • Nov 28 19:52
    cornerman synchronize #545
  • Nov 28 19:17
    cornerman synchronize #545
  • Nov 27 13:54

    fdietze on master

    Deploy website Deploy website … (compare)

  • Nov 27 13:51

    mergify[bot] on master

    Update colibri, colibri-monix t… (compare)

  • Nov 27 13:51
    mergify[bot] closed #546
  • Nov 26 23:43
    mergify[bot] labeled #546
bblfish
@bblfish:matrix.org
[m]
I need to try out one library to get going. I was thinking of cats effects. We used scalaz in banana-rdf 8 years ago.
The choice of effects libs in Outwatch could be very useful.
Btw. having your own diffing lib is a big +point as I'd like to not depend on FB tech, since we are building https://www.youtube.com/watch?v=lgu8NUm5Zxk
bblfish
@bblfish:matrix.org
[m]
to build Solid apps we need the client to make a lot of requests around the web, and update the UI as new information becomes available.
bblfish
@bblfish:matrix.org
[m]
btw, are there any good talks on using scala http libs and effect systems in the browser to fetch resources etc...? I can't find much out there.
bblfish
@bblfish:matrix.org
[m]
I could not find outwatch on maven central. The doc says to use the latest commit. Is that some part of sbt that I don't know that compiles stuff from github?
  "com.github.outwatch.outwatch" %%% "outwatch" % "e02749756fdb3bad7fb92250ed8a2bfab0f69ea7"
I see we have "https://jitpack.io"
bblfish
@bblfish:matrix.org
[m]
I am trying to upgrade the demo example to Scala 3. I tried this https://github.com/bblfish/SolidCtrlApp but without got the following error
[success] Total time: 1 s, completed 7 Nov 2021, 21:43:34
[error] [webpack-cli] Unable to load '@webpack-cli/serve' command
[error] [webpack-cli] TypeError: options.forEach is not a function
[error]     at WebpackCLI.makeCommand (/Volumes/Dev/Programming/Scala3/solidapp/target/scala-3.1.0/scalajs-bundler/main/node_modules/webpack-cli/lib/webpack-cli.js:108:21)
[error]     at ServeCommand.apply (/Volumes/Dev/Programming/Scala3/solidapp/target/scala-3.1.0/scalajs-bundler/main/node_modules/@webpack-cli/serve/lib/index.js:41:19)
bblfish
@bblfish:matrix.org
[m]
I guess it is not a problem with scala 3.x because going down to 2.13 I get the same problem. Perhaps the version of webpack...
johannes karoff
@cornerman
@bblfish:matrix.org Hmm, I also do not get it to work with webpack5 and the scalajs-bundler rc1. Somehow there is some incompatible version of webpack-cli and webpack-cli/serve, with that version configuration.
Do you need webpack 5 for a specific reason?
bblfish
@bblfish:matrix.org
[m]
No, I was just trying to get the latest.
I found this https://youtrack.jetbrains.com/issue/KT-49124
But I think I am using 4.9.1
I am a bit slow because I don't really know the JS ecosystem tools
johannes karoff
@cornerman
If I force the deps webpack-cli -> 4.9.1 and @webpack-cli/serve -> 1.6.0, I get another runtime error:
[error] [webpack-cli] Invalid options object. Dev Server has been initialized using an options object that does not match the API schema.
[error]  - options has an unknown property 'inline'. These properties are valid:
[error]    object { allowedHosts?, bonjour?, client?, compress?, devMiddleware?, headers?, historyApiFallback?, host?, hot?, http2?, https?, ipc?, liveReload?, magicHtml?, onAfterSetupMiddleware?, onBeforeSetupMiddleware?, onListening?, open?, port?, proxy?, server?, setupExitSignals?, static?, watchFiles?, webSocketServer? }
Something is incompatible there. Hmm.
I am still using webpack 4 in my projects without a problem. But might be worth asking in the scalajs-bundler channels.
bblfish
@bblfish:matrix.org
[m]
do you have a public git repo with a config that is working? (idally for scala3)
I don't really need the latest right now, I just need to get going :-)
bblfish
@bblfish:matrix.org
[m]
I'll got back to the seed.g8
johannes karoff
@cornerman

@bblfish:matrix.org Regarding the question about subscriptions and comparison to laminar.

Laminar uses their own streaming library called airstream, which has a really nice concept about reactive state management. There each operation that might lead to a subscription needs an implicit Owner. This owner then handles the subscription - i.e. is responsible for killing it. Using this in laminar, the owner is the enclosing html element. Airstream is in some ways similar to scala-rx, both fixing frp-glitches and using an Owner concept.

In outwatch we try to abstract over different streaming libraries, and not all have this owner concept. The subscription methods there, do not require an Owner, but instead return a Cancelable - a token to cancel the subscription. As long as it is handled, everything is fine.
Now as long as you do not call subscribe on Observables yourself (in colibri or monix), but just use them in outwatch components, everything is fine and subscriptions will be automatically cleaned up.
The only way to leak here, is to call subscribe yourself and actively ignore the returned subscription, like val _ = observable.subscribe(observer). You can still let outwatch handle the subscription manually with managed(SyncIO(observable.subscribe(observer)) inside a component - which imho is rarely needed. Normally, you just use an observable in your component and get everything handled automatically.

Also, if you use scala-rx directly - even with outwatch - the mentioned danger does not apply. Additionally, we should be able to support airstream with outwatch as well.
The seed should work. I have not used scala-3 with outwatch yet, so please let me know of any blockers you might find!
bblfish
@bblfish:matrix.org
[m]

Things start working when I move from

addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.0-RC1")

down to

addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler"  % "0.20.0")

in the plugins

Indeed the little app now works.
bblfish
@bblfish:matrix.org
[m]
It even works with scala 3.1.0 then . I pushed those changes to the https://github.com/bblfish/SolidCtrlApp
johannes karoff
@cornerman
Awesome!
We should start cross-compiling for scala 3 i guess :)
1 reply
bblfish
@bblfish:matrix.org
[m]
I found a nice intro to fs2 and cats effects for UI development. https://twitter.com/bblfish/status/1457992937804124166
That one writes directly to the dom interestingly enough, but is otherwise very FP. Is there any larger project one can look at with a lot of IO that uses OutWatch?
bblfish
@bblfish:matrix.org
[m]
Actually I went off to study cats-effect and co, but I am not sure if you work with cats-effect, and so http4s.
At least I could not find any references in the build file.
bblfish
@bblfish:matrix.org
[m]
(well it says you use cats-effect on the front page, but I guess it must be imported into the project in some indirect way)
bblfish
@bblfish:matrix.org
[m]
Ah cool the sbt dependencyTree tells me it is colibri that colibri that imports it.... (nice tool)
bblfish
@bblfish:matrix.org
[m]
ok, so I guess the latest http4s-dom uses cats-effects 3.x whereas colibri is using 2.6.1
moritz bust
@busti

@bblfish:matrix.org afaik technically projects that directly use a library should define it in their sbt file rather than relying on it through other dependencies. We should probably do that.

http4s-dom looks nice. I was wondering when they would ship their http client to js.

bblfish
@bblfish:matrix.org
[m]
they just release http4s-dom 1.0.0-M29 btw.
moritz bust
@busti
Studying cat's effect is a nice idea in general. The typelevel style in general is used in a big portion of scala libs and it's good to know what you're looking at when encountering libraries or code using the style.
I personally only use a single websocket connection in my project, but if I ever need to talk to a rest api it's probably a good choice
bblfish
@bblfish:matrix.org
[m]
For The Solid Project we write apps for the web thought of as one giant hyper-data RESTful system. Clients follow links from one server (Pod) to another to build up UI elements. So even though websockets are also used, we really need streaming http libraries.
bblfish
@bblfish:matrix.org
[m]
I have written my server in Akka but I think having akka on the client would be a bit heavy on the client. So that means I need to learn another set of libraries on this. Cats-effect seemed indeed like a good thing to try out, and as you say it is widely used...
elyphas
@elyphas
I have some kind of problem when I use onInput the focus on element input is loss more or less, because the element is showing is focused but the cursor is loss.
this happens on chrome but not on firefox.
I was searching for some solutions on google but I have some Observer connecting on this element so I don't quite get the solution.
Any idea please. :-)
this my code:
  val onChangingValueTxt =
        SyncIO(
          onInput
             .value
             .transformLifted( (e: Observable[String]) =>
               e
               .distinctUntilChanged
               .withLatestFrom(hdlFieldActive){ case (txt: String, (field: String, currentValue: JsonValue)) =>
                    val currentValue2: JsonValue = Try {
                            wrapValue(txt, currentValue)
                    } match {
                            case Success(value) => value
                            case Failure(exception) => JsonNull
                    }

                  (field, currentValue2)
                }
             ) --> hdlChangingValue
        )
elyphas
@elyphas
making a filter( x => x.length > 5) loses the cursor after 5 keys
elyphas
@elyphas
I found the problem all of that is inside the Try block:
    val mountCellFocusSelectContent = Observer.create[(dom.Element, String, String)] { case (elem, inputType, idTxt) =>
        if (idTxt == elem.id) {
                val txt = if ( inputType == "input" ) elem.asInstanceOf[html.Input] else elem.asInstanceOf[html.TextArea]
                Try {
                    val range = dom.document.createRange
                    val sel = scalajs.dom.window.getSelection
                    sel.removeAllRanges
                    range.selectNodeContents(txt)
                    sel.addRange(range)
                } match {
                    case Success(value) =>
                        txt.focus
                    case Failure(exception) => alert("Hubo un error al convertir el valor del componente: line:102 from Grid3 " + exception.getMessage())
                }
        }
    }
the solution seems is this:
$('#Search').focus(function() {
    setTimeout((function(el) {
        var strLength = el.value.length;
        return function() {
            if(el.setSelectionRange !== undefined) {
                el.setSelectionRange(strLength, strLength);
            } else {
                $(el).val(el.value);
            }
    }}(this)), 0);
});
What would be the correct translation to Outwatch ?
the comment about the problem is this:
"It seems like the focus event is fired before the cursor is placed when you focus an input, a hacky workaround would be to use a setTimeout like so:"
elyphas
@elyphas

well I did this:

    val mountCellFocusSelectContent = Observer.create[(dom.Element, String, String)] { case (elem, inputType, idTxt) =>
        if (idTxt == elem.id) {
                val txt = if ( inputType == "input" ) elem.asInstanceOf[html.Input] else elem.asInstanceOf[html.TextArea]
                Try {
                    if (window.navigator.userAgent.indexOf("Chrome") == -1 || window.navigator.userAgent.indexOf("Safari") == -1) {
                        val range = dom.document.createRange
                        val sel = scalajs.dom.window.getSelection
                        sel.removeAllRanges
                        range.selectNodeContents(txt)
                        sel.addRange(range)
                    }
                } match {
                    case Success(value) =>
                        txt.focus
                    case Failure(exception) => alert("Hubo un error al convertir el valor del componente: line:102 from Grid3 " + exception.getMessage())
                }
        }
    }

althought I don't know if is right. :-)

johannes karoff
@cornerman
We finally have a real maven release again. Welcome version 1.0.0-RC3. Thank you to @FloWi for setting this up in our github actions!