cranpose-services 0.9.32

Multiplatform service contracts and platform integrations for Cranpose apps
Documentation
use std::{cell::RefCell, rc::Rc};

use cranpose_core::CompositionLocalProvider;

use crate::{SystemTheme, local_accessibility_state, local_system_theme};

fn initialize_service_locals() {
    crate::local_accessibility_options();
    crate::local_audio();
    crate::file_picker::local_file_picker();
    crate::local_haptics();
    crate::host::local_lifecycle_state();
    crate::http::local_http_client();
    crate::local_image_picker();
    crate::local_launch_args();
    crate::local_notifier();
    crate::local_share_sheet();
    crate::local_uri_handler();
}

#[test]
fn service_locals_preserve_nested_providers_after_other_services_initialize() {
    let observed = Rc::new(RefCell::new(Vec::new()));
    let output = Rc::clone(&observed);
    crate::run_test_composition(move || {
        let theme = local_system_theme();
        let accessibility = local_accessibility_state();
        CompositionLocalProvider([theme.provides(SystemTheme::Dark)], || {
            initialize_service_locals();
            output.borrow_mut().push(local_system_theme().current());
            CompositionLocalProvider([local_system_theme().provides(SystemTheme::Light)], || {
                output.borrow_mut().push(theme.current());
            });
            output.borrow_mut().push(local_system_theme().current());
            assert_eq!(
                accessibility.current(),
                crate::platform_accessibility_state()
            );
        });
    });
    assert_eq!(
        *observed.borrow(),
        [SystemTheme::Dark, SystemTheme::Light, SystemTheme::Dark]
    );
}

#[test]
fn service_locals_keep_platform_defaults_isolated_between_threads() {
    let workers = [SystemTheme::Light, SystemTheme::Dark].map(|theme| {
        std::thread::spawn(move || {
            initialize_service_locals();
            crate::set_platform_system_theme(theme);
            let output = Rc::new(RefCell::new(None));
            let observed = Rc::clone(&output);
            crate::run_test_composition(move || {
                *observed.borrow_mut() = Some(local_system_theme().current());
            });
            let result = *output.borrow();
            crate::clear_platform_system_theme();
            assert_eq!(result, Some(theme));
        })
    });
    for worker in workers {
        worker.join().expect("service-local worker succeeds");
    }
}