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

fix: #2833 - KP page refreshed by product (refactoring was needed) #2861

Merged
merged 3 commits into from
Sep 7, 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
@@ -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