feat(plantare): UI — propose from chat, review & sign on the ledger
The viral loop, made usable end-to-end: - Propose sheet (plantare_propose_sheet.dart): from a chat with a peer (their key already in hand), pick your side, name the seed, choose what comes back (similar · non-GMO organic / work hours / other) and an optional return-by, then sign and send. Reached from the chat overflow menu; confirms "waiting for them to sign". - Plantares screen: incoming proposals show Accept & sign / Decline right on the tile; every bilateral row wears a handshake badge — awaiting signature, signed by both, or declined. Accept falls back to a gentle "offline" nudge if the proposal isn't in hand yet. - i18n: full en + es for the bilateral flow; other locales fall back to base per slang config. Wire-up only touches human copy (no jargon) and stays behind the optional PlantareService, so inventory-only builds are unaffected. Tests: propose sheet drives a real sign+send; the ledger renders the signed/awaiting badges. Fake SocialSession in your_people test gains the new transport getter. Widget tests targeted + timed. All green.
This commit is contained in:
parent
b607ddde41
commit
e78656bc07
11 changed files with 2223 additions and 1459 deletions
|
|
@ -950,6 +950,29 @@ class _Translations$plantare$es extends Translations$plantare$en {
|
|||
@override String get pickDate => 'Elegir fecha';
|
||||
@override String get clearDate => 'Quitar fecha';
|
||||
@override String get sectionTitle => 'Compromisos';
|
||||
@override String get propose => 'Proponer un Plantaré firmado';
|
||||
@override String get proposeHelp => 'Los dos guardáis la misma promesa, firmada por ambos: prueba de que esta semilla cambió de manos y se cultivará y devolverá.';
|
||||
@override String proposeTo({required Object name}) => 'Con ${name}';
|
||||
@override String get sent => 'Propuesta enviada — esperando su firma';
|
||||
@override String get seedLabel => '¿Qué semilla?';
|
||||
@override String get seedHint => 'La variedad a la que se refiere la promesa';
|
||||
@override String get returnKindLabel => '¿Qué se devuelve?';
|
||||
@override String get returnSimilar => 'Una cantidad similar de semilla';
|
||||
@override String get returnSimilarNote => 'polinización abierta · no transgénica · cultivada en ecológico';
|
||||
@override String get returnWork => 'Unas horas de trabajo';
|
||||
@override String get returnOther => 'Otra cosa';
|
||||
@override String get workHoursLabel => '¿Cuántas horas?';
|
||||
@override String get proposalsSection => 'Esperando tu respuesta';
|
||||
@override String incomingFrom({required Object name}) => '${name} te propone un Plantaré';
|
||||
@override String get accept => 'Aceptar y firmar';
|
||||
@override String get declineAction => 'Rechazar';
|
||||
@override String get declineReasonHint => 'Motivo (opcional)';
|
||||
@override String get acceptedToast => 'Firmado — ahora lo guardáis los dos';
|
||||
@override String get declinedToast => 'Rechazado';
|
||||
@override String get badgeAwaiting => 'Falta firma';
|
||||
@override String get badgeSigned => 'Firmado por ambos';
|
||||
@override String get badgeDeclined => 'Rechazado';
|
||||
@override String get offline => 'Estás sin conexión — se enviará al reconectar';
|
||||
}
|
||||
|
||||
// Path: handover
|
||||
|
|
@ -1910,6 +1933,31 @@ extension on TranslationsEs {
|
|||
'plantare.pickDate' => 'Elegir fecha',
|
||||
'plantare.clearDate' => 'Quitar fecha',
|
||||
'plantare.sectionTitle' => 'Compromisos',
|
||||
'plantare.propose' => 'Proponer un Plantaré firmado',
|
||||
'plantare.proposeHelp' => 'Los dos guardáis la misma promesa, firmada por ambos: prueba de que esta semilla cambió de manos y se cultivará y devolverá.',
|
||||
'plantare.proposeTo' => ({required Object name}) => 'Con ${name}',
|
||||
'plantare.sent' => 'Propuesta enviada — esperando su firma',
|
||||
'plantare.seedLabel' => '¿Qué semilla?',
|
||||
'plantare.seedHint' => 'La variedad a la que se refiere la promesa',
|
||||
'plantare.returnKindLabel' => '¿Qué se devuelve?',
|
||||
'plantare.returnSimilar' => 'Una cantidad similar de semilla',
|
||||
'plantare.returnSimilarNote' => 'polinización abierta · no transgénica · cultivada en ecológico',
|
||||
'plantare.returnWork' => 'Unas horas de trabajo',
|
||||
'plantare.returnOther' => 'Otra cosa',
|
||||
'plantare.workHoursLabel' => '¿Cuántas horas?',
|
||||
'plantare.proposalsSection' => 'Esperando tu respuesta',
|
||||
'plantare.incomingFrom' => ({required Object name}) => '${name} te propone un Plantaré',
|
||||
'plantare.accept' => 'Aceptar y firmar',
|
||||
'plantare.declineAction' => 'Rechazar',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'plantare.declineReasonHint' => 'Motivo (opcional)',
|
||||
'plantare.acceptedToast' => 'Firmado — ahora lo guardáis los dos',
|
||||
'plantare.declinedToast' => 'Rechazado',
|
||||
'plantare.badgeAwaiting' => 'Falta firma',
|
||||
'plantare.badgeSigned' => 'Firmado por ambos',
|
||||
'plantare.badgeDeclined' => 'Rechazado',
|
||||
'plantare.offline' => 'Estás sin conexión — se enviará al reconectar',
|
||||
'handover.title' => 'Di o recibí semillas',
|
||||
'handover.help' => 'Un regalo, un trueque o una venta: apúntalo, con promesa de devolver semilla o sin ella.',
|
||||
'handover.iGave' => 'Di semillas',
|
||||
|
|
@ -1926,8 +1974,6 @@ extension on TranslationsEs {
|
|||
'sale.add' => 'Registrar venta',
|
||||
'sale.empty' => 'Aún no hay ventas. Anota aquí lo que vendes o compras.',
|
||||
'sale.iSold' => 'Vendí',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.iBought' => 'Compré',
|
||||
'sale.direction' => '¿Vendes o compras?',
|
||||
'sale.counterparty' => '¿Con quién?',
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue