diff --git a/internal/commands/list.go b/internal/commands/list.go index 7ea97d6..f7fbe2e 100644 --- a/internal/commands/list.go +++ b/internal/commands/list.go @@ -195,27 +195,10 @@ func updateList(msg tea.Msg, m model) (tea.Model, tea.Cmd) { cmds = append(cmds, refreshList(m)) case key.Matches(msg, ListKeyMap.Read): - if m.list.SettingFilter() { - break - } - - if len(m.list.Items()) == 0 { - return m, m.list.NewStatusMessage("No items to mark.") + if cmd := markReadList(&m, &cmds); cmd != nil { + cmds = append(cmds, cmd) } - item := m.list.SelectedItem() - if item == nil { - return m, m.list.NewStatusMessage("No item selected.") - } - - current := item.(TUIItem) - err := m.commands.store.ToggleRead(current.ID) - if err != nil { - return m, m.list.NewStatusMessage(fmt.Sprintf("Error marking read: %s", err)) - } - - cmds = append(cmds, m.UpdateList()) - case key.Matches(msg, ListKeyMap.ToggleReads): if m.list.SettingFilter() { break @@ -282,6 +265,11 @@ func updateList(msg tea.Msg, m model) (tea.Model, tea.Cmd) { current := item.(TUIItem) cmd = m.OpenLink(current.URL) cmds = append(cmds, cmd) + if !current.Read && m.commands.config.AutoRead { + if cmd := markReadList(&m, &cmds); cmd != nil { + cmds = append(cmds, cmd) + } + } case key.Matches(msg, ListKeyMap.Sort): if m.list.SettingFilter() || m.list.IsFiltered() { @@ -370,3 +358,27 @@ func getEditor(vars ...string) string { return "nano" } + +func markReadList(m *model, cmds *[]tea.Cmd) tea.Cmd { + if m.list.SettingFilter() { + return nil + } + + if len(m.list.Items()) == 0 { + return m.list.NewStatusMessage("No items to mark.") + } + + item := m.list.SelectedItem() + if item == nil { + return m.list.NewStatusMessage("No item selected.") + } + + current := item.(TUIItem) + err := m.commands.store.ToggleRead(current.ID) + if err != nil { + return m.list.NewStatusMessage(fmt.Sprintf("Error marking read: %s", err)) + } + + *cmds = append(*cmds, m.UpdateList()) + return nil +} diff --git a/internal/commands/viewport.go b/internal/commands/viewport.go index c14db3b..f84ced8 100644 --- a/internal/commands/viewport.go +++ b/internal/commands/viewport.go @@ -48,7 +48,13 @@ func updateViewport(msg tea.Msg, m model) (tea.Model, tea.Cmd) { it := ItemToTUIItem(current) cmd = m.OpenLink(it.URL) + cmds = append(cmds, cmd) + if !current.Read() && m.commands.config.AutoRead { + if cmd := markRead(&m); cmd != nil { + cmds = append(cmds, cmd) + } + } case key.Matches(msg, ViewportKeyMap.Favourite): current, err := m.commands.store.GetItemByID(*m.selectedArticle) @@ -63,45 +69,9 @@ func updateViewport(msg tea.Msg, m model) (tea.Model, tea.Cmd) { } case key.Matches(msg, ViewportKeyMap.Read): - if m.commands.config.AutoRead { - return m, nil - } - current, err := m.commands.store.GetItemByID(*m.selectedArticle) - if err != nil { - m.selectedArticle = nil - return m, m.list.NewStatusMessage("Error: failed to get article") - } - err = m.commands.store.ToggleRead(current.ID) - if err != nil { - m.selectedArticle = nil - return m, m.list.NewStatusMessage("Error marking read") - } - - if !m.commands.config.ShowRead { - index := m.list.Index() - - if m.lastRead != nil && current.ID == (*m.lastRead).(TUIItem).ID { - // un-read re-add post back to list - m.list.InsertItem(index, *m.lastRead) - m.lastReadIndex = index - m.lastRead = nil - } else { - // remove post and store backup for un-read - items := m.list.Items() - item := items[index] - m.list.RemoveItem(index) - m.lastReadIndex = index - m.lastRead = &item - } - } - - // trigger refresh to update read indication - content, err := m.commands.GetGlamourisedArticle(*m.selectedArticle) - if err != nil { - m.selectedArticle = nil - return m, m.list.NewStatusMessage("Error rendering article") + if cmd := markRead(&m); cmd != nil { + cmds = append(cmds, cmd) } - m.viewport.SetContent(content) case key.Matches(msg, ViewportKeyMap.Prev): navIndex := m.getPrevIndex() @@ -228,3 +198,46 @@ func viewportView(m model) string { func (m model) viewportHelp() string { return helpStyle.Render(m.help.View(ViewportKeyMap)) } + +func markRead(m *model) tea.Cmd { + if m.commands.config.AutoRead { + return nil + } + current, err := m.commands.store.GetItemByID(*m.selectedArticle) + if err != nil { + m.selectedArticle = nil + return m.list.NewStatusMessage("Error: failed to get article") + } + err = m.commands.store.ToggleRead(current.ID) + if err != nil { + m.selectedArticle = nil + return m.list.NewStatusMessage("Error marking read") + } + + if !m.commands.config.ShowRead { + index := m.list.Index() + + if m.lastRead != nil && current.ID == (*m.lastRead).(TUIItem).ID { + // un-read re-add post back to list + m.list.InsertItem(index, *m.lastRead) + m.lastReadIndex = index + m.lastRead = nil + } else { + // remove post and store backup for un-read + items := m.list.Items() + item := items[index] + m.list.RemoveItem(index) + m.lastReadIndex = index + m.lastRead = &item + } + } + + // trigger refresh to update read indication + content, err := m.commands.GetGlamourisedArticle(*m.selectedArticle) + if err != nil { + m.selectedArticle = nil + return m.list.NewStatusMessage("Error rendering article") + } + m.viewport.SetContent(content) + return nil +}