feat(ui): add config migration check on startup with toast notification
- commit
- 90e33b5287e465ac5e5167e0492385ed46ee83a0
- author
- bnema · · 2025-12-27 18:48 UTC
- parent
- 8f1f165
- signature
- GPG Unverified
2B82207D370127A0The key is unknown
2 files · +39 -0
M internal/ui/app.go +3 -0
| @@ -929,6 +929,9 @@ func (a *App) finalizeActivation(ctx context.Context) { | |||
| 929 | 929 | ||
| 930 | 930 | // Start async filter loading after window is visible. | |
| 931 | 931 | a.initFilteringAsync(ctx) | |
| 932 | + | ||
| 933 | + | // Check for config migration after window is visible. | |
| 934 | + | a.checkConfigMigration(ctx) | |
| 932 | 935 | } | |
| 933 | 936 | ||
| 934 | 937 | // onShutdown is called when the GTK application is shutting down. | |
| @@ -929,6 +929,9 @@ func (a *App) finalizeActivation(ctx context.Context) { | |||||
| 929 | 929 | ||||
| 930 | // Start async filter loading after window is visible. | 930 | // Start async filter loading after window is visible. | ||
| 931 | a.initFilteringAsync(ctx) | 931 | a.initFilteringAsync(ctx) | ||
| 932 | + | ||||
| 933 | + | // Check for config migration after window is visible. | |||
| 934 | + | a.checkConfigMigration(ctx) | |||
| 932 | } | 935 | } | ||
| 933 | 936 | ||||
| 934 | // onShutdown is called when the GTK application is shutting down. | 937 | // onShutdown is called when the GTK application is shutting down. | ||
A internal/ui/config_migration.go +36 -0
| @@ -0,0 +1,36 @@ | |||
| 1 | + | package ui | |
| 2 | + | ||
| 3 | + | import ( | |
| 4 | + | "context" | |
| 5 | + | "fmt" | |
| 6 | + | ||
| 7 | + | "github.com/bnema/dumber/internal/infrastructure/config" | |
| 8 | + | "github.com/bnema/dumber/internal/logging" | |
| 9 | + | "github.com/bnema/dumber/internal/ui/component" | |
| 10 | + | ) | |
| 11 | + | ||
| 12 | + | // checkConfigMigration checks if user config needs migration and shows a toast. | |
| 13 | + | func (a *App) checkConfigMigration(ctx context.Context) { | |
| 14 | + | log := logging.FromContext(ctx) | |
| 15 | + | ||
| 16 | + | migrator := config.NewMigrator() | |
| 17 | + | result, err := migrator.CheckMigration() | |
| 18 | + | if err != nil { | |
| 19 | + | log.Debug().Err(err).Msg("config migration check failed") | |
| 20 | + | return | |
| 21 | + | } | |
| 22 | + | ||
| 23 | + | if result == nil || len(result.MissingKeys) == 0 { | |
| 24 | + | return // No migration needed | |
| 25 | + | } | |
| 26 | + | ||
| 27 | + | // Show toast notification | |
| 28 | + | if a.appToaster != nil { | |
| 29 | + | msg := fmt.Sprintf("Config has %d new settings. Run 'dumber config migrate'", len(result.MissingKeys)) | |
| 30 | + | a.appToaster.Show(ctx, msg, component.ToastInfo) | |
| 31 | + | } | |
| 32 | + | ||
| 33 | + | log.Info(). | |
| 34 | + | Int("missing_keys", len(result.MissingKeys)). | |
| 35 | + | Msg("config migration available") | |
| 36 | + | } | |
| @@ -0,0 +1,36 @@ | |||||
| 1 | + | package ui | |||
| 2 | + | ||||
| 3 | + | import ( | |||
| 4 | + | "context" | |||
| 5 | + | "fmt" | |||
| 6 | + | ||||
| 7 | + | "github.com/bnema/dumber/internal/infrastructure/config" | |||
| 8 | + | "github.com/bnema/dumber/internal/logging" | |||
| 9 | + | "github.com/bnema/dumber/internal/ui/component" | |||
| 10 | + | ) | |||
| 11 | + | ||||
| 12 | + | // checkConfigMigration checks if user config needs migration and shows a toast. | |||
| 13 | + | func (a *App) checkConfigMigration(ctx context.Context) { | |||
| 14 | + | log := logging.FromContext(ctx) | |||
| 15 | + | ||||
| 16 | + | migrator := config.NewMigrator() | |||
| 17 | + | result, err := migrator.CheckMigration() | |||
| 18 | + | if err != nil { | |||
| 19 | + | log.Debug().Err(err).Msg("config migration check failed") | |||
| 20 | + | return | |||
| 21 | + | } | |||
| 22 | + | ||||
| 23 | + | if result == nil || len(result.MissingKeys) == 0 { | |||
| 24 | + | return // No migration needed | |||
| 25 | + | } | |||
| 26 | + | ||||
| 27 | + | // Show toast notification | |||
| 28 | + | if a.appToaster != nil { | |||
| 29 | + | msg := fmt.Sprintf("Config has %d new settings. Run 'dumber config migrate'", len(result.MissingKeys)) | |||
| 30 | + | a.appToaster.Show(ctx, msg, component.ToastInfo) | |||
| 31 | + | } | |||
| 32 | + | ||||
| 33 | + | log.Info(). | |||
| 34 | + | Int("missing_keys", len(result.MissingKeys)). | |||
| 35 | + | Msg("config migration available") | |||
| 36 | + | } | |||