From b3896476a0e6978c0d7f6fedfb64588934a78f1e Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sun, 10 Mar 2019 23:45:00 -0400 Subject: Fetch valid UIDs from server after opening dir --- widgets/account.go | 35 +++++++++++++++++++++++++++++------ widgets/msglist.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 widgets/msglist.go (limited to 'widgets') diff --git a/widgets/account.go b/widgets/account.go index c5545ef..3085d27 100644 --- a/widgets/account.go +++ b/widgets/account.go @@ -21,6 +21,7 @@ type AccountView struct { interactive ui.Interactive onInvalidate func(d ui.Drawable) runCmd func(cmd string) error + msgStores map[string]*MessageStore statusline *StatusLine statusbar *ui.Stack worker *types.Worker @@ -64,9 +65,10 @@ func NewAccountView(conf *config.AccountConfig, dirlist: dirlist, grid: grid, logger: logger, + msgStores: make(map[string]*MessageStore), runCmd: runCmd, - statusline: statusline, statusbar: statusbar, + statusline: statusline, worker: worker, } @@ -157,10 +159,6 @@ func (acct *AccountView) connected(msg types.WorkerMessage) { Message: types.RespondTo(msg), Approved: true, }, acct.connected) - case *types.Error: - acct.logger.Printf("%v", msg.Error) - acct.statusline.Set(fmt.Sprintf("%v", msg.Error)). - Color(tcell.ColorRed, tcell.ColorDefault) } } @@ -169,5 +167,30 @@ func (acct *AccountView) Directories() *DirectoryList { } func (acct *AccountView) onMessage(msg types.WorkerMessage) { - // TODO + switch msg := msg.(type) { + case *types.Done: + switch msg.InResponseTo().(type) { + case *types.OpenDirectory: + acct.worker.PostAction(&types.FetchDirectoryContents{}, + func(msg types.WorkerMessage) { + // TODO: Do we care + }) + } + case *types.DirectoryInfo: + if store, ok := acct.msgStores[msg.Name]; ok { + store.Update(msg) + } else { + acct.msgStores[msg.Name] = NewMessageStore(msg) + } + case *types.DirectoryContents: + store := acct.msgStores[acct.dirlist.selected] + store.Update(msg) + case *types.MessageInfo: + store := acct.msgStores[acct.dirlist.selected] + store.Update(msg) + case *types.Error: + acct.logger.Printf("%v", msg.Error) + acct.statusline.Set(fmt.Sprintf("%v", msg.Error)). + Color(tcell.ColorRed, tcell.ColorDefault) + } } diff --git a/widgets/msglist.go b/widgets/msglist.go new file mode 100644 index 0000000..370ba85 --- /dev/null +++ b/widgets/msglist.go @@ -0,0 +1,36 @@ +package widgets + +import ( + "git.sr.ht/~sircmpwn/aerc2/worker/types" +) + +type MessageStore struct { + DirInfo types.DirectoryInfo + Messages map[uint64]*types.MessageInfo +} + +func NewMessageStore(dirInfo *types.DirectoryInfo) *MessageStore { + return &MessageStore{DirInfo: *dirInfo} +} + +func (store *MessageStore) Update(msg types.WorkerMessage) { + switch msg := msg.(type) { + case *types.DirectoryInfo: + store.DirInfo = *msg + break + case *types.DirectoryContents: + newMap := make(map[uint64]*types.MessageInfo) + for _, uid := range msg.Uids { + if msg, ok := store.Messages[uid]; ok { + newMap[uid] = msg + } else { + newMap[uid] = nil + } + } + store.Messages = newMap + break + case *types.MessageInfo: + store.Messages[msg.Uid] = msg + break + } +} -- cgit v1.2.3