Skip to main content

tasks_sqlite/
lib.rs

1//! A task list built with ravenrs-app.
2use 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
16/// Navigation, lists and forms backed by an in-memory object space.
17pub 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
29/// The application before it is mounted.
30pub fn tasks() -> App {
31    App::new("Minhas tarefas").language(Language::BrazilianPortuguese).entity::<Task>()
32}
33
34/// Opens the persistent task database on the desktop.
35#[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    /// Runs automatically when the module is instantiated.
57    #[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    /// Unmounts the app and releases its listeners and GPU resources.
73    #[wasm_bindgen]
74    pub fn stop() {
75        APP.with(|a| a.borrow_mut().take());
76    }
77}