import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../data/variety_repository.dart'; import '../db/database.dart'; import '../db/enums.dart'; import '../i18n/strings.g.dart'; import 'plantare_sheet.dart'; import 'theme.dart'; /// The Plantares screen — your reproduction commitments (data-model §2.7). /// Lists what's open (still to grow out & return) and what's done, and lets you /// add or settle one. Local-first; reads the encrypted inventory DB. class PlantaresScreen extends StatelessWidget { const PlantaresScreen({super.key}); @override Widget build(BuildContext context) { final t = context.t; final repo = context.read(); return Scaffold( appBar: AppBar(title: Text(t.plantare.title)), floatingActionButton: FloatingActionButton.extended( key: const Key('plantares.add'), onPressed: () => showPlantareSheet(context, repository: repo), icon: const Icon(Icons.add), label: Text(t.plantare.add), ), body: StreamBuilder>( stream: repo.watchPlantares(), builder: (context, snapshot) { final all = snapshot.data; if (all == null) { return const Center(child: CircularProgressIndicator()); } if (all.isEmpty) { return Center( child: Padding( padding: const EdgeInsets.all(32), child: Text( t.plantare.empty, textAlign: TextAlign.center, style: const TextStyle(color: seedMuted, fontSize: 15), ), ), ); } final open = all.where((p) => p.status == PlantareStatus.open); final settled = all.where((p) => p.status != PlantareStatus.open); return ListView( padding: const EdgeInsets.only(bottom: 88), children: [ if (open.isNotEmpty) _SectionHeader(t.plantare.openSection), for (final p in open) _PlantareTile(p, repo), if (settled.isNotEmpty) _SectionHeader(t.plantare.settledSection), for (final p in settled) _PlantareTile(p, repo), ], ); }, ), ); } } class _SectionHeader extends StatelessWidget { const _SectionHeader(this.label); final String label; @override Widget build(BuildContext context) => Padding( padding: const EdgeInsets.fromLTRB(16, 16, 16, 4), child: Text( label.toUpperCase(), style: const TextStyle( color: seedMuted, fontSize: 12, fontWeight: FontWeight.w600, letterSpacing: 0.5, ), ), ); } /// One commitment row. An open one shows a big "mark returned"; a settled one /// reads muted. The overflow menu carries the rest (let go / reopen / remove). class _PlantareTile extends StatelessWidget { const _PlantareTile(this.p, this.repo); final Plantare p; final VarietyRepository repo; @override Widget build(BuildContext context) { final t = context.t; final done = p.status != PlantareStatus.open; final iReturn = p.direction == PlantareDirection.iReturn; final title = (p.owedDescription?.trim().isNotEmpty ?? false) ? p.owedDescription!.trim() : (iReturn ? t.plantare.iReturn : t.plantare.owedToMe); final subtitleParts = [ iReturn ? t.plantare.iReturn : t.plantare.owedToMe, if (p.counterparty?.trim().isNotEmpty ?? false) p.counterparty!.trim(), if (done) p.status == PlantareStatus.returned ? t.plantare.statusReturned : t.plantare.statusForgiven, ]; return ListTile( leading: Icon( iReturn ? Icons.volunteer_activism_outlined : Icons.eco_outlined, color: done ? seedMuted : seedGreen, ), title: Text( title, style: TextStyle( decoration: done ? TextDecoration.lineThrough : null, color: done ? seedMuted : seedOnSurface, ), ), subtitle: Text(subtitleParts.join(' · '), maxLines: 2, overflow: TextOverflow.ellipsis), trailing: Row( mainAxisSize: MainAxisSize.min, children: [ if (!done) IconButton( key: Key('plantare.return.${p.id}'), icon: const Icon(Icons.check_circle_outline), tooltip: t.plantare.markReturned, color: seedGreen, onPressed: () => repo.setPlantareStatus(p.id, PlantareStatus.returned), ), PopupMenuButton( key: Key('plantare.menu.${p.id}'), onSelected: (v) async { switch (v) { case 'forgiven': await repo.setPlantareStatus(p.id, PlantareStatus.forgiven); case 'reopen': await repo.setPlantareStatus(p.id, PlantareStatus.open); case 'delete': await repo.deletePlantare(p.id); } }, itemBuilder: (context) => [ if (!done) PopupMenuItem( value: 'forgiven', child: Text(t.plantare.markForgiven)), if (done) PopupMenuItem( value: 'reopen', child: Text(t.plantare.reopen)), PopupMenuItem(value: 'delete', child: Text(t.plantare.delete)), ], ), ], ), ); } }