mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-03-31 16:45:27 +00:00
108 lines
3.5 KiB
Rust
108 lines
3.5 KiB
Rust
mod widget;
|
|
use widget::{form::list::item::value::Value, Widget};
|
|
|
|
use super::{BrowserAction, Profile, WindowAction};
|
|
use gtk::{glib::Uri, prelude::IsA};
|
|
use std::rc::Rc;
|
|
|
|
pub struct Gemini {
|
|
// profile: Rc<Profile>,
|
|
widget: Rc<Widget>,
|
|
}
|
|
|
|
impl Gemini {
|
|
// Construct
|
|
|
|
/// Create new `Self` for given `Profile`
|
|
pub fn new(
|
|
(browser_action, window_action): (&Rc<BrowserAction>, &Rc<WindowAction>),
|
|
profile: &Rc<Profile>,
|
|
auth_uri: &Uri,
|
|
) -> Self {
|
|
// Init shared URL string from URI
|
|
let auth_url = auth_uri.to_string();
|
|
|
|
// Init widget
|
|
let widget = Rc::new(Widget::new(
|
|
(browser_action, window_action),
|
|
profile,
|
|
auth_uri,
|
|
));
|
|
|
|
// Init events
|
|
widget.on_cancel({
|
|
let browser_action = browser_action.clone();
|
|
move || browser_action.update.activate(None)
|
|
});
|
|
|
|
widget.on_apply({
|
|
let profile = profile.clone();
|
|
let widget = widget.clone();
|
|
let window_action = window_action.clone();
|
|
move |response| {
|
|
// Get option match user choice
|
|
let option = match response {
|
|
Value::ProfileIdentityGeminiId(value) => Some(value),
|
|
Value::GuestSession => None,
|
|
Value::GeneratePem => Some(
|
|
match profile
|
|
.identity
|
|
.gemini
|
|
.make(None, &widget.form.name.value().unwrap())
|
|
{
|
|
Ok(profile_identity_gemini_id) => profile_identity_gemini_id,
|
|
Err(e) => todo!("{}", e.to_string()),
|
|
},
|
|
),
|
|
Value::ImportPem => Some(
|
|
match profile
|
|
.identity
|
|
.gemini
|
|
.add(&widget.form.file.pem.take().unwrap())
|
|
{
|
|
Ok(profile_identity_gemini_id) => profile_identity_gemini_id,
|
|
Err(e) => todo!("{}", e.to_string()),
|
|
},
|
|
),
|
|
};
|
|
|
|
// Apply auth
|
|
match option {
|
|
// Activate identity for `auth_uri`
|
|
Some(profile_identity_gemini_id) => {
|
|
if let Err(e) = profile
|
|
.identity
|
|
.gemini
|
|
.auth
|
|
.apply(profile_identity_gemini_id, &auth_url)
|
|
{
|
|
todo!("{}", e.to_string())
|
|
};
|
|
}
|
|
// Remove all identity auths for `auth_uri`
|
|
None => {
|
|
if let Err(e) = profile.identity.gemini.auth.remove_scope(&auth_url) {
|
|
todo!("{}", e.to_string())
|
|
};
|
|
}
|
|
}
|
|
|
|
// Reload page to apply changes
|
|
window_action.reload.activate();
|
|
}
|
|
});
|
|
|
|
// Return activated `Self`
|
|
Self {
|
|
// profile,
|
|
widget,
|
|
}
|
|
}
|
|
|
|
// Actions
|
|
|
|
/// Show dialog for parent [Widget](https://docs.gtk.org/gtk4/class.Widget.html)
|
|
pub fn present(&self, parent: Option<&impl IsA<gtk::Widget>>) {
|
|
self.widget.present(parent);
|
|
}
|
|
}
|