feat(block2): publish my seeds to the network (completes publish->discover)

The other half of the market: share your marked lots as offers.
- VarietyRepository.shareableLots(): non-private lots WITH their id (stable,
  updatable offer id) + the variety label. Private lots never leave the device.
- OffersCubit.publishLots(): maps each via OfferMapper and publishes, tagged
  with the coarse area + signed by the derived key; counts acceptances; no-op
  offline or with no area.
- Market screen: a 'share my seeds' action (online only) — publishes, then
  re-discovers to show them; 'mark some seeds first' when nothing's shared.
- i18n en/es/pt.

14 tests green (repo query, cubit publish, market UI); analyzer clean for new code.
This commit is contained in:
vjrj 2026-07-10 10:18:30 +02:00
parent 2d4e14e0da
commit 6195bece4a
12 changed files with 284 additions and 5 deletions

View file

@ -1105,6 +1105,15 @@ class Translations$market$en {
/// en: 'Wanted'
String get wanted => 'Wanted';
/// en: 'Share my seeds'
String get shareMine => 'Share my seeds';
/// en: 'Shared {n} seeds nearby'
String sharedCount({required Object n}) => 'Shared ${n} seeds nearby';
/// en: 'Mark some seeds to give, swap or sell first'
String get nothingToShare => 'Mark some seeds to give, swap or sell first';
}
// Path: intro.slides
@ -1875,6 +1884,9 @@ extension on Translations {
'market.save' => 'Save',
'market.saved' => 'Saved',
'market.wanted' => 'Wanted',
'market.shareMine' => 'Share my seeds',
'market.sharedCount' => ({required Object n}) => 'Shared ${n} seeds nearby',
'market.nothingToShare' => 'Mark some seeds to give, swap or sell first',
_ => null,
};
}