diff --git a/tui/inbox.go b/tui/inbox.go index b9b20dbd607b910843b79eb7bfb3338c916b986d..fcdd439646a41a06fc9c61b382b2306e42688014 100644 --- a/tui/inbox.go +++ b/tui/inbox.go @@ -211,14 +211,29 @@ func parseSenderName(from string) string { // truncateEmail shortens an email for display func truncateEmail(email string) string { - parts := strings.Split(email, "@") - if len(parts) >= 1 && len(parts[0]) > 8 { - return parts[0][:8] + "..." + maxLength := 18 + + if len(email) <= maxLength { + return email } - if len(parts) >= 1 { - return parts[0] + + parts := strings.SplitN(email, "@", 2) + if len(parts) != 2 { + if len(email) > maxLength { + return email[:maxLength-3] + "..." + } + return email } - return email + + local := parts[0] + domain := parts[1] + + // Keep full domain visible (e.g. ...@gmail.com) and truncate local part first. + if len(local) > 8 { + return local[:8] + "...@" + domain + } + + return local + "@" + domain } // AccountTab represents a tab for an account diff --git a/tui/inbox_test.go b/tui/inbox_test.go index a24c40f41f46f8f02da5839d0541a6ded18379d8..5253896e98bb8f74e4ddbe6abc7a4d8000c119ab 100644 --- a/tui/inbox_test.go +++ b/tui/inbox_test.go @@ -314,3 +314,31 @@ func TestFetchMoreTriggeredAtListEnd(t *testing.T) { t.Fatalf("expected Limit %d, got %d", expectedLimit, fetchMsg.Limit) } } + +func TestTruncateEmailKeepsDomain(t *testing.T) { + tests := []struct { + name string + email string + want string + }{ + { + name: "long local part keeps full domain", + email: "verylongemail@gmail.com", + want: "verylong...@gmail.com", + }, + { + name: "short email unchanged", + email: "abc@gmail.com", + want: "abc@gmail.com", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := truncateEmail(tt.email) + if got != tt.want { + t.Fatalf("truncateEmail(%q) = %q, want %q", tt.email, got, tt.want) + } + }) + } +}