feat(block2): profiles — your identity card + name/about (NIP-01 kind:0)

Drawer 'Profile' is now live.
- commons_core: ProfileTransport + UserProfile + NostrProfileTransport (kind:0
  publish/fetch), exposed as SocialSession.profile. Round-trip tested against the
  in-process relay (fast dart test).
- app: ProfileStore (local name/about, keystore) + ProfileScreen — shows your
  shareable npub with copy, edits display name + 'about', saves locally and (when
  online) publishes kind:0 so peers can recognise you instead of a raw key.
- Drawer 'Profile' -> /profile (gated like Market/Chat).
- i18n en/es/pt. ProfileStore + profile transport covered by plain/dart tests.

Analyzer clean (both packages).
This commit is contained in:
vjrj 2026-07-10 12:37:07 +02:00
parent 7f1c520960
commit 8ef587176f
19 changed files with 562 additions and 4 deletions

View file

@ -69,6 +69,7 @@ class TranslationsPt extends Translations with BaseTranslations<AppLocale, Trans
@override late final _Translations$desiccant$pt desiccant = _Translations$desiccant$pt._(_root);
@override late final _Translations$unit$pt unit = _Translations$unit$pt._(_root);
@override late final _Translations$market$pt market = _Translations$market$pt._(_root);
@override late final _Translations$profile$pt profile = _Translations$profile$pt._(_root);
@override late final _Translations$chatList$pt chatList = _Translations$chatList$pt._(_root);
@override late final _Translations$chat$pt chat = _Translations$chat$pt._(_root);
@override late final _Translations$trust$pt trust = _Translations$trust$pt._(_root);
@ -631,6 +632,26 @@ class _Translations$market$pt extends Translations$market$en {
@override String get queued => 'Guardado — vamos partilhá-las quando tiveres ligação';
}
// Path: profile
class _Translations$profile$pt extends Translations$profile$en {
_Translations$profile$pt._(TranslationsPt root) : this._root = root, super.internal(root);
final TranslationsPt _root; // ignore: unused_field
// Translations
@override String get title => 'O teu perfil';
@override String get name => 'Nome';
@override String get nameHint => 'Como os outros te veem';
@override String get about => 'Sobre ti';
@override String get aboutHint => 'Uma linha — o que cultivas, onde';
@override String get yourId => 'A tua identidade';
@override String get idHelp => 'Partilha-a para que te reconheçam';
@override String get copy => 'Copiar';
@override String get copied => 'Copiado';
@override String get save => 'Guardar';
@override String get saved => 'Perfil guardado';
}
// Path: chatList
class _Translations$chatList$pt extends Translations$chatList$en {
_Translations$chatList$pt._(TranslationsPt root) : this._root = root, super.internal(root);
@ -1329,6 +1350,17 @@ extension on TranslationsPt {
'market.useLocation' => 'Usar a minha localização aproximada',
'market.locationFailed' => 'Não foi possível obter a tua localização — verifica se a localização está ativa e a permissão concedida',
'market.queued' => 'Guardado — vamos partilhá-las quando tiveres ligação',
'profile.title' => 'O teu perfil',
'profile.name' => 'Nome',
'profile.nameHint' => 'Como os outros te veem',
'profile.about' => 'Sobre ti',
'profile.aboutHint' => 'Uma linha — o que cultivas, onde',
'profile.yourId' => 'A tua identidade',
'profile.idHelp' => 'Partilha-a para que te reconheçam',
'profile.copy' => 'Copiar',
'profile.copied' => 'Copiado',
'profile.save' => 'Guardar',
'profile.saved' => 'Perfil guardado',
'chatList.title' => 'Mensagens',
'chatList.empty' => 'Ainda não há conversas. Escreve a alguém a partir do mercado.',
'chat.title' => 'Conversa',