diff options
Diffstat (limited to 'worker/jmap/list.go')
-rw-r--r-- | worker/jmap/list.go | 53 |
1 files changed, 44 insertions, 9 deletions
diff --git a/worker/jmap/list.go b/worker/jmap/list.go index cba3db91..cd11707d 100644 --- a/worker/jmap/list.go +++ b/worker/jmap/list.go @@ -11,6 +11,7 @@ import ( func (w *JMAPWorker) handleListDirectories(msg *types.ListDirectories) error { var req jmap.Request + var ids []jmap.ID w.w.Debugf("listing directories") @@ -23,8 +24,17 @@ func (w *JMAPWorker) handleListDirectories(msg *types.ListDirectories) error { for _, inv := range resp.Responses { switch r := inv.Args.(type) { case *mailbox.GetResponse: + ids = make([]jmap.ID, 0, len(r.List)) for _, mbox := range r.List { w.mboxes[mbox.ID] = &MailboxState{mbox: mbox} + if mbox.Role == "archive" && w.config.useLabels { + w.mboxes[""] = &MailboxState{ + dir: w.config.allMailName, + } + ids = append(ids, "") + } else { + ids = append(ids, mbox.ID) + } } w.mboxState = r.State } @@ -34,17 +44,42 @@ func (w *JMAPWorker) handleListDirectories(msg *types.ListDirectories) error { } for _, m := range w.mboxes { + if m.mbox == nil { + w.dir2mbox[m.dir] = "" + continue + } m.dir = m.FullPath(w.mboxes) w.dir2mbox[m.dir] = m.mbox.ID - w.w.PostMessage(&types.Directory{ - Message: types.RespondTo(msg), - Dir: &models.Directory{ - Name: m.dir, - Exists: int(m.mbox.TotalEmails), - Unseen: int(m.mbox.UnreadEmails), - Role: jmapRole2aerc[m.mbox.Role], - }, - }, nil) + } + + for _, id := range ids { + m := w.mboxes[id] + if m.mbox == nil { + w.w.PostMessage(&types.Directory{ + Message: types.RespondTo(msg), + Dir: &models.Directory{ + Name: m.dir, + Role: models.AllRole, + }, + }, nil) + } else { + role := jmapRole2aerc[m.mbox.Role] + switch role { + case models.ArchiveRole: + w.archiveMbox = m.mbox.ID + case models.TrashRole: + w.trashMbox = m.mbox.ID + } + w.w.PostMessage(&types.Directory{ + Message: types.RespondTo(msg), + Dir: &models.Directory{ + Name: m.dir, + Exists: int(m.mbox.TotalEmails), + Unseen: int(m.mbox.UnreadEmails), + Role: role, + }, + }, nil) + } } go w.monitorChanges() |