Skip to content

Commit

Permalink
fix: #2833 - KP page refreshed by product (refactoring was needed) (#…
Browse files Browse the repository at this point in the history
…2861)

Impacted files:
* `knowledge_panel_card.dart`: refactored the call to  `KnowledgePanelPage`
* `knowledge_panel_element_card.dart`: refactored the calls to `KnowledgePanelCard` and `KnowledgePanelGroupCard`
* `knowledge_panel_expanded_card.dart`: refactored the call to `KnowledgePanelElementCard`
* `knowledge_panel_group_card.dart`: refactored the call to `KnowledgePanelCard`
* `knowledge_panel_page.dart`: refactored the call to `KnowledgePanelExpandedCard`; we use a `Consumer` in order to refresh when the product is refreshed
* `knowledge_panel_page_template.dart`; refactored the call to `KnowledgePanelWidget`
* `knowledge_panels_builder.dart`: refactored the call to `KnowledgePanelElementCard`
* `new_product_page.dart`: refactored the call to `KnowledgePanelWidget`
* `simple_input_page.dart`: unrelated "vertical axis" for verbose buttons
* `summary_card.dart`: refactored the call to `KnowledgePanelPage`
  • Loading branch information
monsieurtanuki committed Sep 7, 2022
1 parent 535cddc commit e57cc0f
Show file tree
Hide file tree
Showing 10 changed files with 120 additions and 115 deletions.
Original file line number Diff line number Diff line change
@@ -1,26 +1,22 @@
import 'package:flutter/material.dart';
import 'package:openfoodfacts/model/KnowledgePanel.dart';
import 'package:openfoodfacts/model/KnowledgePanelElement.dart';
import 'package:openfoodfacts/model/KnowledgePanels.dart';
import 'package:openfoodfacts/model/Product.dart';
import 'package:provider/provider.dart';
import 'package:smooth_app/data_models/user_preferences.dart';
import 'package:smooth_app/generic_lib/design_constants.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_expanded_card.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_group_card.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_page.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_summary_card.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels_builder.dart';
import 'package:smooth_app/widgets/smooth_scaffold.dart';

class KnowledgePanelCard extends StatelessWidget {
const KnowledgePanelCard({
required this.panel,
required this.allPanels,
required this.panelId,
required this.product,
});

final KnowledgePanel panel;
final KnowledgePanels allPanels;
final String panelId;
final Product product;

static const String PANEL_NUTRITION_TABLE_ID = 'nutrition_facts_table';
Expand All @@ -32,19 +28,20 @@ class KnowledgePanelCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final UserPreferences userPreferences = context.watch<UserPreferences>();
if (_isExpandedByUser(panel, allPanels, userPreferences) ||
final KnowledgePanel? panel =
KnowledgePanelWidget.getKnowledgePanel(product, panelId);
if (panel == null) {
return EMPTY_WIDGET;
}
if (_isExpandedByUser(panel, userPreferences) ||
(panel.expanded ?? false)) {
return KnowledgePanelExpandedCard(
panel: panel,
allPanels: allPanels,
panelId: panelId,
product: product,
isInitiallyExpanded: false,
);
}

final KnowledgePanelPanelGroupElement? group =
KnowledgePanelGroupCard.groupElementOf(context);

return Padding(
padding: const EdgeInsets.symmetric(vertical: SMALL_SPACE),
child: InkWell(
Expand All @@ -64,9 +61,7 @@ class KnowledgePanelCard extends StatelessWidget {
builder: (BuildContext context) => SmoothBrightnessOverride(
brightness: brightness,
child: KnowledgePanelPage(
groupElement: group,
panel: panel,
allPanels: allPanels,
panelId: panelId,
product: product,
),
),
Expand All @@ -79,7 +74,6 @@ class KnowledgePanelCard extends StatelessWidget {

bool _isExpandedByUser(
final KnowledgePanel panel,
final KnowledgePanels allPanels,
final UserPreferences userPreferences,
) {
final List<String> expandedPanelIds = <String>[
Expand All @@ -89,7 +83,9 @@ class KnowledgePanelCard extends StatelessWidget {
for (final String panelId in expandedPanelIds) {
if (panel.titleElement != null &&
panel.titleElement!.title ==
allPanels.panelIdToPanelMap[panelId]?.titleElement?.title) {
KnowledgePanelWidget.getKnowledgePanel(product, panelId)
?.titleElement
?.title) {
if (userPreferences.getFlag(getExpandFlagTag(panelId)) ?? false) {
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:openfoodfacts/model/KnowledgePanel.dart';
import 'package:openfoodfacts/model/KnowledgePanelElement.dart';
import 'package:openfoodfacts/model/KnowledgePanels.dart';
import 'package:openfoodfacts/model/Product.dart';
import 'package:smooth_app/generic_lib/design_constants.dart';
import 'package:smooth_app/generic_lib/smooth_html_widget.dart';
Expand All @@ -13,18 +12,17 @@ import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_card
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_group_card.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_table_card.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_world_map_card.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels_builder.dart';
import 'package:smooth_app/services/smooth_services.dart';

class KnowledgePanelElementCard extends StatelessWidget {
const KnowledgePanelElementCard({
required this.knowledgePanelElement,
required this.allPanels,
required this.product,
required this.isInitiallyExpanded,
});

final KnowledgePanelElement knowledgePanelElement;
final KnowledgePanels allPanels;
final Product product;
final bool isInitiallyExpanded;

Expand All @@ -43,7 +41,8 @@ class KnowledgePanelElementCard extends StatelessWidget {
);
case KnowledgePanelElementType.PANEL:
final String panelId = knowledgePanelElement.panelElement!.panelId;
final KnowledgePanel? panel = allPanels.panelIdToPanelMap[panelId];
final KnowledgePanel? panel =
KnowledgePanelWidget.getKnowledgePanel(product, panelId);
if (panel == null) {
// happened in https://github.com/openfoodfacts/smooth-app/issues/2682
// due to some inconsistencies in the data sent by the server
Expand All @@ -53,14 +52,12 @@ class KnowledgePanelElementCard extends StatelessWidget {
return EMPTY_WIDGET;
}
return KnowledgePanelCard(
panel: panel,
allPanels: allPanels,
panelId: panelId,
product: product,
);
case KnowledgePanelElementType.PANEL_GROUP:
return KnowledgePanelGroupCard(
groupElement: knowledgePanelElement.panelGroupElement!,
allPanels: allPanels,
product: product,
);
case KnowledgePanelElementType.TABLE:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
import 'package:flutter/material.dart';
import 'package:openfoodfacts/model/KnowledgePanel.dart';
import 'package:openfoodfacts/model/KnowledgePanelElement.dart';
import 'package:openfoodfacts/model/KnowledgePanels.dart';
import 'package:openfoodfacts/model/Product.dart';
import 'package:smooth_app/generic_lib/design_constants.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_element_card.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_summary_card.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels_builder.dart';

class KnowledgePanelExpandedCard extends StatelessWidget {
const KnowledgePanelExpandedCard({
required this.panel,
required this.allPanels,
required this.panelId,
required this.product,
required this.isInitiallyExpanded,
});

final KnowledgePanel panel;
final KnowledgePanels allPanels;
final Product product;
final String panelId;
final bool isInitiallyExpanded;

@override
Widget build(BuildContext context) {
final KnowledgePanel panel =
KnowledgePanelWidget.getKnowledgePanel(product, panelId)!;
final List<Widget> elementWidgets = <Widget>[];
elementWidgets.add(KnowledgePanelSummaryCard(panel, isClickable: false));
for (final KnowledgePanelElement element
Expand All @@ -31,7 +31,6 @@ class KnowledgePanelExpandedCard extends StatelessWidget {
padding: const EdgeInsetsDirectional.only(top: VERY_SMALL_SPACE),
child: KnowledgePanelElementCard(
knowledgePanelElement: element,
allPanels: allPanels,
product: product,
isInitiallyExpanded: isInitiallyExpanded,
),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'package:openfoodfacts/model/KnowledgePanelElement.dart';
import 'package:openfoodfacts/model/KnowledgePanels.dart';
import 'package:openfoodfacts/model/Product.dart';
import 'package:provider/provider.dart';
import 'package:smooth_app/generic_lib/design_constants.dart';
Expand All @@ -9,12 +8,10 @@ import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_card
class KnowledgePanelGroupCard extends StatelessWidget {
const KnowledgePanelGroupCard({
required this.groupElement,
required this.allPanels,
required this.product,
});

final KnowledgePanelPanelGroupElement groupElement;
final KnowledgePanels allPanels;
final Product product;

@override
Expand All @@ -36,20 +33,11 @@ class KnowledgePanelGroupCard extends StatelessWidget {
),
for (String panelId in groupElement.panelIds)
KnowledgePanelCard(
panel: allPanels.panelIdToPanelMap[panelId]!,
allPanels: allPanels,
panelId: panelId,
product: product,
)
],
),
);
}

static KnowledgePanelPanelGroupElement? groupElementOf(BuildContext context) {
try {
return Provider.of<KnowledgePanelPanelGroupElement>(context);
} catch (_) {
return null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,27 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:matomo_tracker/matomo_tracker.dart';
import 'package:openfoodfacts/model/KnowledgePanel.dart';
import 'package:openfoodfacts/model/KnowledgePanelElement.dart';
import 'package:openfoodfacts/model/KnowledgePanels.dart';
import 'package:openfoodfacts/model/Product.dart';
import 'package:provider/provider.dart';
import 'package:smooth_app/data_models/up_to_date_product_provider.dart';
import 'package:smooth_app/database/local_database.dart';
import 'package:smooth_app/generic_lib/design_constants.dart';
import 'package:smooth_app/generic_lib/duration_constants.dart';
import 'package:smooth_app/generic_lib/widgets/smooth_card.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_expanded_card.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels_builder.dart';
import 'package:smooth_app/pages/inherited_data_manager.dart';
import 'package:smooth_app/pages/product/common/product_refresher.dart';
import 'package:smooth_app/widgets/smooth_scaffold.dart';

class KnowledgePanelPage extends StatefulWidget {
const KnowledgePanelPage({
required this.panel,
required this.allPanels,
required this.panelId,
required this.product,
this.groupElement,
});

final KnowledgePanel panel;
final KnowledgePanels allPanels;
final String panelId;
final Product product;
final KnowledgePanelPanelGroupElement? groupElement;

@override
State<KnowledgePanelPage> createState() => _KnowledgePanelPageState();
Expand All @@ -38,47 +35,63 @@ class _KnowledgePanelPageState extends State<KnowledgePanelPage>
String get traceTitle => 'knowledge_panel_page';

@override
String get traceName => 'Opened full knowledge panel page $_title';
String get traceName => 'Opened full knowledge panel page ${_getTitle()}';

late Product _product;

@override
Widget build(BuildContext context) {
return SmoothScaffold(
appBar: AppBar(
title: Text(
_title,
maxLines: 2,
),
),
body: RefreshIndicator(
onRefresh: () => _refreshProduct(context),
child: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
child: SmoothCard(
padding: const EdgeInsets.all(
SMALL_SPACE,
),
child: KnowledgePanelExpandedCard(
panel: widget.panel,
allPanels: widget.allPanels,
product: widget.product,
isInitiallyExpanded: true,
),
),
),
),
);
void initState() {
_product = widget.product;
super.initState();
}

String get _title {
if (widget.groupElement?.title.isNotEmpty == true) {
return widget.groupElement!.title;
} else if (widget.panel.titleElement?.title.isNotEmpty == true) {
return widget.panel.titleElement!.title;
} else {
return '';
static KnowledgePanelPanelGroupElement? _groupElementOf(
BuildContext context) {
try {
return Provider.of<KnowledgePanelPanelGroupElement>(context);
} catch (_) {
return null;
}
}

@override
Widget build(BuildContext context) => Consumer<UpToDateProductProvider>(
builder: (
final BuildContext context,
final UpToDateProductProvider provider,
final Widget? child,
) {
final Product? refreshedProduct = provider.get(_product);
if (refreshedProduct != null) {
_product = refreshedProduct;
}
return SmoothScaffold(
appBar: AppBar(
title: Text(
_getTitle(),
maxLines: 2,
),
),
body: RefreshIndicator(
onRefresh: () => _refreshProduct(context),
child: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
child: SmoothCard(
padding: const EdgeInsets.all(
SMALL_SPACE,
),
child: KnowledgePanelExpandedCard(
panelId: widget.panelId,
product: _product,
isInitiallyExpanded: true,
),
),
),
),
);
},
);

Future<bool> _refreshProduct(BuildContext context) async {
try {
if (InheritedDataManager.of(context).currentBarcode.isNotEmpty) {
Expand Down Expand Up @@ -107,4 +120,18 @@ class _KnowledgePanelPageState extends State<KnowledgePanelPage>
return false;
}
}

String _getTitle() {
final KnowledgePanelPanelGroupElement? groupElement =
_groupElementOf(context);
if (groupElement?.title.isNotEmpty == true) {
return groupElement!.title;
}
final KnowledgePanel? panel =
KnowledgePanelWidget.getKnowledgePanel(_product, widget.panelId);
if (panel?.titleElement?.title.isNotEmpty == true) {
return (panel?.titleElement?.title)!;
}
return '';
}
}
Loading

0 comments on commit e57cc0f

Please sign in to comment.