import 'package:cdb_ui/api.dart' as API; import 'package:cdb_ui/pages/expandable_list.dart'; import 'package:cdb_ui/pages/flow/active_flow_page.dart'; import 'package:cdb_ui/pages/flow/flow_info_page.dart'; import 'package:cdb_ui/pages/supply.dart'; import 'package:flutter/material.dart'; class FlowsPage extends StatefulWidget { const FlowsPage({super.key}); @override State createState() => _FlowsPageState(); } class _FlowsPageState extends State { int tabSelection = 0; Map? flowInfos; @override void initState() { super.initState(); flowInfos = API.API().getFlows(); } Widget flowTile(BuildContext context, API.FlowInfo x) { return ListTile( title: Text(x.name), onTap: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) => FlowInfoPage(x), )); }, ); } Widget listFlowInfoByActive( BuildContext context, Map infos) { return FutureBuilder(future: () async { var included = []; for (var key in infos.keys) { var active = await API.API().getActiveFlowsOf(key); if (active.isNotEmpty) { included.add(infos[key]); } } return included; }(), builder: (context, snapshot) { if (!snapshot.hasData) { return const CircularProgressIndicator(); } var included = snapshot.data!; return ListView( children: included.map((x) => flowTile(context, x)).toList()); }); } Widget listAllFlowInfos( BuildContext context, Map infos) { return ListView( children: infos.values.map((x) { return flowTile(context, x); }).toList()); } Widget listFlowInfoByProduced( BuildContext context, Map infos) { Map> producedMapping = {}; for (var f in infos.values) { for (var produces in f.produces ?? []) { var item = API.itemVariant(produces).$1; producedMapping.putIfAbsent(item, () { return []; }); producedMapping[item]!.add(f); } } List items = []; for (var key in producedMapping.keys) { var flows = Column( children: producedMapping[key]!.map((x) { return flowTile(context, x); }).toList()); items.add(ExpandableListItem( body: flows, header: Text(API.API().getItem(key).name))); } return ExpandableList(items); } Widget listFlowInfoByDependant( BuildContext context, Map infos) { Map> dependsMapping = {}; for (var f in infos.values) { for (var produces in f.depends) { var item = API.itemVariant(produces).$1; // todo : add only if item is in inventory dependsMapping.putIfAbsent(item, () { return []; }); dependsMapping[item]!.add(f); } } List items = []; for (var key in dependsMapping.keys) { var flows = Column( children: dependsMapping[key]!.map((x) { return flowTile(context, x); }).toList()); items.add(ExpandableListItem( body: flows, header: Text(API.API().getItem(key).name))); } return ExpandableList(items); } @override Widget build(BuildContext context) { if (flowInfos == null) { return const CircularProgressIndicator(); } return DefaultTabController( length: 4, child: Scaffold( appBar: AppBar( title: const Text("Flows"), bottom: TabBar( tabs: const [ Tab(text: "All"), Tab(text: "Produces"), Tab(text: "Depends"), Tab(text: "Active") ], onTap: (value) { setState(() { tabSelection = value; }); }, )), body: switch (tabSelection) { 0 => listAllFlowInfos(context, flowInfos!), 1 => listFlowInfoByProduced(context, flowInfos!), 2 => listFlowInfoByDependant(context, flowInfos!), 3 => listFlowInfoByActive(context, flowInfos!), _ => const Text("..."), }, floatingActionButton: FloatingActionButton( onPressed: () async { // scan flow code var code = await scanQRCode(context, title: "Scan Flow Code"); API.API().getFlow(code!).then((flow) { var info = API.API().getFlowInfo(flow.kind); Navigator.of(context).push(MaterialPageRoute( builder: (context) { return ActiveFlowPage(flow, info); }, )); }); }, child: const Icon(Icons.qr_code), ), )); } }