Quellcode durchsuchen

refactor(ui): modularize code

ayntgl vor 3 Jahren
Ursprung
Commit
688b6c3012
6 geänderte Dateien mit 60 neuen und 41 gelöschten Zeilen
  1. 3 3
      ui/actions_view.go
  2. 1 1
      ui/application.go
  3. 20 31
      ui/channels_view.go
  4. 1 1
      ui/guilds_view.go
  5. 3 3
      ui/input_view.go
  6. 32 2
      ui/messages_view.go

+ 3 - 3
ui/actions_view.go

@@ -34,10 +34,10 @@ func newActionsView(app *Application, m *discord.Message) *ActionsView {
 		app.SetFocus(app.view.MessagesView)
 	})
 
-	isDM := channelIsInDMCategory(app.view.ChannelsView.selectedChannel)
+	isDM := channelIsInDMCategory(app.view.ChannelsView.selected)
 
 	// If the client user has the `SEND_MESSAGES` permission, add "Reply" and "Mention Reply" actions.
-	if isDM || !isDM && hasPermission(app.state, app.view.ChannelsView.selectedChannel.ID, discord.PermissionSendMessages) {
+	if isDM || !isDM && hasPermission(app.state, app.view.ChannelsView.selected.ID, discord.PermissionSendMessages) {
 		v.AddItem("Reply", "", 'r', v.replyAction)
 		v.AddItem("Mention Reply", "", 'R', v.mentionReplyAction)
 	}
@@ -69,7 +69,7 @@ func newActionsView(app *Application, m *discord.Message) *ActionsView {
 	me, _ := app.state.MeStore.Me()
 
 	// If the client user has the `MANAGE_MESSAGES` permission, add a new action to delete the message.
-	if (isDM && m.Author.ID == me.ID) || (!isDM && hasPermission(app.state, app.view.ChannelsView.selectedChannel.ID, discord.PermissionManageMessages)) {
+	if (isDM && m.Author.ID == me.ID) || (!isDM && hasPermission(app.state, app.view.ChannelsView.selected.ID, discord.PermissionManageMessages)) {
 		v.AddItem("Delete", "", 'd', v.deleteAction)
 	}
 

+ 1 - 1
ui/application.go

@@ -189,7 +189,7 @@ func (c *Application) onGuildDelete(g *gateway.GuildDeleteEvent) {
 }
 
 func (c *Application) onMessageCreate(m *gateway.MessageCreateEvent) {
-	if c.view.ChannelsView.selectedChannel != nil && c.view.ChannelsView.selectedChannel.ID == m.ChannelID {
+	if c.view.ChannelsView.selected != nil && c.view.ChannelsView.selected.ID == m.ChannelID {
 		_, err := c.view.MessagesView.Write(buildMessage(c, m.Message))
 		if err != nil {
 			return

+ 20 - 31
ui/channels_view.go

@@ -10,14 +10,16 @@ import (
 
 type ChannelsView struct {
 	*tview.TreeView
-	selectedChannel *discord.Channel
-	app             *Application
+
+	app      *Application
+	selected *discord.Channel
 }
 
 func newChannelsView(app *Application) *ChannelsView {
 	v := &ChannelsView{
 		TreeView: tview.NewTreeView(),
-		app:      app,
+
+		app: app,
 	}
 
 	v.SetRoot(tview.NewTreeNode(""))
@@ -33,7 +35,7 @@ func newChannelsView(app *Application) *ChannelsView {
 }
 
 func (v *ChannelsView) onSelected(node *tview.TreeNode) {
-	v.selectedChannel = nil
+	v.selected = nil
 	v.app.view.MessagesView.selectedMessage = -1
 	v.app.view.MessagesView.
 		Highlight().
@@ -42,44 +44,31 @@ func (v *ChannelsView) onSelected(node *tview.TreeNode) {
 	v.app.view.InputView.SetText("")
 
 	ref := node.GetReference()
+	if ref == nil {
+		log.Println("selected channel reference is nil")
+		return
+	}
+
 	c, err := v.app.state.Cabinet.Channel(ref.(discord.ChannelID))
 	if err != nil {
+		log.Println("selected channel not found")
 		return
 	}
 
+	switch c.Type {
 	// If the channel is a category channel, expand the selected node if it is collapsed, otherwise collapse.
-	if c.Type == discord.GuildCategory {
+	case discord.GuildCategory:
 		node.SetExpanded(!node.IsExpanded())
 		return
-	}
 
-	v.selectedChannel = c
-	v.app.SetFocus(v.app.view.InputView)
+	default:
+		v.selected = c
 
-	title := channelToString(*c)
-	if c.Topic != "" {
-		title += " - " + parseMarkdown(c.Topic)
-	}
-	v.app.view.MessagesView.SetTitle(title)
-
-	go func() {
-		// The returned slice will be sorted from latest to oldest.
-		ms, err := v.app.state.Messages(c.ID, v.app.config.MessagesLimit)
-		if err != nil {
-			log.Println(err)
-			return
-		}
-
-		for i := len(ms) - 1; i >= 0; i-- {
-			_, err = v.app.view.MessagesView.Write(buildMessage(v.app, ms[i]))
-			if err != nil {
-				log.Println(err)
-				continue
-			}
-		}
+		v.app.view.MessagesView.setTitle(c)
+		v.app.SetFocus(v.app.view.InputView)
 
-		v.app.view.MessagesView.ScrollToEnd()
-	}()
+		go v.app.view.MessagesView.loadMessages(c)
+	}
 }
 
 func (v *ChannelsView) createChannelNode(c discord.Channel) *tview.TreeNode {

+ 1 - 1
ui/guilds_view.go

@@ -32,7 +32,7 @@ func newGuildsView(app *Application) *GuildsView {
 }
 
 func (v *GuildsView) onSelected(node *tview.TreeNode) {
-	v.app.view.ChannelsView.selectedChannel = nil
+	v.app.view.ChannelsView.selected = nil
 	v.app.view.MessagesView.selectedMessage = -1
 	rootNode := v.app.view.ChannelsView.GetRoot()
 	rootNode.ClearChildren()

+ 3 - 3
ui/input_view.go

@@ -59,7 +59,7 @@ func (v *InputView) inputCapture(event *tcell.EventKey) *tcell.EventKey {
 }
 
 func (v *InputView) sendMessage() *tcell.EventKey {
-	if v.app.view.ChannelsView.selectedChannel == nil {
+	if v.app.view.ChannelsView.selected == nil {
 		return nil
 	}
 
@@ -68,7 +68,7 @@ func (v *InputView) sendMessage() *tcell.EventKey {
 		return nil
 	}
 
-	ms, err := v.app.state.Messages(v.app.view.ChannelsView.selectedChannel.ID, v.app.config.MessagesLimit)
+	ms, err := v.app.state.Messages(v.app.view.ChannelsView.selected.ID, v.app.config.MessagesLimit)
 	if err != nil {
 		log.Println(err)
 		return nil
@@ -102,7 +102,7 @@ func (v *InputView) sendMessage() *tcell.EventKey {
 
 		v.SetTitle("")
 	} else {
-		go v.app.state.SendMessage(v.app.view.ChannelsView.selectedChannel.ID, t)
+		go v.app.state.SendMessage(v.app.view.ChannelsView.selected.ID, t)
 	}
 
 	v.SetText("")

+ 32 - 2
ui/messages_view.go

@@ -1,6 +1,8 @@
 package ui
 
 import (
+	"log"
+
 	"github.com/diamondburned/arikawa/v3/discord"
 	"github.com/gdamore/tcell/v2"
 	"github.com/rivo/tview"
@@ -36,13 +38,41 @@ func newMessagesView(app *Application) *MessagesView {
 	return v
 }
 
+func (v *MessagesView) setTitle(c *discord.Channel) {
+	title := channelToString(*c)
+	if c.Topic != "" {
+		title += " - " + parseMarkdown(c.Topic)
+	}
+
+	v.SetTitle(title)
+}
+
+func (v *MessagesView) loadMessages(c *discord.Channel) {
+	// The returned slice will be sorted from latest to oldest.
+	ms, err := v.app.state.Messages(c.ID, v.app.config.MessagesLimit)
+	if err != nil {
+		log.Println(err)
+		return
+	}
+
+	for i := len(ms) - 1; i >= 0; i-- {
+		_, err = v.app.view.MessagesView.Write(buildMessage(v.app, ms[i]))
+		if err != nil {
+			log.Println(err)
+			continue
+		}
+	}
+
+	v.ScrollToEnd()
+}
+
 func (v *MessagesView) onInputCapture(e *tcell.EventKey) *tcell.EventKey {
-	if v.app.view.ChannelsView.selectedChannel == nil {
+	if v.app.view.ChannelsView.selected == nil {
 		return nil
 	}
 
 	// Messages should return messages ordered from latest to earliest.
-	ms, err := v.app.state.Cabinet.Messages(v.app.view.ChannelsView.selectedChannel.ID)
+	ms, err := v.app.state.Cabinet.Messages(v.app.view.ChannelsView.selected.ID)
 	if err != nil || len(ms) == 0 {
 		return nil
 	}