refactor(gui): extract AppContext for shared page handles
KeysPage::new now takes a single AppContext that owns parent_window, toast_overlay, and the shared daemon Rc<RefCell<Option<Daemon>>>. Phases 9, 10, 11, and 12 GUI tab will all consume this struct. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,27 +1,23 @@
|
||||
//! "Security keys" preferences page. v1 surface: the current user's enrolled
|
||||
//! FIDO2 credentials with per-row remove + a single "Enroll a new key" button.
|
||||
|
||||
use crate::app_context::AppContext;
|
||||
use crate::bus::{current_user, Daemon};
|
||||
use crate::error::user_message;
|
||||
use adw::prelude::*;
|
||||
use gtk::glib;
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
|
||||
pub(crate) struct KeysPage {
|
||||
pub root: adw::Bin,
|
||||
daemon: Rc<RefCell<Option<Daemon>>>,
|
||||
parent_window: gtk::Window,
|
||||
toast_overlay: adw::ToastOverlay,
|
||||
ctx: AppContext,
|
||||
}
|
||||
|
||||
impl KeysPage {
|
||||
pub fn new(parent_window: gtk::Window, toast_overlay: adw::ToastOverlay) -> Rc<Self> {
|
||||
pub fn new(ctx: AppContext) -> Rc<Self> {
|
||||
let page = Rc::new(Self {
|
||||
root: adw::Bin::new(),
|
||||
daemon: Rc::new(RefCell::new(None)),
|
||||
parent_window,
|
||||
toast_overlay,
|
||||
ctx,
|
||||
});
|
||||
let p = page.clone();
|
||||
glib::MainContext::default().spawn_local(async move {
|
||||
@@ -33,7 +29,7 @@ impl KeysPage {
|
||||
async fn try_connect_and_render(self: Rc<Self>) {
|
||||
match Daemon::connect().await {
|
||||
Ok(d) => {
|
||||
*self.daemon.borrow_mut() = Some(d);
|
||||
*self.ctx.daemon.borrow_mut() = Some(d);
|
||||
self.render_connected().await;
|
||||
}
|
||||
Err(e) => self.render_disconnected(&user_message(&e)),
|
||||
@@ -63,7 +59,7 @@ impl KeysPage {
|
||||
}
|
||||
|
||||
async fn render_connected(self: &Rc<Self>) {
|
||||
let daemon = match self.daemon.borrow().clone() {
|
||||
let daemon = match self.ctx.daemon.borrow().clone() {
|
||||
Some(d) => d,
|
||||
None => {
|
||||
self.render_disconnected("internal: daemon handle missing");
|
||||
@@ -140,7 +136,7 @@ impl KeysPage {
|
||||
}
|
||||
|
||||
async fn remove_credential(self: &Rc<Self>, cred_id: &str) {
|
||||
let daemon = match self.daemon.borrow().clone() {
|
||||
let daemon = match self.ctx.daemon.borrow().clone() {
|
||||
Some(d) => d,
|
||||
None => return,
|
||||
};
|
||||
@@ -153,12 +149,12 @@ impl KeysPage {
|
||||
}
|
||||
|
||||
async fn start_enroll(self: &Rc<Self>) {
|
||||
let daemon = match self.daemon.borrow().clone() {
|
||||
let daemon = match self.ctx.daemon.borrow().clone() {
|
||||
Some(d) => d,
|
||||
None => return,
|
||||
};
|
||||
let me = self.clone();
|
||||
crate::enroll_dialog::present(&self.parent_window, daemon, move || {
|
||||
crate::enroll_dialog::present(&self.ctx.parent_window, daemon, move || {
|
||||
let me = me.clone();
|
||||
glib::MainContext::default().spawn_local(async move {
|
||||
me.render_connected().await;
|
||||
@@ -168,7 +164,7 @@ impl KeysPage {
|
||||
|
||||
fn show_toast(self: &Rc<Self>, msg: &str) {
|
||||
let toast = adw::Toast::builder().title(msg).timeout(5).build();
|
||||
self.toast_overlay.add_toast(toast);
|
||||
self.ctx.toast_overlay.add_toast(toast);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user