///|
pub typealias @cmd.(Cmd, Command)
///|
pub fnalias @cmd.(none, batch, task, perform, attempt)
///|
/// Start the application.
///
/// - `model` is the state of your application.
/// - `view` is a way to turn your model into HTML.
/// - `update` a way to update your state based on messages.
///
/// These three are the core of the TEA. Rabbit-TEA is highly unstable at this time,
/// but it follows the same pattern as Elm. You can visit https://guide.elm-lang.org/
/// to get more intuition!
///
/// To start the application with router, you can use the `application` function.
pub fn[Model, Message] startup(
model~ : Model,
update~ : (Message, Model) -> (Cmd[Message], Model),
view~ : (Model) -> @html.Html[Message],
mount? : String = "app",
) -> Unit {
@dom.document()
.get_element_by_id(mount)
.unwrap()
.set_inner_html("")
let mut sandbox = None
let mut curr_dom = @vdom.node("div", [], [])
fn after_update(html : @html.Html[Message]) {
guard sandbox is Some(sandbox)
let new_dom = html.to_virtual_dom()
new_dom.patch(curr_dom, sandbox, mount~)
curr_dom = new_dom
}
sandbox = Some(@browser.Sandbox::new(model, update, view, after_update~))
sandbox.unwrap().refresh()
}
///|
/// Start the application with initial URL.
///
/// - `url_changed` is a message that will be passed when the URL is changed by the navigation API in the `@browser` package.
/// - `url_request` is a message that will be passed when an `` tag is clicked.
/// - `initialize` will be called when the application is started.
///
pub fn[Model, Msg] application(
initialize~ : (@url.Url) -> (Cmd[Msg], Model),
update~ : (Msg, Model) -> (Cmd[Msg], Model),
view~ : (Model) -> @html.Html[Msg],
url_changed? : (@url.Url) -> Msg,
url_request? : (@url.UrlRequest) -> Msg,
mount? : String = "app",
) -> Unit {
@dom.document()
.get_element_by_id(mount)
.unwrap()
.set_inner_html("")
let mut sandbox_ref = None
let mut curr_dom = @vdom.node("div", [], [])
fn after_update(html : @html.Html[Msg]) {
guard sandbox_ref is Some(sandbox)
let new_dom = html.to_virtual_dom()
new_dom.patch(curr_dom, sandbox, mount~)
curr_dom = new_dom
}
guard (try? @url.parse(@dom.window().current_url())) is Ok(url)
let (cmd, model) = initialize(url)
let sandbox = @browser.Sandbox::new(
model,
update,
view,
after_update~,
url_request?,
url_changed?,
)
sandbox_ref = Some(sandbox)
sandbox..launch(cmd)..refresh()
}