1+ import react .ReactComponent ;
2+ import tink .pure .* ;
3+ import tink .state .* ;
4+ import coconut .ui .* ;
5+ import coconut .data .* ;
6+ import coconut .react .Renderer .* ;
7+ import js .Browser .* ;
8+
9+ using tink .CoreApi ;
10+
11+ @:asserts
12+ class Issue8 {
13+ static final msgs = [];
14+ static public function log (v )
15+ msgs .push (v );
16+
17+ public function new () {}
18+ public function test () {
19+ var rendered = ReactTestRenderer .create (hxx (' <Root />' ));
20+ asserts .assert (msgs .length == 2 );
21+ rendered .root .findByType (Div ).props .onclick ();
22+ updateAll ();
23+ asserts .assert (msgs .length == 3 );
24+ return asserts .done ();
25+ }
26+ }
27+
28+ class Root extends View {
29+
30+ @:attr var value : Value <Vector <Obj >, Vector <Obj >> = new Value ({
31+ raw : new State (([{foo : ' bar' }]: Vector <Obj >)),
32+ parse : Success ,
33+ });
34+
35+ function render () {
36+ Issue8 .log (' render Root ${value .raw .length }' );
37+ return @hxx '
38+ <>
39+ <for ${i in 0 ... value .raw .length }>
40+ <Sub value= ${value .sub (raw -> raw [i ], (raw , nu ) -> raw .with (i , nu ), Success )} onClick= ${value .raw = []}/>
41+ </for>
42+ </>
43+ ' ;
44+ }
45+ }
46+
47+ typedef Obj = {
48+ final foo : String ;
49+ }
50+
51+ class Sub extends View {
52+ @:attr var value : Value <Obj , Obj >;
53+ @:attr var onClick : Void -> Void ;
54+ function render () {
55+ Issue8 .log (' render Sub ${value .raw }' );
56+ return @hxx ' <Div onclick= ${onClick }> ${value .raw == null ? null : value .raw .foo }</Div>' ;
57+ }
58+ }
59+
60+ class Div extends ReactComponent <{ onclick : ()-> Void , children : String }, {}> {
61+ override function render () return props .children ;
62+ }
63+
64+ class Value <Raw , Result > implements Model {
65+ @:shared var raw : Raw ;
66+ @:constant var parse : Raw -> Outcome <Result , Error >;
67+ @:computed var parsed : Outcome <Result , Error > = parse (raw );
68+ public inline function sub <SubRaw , SubResult >(read : Raw -> SubRaw , write : (Raw , SubRaw ) -> Raw ,
69+ parse : SubRaw -> Outcome <SubResult , Error >): Value <SubRaw , SubResult > {
70+ return new Value ({
71+ raw : observables .raw .transform ({read : read , write : v -> write (raw , v )}),
72+ parse : parse ,
73+ });
74+ }
75+ }
0 commit comments