Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: #1136 - handle "action" elements in KP #2440

Merged
merged 1 commit into from
Jun 30, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import 'package:flutter/material.dart';
import 'package:openfoodfacts/model/KnowledgePanelElement.dart';
import 'package:openfoodfacts/model/Product.dart';
import 'package:smooth_app/generic_lib/smooth_html_widget.dart';
import 'package:smooth_app/pages/product/add_category_button.dart';
import 'package:smooth_app/pages/product/add_ingredients_button.dart';
import 'package:smooth_app/pages/product/add_nutrition_button.dart';
import 'package:smooth_app/services/smooth_services.dart';

/// "Contribute Actions" for the knowledge panels.
class KnowledgePanelActionCard extends StatelessWidget {
const KnowledgePanelActionCard(this.element, this.product);

final KnowledgePanelActionElement element;
final Product product;

@override
Widget build(BuildContext context) {
final List<Widget> actionWidgets = <Widget>[];
for (final String action in element.actions) {
switch (action) {
case KnowledgePanelActionElement.ACTION_ADD_CATEGORIES:
actionWidgets.add(AddCategoryButton(product));
break;
case KnowledgePanelActionElement.ACTION_ADD_INGREDIENTS_TEXT:
actionWidgets.add(AddIngredientsButton(product));
break;
case KnowledgePanelActionElement.ACTION_ADD_NUTRITION_FACTS:
actionWidgets.add(AddNutritionButton(product));
break;
default:
Logs.e('unknown knowledge panel action: $action');
}
}
return Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
SmoothHtmlWidget(element.html),
...actionWidgets,
],
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ 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/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';
Expand All @@ -11,10 +12,12 @@ class KnowledgePanelCard extends StatelessWidget {
const KnowledgePanelCard({
required this.panel,
required this.allPanels,
required this.product,
});

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

@override
Widget build(BuildContext context) {
Expand All @@ -23,6 +26,7 @@ class KnowledgePanelCard extends StatelessWidget {
return KnowledgePanelExpandedCard(
panel: panel,
allPanels: allPanels,
product: product,
);
}

Expand All @@ -42,6 +46,7 @@ class KnowledgePanelCard extends StatelessWidget {
groupElement: group,
panel: panel,
allPanels: allPanels,
product: product,
),
),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.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';
import 'package:smooth_app/helpers/launch_url_helper.dart';
import 'package:smooth_app/helpers/product_cards_helper.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_action_card.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_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_table_card.dart';
Expand All @@ -16,10 +18,12 @@ class KnowledgePanelElementCard extends StatelessWidget {
const KnowledgePanelElementCard({
required this.knowledgePanelElement,
required this.allPanels,
required this.product,
});

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

@override
Widget build(BuildContext context) {
Expand All @@ -39,11 +43,14 @@ class KnowledgePanelElementCard extends StatelessWidget {
panel: allPanels
.panelIdToPanelMap[knowledgePanelElement.panelElement!.panelId]!,
allPanels: allPanels,
product: product,
);
case KnowledgePanelElementType.PANEL_GROUP:
return KnowledgePanelGroupCard(
groupElement: knowledgePanelElement.panelGroupElement!,
allPanels: allPanels);
groupElement: knowledgePanelElement.panelGroupElement!,
allPanels: allPanels,
product: product,
);
case KnowledgePanelElementType.TABLE:
return KnowledgePanelTableCard(
tableElement: knowledgePanelElement.tableElement!,
Expand All @@ -52,6 +59,11 @@ class KnowledgePanelElementCard extends StatelessWidget {
return KnowledgePanelWorldMapCard(knowledgePanelElement.mapElement!);
case KnowledgePanelElementType.UNKNOWN:
return EMPTY_WIDGET;
case KnowledgePanelElementType.ACTION:
return KnowledgePanelActionCard(
knowledgePanelElement.actionElement!,
product,
);
default:
Logs.e('unexpected element type: ${knowledgePanelElement.elementType}');
return EMPTY_WIDGET;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ 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';
Expand All @@ -10,10 +11,12 @@ class KnowledgePanelExpandedCard extends StatelessWidget {
const KnowledgePanelExpandedCard({
required this.panel,
required this.allPanels,
required this.product,
});

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

@override
Widget build(BuildContext context) {
Expand All @@ -27,6 +30,7 @@ class KnowledgePanelExpandedCard extends StatelessWidget {
child: KnowledgePanelElementCard(
knowledgePanelElement: element,
allPanels: allPanels,
product: product,
),
),
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
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';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_card.dart';
Expand All @@ -9,10 +10,12 @@ 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
Widget build(BuildContext context) {
Expand All @@ -35,6 +38,7 @@ class KnowledgePanelGroupCard extends StatelessWidget {
KnowledgePanelCard(
panel: allPanels.panelIdToPanelMap[panelId]!,
allPanels: allPanels,
product: product,
)
],
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ 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/database/local_database.dart';
import 'package:smooth_app/generic_lib/design_constants.dart';
Expand All @@ -16,11 +17,13 @@ class KnowledgePanelPage extends StatefulWidget {
const KnowledgePanelPage({
required this.panel,
required this.allPanels,
required this.product,
this.groupElement,
});

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

@override
Expand All @@ -39,7 +42,10 @@ class _KnowledgePanelPageState extends State<KnowledgePanelPage>
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(_title),
title: Text(
_title,
maxLines: 2,
),
),
body: RefreshIndicator(
onRefresh: () => _refreshProduct(context),
Expand All @@ -52,6 +58,7 @@ class _KnowledgePanelPageState extends State<KnowledgePanelPage>
child: KnowledgePanelExpandedCard(
panel: widget.panel,
allPanels: widget.allPanels,
product: widget.product,
),
),
),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,29 @@
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/openfoodfacts.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/helpers/product_cards_helper.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_element_card.dart';
import 'package:smooth_app/pages/preferences/user_preferences_dev_mode.dart';
import 'package:smooth_app/pages/product/edit_ingredients_page.dart';
import 'package:smooth_app/pages/product/nutrition_page_loaded.dart';
import 'package:smooth_app/pages/product/ocr_ingredients_helper.dart';
import 'package:smooth_app/pages/product/ordered_nutrients_cache.dart';
import 'package:smooth_app/pages/product/add_ingredients_button.dart';
import 'package:smooth_app/pages/product/add_nutrition_button.dart';

/// "Knowledge Panel" widget.
class KnowledgePanelWidget extends StatelessWidget {
const KnowledgePanelWidget({
required this.panelElement,
required this.knowledgePanels,
this.product,
required this.product,
required this.onboardingMode,
});

final KnowledgePanelElement panelElement;
final KnowledgePanels knowledgePanels;
final Product? product;
final Product product;
final bool onboardingMode;

@override
Widget build(BuildContext context) {
Expand All @@ -49,67 +47,30 @@ class KnowledgePanelWidget extends StatelessWidget {
KnowledgePanelElementCard(
knowledgePanelElement: knowledgePanelElement,
allPanels: knowledgePanels,
product: product,
),
);
}
if (product != null) {
if (!onboardingMode) {
if (panelId == 'health_card') {
final bool nutritionAddOrUpdate = product!.statesTags
final bool nutritionAddOrUpdate = product.statesTags
?.contains('en:nutrition-facts-to-be-completed') ??
false;
final AppLocalizations appLocalizations = AppLocalizations.of(context);
if (nutritionAddOrUpdate) {
children.add(
addPanelButton(
nutritionAddOrUpdate
? appLocalizations.score_add_missing_nutrition_facts
: appLocalizations.score_update_nutrition_facts,
iconData: nutritionAddOrUpdate ? Icons.add : Icons.edit,
onPressed: () async {
final OrderedNutrientsCache? cache =
await OrderedNutrientsCache.getCache(context);
if (cache == null) {
return;
}
//ignore: use_build_context_synchronously
await Navigator.push<Product>(
context,
MaterialPageRoute<Product>(
builder: (BuildContext context) => NutritionPageLoaded(
product!,
cache.orderedNutrients,
),
),
);
},
),
);
children.add(AddNutritionButton(product));
}

final bool needEditIngredients = context
.read<UserPreferences>()
.getFlag(UserPreferencesDevMode
.userPreferencesFlagEditIngredients) ??
false;
if ((product!.ingredientsText == null ||
product!.ingredientsText!.isEmpty) &&
if ((product.ingredientsText == null ||
product.ingredientsText!.isEmpty) &&
needEditIngredients) {
// When the flag is removed, this should be the following:
// if (product.statesTags?.contains('en:ingredients-to-be-completed') ?? false) {
children.add(
addPanelButton(
appLocalizations.score_add_missing_ingredients,
onPressed: () async => Navigator.push<bool>(
context,
MaterialPageRoute<bool>(
builder: (BuildContext context) => EditOcrPage(
product: product!,
helper: OcrIngredientsHelper(),
),
),
),
),
);
children.add(AddIngredientsButton(product));
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class _KnowledgePanelPageTemplateState
late KnowledgePanels _knowledgePanels;
bool _isHintDismissed = false;
late final AppLocalizations appLocalizations = AppLocalizations.of(context);
late final Product _product;

@override
void initState() {
Expand All @@ -52,10 +53,9 @@ class _KnowledgePanelPageTemplateState
}

Future<void> _init() async {
final Product product =
await OnboardingDataProduct.forProduct(widget.localDatabase)
.getData(rootBundle);
_knowledgePanels = product.knowledgePanels!;
_product = await OnboardingDataProduct.forProduct(widget.localDatabase)
.getData(rootBundle);
_knowledgePanels = _product.knowledgePanels!;
}

@override
Expand All @@ -79,6 +79,8 @@ class _KnowledgePanelPageTemplateState
widget.panelId,
)!,
knowledgePanels: _knowledgePanels,
product: _product,
onboardingMode: true,
);
return Container(
color: widget.backgroundColor,
Expand Down
Loading