[client] Add support for disabling profiles feature via command line flag (#4235)

* Add support for disabling profiles feature via command line flag

* Add profiles disabling flag to service command

* Refactor profile menu initialization and enhance error notifications in event handlers
This commit is contained in:
hakansa
2025-07-29 13:03:15 +03:00
committed by GitHub
parent e1c66a8124
commit 8c8473aed3
9 changed files with 117 additions and 32 deletions

View File

@@ -802,7 +802,21 @@ func (s *serviceClient) onTrayReady() {
profileMenuItem := systray.AddMenuItem("", "")
emailMenuItem := systray.AddMenuItem("", "")
s.mProfile = newProfileMenu(s.ctx, s.profileManager, *s.eventHandler, profileMenuItem, emailMenuItem, s.menuDownClick, s.menuUpClick, s.getSrvClient, s.loadSettings)
newProfileMenuArgs := &newProfileMenuArgs{
ctx: s.ctx,
profileManager: s.profileManager,
eventHandler: s.eventHandler,
profileMenuItem: profileMenuItem,
emailMenuItem: emailMenuItem,
downClickCallback: s.menuDownClick,
upClickCallback: s.menuUpClick,
getSrvClientCallback: s.getSrvClient,
loadSettingsCallback: s.loadSettings,
app: s.app,
}
s.mProfile = newProfileMenu(*newProfileMenuArgs)
systray.AddSeparator()
s.mUp = systray.AddMenuItem("Connect", "Connect")

View File

@@ -86,35 +86,60 @@ func (h *eventHandler) handleDisconnectClick() {
func (h *eventHandler) handleAllowSSHClick() {
h.toggleCheckbox(h.client.mAllowSSH)
h.updateConfigWithErr()
if err := h.updateConfigWithErr(); err != nil {
h.toggleCheckbox(h.client.mAllowSSH) // revert checkbox state on error
log.Errorf("failed to update config: %v", err)
h.client.app.SendNotification(fyne.NewNotification("Error", "Failed to update SSH settings"))
}
}
func (h *eventHandler) handleAutoConnectClick() {
h.toggleCheckbox(h.client.mAutoConnect)
h.updateConfigWithErr()
if err := h.updateConfigWithErr(); err != nil {
h.toggleCheckbox(h.client.mAutoConnect) // revert checkbox state on error
log.Errorf("failed to update config: %v", err)
h.client.app.SendNotification(fyne.NewNotification("Error", "Failed to update auto-connect settings"))
}
}
func (h *eventHandler) handleRosenpassClick() {
h.toggleCheckbox(h.client.mEnableRosenpass)
h.updateConfigWithErr()
if err := h.updateConfigWithErr(); err != nil {
h.toggleCheckbox(h.client.mEnableRosenpass) // revert checkbox state on error
log.Errorf("failed to update config: %v", err)
h.client.app.SendNotification(fyne.NewNotification("Error", "Failed to update Rosenpass settings"))
}
}
func (h *eventHandler) handleLazyConnectionClick() {
h.toggleCheckbox(h.client.mLazyConnEnabled)
h.updateConfigWithErr()
if err := h.updateConfigWithErr(); err != nil {
h.toggleCheckbox(h.client.mLazyConnEnabled) // revert checkbox state on error
log.Errorf("failed to update config: %v", err)
h.client.app.SendNotification(fyne.NewNotification("Error", "Failed to update lazy connection settings"))
}
}
func (h *eventHandler) handleBlockInboundClick() {
h.toggleCheckbox(h.client.mBlockInbound)
h.updateConfigWithErr()
if err := h.updateConfigWithErr(); err != nil {
h.toggleCheckbox(h.client.mBlockInbound) // revert checkbox state on error
log.Errorf("failed to update config: %v", err)
h.client.app.SendNotification(fyne.NewNotification("Error", "Failed to update block inbound settings"))
}
}
func (h *eventHandler) handleNotificationsClick() {
h.toggleCheckbox(h.client.mNotifications)
if h.client.eventManager != nil {
if err := h.updateConfigWithErr(); err != nil {
h.toggleCheckbox(h.client.mNotifications) // revert checkbox state on error
log.Errorf("failed to update config: %v", err)
h.client.app.SendNotification(fyne.NewNotification("Error", "Failed to update notifications settings"))
} else if h.client.eventManager != nil {
h.client.eventManager.SetNotificationsEnabled(h.client.mNotifications.Checked())
}
h.updateConfigWithErr()
}
func (h *eventHandler) handleAdvancedSettingsClick() {
@@ -166,10 +191,12 @@ func (h *eventHandler) toggleCheckbox(item *systray.MenuItem) {
}
}
func (h *eventHandler) updateConfigWithErr() {
func (h *eventHandler) updateConfigWithErr() error {
if err := h.client.updateConfig(); err != nil {
log.Errorf("failed to update config: %v", err)
return err
}
return nil
}
func (h *eventHandler) runSelfCommand(ctx context.Context, command, arg string) {

View File

@@ -334,7 +334,7 @@ type profileMenu struct {
mu sync.Mutex
ctx context.Context
profileManager *profilemanager.ProfileManager
eventHandler eventHandler
eventHandler *eventHandler
profileMenuItem *systray.MenuItem
emailMenuItem *systray.MenuItem
profileSubItems []*subItem
@@ -344,24 +344,34 @@ type profileMenu struct {
upClickCallback func() error
getSrvClientCallback func(timeout time.Duration) (proto.DaemonServiceClient, error)
loadSettingsCallback func()
app fyne.App
}
func newProfileMenu(ctx context.Context, profileManager *profilemanager.ProfileManager,
type newProfileMenuArgs struct {
ctx context.Context
profileManager *profilemanager.ProfileManager
eventHandler *eventHandler
profileMenuItem *systray.MenuItem
emailMenuItem *systray.MenuItem
downClickCallback func() error
upClickCallback func() error
getSrvClientCallback func(timeout time.Duration) (proto.DaemonServiceClient, error)
loadSettingsCallback func()
app fyne.App
}
eventHandler eventHandler, profileMenuItem, emailMenuItem *systray.MenuItem,
downClickCallback, upClickCallback func() error,
getSrvClientCallback func(timeout time.Duration) (proto.DaemonServiceClient, error),
loadSettingsCallback func()) *profileMenu {
func newProfileMenu(args newProfileMenuArgs) *profileMenu {
p := profileMenu{
ctx: ctx,
profileManager: profileManager,
eventHandler: eventHandler,
profileMenuItem: profileMenuItem,
emailMenuItem: emailMenuItem,
downClickCallback: downClickCallback,
upClickCallback: upClickCallback,
getSrvClientCallback: getSrvClientCallback,
loadSettingsCallback: loadSettingsCallback,
ctx: args.ctx,
profileManager: args.profileManager,
eventHandler: args.eventHandler,
profileMenuItem: args.profileMenuItem,
emailMenuItem: args.emailMenuItem,
downClickCallback: args.downClickCallback,
upClickCallback: args.upClickCallback,
getSrvClientCallback: args.getSrvClientCallback,
loadSettingsCallback: args.loadSettingsCallback,
app: args.app,
}
p.emailMenuItem.Disable()
@@ -479,6 +489,8 @@ func (p *profileMenu) refresh() {
})
if err != nil {
log.Errorf("failed to switch profile: %v", err)
// show notification dialog
p.app.SendNotification(fyne.NewNotification("Error", "Failed to switch profile"))
return
}