detached 90e33b5

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 Unverified2B82207D370127A0 The 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) {
929929
930930 // Start async filter loading after window is visible.
931931 a.initFilteringAsync(ctx)
932+
933+ // Check for config migration after window is visible.
934+ a.checkConfigMigration(ctx)
932935 }
933936
934937 // 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+}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close