Skip to content

Commit

Permalink
chore: Track edit events (#3755)
Browse files Browse the repository at this point in the history
* track edit events

* flutter format

* fixed the logic for most edit events

* dart formatting

* typo fixes

* fix the bugs and simple input page

* Update packages/smooth_app/lib/helpers/analytics_helper.dart

Co-authored-by: Pierre Slamich <pierre.slamich@gmail.com>

* Update packages/smooth_app/lib/pages/product/edit_product_page.dart

* Update packages/smooth_app/lib/pages/product/new_product_page.dart

* remove the webview ^

* Update presubmit.yml

---------

Co-authored-by: Pierre Slamich <pierre.slamich@gmail.com>
Co-authored-by: monsieurtanuki <fabrice_fontaine@hotmail.com>
  • Loading branch information
3 people committed Mar 16, 2023
1 parent 31df491 commit cd04400
Show file tree
Hide file tree
Showing 16 changed files with 203 additions and 33 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/presubmit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
channel: stable
cache: true
flutter-version: '3.0.5'
cache-key: revert-3.0.5
cache-key: revert-3.0.5-debug

- run: flutter --version

Expand Down
41 changes: 39 additions & 2 deletions packages/smooth_app/lib/helpers/analytics_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ enum AnalyticsCategory {
userManagement(tag: 'user management'),
scanning(tag: 'scanning'),
share(tag: 'share'),
list(tag: 'list'),
couldNotFindProduct(tag: 'could not find product');
couldNotFindProduct(tag: 'could not find product'),
productEdit(tag: 'product edit'),
list(tag: 'list');

const AnalyticsCategory({required this.tag});
final String tag;
Expand All @@ -34,6 +35,11 @@ enum AnalyticsEvent {
tag: 'could not find product',
category: AnalyticsCategory.couldNotFindProduct,
),
openProductEditPage(
tag: 'opened product edit page',
category: AnalyticsCategory.productEdit,
),

shareList(tag: 'shared a list', category: AnalyticsCategory.list),
openListWeb(tag: 'open a list in wbe', category: AnalyticsCategory.list);

Expand All @@ -42,6 +48,27 @@ enum AnalyticsEvent {
final AnalyticsCategory category;
}

enum AnalyticsEditEvents {
basicDetials(name: 'BasicDetails'),
photos(name: 'Photos'),
powerEditScreen(name: 'Power Edit Screen'),
ingredients_and_Origins(name: 'Ingredient And Origins'),
categories(name: 'Categories'),
nutrition_Facts(name: 'Nutrition Facts'),
labelsAndCertifications(name: 'Labels And Certifications'),
packagingComponents(name: 'Packaging Components'),
recyclingInstructionsPhotos(name: 'Recycling Instructions Photos'),
stores(name: 'Stores'),
origins(name: 'Origins'),
traceabilityCodes(name: 'Traceability Codes'),
country(name: 'Country'),
otherDetails(name: 'Other Details');

const AnalyticsEditEvents({required this.name});

final String name;
}

/// Helper for logging usage of core features and exceptions
/// Logging:
/// - Errors and Problems (sentry)
Expand Down Expand Up @@ -130,6 +157,16 @@ class AnalyticsHelper {
eventValue: eventValue ?? _formatBarcode(barcode),
);

static void trackProductEdit(
AnalyticsEditEvents editEventName, String barcode,
[bool saved = false]) =>
MatomoTracker.instance.trackEvent(
eventName: saved ? '${editEventName.name}-saved' : editEventName.name,
eventCategory: AnalyticsCategory.productEdit.tag,
action: editEventName.name,
eventValue: _formatBarcode(barcode),
);

static void trackSearch({
required String search,
String? searchCategory,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:smooth_app/cards/product_cards/product_image_carousel.dart';
import 'package:smooth_app/generic_lib/design_constants.dart';
import 'package:smooth_app/generic_lib/dialogs/smooth_alert_dialog.dart';
import 'package:smooth_app/generic_lib/widgets/smooth_text_form_field.dart';
import 'package:smooth_app/helpers/analytics_helper.dart';
import 'package:smooth_app/helpers/product_cards_helper.dart';
import 'package:smooth_app/widgets/smooth_app_bar.dart';
import 'package:smooth_app/widgets/smooth_scaffold.dart';
Expand Down Expand Up @@ -151,6 +152,11 @@ class _AddBasicDetailsPageState extends State<AddBasicDetailsPage> {
if (!_formKey.currentState!.validate()) {
return;
}
AnalyticsHelper.trackProductEdit(
AnalyticsEditEvents.basicDetials,
_product.barcode!,
true,
);
await BackgroundTaskDetails.addTask(
_getMinimalistProduct(),
widget: this,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:smooth_app/background/background_task_details.dart';
import 'package:smooth_app/generic_lib/design_constants.dart';
import 'package:smooth_app/generic_lib/dialogs/smooth_alert_dialog.dart';
import 'package:smooth_app/generic_lib/widgets/smooth_text_form_field.dart';
import 'package:smooth_app/helpers/analytics_helper.dart';
import 'package:smooth_app/widgets/smooth_app_bar.dart';
import 'package:smooth_app/widgets/smooth_scaffold.dart';

Expand Down Expand Up @@ -97,6 +98,11 @@ class _AddOtherDetailsPageState extends State<AddOtherDetailsPage> {
if (!_formKey.currentState!.validate()) {
return;
}
AnalyticsHelper.trackProductEdit(
AnalyticsEditEvents.otherDetails,
widget.product.barcode!,
true,
);
await BackgroundTaskDetails.addTask(
_getMinimalistProduct(),
widget: this,
Expand Down
20 changes: 14 additions & 6 deletions packages/smooth_app/lib/pages/product/edit_ingredients_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'package:smooth_app/database/local_database.dart';
import 'package:smooth_app/database/transient_file.dart';
import 'package:smooth_app/generic_lib/design_constants.dart';
import 'package:smooth_app/generic_lib/loading_dialog.dart';
import 'package:smooth_app/helpers/analytics_helper.dart';
import 'package:smooth_app/helpers/product_cards_helper.dart';
import 'package:smooth_app/pages/image_crop_page.dart';
import 'package:smooth_app/pages/product/ocr_helper.dart';
Expand Down Expand Up @@ -98,12 +99,19 @@ class _EditOcrPageState extends State<EditOcrPage> {
Future<void> _updateText(
final String text,
final ImageField imageField,
) async =>
BackgroundTaskDetails.addTask(
_helper.getMinimalistProduct(Product(barcode: _product.barcode), text),
widget: this,
stamp: _helper.getStamp(),
);
) async {
AnalyticsHelper.trackProductEdit(
_helper.getEditEventAnalyticsTag(),
_product.barcode!,
true,
);
await BackgroundTaskDetails.addTask(
_helper.getMinimalistProduct(Product(barcode: _product.barcode), text),
widget: this,
stamp: _helper.getStamp(),
);
return;
}

@override
Widget build(BuildContext context) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:smooth_app/database/local_database.dart';
import 'package:smooth_app/generic_lib/design_constants.dart';
import 'package:smooth_app/generic_lib/dialogs/smooth_alert_dialog.dart';
import 'package:smooth_app/generic_lib/widgets/smooth_card.dart';
import 'package:smooth_app/helpers/analytics_helper.dart';
import 'package:smooth_app/helpers/product_cards_helper.dart';
import 'package:smooth_app/pages/image_crop_page.dart';
import 'package:smooth_app/pages/product/edit_new_packagings_component.dart';
Expand Down Expand Up @@ -292,6 +293,12 @@ class _EditNewPackagingsState extends State<EditNewPackagings> {
}
}

AnalyticsHelper.trackProductEdit(
AnalyticsEditEvents.packagingComponents,
changedProduct.barcode!,
true,
);

await BackgroundTaskDetails.addTask(
changedProduct,
widget: this,
Expand Down
54 changes: 42 additions & 12 deletions packages/smooth_app/lib/pages/product/edit_product_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import 'package:smooth_app/database/local_database.dart';
import 'package:smooth_app/generic_lib/design_constants.dart';
import 'package:smooth_app/generic_lib/widgets/smooth_back_button.dart';
import 'package:smooth_app/generic_lib/widgets/smooth_list_tile_card.dart';
import 'package:smooth_app/helpers/analytics_helper.dart';
import 'package:smooth_app/helpers/app_helper.dart';
import 'package:smooth_app/helpers/product_cards_helper.dart';
import 'package:smooth_app/pages/product/add_basic_details_page.dart';
Expand Down Expand Up @@ -131,6 +132,10 @@ class _EditProductPageState extends State<EditProductPage> {
if (!await ProductRefresher().checkIfLoggedIn(context)) {
return;
}

AnalyticsHelper.trackProductEdit(
AnalyticsEditEvents.basicDetials, _barcode);

await Navigator.push<void>(
context,
MaterialPageRoute<void>(
Expand All @@ -146,6 +151,9 @@ class _EditProductPageState extends State<EditProductPage> {
subtitle:
appLocalizations.edit_product_form_item_photos_subtitle,
onTap: () async {
AnalyticsHelper.trackProductEdit(
AnalyticsEditEvents.photos, _barcode);

await Navigator.push<void>(
context,
MaterialPageRoute<void>(
Expand Down Expand Up @@ -176,6 +184,9 @@ class _EditProductPageState extends State<EditProductPage> {
if (!await ProductRefresher().checkIfLoggedIn(context)) {
return;
}
AnalyticsHelper.trackProductEdit(
AnalyticsEditEvents.ingredients_and_Origins, _barcode);

await Navigator.push<void>(
context,
MaterialPageRoute<void>(
Expand All @@ -190,18 +201,21 @@ class _EditProductPageState extends State<EditProductPage> {
),
_getSimpleListTileItem(SimpleInputPageCategoryHelper()),
_ListTitleItem(
leading:
const _SvgIcon('assets/cacheTintable/scale-balance.svg'),
title: appLocalizations
.edit_product_form_item_nutrition_facts_title,
subtitle: appLocalizations
.edit_product_form_item_nutrition_facts_subtitle,
onTap: () async => NutritionPageLoaded.showNutritionPage(
product: _product,
isLoggedInMandatory: true,
widget: this,
),
),
leading:
const _SvgIcon('assets/cacheTintable/scale-balance.svg'),
title: appLocalizations
.edit_product_form_item_nutrition_facts_title,
subtitle: appLocalizations
.edit_product_form_item_nutrition_facts_subtitle,
onTap: () async {
AnalyticsHelper.trackProductEdit(
AnalyticsEditEvents.nutrition_Facts, _barcode);
await NutritionPageLoaded.showNutritionPage(
product: _product,
isLoggedInMandatory: true,
widget: this,
);
}),
_getSimpleListTileItem(SimpleInputPageLabelHelper()),
_ListTitleItem(
leading: const _SvgIcon('assets/cacheTintable/packaging.svg'),
Expand All @@ -210,6 +224,9 @@ class _EditProductPageState extends State<EditProductPage> {
if (!await ProductRefresher().checkIfLoggedIn(context)) {
return;
}
AnalyticsHelper.trackProductEdit(
AnalyticsEditEvents.packagingComponents, _barcode);

await Navigator.push<void>(
context,
MaterialPageRoute<void>(
Expand All @@ -228,6 +245,11 @@ class _EditProductPageState extends State<EditProductPage> {
if (!await ProductRefresher().checkIfLoggedIn(context)) {
return;
}
AnalyticsHelper.trackProductEdit(
AnalyticsEditEvents.recyclingInstructionsPhotos,
_barcode,
);

await Navigator.push<void>(
context,
MaterialPageRoute<void>(
Expand All @@ -253,6 +275,8 @@ class _EditProductPageState extends State<EditProductPage> {
if (!await ProductRefresher().checkIfLoggedIn(context)) {
return;
}
AnalyticsHelper.trackProductEdit(
AnalyticsEditEvents.otherDetails, _barcode);
await Navigator.push<void>(
context,
MaterialPageRoute<void>(
Expand Down Expand Up @@ -280,6 +304,10 @@ class _EditProductPageState extends State<EditProductPage> {
if (!await ProductRefresher().checkIfLoggedIn(context)) {
return;
}
AnalyticsHelper.trackProductEdit(
helper.getAnalyticsEditEvent(),
_barcode,
);
await Navigator.push<void>(
context,
MaterialPageRoute<void>(
Expand Down Expand Up @@ -309,6 +337,8 @@ class _EditProductPageState extends State<EditProductPage> {
if (!await ProductRefresher().checkIfLoggedIn(context)) {
return;
}
AnalyticsHelper.trackProductEdit(
AnalyticsEditEvents.powerEditScreen, _barcode);
await Navigator.push<void>(
context,
MaterialPageRoute<void>(
Expand Down
19 changes: 13 additions & 6 deletions packages/smooth_app/lib/pages/product/new_product_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -315,12 +315,19 @@ class _ProductPageState extends State<ProductPage> with TraceableClientMixin {
_buildActionBarItem(
Icons.edit,
appLocalizations.edit_product_label,
() async => Navigator.push<void>(
context,
MaterialPageRoute<void>(
builder: (BuildContext context) => EditProductPage(_product),
),
),
() async {
AnalyticsHelper.trackEvent(
AnalyticsEvent.openProductEditPage,
barcode: _barcode,
);
await Navigator.push<void>(
context,
MaterialPageRoute<void>(
builder: (BuildContext context) =>
EditProductPage(_product),
),
);
},
),
_buildActionBarItem(
ConstantIcons.instance.getShareIcon(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import 'package:smooth_app/background/background_task_details.dart';
import 'package:smooth_app/generic_lib/design_constants.dart';
import 'package:smooth_app/generic_lib/dialogs/smooth_alert_dialog.dart';
import 'package:smooth_app/generic_lib/widgets/smooth_card.dart';
import 'package:smooth_app/helpers/analytics_helper.dart';
import 'package:smooth_app/helpers/text_input_formatters_helper.dart';
import 'package:smooth_app/pages/product/common/product_refresher.dart';
import 'package:smooth_app/pages/product/may_exit_page_helper.dart';
Expand Down Expand Up @@ -529,6 +530,12 @@ class _NutritionPageLoadedState extends State<NutritionPageLoaded> {
);
return false;
}

AnalyticsHelper.trackProductEdit(
AnalyticsEditEvents.nutrition_Facts,
changedProduct.barcode!,
true,
);
await BackgroundTaskDetails.addTask(
changedProduct,
widget: this,
Expand Down
4 changes: 4 additions & 0 deletions packages/smooth_app/lib/pages/product/ocr_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:openfoodfacts/openfoodfacts.dart';
import 'package:smooth_app/background/background_task_details.dart';
import 'package:smooth_app/helpers/analytics_helper.dart';
import 'package:smooth_app/query/product_query.dart';

/// OCR Helper, to be implemented for ingredients and packaging for instance.
Expand Down Expand Up @@ -57,4 +58,7 @@ abstract class OcrHelper {

@protected
User getUser() => ProductQuery.getUser();

/// Returns the enum to be used for matomo analytics.
AnalyticsEditEvents getEditEventAnalyticsTag();
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:openfoodfacts/openfoodfacts.dart';
import 'package:smooth_app/background/background_task_details.dart';
import 'package:smooth_app/helpers/analytics_helper.dart';
import 'package:smooth_app/pages/product/ocr_helper.dart';

/// OCR Helper for ingredients.
Expand Down Expand Up @@ -65,4 +66,8 @@ class OcrIngredientsHelper extends OcrHelper {

@override
bool hasAddExtraPhotoButton() => false;

@override
AnalyticsEditEvents getEditEventAnalyticsTag() =>
AnalyticsEditEvents.ingredients_and_Origins;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:async';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:openfoodfacts/openfoodfacts.dart';
import 'package:smooth_app/background/background_task_details.dart';
import 'package:smooth_app/helpers/analytics_helper.dart';
import 'package:smooth_app/pages/product/ocr_helper.dart';

/// OCR Helper for packaging.
Expand Down Expand Up @@ -68,4 +69,8 @@ class OcrPackagingHelper extends OcrHelper {

@override
bool hasAddExtraPhotoButton() => true;

@override
AnalyticsEditEvents getEditEventAnalyticsTag() =>
AnalyticsEditEvents.recyclingInstructionsPhotos;
}

0 comments on commit cd04400

Please sign in to comment.