1use ravenrs_app::BusinessObject;
3use ravenrs_app_ui::{App, Language};
4
5#[derive(BusinessObject)]
6#[object(caption = "Tarefas", navigation = "Organização", icon = "list")]
7struct Task {
8 #[field(key)]
9 id: i64,
10 #[field(caption = "Título", default_property, required)]
11 title: String,
12 #[field(caption = "Concluída")]
13 done: bool,
14}
15
16pub fn app() -> ravenrs::prelude::AnyView {
18 #[cfg(not(target_arch = "wasm32"))]
19 {
20 match database("tasks.sqlite") {
21 Ok(database) => tasks().storage(move || database.space()).into_view(),
22 Err(error) => Box::new(ravenrs::prelude::Text::new(error)),
23 }
24 }
25 #[cfg(target_arch = "wasm32")]
26 tasks().into_view()
27}
28
29pub fn tasks() -> App {
31 App::new("Minhas tarefas").language(Language::BrazilianPortuguese).entity::<Task>()
32}
33
34#[cfg(not(target_arch = "wasm32"))]
36pub fn database(file: &str) -> Result<ravenrs_app_sqlite::SqliteDatabase, String> {
37 use ravenrs_app::BusinessObject;
38 use ravenrs_app_sqlite::{SqliteDatabase, TableMap};
39 let connection = rusqlite::Connection::open(file).map_err(|e| e.to_string())?;
40 Ok(SqliteDatabase::builder(std::rc::Rc::new(connection))
41 .managed(Task::entity_info(), TableMap::new("tasks"))
42 .map_err(|e| e.0)?
43 .build())
44}
45
46#[cfg(target_arch = "wasm32")]
47mod web_entry {
48 use std::cell::RefCell;
49
50 use wasm_bindgen::prelude::*;
51
52 thread_local! {
53 static APP: RefCell<Option<ravenrs::web::WebApp>> = const { RefCell::new(None) };
54 }
55
56 #[wasm_bindgen(start)]
58 pub fn start() {
59 console_error_panic_hook::set_once();
60 wasm_bindgen_futures::spawn_local(async {
61 let view = match ravenrs::web::IndexedDbStorage::open("tasks").await {
62 Ok(storage) => super::tasks().keep_in(storage).into_view(),
63 Err(_) => super::tasks().into_view(),
64 };
65 match ravenrs::web::start(view, ravenrs::web::WebOptions::new("raven-canvas")).await {
66 Ok(app) => APP.with(|a| *a.borrow_mut() = Some(app)),
67 Err(e) => web_sys::console::error_1(&e.to_string().into()),
68 }
69 });
70 }
71
72 #[wasm_bindgen]
74 pub fn stop() {
75 APP.with(|a| a.borrow_mut().take());
76 }
77}