fix(ui): skip the "(unknown)" suffix when building avatar initials

A message request named "Mom (unknown)" showed the initials "M(".
This commit is contained in:
Julius Joska
2026-10-23 10:51:02 +02:00
parent 59992af778
commit cbb09afbb1
2 changed files with 16 additions and 1 deletions
+9 -1
View File
@@ -99,12 +99,20 @@ class SepotAvatar extends ConsumerWidget {
); );
} }
static final _leadingPunct = RegExp(r'^\p{P}', unicode: true);
/// Iniciály pro avatar — veřejné, ať je sdílí i kolečka hlasujících apod. /// Iniciály pro avatar — veřejné, ať je sdílí i kolečka hlasujících apod.
static String initialsOf(String name) { static String initialsOf(String name) {
// Prázdné díly odfiltrovat — dvojitá mezera ve jméně nesmí shodit render. // Prázdné díly odfiltrovat — dvojitá mezera ve jméně nesmí shodit render.
// Grafémy (characters), ne code units — jméno začínající emoji by se // Grafémy (characters), ne code units — jméno začínající emoji by se
// jinak rozpůlilo na rozbitý surrogate. // jinak rozpůlilo na rozbitý surrogate.
final parts = name.trim().split(' ').where((p) => p.isNotEmpty).toList(); // Slova začínající interpunkcí přeskočit: přívlastek „(neznámý)“ u žádosti
// o zprávu by jinak dal iniciály „M(“.
final parts = name
.trim()
.split(' ')
.where((p) => p.isNotEmpty && !_leadingPunct.hasMatch(p))
.toList();
if (parts.length >= 2) { if (parts.length >= 2) {
return '${parts[0].characters.first}${parts[1].characters.first}' return '${parts[0].characters.first}${parts[1].characters.first}'
.toUpperCase(); .toUpperCase();
+7
View File
@@ -4,6 +4,7 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:sepot/core/safety/lookalike_names.dart'; import 'package:sepot/core/safety/lookalike_names.dart';
import 'package:sepot/models/contact.dart'; import 'package:sepot/models/contact.dart';
import 'package:sepot/models/identity.dart'; import 'package:sepot/models/identity.dart';
import 'package:sepot/widgets/avatar.dart';
/// Jméno zvolené odesílatelem se nesmí dát „obejít“ diakritikou, velikostí /// Jméno zvolené odesílatelem se nesmí dát „obejít“ diakritikou, velikostí
/// písmen, cizí abecedou ani neviditelnými znaky. /// písmen, cizí abecedou ani neviditelnými znaky.
@@ -55,4 +56,10 @@ void main() {
expect(lookalikeContact('', [kontakt('')]), isNull, expect(lookalikeContact('', [kontakt('')]), isNull,
reason: 'prázdné jméno nic nenese'); reason: 'prázdné jméno nic nenese');
}); });
test('přívlastek žádosti v závorce nekazí iniciály avataru', () {
expect(SepotAvatar.initialsOf('Máma (neznámý)'), 'MÁ');
expect(SepotAvatar.initialsOf('Jan Novák (unknown)'), 'JN');
expect(SepotAvatar.initialsOf('(neznámý)'), '?');
});
} }