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 abc2d37402
commit 30246f4292
19 changed files with 562 additions and 4 deletions

View file

@ -70,6 +70,7 @@ class Translations with BaseTranslations<AppLocale, Translations> {
late final Translations$desiccant$en desiccant = Translations$desiccant$en.internal(_root);
late final Translations$unit$en unit = Translations$unit$en.internal(_root);
late final Translations$market$en market = Translations$market$en.internal(_root);
late final Translations$profile$en profile = Translations$profile$en.internal(_root);
late final Translations$chatList$en chatList = Translations$chatList$en.internal(_root);
late final Translations$chat$en chat = Translations$chat$en.internal(_root);
late final Translations$trust$en trust = Translations$trust$en.internal(_root);
@ -1143,6 +1144,48 @@ class Translations$market$en {
String get queued => 'Saved — we\'ll share these when you\'re connected';
}
// Path: profile
class Translations$profile$en {
Translations$profile$en.internal(this._root);
final Translations _root; // ignore: unused_field
// Translations
/// en: 'Your profile'
String get title => 'Your profile';
/// en: 'Display name'
String get name => 'Display name';
/// en: 'How others see you'
String get nameHint => 'How others see you';
/// en: 'About'
String get about => 'About';
/// en: 'A short line — what you grow, where'
String get aboutHint => 'A short line — what you grow, where';
/// en: 'Your identity'
String get yourId => 'Your identity';
/// en: 'Share this so people can recognise you'
String get idHelp => 'Share this so people can recognise you';
/// en: 'Copy'
String get copy => 'Copy';
/// en: 'Copied'
String get copied => 'Copied';
/// en: 'Save'
String get save => 'Save';
/// en: 'Profile saved'
String get saved => 'Profile saved';
}
// Path: chatList
class Translations$chatList$en {
Translations$chatList$en.internal(this._root);
@ -1985,6 +2028,17 @@ extension on Translations {
'market.useLocation' => 'Use my approximate location',
'market.locationFailed' => 'Couldn\'t get your location — check that location is on and the permission is granted',
'market.queued' => 'Saved — we\'ll share these when you\'re connected',
'profile.title' => 'Your profile',
'profile.name' => 'Display name',
'profile.nameHint' => 'How others see you',
'profile.about' => 'About',
'profile.aboutHint' => 'A short line — what you grow, where',
'profile.yourId' => 'Your identity',
'profile.idHelp' => 'Share this so people can recognise you',
'profile.copy' => 'Copy',
'profile.copied' => 'Copied',
'profile.save' => 'Save',
'profile.saved' => 'Profile saved',
'chatList.title' => 'Messages',
'chatList.empty' => 'No conversations yet. Message someone from the market.',
'chat.title' => 'Chat',