diff --git a/moon.mod.json b/moon.mod.json index 4aef08c..bce27ad 100644 --- a/moon.mod.json +++ b/moon.mod.json @@ -2,13 +2,15 @@ "name": "respo/app", "version": "0.1.0", "deps": { - "tiye/respo": "0.0.35", - "tiye/dom-ffi": "0.0.9" + "tiye/respo": "0.1.0", + "tiye/dom-ffi": "0.2.0", + "tiye/respo_css": "0.1.2" }, "readme": "README.md", "repository": "", "license": "Apache-2.0", "keywords": [], "description": "", - "source": "src" + "source": "src", + "preferred-target": "js" } diff --git a/src/main/counter.mbt b/src/main/counter.mbt index afc02bb..d7ccb9d 100644 --- a/src/main/counter.mbt +++ b/src/main/counter.mbt @@ -1,8 +1,11 @@ ///| -typealias @respo_node.(RespoEvent, RespoNode, DispatchFn, RespoCommonError) - -///| -fnalias @respo_node.text_node +using @respo_node { + text_node, + type RespoEvent, + type RespoNode, + type DispatchFn, + type RespoCommonError +} ///| struct MainState { @@ -12,14 +15,14 @@ struct MainState { ///| fn comp_counter( states : @respo.RespoStatesTree, - global_counted : Int + global_counted : Int, ) -> RespoNode[ActionOp] { let cursor = states.path() let state = (states.cast_branch() : MainState) let counted = state.counted let on_inc = fn( e : RespoEvent, - dispatch : DispatchFn[ActionOp] + dispatch : DispatchFn[ActionOp], ) -> Unit raise RespoCommonError { @dom_ffi.warn_log("inc click: \{e}") if e is Click(original_event~, ..) { @@ -31,7 +34,7 @@ fn comp_counter( } let on_dec = fn( e : RespoEvent, - dispatch : DispatchFn[ActionOp] + dispatch : DispatchFn[ActionOp], ) -> Unit raise RespoCommonError { @dom_ffi.warn_log("dec click: \{e}") dispatch.run(Decrement) @@ -40,7 +43,7 @@ fn comp_counter( } let on_inc_twice = fn( e : RespoEvent, - dispatch : DispatchFn[ActionOp] + dispatch : DispatchFn[ActionOp], ) -> Unit raise RespoCommonError { @dom_ffi.warn_log("twice click: \{e}") dispatch.run(IncTwice) diff --git a/src/main/main.mbt b/src/main/main.mbt index ea29d88..cdd2f66 100644 --- a/src/main/main.mbt +++ b/src/main/main.mbt @@ -1,12 +1,15 @@ ///| -fnalias @respo_node.(div, span, button, respo_style) +using @respo_node {div, span, button} + +///| +using @css {respo_style} ///| let app_store_key : String = "mbt-workflow" ///| fn view( - store : Store + store : Store, ) -> @respo_node.RespoNode[ActionOp] raise @respo_node.RespoCommonError { if false { raise @respo_node.RespoCommonError("TODO") @@ -21,23 +24,24 @@ fn view( ///| fn main { let window = @dom_ffi.window() - let mount_target = window - .document() - .query_selector(".app") - .reinterpret_as_node() - let app : @respo.RespoApp[Store] = { - store: Ref::new(@respo.try_load_storage(app_store_key)), - mount_target, - storage_key: app_store_key, + if window.document().query_selector(".app") is Some(mount_target) { + let mount_target = mount_target.reinterpret_as_node() + let app : @respo.RespoApp[Store] = { + store: Ref::new(@respo.try_load_storage(app_store_key)), + mount_target, + storage_key: app_store_key, + } + app.backup_model_beforeunload() + // @dom_ffi.log("store: " + app.store.val.to_json().stringify(indent=2)) + app.render_loop(fn() { view(app.store.val) }, fn(op) { + @dom_ffi.log("Action: \{op}") + app.store.val.update(op) + }) + let dev_mode = @dom_ffi.new_url_search_params(window.location().search()).get( + "mode", + ) + @dom_ffi.log("dev mode: \{dev_mode}") + } else { + @dom_ffi.log("No mount target found") } - app.backup_model_beforeunload() - // @dom_ffi.log("store: " + app.store.val.to_json().stringify(indent=2)) - app.render_loop(fn() { view(app.store.val) }, fn(op) { - @dom_ffi.log("Action: \{op}") - app.store.val.update(op) - }) - let dev_mode = @dom_ffi.new_url_search_params(window.location().search()).get( - "mode", - ) - @dom_ffi.log("dev mode: \{dev_mode}") } diff --git a/src/main/moon.pkg.json b/src/main/moon.pkg.json index 837b236..59ac124 100644 --- a/src/main/moon.pkg.json +++ b/src/main/moon.pkg.json @@ -2,13 +2,14 @@ "is-main": true, "import": [ { - "path": "tiye/respo/lib", + "path": "tiye/respo", "alias": "respo" }, { - "path": "tiye/respo/lib/node", + "path": "tiye/respo/node", "alias": "respo_node" }, - { "path": "tiye/dom-ffi/lib", "alias": "dom_ffi" } + { "path": "tiye/dom-ffi", "alias": "dom_ffi" }, + { "path": "tiye/respo_css", "alias": "css" } ] } diff --git a/src/main/store.mbt b/src/main/store.mbt index 0110139..9372aba 100644 --- a/src/main/store.mbt +++ b/src/main/store.mbt @@ -20,6 +20,7 @@ struct Task { ///| enum ActionOp { + Noop StatesChange(@respo.RespoUpdateState) Increment Decrement @@ -27,15 +28,29 @@ enum ActionOp { } ///| -impl @respo_node.RespoAction for ActionOp with build_states_action(cursor, a) { - ActionOp::StatesChange({ cursor, data: a.map(ToJson::to_json) }) +pub impl Default for ActionOp with default() -> ActionOp { + Noop +} + +///| +impl @respo_node.RespoAction for ActionOp with build_states_action(cursor, a, j) { + StatesChange({ + cursor, + data: if a is Some(a) { + Some(@dom_ffi.js_obscure_to_v(a)) + } else { + None + }, + backup: j, + }) } ///| impl Show for ActionOp with output(self, logger) -> Unit { let s = match self { - StatesChange(states) => - "StatesChange(\{states.cursor} \{states.data.to_json()})" + Noop => "Noop" + StatesChange(state) => + "StatesChange(\{state.cursor} \{state.backup.to_json()})" // Intent(_intent) => "Intent(...)" Increment => "Increment" Decrement => "Decrement" @@ -49,7 +64,8 @@ fn get_states(self : Store) -> @respo.RespoStatesTree { self.states } -///| TODO mutation might break memoization in future +///| +/// TODO mutation might break memoization in future fn update(self : Store, op : ActionOp) -> Unit { match op { Increment => self.counted += 1