Code Monkey home page Code Monkey logo

scala-js-react's Introduction

scala-js-react

Build Status Gitter

Scala-js-react provides nice statically typed interface to Facebook's React.

Quickstart

For detailed sbt configuration please refer to scala.js documentation.

build.sbt

enablePlugins(ScalaJSPlugin)

scalaVersion := "2.11.5"

libraryDependencies ++= Seq(
  "com.xored.scalajs" %%% "scalajs-react" % "0.3.3",
  compilerPlugin("org.scalamacros" % "paradise" % "2.0.1" cross CrossVersion.full)
)

project/plugins.sbt

addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.0")

project/build.properties

sbt.version=0.13.7

Features

scala-js-react aims to support all Facebook React features.

scalax annotation

While Facebook React uses JSX, scala-js-react offers scalax support. Basically scalax allows to use Scala XML literals to build React DOM.

React DOM allows to put objects into attribute values, while scala.xml.UnprefixedAttribute constructor takes Seq[Node] or String. So we have to transform methods before it typechecks. That is why scalax scalax uses macro annotations and requires macro paradise compiler plugin.

object HelloMessage extends TypedReactSpec {

  case class State()
  case class Props(name: String)

  def getInitialState(self: This) = State()

  @scalax
  def render(self: This) = {
    <div>Hello {self.props.name}</div>
  }
}

React.renderComponent(
  HelloMessage(HelloMessage.Props(name = "John")),
  mountNode
)

Internal State

A component can maintain internal state.

object Timer extends TypedReactSpec with TypedEventListeners {

  case class Props()
  case class State(secondsElapsed: Int, interval: Option[Int])

  def getInitialState(self: This) = State(secondsElapsed = 0, interval = None)

  implicit class Closure(self: This) {
    import self._

    val tick = () => {
      setState(state.copy(secondsElapsed = state.secondsElapsed + 1))
    }
  }

  override def componentDidMount(self: This) = {
    val interval = window.setInterval(self.tick, 1000)

    self.setState(self.state.copy(interval = Some(interval)))
  }

  override def componentWillUnmount(self: This) = {
    self.state.interval.foreach(window.clearInterval)
  }

  @scalax
  def render(self: This) = {
    <div>Seconds Elapsed: {self.state.secondsElapsed}</div>
  }
}

Typed listeners and closures

object Say extends TypedReactSpec with TypedEventListeners {

  case class Props()
  case class State(text: String)

  implicit class Closure(self: This) {
    import self._

    val onChange = input.onChange(e => {
      setState(state.copy(text = e.target.value))
    })

    val onClick = button.onClick(e => {
      alert(state.text)
    })
  }

  def getInitialState(self: This) = State(text = "")

  @scalax
  def render(self: This) = {
    <div>
      <input type="text" value={self.state.text} onChange={self.onChange}></input>
      <button type="text" onClick={self.onClick}>Say</button>
    </div>
  }
}

How to run examples

$ sbt "project scalajs-react-examples" fastOptJS
$ open scalajs-react-examples/index.html

Copyright

Copyright © 2014 Xored Software, Inc.

Licensed under the Apache License, Version 2.0.

scala-js-react's People

Contributors

13h3r avatar kanterov avatar sjrd avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

scala-js-react's Issues

how to deal with style attributes

I've come up with the following code, which fails to compile

import org.scalajs.react._
import scala.scalajs.js.Dynamic.literal

object Child extends TypedReactSpec {

  case class State()
  case class Props(x: Int)

  def style(self: This) = literal {
    paddingLeft = self.props.x
  }

  @scalax
  def render(self: This) = {
    <div style={style(self)}>a cool child {self.props.x}</div>
  }

  def getInitialState(self: This) = State()
}

What is the right way to do this with scala-js-react?

Type-safe way to `linkState`?

In javascript version of react, we can use linkState addon:

<input type="text" placeholder="name" valueLink={this.linkState('name')} />

How to do the same with scala-js-react, in a type-safe way?

Error when trying to add xored scalajs react to a play project

I've got Scala.js working in the play project but when I try to add xored scalajs react, I'm getting these errors:

rg.scalajs.core.tools.classpath.JSLibResolveException: Some references to JS libraries could not be resolved:

  • Ambiguous reference to a JS library: react.js
    Possible paths found on the classpath:
    • META-INF/resources/webjars/react/0.11.0/react.js
    • META-INF/resources/webjars/react/0.11.0/vendor/fbtransform/transforms/react.js
      originating from: scalajs-react:compile

Children components?

Is there an example with you using Children components, similar to this (JSX):

/** @jsx React.DOM */

var buttonsInstance = (
    <div>
      <ButtonToolbar>
        <Button bsStyle="primary" bsSize="large">Large button</Button>
        <Button bsSize="large">Large button</Button>
      </ButtonToolbar>
      <ButtonToolbar>
        <Button bsStyle="primary">Default button</Button>
        <Button>Default button</Button>
      </ButtonToolbar>
      <ButtonToolbar>
        <Button bsStyle="primary" bsSize="small">Small button</Button>
        <Button bsSize="small">Small button</Button>
      </ButtonToolbar>
      <ButtonToolbar>
        <Button bsStyle="primary" bsSize="xsmall">Extra small button</Button>
        <Button bsSize="xsmall">Extra small button</Button>
      </ButtonToolbar>
    </div>
  );

React.renderComponent(buttonsInstance, mountNode);

or plain js

/** @jsx React.DOM */

var buttonsInstance = (
    React.DOM.div(null,
      ButtonToolbar(null,
        Button( {bsStyle:"primary", bsSize:"large"}, "Large button"),
        Button( {bsSize:"large"}, "Large button")
      ),
      ButtonToolbar(null,
        Button( {bsStyle:"primary"}, "Default button"),
        Button(null, "Default button")
      ),
      ButtonToolbar(null,
        Button( {bsStyle:"primary", bsSize:"small"}, "Small button"),
        Button( {bsSize:"small"}, "Small button")
      ),
      ButtonToolbar(null,
        Button( {bsStyle:"primary", bsSize:"xsmall"}, "Extra small button"),
        Button( {bsSize:"xsmall"}, "Extra small button")
      )
    )
  );

React.renderComponent(buttonsInstance, mountNode);

I haven't gotten it to work. It looks like you assume everything passed in after the first component is a ref. Any insight how to wire this up?

Send TypedReactSpec as props

Hi, I am trying to send a TypedReactSpec inside a prop, but I am not able to "mount" it on render because I don't know which props should be there.

case class Props(root: TypedReactSpec)

@scalax
  def render(self: This) = {
    self.props.root(???)
  }

I also tried to extend TypedReactSpec to a general type so I would know which prop is it, but I was not able.

Is there a way to achieve that using scala-js-react?

Thanks

Router?

How to create a router with this project?

Is it possible to declare the components we defined in XML?

I see in the examples, we can just declare in XML with the standard HTML tags, like:

@scalax
  def render(self: This) = {
    <div>Hello {self.props.name}</div>
  }

Is it possible to use the components we defined? like:

@scalax
  def render(self: This) = {
    <MyComponent>Hello {self.props.name}</MyComponent>
  }

How to get the ref of a custom component in parent component?

Say I have two custom components, one has a button, other one has a link.

When I click on the button, I want to the link of another component be clicked.

If I can get the DOM of the link from the button component, I can easily do:

linkNode.click()

But in my case, I can't find a way to get the ref of the link in the button component. If I use pure reactjs, I can do:

refs('linkComponent').refs('link').getDOMNode().click()

But how to do the same with scala-js-react?

Include multiple component from scalax

I can't figure out from the source how to include nested components (only works for the last item == return object). Let's see those two files:

core/Hack.scala

package core

import scala.scalajs.js
import org.scalajs.react._
import org.scalajs.react.util._
import org.scalajs.dom._

import scala.scalajs.js.annotation.JSExport
import org.scalajs.dom.extensions.KeyCode

import widgets.{Header, Menu, Footer}

@JSExport("Hack")
object Hack extends TypedReactSpec with TypedEventListeners {

  case class Props()
  case class State()

  def getInitialState(self: This) = State()

  @scalax
  def render(self: This) = {

    // That'd be neat:
    // <Header/>
    // <Menu/>
    // <Footer/>

    Header(Header.Props())
    Menu(Menu.Props())
    Footer(Footer.Props()) // <- that one is included

  }
}

widgets/Header.scala

package widgets

import org.scalajs.react._
import org.scalajs.react.util._
import org.scalajs.dom._

import scala.scalajs.js.annotation.JSExport
import org.scalajs.dom.extensions.KeyCode

@JSExport("Header")
object Header extends TypedReactSpec with TypedEventListeners {

  case class Props()

  case class State()

  def getInitialState(self: This) = State()

  @scalax
  def render(self: This) = {
    <header id="header">
      <div class="omnisearch-wrapper">
      </div>
    </header>
  }
}

Can you confirm that it's not possible (yet?), or point to me the place in the code that'd allow me to deal with this kind of stuffs?

Thanks, and awesome job btw :)

Shorter prop usage syntax

Hello,

I've been using the project for some days and was really pleased by the lib except for the syntax part which suffer from react/js legacy.

The problem with Props() is that it forces you to type a lot of things and when you start to use apply(...) = apply(Props(...)) you have to type three times your parameters to keep things in sync which is a pain.

I just found a method to shorten the syntax but I haven't tested it a lot so your comments are welcome :

// This is our Props()
case class UserRankingLine(pos:Int, name:String, image:String, score:String)

// A component to display a Ranking
object UserRankingLine extends TypedReactSpec {
  // our Props is the case class
  type Props = UserRankingLine
  // this implicit will run the .apply(o:Props) whenever a Props() needs to be converted into a ReactDOM
  implicit def toReactDOM(o:Props) : ReactDOM = apply(o)

  // our state as usual
  case class State()
  def getInitialState(self:This) = State()

  // render the component
  @scalax def render(self:This) = {
    <div className="UserRankingLine">
      <div className="rank">{ self.props.pos }</div>
      <img src="{self.props.image}" alt="" width="50" height="50" />
      <div className="name">{ self.props.name }</div>
      <div className="score">{ self.props.score }</div>
    </div>
  }
}

And then you can instantiate your component just like with the regular Component.apply(...) method :

@scalax def render(self:This) = {
  UserRankingLine(1, "User", "img/foo.png", "1000 pts")
}

Maybe the implicit can be pushed up into the hierarchy so users don't have to type it everytime or maybe the case class type could be given as a generic parameter so the implicit could be created inside the TypedReactSpec[T]. I am not sure what could work with the project.

There may be problems with Seq[Component], I am not sure implicits will be run correctly to get Seq[ReactDom], I haven't tested it yet and you may see problems coming :)

Anyway thank you for the awesome work and I hope this little trick will be of some help to simplify the API.

Compilation error

Following code will cause compilation error:

case class Props(projects: Seq[Project], onSelectProject: (Project) => Unit)

@scalax
  override def render(self: This) = {
    <div>
      {self.props.projects.map(p => <div onClick={self.props.onSelectProject(p)}>{p.name}</div>)}
    </div>
  }

and Project:

case class Project(name: String, links: Seq[Link], description: Option[String] = None)
case class Link(name: String, url: String, description: Option[String] = None)

Error:

2. Waiting for source changes... (press enter to interrupt)
[info] Compiling 1 Scala source to /Users/twer/workspace/wind-links/target/scala-2.11/classes...
[error] /Users/twer/workspace/wind-links/src/main/scala/in/freewind/windlinks/pages/config/ProjectLists.scala:22: overloaded method value apply with alternatives:
[error]   (key: String,value: scala.scalajs.js.Dynamic,md: scala.scalajs.js.Dictionary[scala.scalajs.js.Any])scala.scalajs.js.Dictionary[scala.scalajs.js.Any] <and>
[error]   [T](key: String, value: scala.scalajs.js.Dictionary[T], md: scala.scalajs.js.Dictionary[scala.scalajs.js.Any])scala.scalajs.js.Dictionary[scala.scalajs.js.Any] <and>
[error]   [T](key: String, value: Map[String,T], md: scala.scalajs.js.Dictionary[scala.scalajs.js.Any])scala.scalajs.js.Dictionary[scala.scalajs.js.Any] <and>
[error]   (key: String,value: Double,md: scala.scalajs.js.Dictionary[scala.scalajs.js.Any])scala.scalajs.js.Dictionary[scala.scalajs.js.Any] <and>
[error]   (key: String,value: Boolean,md: scala.scalajs.js.Dictionary[scala.scalajs.js.Any])scala.scalajs.js.Dictionary[scala.scalajs.js.Any] <and>
[error]   (key: String,value: String,md: scala.scalajs.js.Dictionary[scala.scalajs.js.Any])scala.scalajs.js.Dictionary[scala.scalajs.js.Any] <and>
[error]   (key: String,value: Function3[_, _, _, _],md: scala.scalajs.js.Dictionary[scala.scalajs.js.Any])scala.scalajs.js.Dictionary[scala.scalajs.js.Any] <and>
[error]   (key: String,value: Function2[_, _, _],md: scala.scalajs.js.Dictionary[scala.scalajs.js.Any])scala.scalajs.js.Dictionary[scala.scalajs.js.Any] <and>
[error]   (key: String,value: Function1[_, _],md: scala.scalajs.js.Dictionary[scala.scalajs.js.Any])scala.scalajs.js.Dictionary[scala.scalajs.js.Any] <and>
[error]   (key: String,value: Function0[_],md: scala.scalajs.js.Dictionary[scala.scalajs.js.Any])scala.scalajs.js.Dictionary[scala.scalajs.js.Any] <and>
[error]   (key: String,value: Option[Function1[_, _]],md: scala.scalajs.js.Dictionary[scala.scalajs.js.Any])scala.scalajs.js.Dictionary[scala.scalajs.js.Any]
[error]  cannot be applied to (String, Unit, scala.scalajs.js.Dictionary[scala.scalajs.js.Any])
[error]   @scalax
[error]    ^
[error] one error found
[error] (compile:compile) Compilation failed
[error] Total time: 1 s, completed Feb 14, 2015 12:36:53 PM
3. Waiting for source changes... (press enter to interrupt)

But if I remove the onClick={self.props.onSelectProject(p)} part, it will be OK.

Is it because the parameter p is not a normal type like string, but a custom complex type Project?

Need tutorial to create simple scala.js react app

I am trying to create Simple Hello World scala-js-react app. But somehow I am not able to make it work.

It would be great if you publish a simple standalone Hello World example for this project.

I am basically struggling in setting up build.sbt, project/plugins.sbt.

Thanks.

Can't download require 'commons-logging' when run `sbt`

Just cloned the repo and run: sbt, it reports:

[info] Loading project definition from /Users/twer/workspace/scala-js-react/project
[info] Updating {file:/Users/twer/workspace/scala-js-react/project/}scala-js-react-build...
[info] Resolving org.scala-sbt.ivy#ivy;2.3.0-sbt-fccfbd44c9f64523b61398a0155784d[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: commons-logging#commons-logging;1.1.1: configuration not found in commons-logging#commons-logging;1.1.1: 'master(compile)'. Missing configuration: 'compile'. It was required from org.apache.httpcomponents#httpclient;4.2.6 compile
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]
[warn]  Note: Unresolved dependencies path:
[warn]      commons-logging:commons-logging:1.1.1
[warn]        +- org.apache.httpcomponents:httpclient:4.2.6
[warn]        +- org.xerial.sbt:sbt-sonatype:0.2.1 (scalaVersion=2.10, sbtVersion=0.13) (/Users/twer/workspace/scala-js-react/project/plugins.sbt#L3-4)
[warn]        +- default:scala-js-react-build:0.1-SNAPSHOT (scalaVersion=2.10, sbtVersion=0.13)
sbt.ResolveException: unresolved dependency: commons-logging#commons-logging;1.1.1: configuration not found in commons-logging#commons-logging;1.1.1: 'master(compile)'. Missing configuration: 'compile'. It was required from org.apache.httpcomponents#httpclient;4.2.6 compile
    at sbt.IvyActions$.sbt$IvyActions$$resolve(IvyActions.scala:278)
    at sbt.IvyActions$$anonfun$updateEither$1.apply(IvyActions.scala:175)
    at sbt.IvyActions$$anonfun$updateEither$1.apply(IvyActions.scala:157)
    at sbt.IvySbt$Module$$anonfun$withModule$1.apply(Ivy.scala:151)
    at sbt.IvySbt$Module$$anonfun$withModule$1.apply(Ivy.scala:151)
    at sbt.IvySbt$$anonfun$withIvy$1.apply(Ivy.scala:128)
    at sbt.IvySbt.sbt$IvySbt$$action$1(Ivy.scala:56)
    at sbt.IvySbt$$anon$4.call(Ivy.scala:64)
    at xsbt.boot.Locks$GlobalLock.withChannel$1(Locks.scala:93)
    at xsbt.boot.Locks$GlobalLock.xsbt$boot$Locks$GlobalLock$$withChannelRetries$1(Locks.scala:78)
    at xsbt.boot.Locks$GlobalLock$$anonfun$withFileLock$1.apply(Locks.scala:97)
    at xsbt.boot.Using$.withResource(Using.scala:10)
    at xsbt.boot.Using$.apply(Using.scala:9)
    at xsbt.boot.Locks$GlobalLock.ignoringDeadlockAvoided(Locks.scala:58)
    at xsbt.boot.Locks$GlobalLock.withLock(Locks.scala:48)
    at xsbt.boot.Locks$.apply0(Locks.scala:31)
    at xsbt.boot.Locks$.apply(Locks.scala:28)
    at sbt.IvySbt.withDefaultLogger(Ivy.scala:64)
    at sbt.IvySbt.withIvy(Ivy.scala:123)
    at sbt.IvySbt.withIvy(Ivy.scala:120)
    at sbt.IvySbt$Module.withModule(Ivy.scala:151)
    at sbt.IvyActions$.updateEither(IvyActions.scala:157)
    at sbt.Classpaths$$anonfun$sbt$Classpaths$$work$1$1.apply(Defaults.scala:1318)
    at sbt.Classpaths$$anonfun$sbt$Classpaths$$work$1$1.apply(Defaults.scala:1315)
    at sbt.Classpaths$$anonfun$doWork$1$1$$anonfun$85.apply(Defaults.scala:1345)
    at sbt.Classpaths$$anonfun$doWork$1$1$$anonfun$85.apply(Defaults.scala:1343)
    at sbt.Tracked$$anonfun$lastOutput$1.apply(Tracked.scala:35)
    at sbt.Classpaths$$anonfun$doWork$1$1.apply(Defaults.scala:1348)
    at sbt.Classpaths$$anonfun$doWork$1$1.apply(Defaults.scala:1342)
    at sbt.Tracked$$anonfun$inputChanged$1.apply(Tracked.scala:45)
    at sbt.Classpaths$.cachedUpdate(Defaults.scala:1360)
    at sbt.Classpaths$$anonfun$updateTask$1.apply(Defaults.scala:1300)
    at sbt.Classpaths$$anonfun$updateTask$1.apply(Defaults.scala:1275)
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
    at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
    at sbt.std.Transform$$anon$4.work(System.scala:63)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
    at sbt.Execute.work(Execute.scala:235)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
[error] (*:update) sbt.ResolveException: unresolved dependency: commons-logging#commons-logging;1.1.1: configuration not found in commons-logging#commons-logging;1.1.1: 'master(compile)'. Missing configuration: 'compile'. It was required from org.apache.httpcomponents#httpclient;4.2.6 compile
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore?

Not sure how to fix it

Can't handle List in `render`?

I have a render which contains a List:

@scalax
  override def render(self: This) = {
    val content = Search(Search.Props(self.onSearch)) :: (self.state.keyword match {
      case Some(keyword) => SearchResult(SearchResult.Props(filteredLinks(projects, keyword)))
      case _ => Links(Links.Props(projects))
    }) :: Nil

    <div>
      {content}
    </div>
  }

It will reports error when I run fastOptJS:

6. Waiting for source changes... (press enter to interrupt)
[info] Compiling 1 Scala source to /Users/twer/workspace/wind-links/target/scala-2.11/classes...
[error] /Users/twer/workspace/wind-links/src/main/scala/in/freewind/windlinks/main/Main.scala:34: ')' expected but $XMLSTART$< found.
[error]     <div>
[error]     ^
[error] one error found
[error] (compile:compile) Compilation failed
[error] Total time: 0 s, completed Feb 13, 2015 10:56:07 PM
7. Waiting for source changes... (press enter to interrupt)
[info] Compiling 1 Scala source to /Users/twer/workspace/wind-links/target/scala-2.11/classes...
[error]
[error]   no progress in completing object Main: <?>
[error]      while compiling: /Users/twer/workspace/wind-links/src/main/scala/in/freewind/windlinks/main/Main.scala
[error]         during phase: globalPhase=typer, enteringPhase=namer
[error]      library version: version 2.11.5
[error]     compiler version: version 2.11.5
[error]   reconstructed args: -classpath /Users/twer/workspace/wind-links/target/scala-2.11/classes:/Users/twer/.ivy2/cache/org.scala-js/scalajs-library_2.11/jars/scalajs-library_2.11-0.6.0.jar:/Users/twer/.ivy2/cache/com.xored.scalajs/scalajs-react_sjs0.6_2.11/jars/scalajs-react_sjs0.6_2.11-0.3.3.jar:/Users/twer/.ivy2/cache/org.webjars/react/jars/react-0.11.0.jar:/Users/twer/.ivy2/cache/org.scala-js/scalajs-dom_sjs0.6_2.11/jars/scalajs-dom_sjs0.6_2.11-0.7.0.jar:/Users/twer/.ivy2/cache/org.scala-lang.modules/scala-xml_2.11/bundles/scala-xml_2.11-1.0.2.jar:/Users/twer/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.11.5.jar -Xplugin:/Users/twer/.ivy2/cache/org.scala-js/scalajs-compiler_2.11.5/jars/scalajs-compiler_2.11.5-0.6.0.jar -Xplugin:/Users/twer/.ivy2/cache/org.scalamacros/paradise_2.11.5/jars/paradise_2.11.5-2.0.1.jar -bootclasspath /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/classes:/Users/twer/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.5.jar
[error]
[error]   last tree to typer: Select(Ident(Links), apply$default$2)
[error]        tree position: line 31 of /Users/twer/workspace/wind-links/src/main/scala/in/freewind/windlinks/main/Main.scala
[error]             tree tpe: [T]=> Any
[error]               symbol: method apply$default$2 in trait ReactSpec
[error]    symbol definition: def apply$default$2[T]: Any @scala.annotation.unchecked.uncheckedVariance (a MethodSymbol)
[error]       symbol package: com.xored.scalajs.react
[error]        symbol owners: method apply$default$2 -> trait ReactSpec
[error]            call site: object Main in package main in package main
[error]
[error] == Source file context for tree position ==
[error]
[error]     28     val content = Search(Search.Props(self.onSearch)) :: (self.state.keyword match {
[error]     29       case Some(keyword) => SearchResult(SearchResult.Props(filteredLinks(projects, keyword)))
[error]     30       case _ => Links(Links.Props(projects))
[error]     31     }) :: Nil
[error]     32
[error]     33     <div>
[error]     34       {content}
[error] /Users/twer/workspace/wind-links/src/main/scala/in/freewind/windlinks/main/Main.scala:27: exception during macro expansion:
[error] scala.reflect.internal.FatalError:
[error]   no progress in completing object Main: <?>
[error]      while compiling: /Users/twer/workspace/wind-links/src/main/scala/in/freewind/windlinks/main/Main.scala
[error]         during phase: globalPhase=typer, enteringPhase=namer
[error]      library version: version 2.11.5
[error]     compiler version: version 2.11.5
[error]   reconstructed args: -classpath /Users/twer/workspace/wind-links/target/scala-2.11/classes:/Users/twer/.ivy2/cache/org.scala-js/scalajs-library_2.11/jars/scalajs-library_2.11-0.6.0.jar:/Users/twer/.ivy2/cache/com.xored.scalajs/scalajs-react_sjs0.6_2.11/jars/scalajs-react_sjs0.6_2.11-0.3.3.jar:/Users/twer/.ivy2/cache/org.webjars/react/jars/react-0.11.0.jar:/Users/twer/.ivy2/cache/org.scala-js/scalajs-dom_sjs0.6_2.11/jars/scalajs-dom_sjs0.6_2.11-0.7.0.jar:/Users/twer/.ivy2/cache/org.scala-lang.modules/scala-xml_2.11/bundles/scala-xml_2.11-1.0.2.jar:/Users/twer/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.11.5.jar -Xplugin:/Users/twer/.ivy2/cache/org.scala-js/scalajs-compiler_2.11.5/jars/scalajs-compiler_2.11.5-0.6.0.jar -Xplugin:/Users/twer/.ivy2/cache/org.scalamacros/paradise_2.11.5/jars/paradise_2.11.5-2.0.1.jar -bootclasspath /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/classes:/Users/twer/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.5.jar
[error]
[error]   last tree to typer: Select(Ident(Links), apply$default$2)
[error]        tree position: line 31 of /Users/twer/workspace/wind-links/src/main/scala/in/freewind/windlinks/main/Main.scala
[error]             tree tpe: [T]=> Any
[error]               symbol: method apply$default$2 in trait ReactSpec
[error]    symbol definition: def apply$default$2[T]: Any @scala.annotation.unchecked.uncheckedVariance (a MethodSymbol)
[error]       symbol package: com.xored.scalajs.react
[error]        symbol owners: method apply$default$2 -> trait ReactSpec
[error]            call site: object Main in package main in package main
[error]
[error] == Source file context for tree position ==
[error]
[error]     28     val content = Search(Search.Props(self.onSearch)) :: (self.state.keyword match {
[error]     29       case Some(keyword) => SearchResult(SearchResult.Props(filteredLinks(projects, keyword)))
[error]     30       case _ => Links(Links.Props(projects))
[error]     31     }) :: Nil
[error]     32
[error]     33     <div>
[error]     34       {content}
[error]     at scala.reflect.internal.Reporting$class.abort(Reporting.scala:59)
[error]     at scala.reflect.internal.SymbolTable.abort(SymbolTable.scala:16)
[error]     at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1491)
[error]     at scala.reflect.internal.Symbols$Symbol.getterIn(Symbols.scala:2394)
[error]     at scala.reflect.internal.Symbols$Symbol.getter(Symbols.scala:2391)
[error]     at scala.tools.nsc.typechecker.Namers$Namer.widenIfNecessary(Namers.scala:847)
[error]     at scala.tools.nsc.typechecker.Namers$Namer.assignTypeToTree(Namers.scala:877)
[error]     at scala.tools.nsc.typechecker.Namers$Namer.valDefSig(Namers.scala:1381)
[error]     at scala.tools.nsc.typechecker.Namers$Namer.getSig$1(Namers.scala:1532)
[error]     at scala.tools.nsc.typechecker.Namers$Namer.typeSig(Namers.scala:1541)
[error]     at scala.tools.nsc.typechecker.Namers$Namer$$anonfun$monoTypeCompleter$1$$anonfun$apply$1.apply$mcV$sp(Namers.scala:781)
[error]     at scala.tools.nsc.typechecker.Namers$Namer$$anonfun$monoTypeCompleter$1$$anonfun$apply$1.apply(Namers.scala:780)
[error]     at scala.tools.nsc.typechecker.Namers$Namer$$anonfun$monoTypeCompleter$1$$anonfun$apply$1.apply(Namers.scala:780)
[error]     at scala.tools.nsc.typechecker.Namers$Namer.scala$tools$nsc$typechecker$Namers$Namer$$logAndValidate(Namers.scala:1568)
[error]     at scala.tools.nsc.typechecker.Namers$Namer$$anonfun$monoTypeCompleter$1.apply(Namers.scala:780)
[error]     at scala.tools.nsc.typechecker.Namers$Namer$$anonfun$monoTypeCompleter$1.apply(Namers.scala:772)
[error]     at scala.tools.nsc.typechecker.Namers$$anon$1.completeImpl(Namers.scala:1684)
[error]     at scala.tools.nsc.typechecker.Namers$LockingTypeCompleter$class.complete(Namers.scala:1692)
[error]     at scala.tools.nsc.typechecker.Namers$$anon$1.complete(Namers.scala:1682)
[error]     at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1483)
[error]     at scala.reflect.internal.Symbols$Symbol.initialize(Symbols.scala:1628)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:4982)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5373)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5400)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5347)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5351)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5429)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedStat$1(Typers.scala:3028)
[error]     at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$62.apply(Typers.scala:3132)
[error]     at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$62.apply(Typers.scala:3132)
[error]     at scala.collection.immutable.List.loop$1(List.scala:173)
[error]     at scala.collection.immutable.List.mapConserve(List.scala:189)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3132)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedBlock(Typers.scala:2363)
[error]     at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedOutsidePatternMode$1$1.apply(Typers.scala:5295)
[error]     at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedOutsidePatternMode$1$1.apply(Typers.scala:5295)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedOutsidePatternMode$1(Typers.scala:5294)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5330)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5337)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5373)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5400)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5347)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5351)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedQualifier(Typers.scala:5449)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedQualifier(Typers.scala:5455)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedSelectOrSuperCall$1(Typers.scala:4787)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5321)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5337)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5373)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5400)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5347)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5351)
[error]     at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$95.apply(Typers.scala:4501)
[error]     at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$95.apply(Typers.scala:4501)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.silent(Typers.scala:676)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.normalTypedApply$1(Typers.scala:4500)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:4555)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5320)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5337)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5373)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5400)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5347)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5351)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedBlock(Typers.scala:2364)
[error]     at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedOutsidePatternMode$1$1.apply(Typers.scala:5295)
[error]     at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedOutsidePatternMode$1$1.apply(Typers.scala:5295)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedOutsidePatternMode$1(Typers.scala:5294)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5330)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5337)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5373)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5400)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5347)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5351)
[error]     at scala.reflect.macros.contexts.Typers$$anonfun$typecheckInternal$1$1.apply(Typers.scala:27)
[error]     at scala.reflect.macros.contexts.Typers$$anonfun$typecheckInternal$1$1.apply(Typers.scala:27)
[error]     at scala.tools.nsc.typechecker.Typers$Typer.silent(Typers.scala:676)
[error]     at scala.reflect.macros.contexts.Typers$class.typecheckInternal$1(Typers.scala:27)
[error]     at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2$$anonfun$apply$1.apply(Typers.scala:28)
[error]     at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2$$anonfun$apply$1.apply(Typers.scala:28)
[error]     at scala.reflect.macros.contexts.Typers$$anonfun$3.apply(Typers.scala:24)
[error]     at scala.reflect.macros.contexts.Typers$$anonfun$3.apply(Typers.scala:24)
[error]     at scala.reflect.macros.contexts.Typers$$anonfun$withContext$1$1.apply(Typers.scala:25)
[error]     at scala.reflect.macros.contexts.Typers$$anonfun$withContext$1$1.apply(Typers.scala:25)
[error]     at scala.reflect.macros.contexts.Typers$$anonfun$1.apply(Typers.scala:23)
[error]     at scala.reflect.macros.contexts.Typers$$anonfun$1.apply(Typers.scala:23)
[error]     at scala.reflect.macros.contexts.Typers$class.withContext$1(Typers.scala:25)
[error]     at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2.apply(Typers.scala:28)
[error]     at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2.apply(Typers.scala:28)
[error]     at scala.reflect.internal.Trees$class.wrappingIntoTerm(Trees.scala:1698)
[error]     at scala.reflect.internal.SymbolTable.wrappingIntoTerm(SymbolTable.scala:16)
[error]     at scala.reflect.macros.contexts.Typers$class.withWrapping$1(Typers.scala:26)
[error]     at scala.reflect.macros.contexts.Typers$class.typecheck(Typers.scala:28)
[error]     at scala.reflect.macros.contexts.Context.typecheck(Context.scala:6)
[error]     at scala.reflect.macros.contexts.Context.typecheck(Context.scala:6)
[error]     at com.xored.scalajs.react.internal.ScalaxHelper$HasType.matches(ScalaxImpl.scala:64)
[error]     at com.xored.scalajs.react.internal.ScalaxHelper$ElemTransformer$.transform(ScalaxImpl.scala:95)
[error]     at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:2589)
[error]     at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:2587)
[error]     at scala.collection.immutable.List.loop$1(List.scala:173)
[error]     at scala.collection.immutable.List.mapConserve(List.scala:189)
[error]     at scala.reflect.api.Trees$Transformer.transformStats(Trees.scala:2587)
[error]     at scala.reflect.internal.Trees$class.itransform(Trees.scala:1366)
[error]     at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
[error]     at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
[error]     at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
[error]     at com.xored.scalajs.react.internal.ScalaxHelper$ElemTransformer$.transform(ScalaxImpl.scala:130)
[error]     at scala.reflect.internal.Trees$$anonfun$itransform$2.apply(Trees.scala:1363)
[error]     at scala.reflect.internal.Trees$$anonfun$itransform$2.apply(Trees.scala:1361)
[error]     at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2600)
[error]     at scala.reflect.internal.Trees$class.itransform(Trees.scala:1360)
[error]     at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
[error]     at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
[error]     at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
[error]     at com.xored.scalajs.react.internal.ScalaxHelper$ElemTransformer$.transform(ScalaxImpl.scala:130)
[error]     at com.xored.scalajs.react.internal.ScalaxHelper.transform(ScalaxImpl.scala:90)
[error]     at com.xored.scalajs.react.internal.ScalaxImpl$$anonfun$1.apply(ScalaxImpl.scala:33)
[error]     at com.xored.scalajs.react.internal.ScalaxImpl$$anonfun$1.apply(ScalaxImpl.scala:33)
[error]     at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
[error]     at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
[error]     at scala.collection.immutable.List.foreach(List.scala:381)
[error]     at scala.collection.TraversableLike$class.map(TraversableLike.scala:245)
[error]     at scala.collection.immutable.List.map(List.scala:285)
[error]     at com.xored.scalajs.react.internal.ScalaxImpl$.macroTransform(ScalaxImpl.scala:33)
[error]   @scalax
[error]    ^
[error] /Users/twer/workspace/wind-links/src/main/scala/in/freewind/windlinks/main/Main.scala:34: type mismatch;
[error]  found   : scala.xml.Elem
[error]  required: com.xored.scalajs.react.ReactDOM
[error]     <div>
[error]      ^
[error] three errors found
[error] (compile:compile) Compilation failed
[error] Total time: 1 s, completed Feb 13, 2015 10:56:15 PM
8. Waiting for source changes... (press enter to interrupt)

If I use a Seq instead, it will be all OK:

val content = Seq(
  Search(Search.Props(self.onSearch)),
  self.state.keyword match {
    case Some(keyword) => SearchResult(SearchResult.Props(filteredLinks(projects, keyword)))
    case _ => Links(Links.Props(projects))
  })

If you need more information, see here: https://github.com/freewind/wind-links/blob/master/src/main/scala/in/freewind/windlinks/main/Main.scala

Missing setProps in ReactComponent

Hi! First of all, great job on implementing this port of React, it's really useful. :)

I was wondering: is there a setProps method missing in the current version, or if there is an alternative way to achieve the same result as calling it in the library?

Thanks,
Sérgio

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.