Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@
"@types/lodash-es": "^4.17.12",
"@types/node": "^24.3.0",
"@types/react": "^19.1.12",
"@types/react-dom": "^19.1.8",
"@types/react-dom": "^19.1.9",
"@vitejs/plugin-react": "^5.0.2",
"@vitejs/plugin-react-swc": "^4.0.1",
"autoprefixer": "^10.4.21",
Expand Down
10 changes: 5 additions & 5 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

55 changes: 21 additions & 34 deletions src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions src-tauri/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,17 @@ pub struct LocationInfo {
pub location_mfa_mode: LocationMfaMode,
}

impl LocationInfo {
/// Label used in system tray menu.
pub(crate) fn menu_label(&self) -> String {
format!(
"{}: {}",
if self.active { "Disconnect" } else { "Connect" },
self.name
)
}
}

impl fmt::Display for LocationInfo {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.name)
Expand Down
50 changes: 31 additions & 19 deletions src-tauri/src/tray.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,37 +59,49 @@ async fn generate_tray_menu(app: &AppHandle) -> Result<Menu<impl Runtime>, Error
Ok(instances) => {
let instance_count = instances.len();
debug!("Got {instance_count} instances to display in the tray menu");
for instance in instances {
let mut instance_menu = SubmenuBuilder::new(app, &instance.name);
let all_locations = all_locations(instance.id).await.unwrap();

// One instance omits sub-menu.
if instance_count == 1 {
let instance = &instances[0];
let all_locations = all_locations(instance.id).await?;
debug!(
"Found {} locations for the {} instance to display in the tray menu",
"Found {} locations for the {instance} instance to display in the tray menu",
all_locations.len(),
instance
);

// TODO: Use icons instead of Connect/Disconnect when Defguard utilizes tauri v2.
for location in all_locations {
let item_name = format!(
"{}: {}",
if location.active {
"Disconnect"
} else {
"Connect"
},
location.name
);
let menu_item = MenuItem::with_id(
app,
location.id.to_string(),
item_name,
location.menu_label(),
true,
None::<&str>,
)?;
instance_menu = instance_menu.item(&menu_item);
menu = menu.item(&menu_item);
}
} else {
for instance in instances {
let mut instance_menu = SubmenuBuilder::new(app, &instance.name);
let all_locations = all_locations(instance.id).await?;
debug!(
"Found {} locations for the {instance} instance to display in the tray menu",
all_locations.len(),
);

// TODO: Use icons instead of Connect/Disconnect when Defguard utilizes tauri v2.
for location in all_locations {
let menu_item = MenuItem::with_id(
app,
location.id.to_string(),
location.menu_label(),
true,
None::<&str>,
)?;
instance_menu = instance_menu.item(&menu_item);
}
let submenu = instance_menu.build()?;
menu = menu.item(&submenu);
}
let submenu = instance_menu.build()?;
menu = menu.item(&submenu);
}
}
Err(err) => {
Expand Down