bevy_ios_alerts/
lib.rs

1mod native;
2
3mod native_events;
4
5use bevy::prelude::*;
6
7pub use native_events::{IosAlertDialogButton, IosAlertResponse};
8
9#[derive(Resource, Clone, Debug, Default)]
10struct NonSendRes;
11
12#[derive(Event, Clone, Debug)]
13pub enum IosAlert {
14    Message {
15        msg: String,
16        title: String,
17        button: String,
18    },
19    Dialog {
20        msg: String,
21        title: String,
22        button_yes: String,
23        button_no: String,
24    },
25    Input {
26        msg: String,
27        title: String,
28        button: String,
29        placeholder: String,
30    },
31    Dismiss,
32}
33
34pub struct IosAlertsPlugin;
35
36impl Plugin for IosAlertsPlugin {
37    fn build(&self, app: &mut App) {
38        app.add_event::<IosAlert>()
39            .init_non_send_resource::<NonSendRes>()
40            .add_systems(Update, process_events.run_if(on_event::<IosAlert>));
41
42        #[cfg(not(target_os = "ios"))]
43        {
44            app.add_event::<IosAlertResponse>();
45        }
46
47        #[cfg(target_os = "ios")]
48        {
49            use bevy_crossbeam_event::{CrossbeamEventApp, CrossbeamEventSender};
50
51            app.add_crossbeam_event::<IosAlertResponse>();
52
53            let sender = app
54                .world()
55                .get_resource::<CrossbeamEventSender<IosAlertResponse>>()
56                .unwrap()
57                .clone();
58
59            native_events::set_sender(sender);
60        }
61    }
62}
63
64fn process_events(mut events: EventReader<IosAlert>, _main_thread: NonSend<NonSendRes>) {
65    while let Some(e) = events.read().next() {
66        match e {
67            IosAlert::Message { msg, title, button } => native::popup_msg(title, msg, button),
68            IosAlert::Dialog {
69                msg,
70                title,
71                button_yes,
72                button_no,
73            } => native::popup_dialog(title, msg, button_yes, button_no),
74            IosAlert::Input {
75                msg,
76                title,
77                button,
78                placeholder,
79            } => native::popup_input(title, msg, button, placeholder),
80            IosAlert::Dismiss => native::popup_dismiss_current(),
81        }
82    }
83}