diff options
| author | raven <citrons@mondecitronne.com> | 2026-02-11 17:08:51 -0600 |
|---|---|---|
| committer | raven <citrons@mondecitronne.com> | 2026-02-11 17:08:51 -0600 |
| commit | 2ddec8b29c46f57481463abd9b56a39185986918 (patch) | |
| tree | 8df62c7cf9c4ac0978e13d81140039d90f4ecfcb /client | |
| parent | 9b830a3d0b80d04368fae5e6bc48ad1e0049b913 (diff) | |
mark channel read upon interaction with UI
Diffstat (limited to 'client')
| -rw-r--r-- | client/application.go | 7 | ||||
| -rw-r--r-- | client/channel_list.go | 9 | ||||
| -rw-r--r-- | client/channel_window.go | 20 | ||||
| -rw-r--r-- | client/ui.go | 7 |
4 files changed, 33 insertions, 10 deletions
diff --git a/client/application.go b/client/application.go index 7e46199..6f7e599 100644 --- a/client/application.go +++ b/client/application.go @@ -103,12 +103,7 @@ func (a *application) OnEvent(cmd proto.Command) { } }) case "unread": - switch cl := a.currentWindow.(type) { - case channelLocation: - if cl.id != cmd.Target { - a.channelList.setUnread(channelLocation {id: cmd.Target}, true) - } - } + a.channelList.setUnread(channelLocation {id: cmd.Target}, true) case "read": a.channelList.setUnread(channelLocation {id: cmd.Target}, false) } diff --git a/client/channel_list.go b/client/channel_list.go index 24c5230..b8bf962 100644 --- a/client/channel_list.go +++ b/client/channel_list.go @@ -58,6 +58,15 @@ func (cl *channelList) setUnread(location channelLocation, unread bool) { } } +func (cl *channelList) getUnread(location channelLocation) bool { + for i := 0; i < len(*cl); i++ { + if (*cl)[i].location == location { + return (*cl)[i].unread + } + } + return false +} + func (cl *channelList) findName(name string) channelLocation { for i := 0; i < len(*cl); i++ { if validate.Fold((*cl)[i].name) == validate.Fold(name) { diff --git a/client/channel_window.go b/client/channel_window.go index dbeeb3c..97e86e8 100644 --- a/client/channel_window.go +++ b/client/channel_window.go @@ -142,13 +142,25 @@ func (cw *channelWindow) Send(text string) { if cw.location.jumpTo == "" { cw.Buf.ScrollBottom() } + cw.markRead() // twofold: push to front of history, navigate back to non-history view globalApp.goTo(channelLocation {id: cw.location.id}) } -func (cw *channelWindow) setRead() { - globalApp.Request(proto.NewCmd("read", cw.location.id), nil) - globalApp.channelList.setUnread(cw.location, false) +func (cw *channelWindow) markRead() { + globalApp.Request(proto.NewCmd("read", cw.location.id), + func(response proto.Command) { + if response.Kind == "ok" { + globalApp.channelList.setUnread(cw.location, false) + } + }, + ) +} + +func (cw *channelWindow) fingersPresent() { + if globalApp.channelList.getUnread(cw.location) && cw.Buf.AtBottom() { + cw.markRead() + } } func (cw *channelWindow) replyTo(id string) { @@ -398,7 +410,7 @@ func (cw *channelWindow) OnNavigate() { if cw.jumpedTo != nil { cw.Buf.ScrollTo(cw.jumpedTo.Id()) } - cw.setRead() + cw.markRead() } func (cw *channelWindow) goToMessage(id string) { diff --git a/client/ui.go b/client/ui.go index 3cba7e2..8331799 100644 --- a/client/ui.go +++ b/client/ui.go @@ -57,6 +57,13 @@ func (a *application) onInput(ev tui.Event) { } } + if ev.Key != 0 { + switch cl := a.currentWindow.(type) { + case channelLocation: + a.windowCache.Get(cl).(*channelWindow).fingersPresent() + } + } + buf := win.Buffer() scroll := tui.Size().Height - 5 switch ev.Key { |
