[mention] fix relate issues to input segments (#3766)
This commit is contained in:
parent
c757f6c6b9
commit
14483dabda
|
@ -318,24 +318,6 @@ func (m *MentionManager) OnChangeText(chatID, fullText string) (*ChatMentionCont
|
||||||
return m.calculateSuggestions(chatID, fullText)
|
return m.calculateSuggestions(chatID, fullText)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MentionManager) recheckAtIdxs(chatID string, fullText string, publicKey string) (*ChatMentionContext, error) {
|
|
||||||
user, err := m.mentionableUserGetter.getMentionableUser(chatID, publicKey)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
ctx := m.getChatMentionContext(chatID)
|
|
||||||
state := ctx.MentionState
|
|
||||||
mentionableUsers := map[string]*MentionableUser{user.ID: user}
|
|
||||||
newAtIdxs := checkIdxForMentions(fullText, state.AtIdxs, mentionableUsers)
|
|
||||||
inputSegments, success := calculateInput(fullText, newAtIdxs)
|
|
||||||
if !success {
|
|
||||||
m.logger.Warn("recheckAtIdxs: calculateInput failed", zap.String("chatID", chatID), zap.String("fullText", fullText), zap.Any("state", ctx.MentionState))
|
|
||||||
}
|
|
||||||
ctx.InputSegments = inputSegments
|
|
||||||
state.AtIdxs = newAtIdxs
|
|
||||||
return ctx, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MentionManager) calculateSuggestions(chatID, fullText string) (*ChatMentionContext, error) {
|
func (m *MentionManager) calculateSuggestions(chatID, fullText string) (*ChatMentionContext, error) {
|
||||||
ctx := m.getChatMentionContext(chatID)
|
ctx := m.getChatMentionContext(chatID)
|
||||||
|
|
||||||
|
@ -419,11 +401,10 @@ func (m *MentionManager) SelectMention(chatID, text, primaryName, publicKey stri
|
||||||
|
|
||||||
ctx.NewText = string(tr[:atSignIdx+1]) + primaryName + space + string(tr[mentionEnd:])
|
ctx.NewText = string(tr[:atSignIdx+1]) + primaryName + space + string(tr[mentionEnd:])
|
||||||
|
|
||||||
ctx, err := m.recheckAtIdxs(chatID, ctx.NewText, publicKey)
|
ctx, err := m.OnChangeText(chatID, ctx.NewText)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
ctx.PreviousText = ctx.NewText
|
|
||||||
m.clearSuggestions(chatID)
|
m.clearSuggestions(chatID)
|
||||||
return ctx, nil
|
return ctx, nil
|
||||||
}
|
}
|
||||||
|
@ -735,6 +716,9 @@ func MatchMention(text string, users map[string]*MentionableUser, mentionKeyIdx
|
||||||
|
|
||||||
func matchMention(text string, users map[string]*MentionableUser, mentionKeyIdx int, nextWordIdx int, words []string) *MentionableUser {
|
func matchMention(text string, users map[string]*MentionableUser, mentionKeyIdx int, nextWordIdx int, words []string) *MentionableUser {
|
||||||
tr := []rune(text)
|
tr := []rune(text)
|
||||||
|
if nextWordIdx >= len(tr) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
if word := wordRegex.FindString(string(tr[nextWordIdx:])); word != "" {
|
if word := wordRegex.FindString(string(tr[nextWordIdx:])); word != "" {
|
||||||
newWords := append(words, word)
|
newWords := append(words, word)
|
||||||
|
|
||||||
|
@ -888,7 +872,7 @@ func calculateAtIndexEntries(state *MentionState) ([]*AtIndexEntry, error) {
|
||||||
entry.From += diff
|
entry.From += diff
|
||||||
entry.To += diff
|
entry.To += diff
|
||||||
}
|
}
|
||||||
if entry.From < state.Start && entry.To >= state.Start { // impacted after user edit so need to be rechecked
|
if entry.From < state.Start && entry.To+1 >= state.Start { // impacted after user edit so need to be rechecked
|
||||||
entry.Checked = false
|
entry.Checked = false
|
||||||
}
|
}
|
||||||
keptAtIndexEntries = append(keptAtIndexEntries, entry)
|
keptAtIndexEntries = append(keptAtIndexEntries, entry)
|
||||||
|
|
|
@ -979,6 +979,34 @@ func TestInputSegments(t *testing.T) {
|
||||||
require.Equal(t, " ", ctx.InputSegments[1].Value)
|
require.Equal(t, " ", ctx.InputSegments[1].Value)
|
||||||
require.Equal(t, Text, ctx.InputSegments[2].Type)
|
require.Equal(t, Text, ctx.InputSegments[2].Type)
|
||||||
require.Equal(t, "@ ", ctx.InputSegments[2].Value)
|
require.Equal(t, "@ ", ctx.InputSegments[2].Value)
|
||||||
|
|
||||||
|
_, err = mentionManager.OnChangeText(chatID, " @ @User Number Three ")
|
||||||
|
require.NoError(t, err)
|
||||||
|
_, err = mentionManager.OnChangeText(chatID, "@U @ @User Number Three ")
|
||||||
|
require.NoError(t, err)
|
||||||
|
ctx, err = mentionManager.SelectMention(chatID, "@U @ @User Number Three ", "User Number Three", "0xpk3")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, 2, mentionTypeNum(ctx.InputSegments))
|
||||||
|
|
||||||
|
ctx, _ = mentionManager.OnChangeText(chatID, "@User Number Threea")
|
||||||
|
require.Equal(t, 0, mentionTypeNum(ctx.InputSegments))
|
||||||
|
|
||||||
|
ctx, _ = mentionManager.OnChangeText(chatID, "@User Number Threea\n@u2\nabc@u3 asa")
|
||||||
|
require.Equal(t, 2, mentionTypeNum(ctx.InputSegments))
|
||||||
|
ctx, _ = mentionManager.OnChangeText(chatID, "@User Number Thre\n@u2\nabc@u3 asa")
|
||||||
|
require.Equal(t, 2, mentionTypeNum(ctx.InputSegments))
|
||||||
|
require.Equal(t, "@u2", ctx.InputSegments[1].Value)
|
||||||
|
require.Equal(t, "@u3", ctx.InputSegments[3].Value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func mentionTypeNum(inputSegments []InputSegment) int {
|
||||||
|
var num int
|
||||||
|
for _, s := range inputSegments {
|
||||||
|
if s.Type == Mention {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return num
|
||||||
}
|
}
|
||||||
|
|
||||||
func setupMentionSuggestionTest(t *testing.T, mentionableUserMapInput map[string]*MentionableUser) (map[string]*MentionableUser, string, *MentionManager) {
|
func setupMentionSuggestionTest(t *testing.T, mentionableUserMapInput map[string]*MentionableUser) (map[string]*MentionableUser, string, *MentionManager) {
|
||||||
|
|
Loading…
Reference in New Issue