discordo/internal/ui/chat/emojipicker/model.go

63 lines
1.6 KiB
Go

package emojipicker
import (
"github.com/ayn2op/arikawa/v3/discord"
"github.com/ayn2op/discordo/internal/config"
"github.com/ayn2op/discordo/internal/emoji"
uipicker "github.com/ayn2op/discordo/internal/ui/picker"
"github.com/ayn2op/ningen/v3"
"github.com/ayn2op/tview"
"github.com/ayn2op/tview/picker"
)
type Model struct {
uipicker.Model
cfg *config.Config
}
func NewModel(cfg *config.Config) Model {
return Model{Model: uipicker.NewModel(cfg, "Add Reaction"), cfg: cfg}
}
var _ tview.Model[Model] = Model{}
// View shows the picker in a box titled Add Reaction.
func (m Model) View() tview.Widget {
return m.Model.View(func(item picker.Item) tview.Msg {
apiEmoji, ok := item.Reference.(discord.APIEmoji)
if !ok {
return nil
}
return SelectedMsg{Emoji: apiEmoji}
}, CancelMsg{})
}
func (m Model) Update(msg tview.Msg) (Model, tview.Cmd) {
var cmd tview.Cmd
m.Model, cmd = m.Model.Update(msg)
return m, cmd
}
// RefreshEmojis repopulates the picker with custom guild emojis and Unicode emojis.
func (m *Model) RefreshEmojis(state *ningen.State, guildID discord.GuildID) {
var customEmojis []discord.Emoji
if state != nil && state.EmojiState != nil {
guilds, err := state.EmojiState.ForGuild(guildID)
if err == nil {
for _, g := range guilds {
customEmojis = append(customEmojis, g.Emojis...)
}
}
}
results := emoji.Search("", customEmojis, 2500)
items := make(picker.Items, 0, len(results))
for _, item := range results {
items = append(items, picker.Item{
Text: item.Display,
FilterText: item.Name,
Reference: item.APIEmoji(),
})
}
m.SetItems(items)
}