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}