From cbb09afbb18ac3a632951f877810d8b845a688ee Mon Sep 17 00:00:00 2001 From: Julius Joska Date: Fri, 23 Oct 2026 10:51:02 +0200 Subject: [PATCH] fix(ui): skip the "(unknown)" suffix when building avatar initials A message request named "Mom (unknown)" showed the initials "M(". --- app/lib/widgets/avatar.dart | 10 +++++++++- app/test/lookalike_names_test.dart | 7 +++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/lib/widgets/avatar.dart b/app/lib/widgets/avatar.dart index 20ffeda..5cded90 100644 --- a/app/lib/widgets/avatar.dart +++ b/app/lib/widgets/avatar.dart @@ -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. static String initialsOf(String name) { // 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 // 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) { return '${parts[0].characters.first}${parts[1].characters.first}' .toUpperCase(); diff --git a/app/test/lookalike_names_test.dart b/app/test/lookalike_names_test.dart index 675774b..72c3c06 100644 --- a/app/test/lookalike_names_test.dart +++ b/app/test/lookalike_names_test.dart @@ -4,6 +4,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:sepot/core/safety/lookalike_names.dart'; import 'package:sepot/models/contact.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í /// písmen, cizí abecedou ani neviditelnými znaky. @@ -55,4 +56,10 @@ void main() { expect(lookalikeContact('', [kontakt('')]), isNull, 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ý)'), '?'); + }); }