feat: implement default profile and enhance profile management UI

This commit is contained in:
Hakan Sariman 2025-06-22 10:44:06 +03:00
parent 7f899d5005
commit b27ed5e0cf
4 changed files with 66 additions and 25 deletions

View File

@ -114,6 +114,8 @@ func (pm *ProfileManager) ListProfiles() ([]Profile, error) {
}
var profiles []Profile
// add default profile always
profiles = append(profiles, Profile{Name: "default", IsActive: activeProfName == "default"})
for _, file := range files {
profileName := strings.TrimSuffix(filepath.Base(file), ".json")
var isActive bool

View File

@ -221,11 +221,10 @@ type serviceClient struct {
// systray menu items
mStatus *systray.MenuItem
mProfileName *systray.MenuItem
mUp *systray.MenuItem
mDown *systray.MenuItem
mSettings *systray.MenuItem
mProfiles *systray.MenuItem
mProfile *profileMenu
mAbout *systray.MenuItem
mGitHub *systray.MenuItem
mVersionUI *systray.MenuItem
@ -722,14 +721,12 @@ func (s *serviceClient) onTrayReady() {
s.mStatus = systray.AddMenuItem("Disconnected", "Disconnected")
s.mStatus.SetIcon(s.icDisconnectedDot)
s.mStatus.Disable()
s.mProfileName = systray.AddMenuItem("hakan_work", "Selected Profile: Home")
systray.AddMenuItem("(hakan.@gmail.com)", "").Disable()
s.mProfiles = s.mProfileName
s.mProfileName.AddSubMenuItem("hakan_work", "Selected Profile: Personal").Check()
s.mProfileName.AddSubMenuItem("hakan_personal", "Selected Profile: Personal")
s.mProfileName.AddSubMenuItem("common", "Selected Profile: Common")
s.mProfileName.AddSeparator()
s.mProfileName.AddSubMenuItem("Manage Profiles", "Selected Profile: Work")
s.profileManager = profilemanager.NewProfileManager()
profileMenuItem := systray.AddMenuItem("", "")
emailMenuItem := systray.AddMenuItem("", "")
s.mProfile = newProfileMenu(s.profileManager, profileMenuItem, emailMenuItem)
systray.AddSeparator()
s.mUp = systray.AddMenuItem("Connect", "Connect")
s.mDown = systray.AddMenuItem("Disconnect", "Disconnect")

View File

@ -49,8 +49,6 @@ func (h *eventHandler) listen(ctx context.Context) {
h.handleAdvancedSettingsClick()
case <-h.client.mCreateDebugBundle.ClickedCh:
h.handleCreateDebugBundleClick()
case <-h.client.mProfiles.ClickedCh:
h.handleProfilesClick()
case <-h.client.mQuit.ClickedCh:
h.handleQuitClick()
return
@ -136,14 +134,6 @@ func (h *eventHandler) handleCreateDebugBundleClick() {
}()
}
func (h *eventHandler) handleProfilesClick() {
h.client.mProfiles.Disable()
go func() {
defer h.client.mProfiles.Enable()
h.runSelfCommand("profiles", "true")
}()
}
func (h *eventHandler) handleQuitClick() {
systray.Quit()
}

View File

@ -9,11 +9,17 @@ import (
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/widget"
"fyne.io/systray"
log "github.com/sirupsen/logrus"
"github.com/netbirdio/netbird/client/internal/profilemanager"
)
type profile struct {
name string
selected bool
}
// showProfilesUI creates and displays the Profiles window with a list of existing profiles,
// a button to add new profiles, allows removal, and lets the user switch the active profile.
func (s *serviceClient) showProfilesUI() {
@ -185,11 +191,6 @@ func (s *serviceClient) showProfilesUI() {
s.wProfiles.Show()
}
type profile struct {
name string
selected bool
}
// func (p *profileMenu) updateProfiles(ctx context.Context, conn proto.DaemonServiceClient) {
// profiles, err := p.getProfiles(ctx, conn)
// if err != nil {
@ -243,3 +244,54 @@ func (s *serviceClient) getProfiles() ([]profilemanager.Profile, error) {
}
return prof, nil
}
type profileMenu struct {
profileManager *profilemanager.ProfileManager
profileMenuItem *systray.MenuItem
emailMenuItem *systray.MenuItem
profileItems []*systray.MenuItem
manageProfilesItem *systray.MenuItem
}
func newProfileMenu(profileManager *profilemanager.ProfileManager, profileMenuItem, emailMenuItem *systray.MenuItem) *profileMenu {
p := profileMenu{
profileManager: profileManager,
profileMenuItem: profileMenuItem,
emailMenuItem: emailMenuItem,
}
p.refresh()
return &p
}
func (p *profileMenu) refresh() {
profiles, err := p.profileManager.ListProfiles()
if err != nil {
log.Errorf("failed to list profiles: %v", err)
return
}
// Clear existing profile items
for _, item := range p.profileItems {
item.Remove()
}
if p.manageProfilesItem != nil {
// Remove the manage profiles item if it exists
p.manageProfilesItem.Remove()
}
for _, profile := range profiles {
item := p.profileMenuItem.AddSubMenuItem(profile.Name, "")
if profile.IsActive {
item.Check()
}
p.profileItems = append(p.profileItems, item)
// TODO(hakan): handle switch profile
}
p.profileMenuItem.AddSeparator()
p.manageProfilesItem = p.profileMenuItem.AddSubMenuItem("Manage Profiles", "")
}