detached 924f06c

feat(main): wire session management dependencies

commit
924f06c83fa81829a6ef27f41e168069458715b1
author
bnema · · 2025-12-24 21:27 UTC
committer
brice · · 2025-12-25 05:18 UTC
parent
2718ba9
signature
unsigned
1 file · +45 -34
M cmd/dumber/main.go +45 -34
@@ -118,7 +118,7 @@ func runGUI() int {
118118 _ = idleInhibitor.Close()
119119 }
120120 }()
121- uiDeps := buildUIDependencies(ctx, cfg, themeManager, &stack, repos, useCases, idleInhibitor)
121+ uiDeps := buildUIDependencies(ctx, cfg, themeManager, &stack, repos, useCases, idleInhibitor, browserSession.Session.ID)
122122
123123 app, err := ui.New(uiDeps)
124124 if err != nil {
@@ -226,20 +226,24 @@ func openDatabase(ctx context.Context, logger zerolog.Logger, dataDir string) (*
226226
227227 // repositories groups infrastructure layer repository implementations.
228228 type repositories struct {
229- history repository.HistoryRepository
230- favorite repository.FavoriteRepository
231- folder repository.FolderRepository
232- tag repository.TagRepository
233- zoom repository.ZoomRepository
229+ history repository.HistoryRepository
230+ favorite repository.FavoriteRepository
231+ folder repository.FolderRepository
232+ tag repository.TagRepository
233+ zoom repository.ZoomRepository
234+ session repository.SessionRepository
235+ sessionState repository.SessionStateRepository
234236 }
235237
236238 func createRepositories(db *sql.DB) *repositories {
237239 return &repositories{
238- history: sqlite.NewHistoryRepository(db),
239- favorite: sqlite.NewFavoriteRepository(db),
240- folder: sqlite.NewFolderRepository(db),
241- tag: sqlite.NewTagRepository(db),
242- zoom: sqlite.NewZoomRepository(db),
240+ history: sqlite.NewHistoryRepository(db),
241+ favorite: sqlite.NewFavoriteRepository(db),
242+ folder: sqlite.NewFolderRepository(db),
243+ tag: sqlite.NewTagRepository(db),
244+ zoom: sqlite.NewZoomRepository(db),
245+ session: sqlite.NewSessionRepository(db),
246+ sessionState: sqlite.NewSessionStateRepository(db),
243247 }
244248 }
245249
@@ -252,6 +256,7 @@ type useCases struct {
252256 zoom *usecase.ManageZoomUseCase
253257 navigate *usecase.NavigateUseCase
254258 copyURL *usecase.CopyURLUseCase
259+ snapshot *usecase.SnapshotSessionUseCase
255260 clipboard port.Clipboard
256261 favicon *favicon.Service
257262 }
@@ -279,6 +284,7 @@ func createUseCases(repos *repositories, cfg *config.Config) *useCases {
279284 zoom: usecase.NewManageZoomUseCase(repos.zoom, defaultZoom, zoomCache),
280285 navigate: usecase.NewNavigateUseCase(repos.history, repos.zoom, defaultZoom),
281286 copyURL: usecase.NewCopyURLUseCase(clipboardAdapter),
287+ snapshot: usecase.NewSnapshotSessionUseCase(repos.sessionState),
282288 clipboard: clipboardAdapter,
283289 favicon: favicon.NewService(faviconCacheDir),
284290 }
@@ -292,30 +298,35 @@ func buildUIDependencies(
292298 repos *repositories,
293299 uc *useCases,
294300 idleInhibitor port.IdleInhibitor,
301+ currentSessionID entity.SessionID,
295302 ) *ui.Dependencies {
296303 return &ui.Dependencies{
297- Ctx: ctx,
298- Config: cfg,
299- InitialURL: initialURL,
300- Theme: themeManager,
301- WebContext: stack.Context,
302- Pool: stack.Pool,
303- Settings: stack.Settings,
304- Injector: stack.Injector,
305- MessageRouter: stack.MessageRouter,
306- FilterManager: stack.FilterManager,
307- HistoryRepo: repos.history,
308- FavoriteRepo: repos.favorite,
309- ZoomRepo: repos.zoom,
310- TabsUC: uc.tabs,
311- PanesUC: uc.panes,
312- HistoryUC: uc.history,
313- FavoritesUC: uc.favorites,
314- ZoomUC: uc.zoom,
315- NavigateUC: uc.navigate,
316- CopyURLUC: uc.copyURL,
317- Clipboard: uc.clipboard,
318- FaviconService: uc.favicon,
319- IdleInhibitor: idleInhibitor,
304+ Ctx: ctx,
305+ Config: cfg,
306+ InitialURL: initialURL,
307+ Theme: themeManager,
308+ WebContext: stack.Context,
309+ Pool: stack.Pool,
310+ Settings: stack.Settings,
311+ Injector: stack.Injector,
312+ MessageRouter: stack.MessageRouter,
313+ FilterManager: stack.FilterManager,
314+ HistoryRepo: repos.history,
315+ FavoriteRepo: repos.favorite,
316+ ZoomRepo: repos.zoom,
317+ TabsUC: uc.tabs,
318+ PanesUC: uc.panes,
319+ HistoryUC: uc.history,
320+ FavoritesUC: uc.favorites,
321+ ZoomUC: uc.zoom,
322+ NavigateUC: uc.navigate,
323+ CopyURLUC: uc.copyURL,
324+ Clipboard: uc.clipboard,
325+ FaviconService: uc.favicon,
326+ IdleInhibitor: idleInhibitor,
327+ SessionRepo: repos.session,
328+ SessionStateRepo: repos.sessionState,
329+ CurrentSessionID: currentSessionID,
330+ SnapshotUC: uc.snapshot,
320331 }
321332 }
@@ -118,7 +118,7 @@ func runGUI() int {
118 _ = idleInhibitor.Close()118 _ = idleInhibitor.Close()
119 }119 }
120 }()120 }()
121- uiDeps := buildUIDependencies(ctx, cfg, themeManager, &stack, repos, useCases, idleInhibitor)121+ uiDeps := buildUIDependencies(ctx, cfg, themeManager, &stack, repos, useCases, idleInhibitor, browserSession.Session.ID)
122 122
123 app, err := ui.New(uiDeps)123 app, err := ui.New(uiDeps)
124 if err != nil {124 if err != nil {
@@ -226,20 +226,24 @@ func openDatabase(ctx context.Context, logger zerolog.Logger, dataDir string) (*
226 226
227 // repositories groups infrastructure layer repository implementations.227 // repositories groups infrastructure layer repository implementations.
228 type repositories struct {228 type repositories struct {
229- history repository.HistoryRepository229+ history repository.HistoryRepository
230- favorite repository.FavoriteRepository230+ favorite repository.FavoriteRepository
231- folder repository.FolderRepository231+ folder repository.FolderRepository
232- tag repository.TagRepository232+ tag repository.TagRepository
233- zoom repository.ZoomRepository233+ zoom repository.ZoomRepository
234+ session repository.SessionRepository
235+ sessionState repository.SessionStateRepository
234 }236 }
235 237
236 func createRepositories(db *sql.DB) *repositories {238 func createRepositories(db *sql.DB) *repositories {
237 return &repositories{239 return &repositories{
238- history: sqlite.NewHistoryRepository(db),240+ history: sqlite.NewHistoryRepository(db),
239- favorite: sqlite.NewFavoriteRepository(db),241+ favorite: sqlite.NewFavoriteRepository(db),
240- folder: sqlite.NewFolderRepository(db),242+ folder: sqlite.NewFolderRepository(db),
241- tag: sqlite.NewTagRepository(db),243+ tag: sqlite.NewTagRepository(db),
242- zoom: sqlite.NewZoomRepository(db),244+ zoom: sqlite.NewZoomRepository(db),
245+ session: sqlite.NewSessionRepository(db),
246+ sessionState: sqlite.NewSessionStateRepository(db),
243 }247 }
244 }248 }
245 249
@@ -252,6 +256,7 @@ type useCases struct {
252 zoom *usecase.ManageZoomUseCase256 zoom *usecase.ManageZoomUseCase
253 navigate *usecase.NavigateUseCase257 navigate *usecase.NavigateUseCase
254 copyURL *usecase.CopyURLUseCase258 copyURL *usecase.CopyURLUseCase
259+ snapshot *usecase.SnapshotSessionUseCase
255 clipboard port.Clipboard260 clipboard port.Clipboard
256 favicon *favicon.Service261 favicon *favicon.Service
257 }262 }
@@ -279,6 +284,7 @@ func createUseCases(repos *repositories, cfg *config.Config) *useCases {
279 zoom: usecase.NewManageZoomUseCase(repos.zoom, defaultZoom, zoomCache),284 zoom: usecase.NewManageZoomUseCase(repos.zoom, defaultZoom, zoomCache),
280 navigate: usecase.NewNavigateUseCase(repos.history, repos.zoom, defaultZoom),285 navigate: usecase.NewNavigateUseCase(repos.history, repos.zoom, defaultZoom),
281 copyURL: usecase.NewCopyURLUseCase(clipboardAdapter),286 copyURL: usecase.NewCopyURLUseCase(clipboardAdapter),
287+ snapshot: usecase.NewSnapshotSessionUseCase(repos.sessionState),
282 clipboard: clipboardAdapter,288 clipboard: clipboardAdapter,
283 favicon: favicon.NewService(faviconCacheDir),289 favicon: favicon.NewService(faviconCacheDir),
284 }290 }
@@ -292,30 +298,35 @@ func buildUIDependencies(
292 repos *repositories,298 repos *repositories,
293 uc *useCases,299 uc *useCases,
294 idleInhibitor port.IdleInhibitor,300 idleInhibitor port.IdleInhibitor,
301+ currentSessionID entity.SessionID,
295 ) *ui.Dependencies {302 ) *ui.Dependencies {
296 return &ui.Dependencies{303 return &ui.Dependencies{
297- Ctx: ctx,304+ Ctx: ctx,
298- Config: cfg,305+ Config: cfg,
299- InitialURL: initialURL,306+ InitialURL: initialURL,
300- Theme: themeManager,307+ Theme: themeManager,
301- WebContext: stack.Context,308+ WebContext: stack.Context,
302- Pool: stack.Pool,309+ Pool: stack.Pool,
303- Settings: stack.Settings,310+ Settings: stack.Settings,
304- Injector: stack.Injector,311+ Injector: stack.Injector,
305- MessageRouter: stack.MessageRouter,312+ MessageRouter: stack.MessageRouter,
306- FilterManager: stack.FilterManager,313+ FilterManager: stack.FilterManager,
307- HistoryRepo: repos.history,314+ HistoryRepo: repos.history,
308- FavoriteRepo: repos.favorite,315+ FavoriteRepo: repos.favorite,
309- ZoomRepo: repos.zoom,316+ ZoomRepo: repos.zoom,
310- TabsUC: uc.tabs,317+ TabsUC: uc.tabs,
311- PanesUC: uc.panes,318+ PanesUC: uc.panes,
312- HistoryUC: uc.history,319+ HistoryUC: uc.history,
313- FavoritesUC: uc.favorites,320+ FavoritesUC: uc.favorites,
314- ZoomUC: uc.zoom,321+ ZoomUC: uc.zoom,
315- NavigateUC: uc.navigate,322+ NavigateUC: uc.navigate,
316- CopyURLUC: uc.copyURL,323+ CopyURLUC: uc.copyURL,
317- Clipboard: uc.clipboard,324+ Clipboard: uc.clipboard,
318- FaviconService: uc.favicon,325+ FaviconService: uc.favicon,
319- IdleInhibitor: idleInhibitor,326+ IdleInhibitor: idleInhibitor,
327+ SessionRepo: repos.session,
328+ SessionStateRepo: repos.sessionState,
329+ CurrentSessionID: currentSessionID,
330+ SnapshotUC: uc.snapshot,
320 }331 }
321 }332 }

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