bevy_ios_notifications 0.6.0

Bevy plugin to interact with iOS Notifications API
Documentation
use bevy_app::prelude::*;
use bevy_ecs::prelude::*;

use crate::IosNotificationsResource;

#[derive(Clone, Debug, Default)]
pub struct IosNotificationPermissions {
    pub alert: bool,
    pub sound: bool,
    pub badge: bool,
}

#[derive(Clone, Debug, Default)]
pub struct IosNotificationResponse {
    pub identifier: String,
    pub action: String,
}

#[derive(Clone, Debug)]
pub enum IosRemoteNotificationRegistration {
    Failed {
        code: i32,
        localized_description: String,
    },
    DeviceToken(String),
}

#[derive(Message, Clone, Debug)]
pub enum IosNotificationEvents {
    PermissionResponse(bool),
    NotificationSchedulingSucceeded(String),
    NotificationSchedulingFailed(String),
    NotificationTriggered(String),
    PendingNotifications(Vec<String>),
    NotificationResponse(IosNotificationResponse),
    RemoteNotificationRegistration(IosRemoteNotificationRegistration),
}

#[allow(dead_code)]
#[derive(Default)]
pub struct IosNotificationsPlugin {
    permissions: Option<IosNotificationPermissions>,
}

impl IosNotificationsPlugin {
    pub fn request_permissions_on_start(alert: bool, sound: bool, badge: bool) -> Self {
        Self {
            permissions: Some(IosNotificationPermissions {
                alert,
                sound,
                badge,
            }),
        }
    }
}

impl Plugin for IosNotificationsPlugin {
    fn build(&self, app: &mut App) {
        app.init_non_send_resource::<IosNotificationsResource>();

        #[cfg(not(target_os = "ios"))]
        {
            app.add_message::<IosNotificationEvents>();
        }

        #[cfg(target_os = "ios")]
        {
            crate::native::init();

            if let Some(permissions) = &self.permissions {
                crate::native::request(crate::Request {
                    calls: Some(crate::request::Calls::Permissions(
                        crate::request::Permissions {
                            alert: permissions.alert,
                            sound: permissions.sound,
                            badge: permissions.badge,
                        },
                    )),
                });
            }

            use bevy_channel_message::{ChannelMessageApp, ChannelMessageSender};

            app.add_channel_message::<IosNotificationEvents>();

            let sender = app
                .world()
                .get_resource::<ChannelMessageSender<IosNotificationEvents>>()
                .unwrap()
                .clone();

            crate::channel::set_sender(sender);
        }
    }
}