app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit e6f1b4a2eae401cd319f50e4bd35cb060d834a16
parent 26566ff74fe5781873eeb062421d63813743e036
Author: triesap <triesap@radroots.dev>
Date:   Wed, 21 Jan 2026 14:56:57 +0000

app: add typed notifications permission helpers

- parse stored notifications permission as enum

- add typed setter for stored permission value

- export permission helpers from bootstrap module

- add unit tests for permission helpers

Diffstat:
Mapp/src/bootstrap.rs | 44++++++++++++++++++++++++++++++++++++++++++++
Mapp/src/lib.rs | 2++
2 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/app/src/bootstrap.rs b/app/src/bootstrap.rs @@ -1,6 +1,7 @@ #![forbid(unsafe_code)] use radroots_app_core::datastore::{RadrootsClientDatastore, RadrootsClientDatastoreError}; +use radroots_app_core::notifications::RadrootsClientNotificationsPermission; use crate::{ app_datastore_obj_key_settings, @@ -110,6 +111,22 @@ pub async fn app_state_set_notifications_permission<T: RadrootsClientDatastore>( Ok(value) } +pub fn app_state_notifications_permission_value( + data: &RadrootsAppState, +) -> Option<RadrootsClientNotificationsPermission> { + data.notifications_permission + .as_deref() + .and_then(RadrootsClientNotificationsPermission::parse) +} + +pub async fn app_state_set_notifications_permission_value<T: RadrootsClientDatastore>( + datastore: &T, + key_maps: &RadrootsAppKeyMapConfig, + permission: RadrootsClientNotificationsPermission, +) -> RadrootsAppInitResult<RadrootsAppState> { + app_state_set_notifications_permission(datastore, key_maps, permission.as_str()).await +} + #[cfg(test)] mod tests { use super::{ @@ -118,11 +135,14 @@ mod tests { app_datastore_has_settings, app_datastore_read_state, app_state_set_notifications_permission, + app_state_set_notifications_permission_value, + app_state_notifications_permission_value, app_datastore_write_state, app_datastore_write_settings, }; use crate::{app_key_maps_default, RadrootsAppState, RadrootsAppSettings, RadrootsAppInitError}; use radroots_app_core::datastore::{RadrootsClientDatastoreError, RadrootsClientWebDatastore}; + use radroots_app_core::notifications::RadrootsClientNotificationsPermission; #[test] fn settings_write_maps_idb_errors() { @@ -206,4 +226,28 @@ mod tests { .expect_err("idb undefined"); assert_eq!(err, RadrootsAppInitError::Datastore(RadrootsClientDatastoreError::IdbUndefined)); } + + #[test] + fn notifications_permission_value_parses_state() { + let mut state = RadrootsAppState::default(); + assert!(app_state_notifications_permission_value(&state).is_none()); + state.notifications_permission = Some(String::from("granted")); + assert_eq!( + app_state_notifications_permission_value(&state), + Some(RadrootsClientNotificationsPermission::Granted) + ); + } + + #[test] + fn notifications_permission_value_maps_idb_errors() { + let datastore = RadrootsClientWebDatastore::new(None); + let key_maps = app_key_maps_default(); + let err = futures::executor::block_on(app_state_set_notifications_permission_value( + &datastore, + &key_maps, + RadrootsClientNotificationsPermission::Granted, + )) + .expect_err("idb undefined"); + assert_eq!(err, RadrootsAppInitError::Datastore(RadrootsClientDatastoreError::IdbUndefined)); + } } diff --git a/app/src/lib.rs b/app/src/lib.rs @@ -21,6 +21,8 @@ pub use bootstrap::{ app_datastore_has_settings, app_datastore_read_state, app_state_set_notifications_permission, + app_state_set_notifications_permission_value, + app_state_notifications_permission_value, app_datastore_write_state, app_datastore_write_settings, };