Skip to content

feat: Add infinite scrolling to the various Open Prices ListViews. #6561

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

Conversation

AshutoshKhadse23
Copy link
Contributor

Closes: #6478

I added infinite scrolling to open the prices list view.

This is how the solution looks :

issue.6478.new.mp4

@codecov-commenter
Copy link

codecov-commenter commented Apr 21, 2025

Codecov Report

Attention: Patch coverage is 0% with 285 lines in your changes missing coverage. Please review.

Project coverage is 5.74%. Comparing base (4d9c7fc) to head (2c1d096).
Report is 873 commits behind head on develop.

Files with missing lines Patch % Lines
...oth_app/lib/pages/prices/infinite_scroll_list.dart 0.00% 67 Missing ⚠️
...mooth_app/lib/pages/prices/prices_proofs_page.dart 0.00% 56 Missing ⚠️
..._app/lib/pages/prices/infinite_scroll_manager.dart 0.00% 46 Missing ⚠️
...th_app/lib/pages/prices/prices_locations_page.dart 0.00% 43 Missing ⚠️
...ooth_app/lib/pages/prices/product_prices_list.dart 0.00% 27 Missing ⚠️
...smooth_app/lib/pages/prices/prices_users_page.dart 0.00% 26 Missing ⚠️
...oth_app/lib/pages/prices/prices_products_page.dart 0.00% 20 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           develop   #6561      +/-   ##
==========================================
- Coverage     9.54%   5.74%   -3.80%     
==========================================
  Files          325     511     +186     
  Lines        16411   30331   +13920     
==========================================
+ Hits          1567    1744     +177     
- Misses       14844   28587   +13743     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@monsieurtanuki monsieurtanuki self-requested a review April 22, 2025 10:12
Copy link
Contributor

@monsieurtanuki monsieurtanuki left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @AshutoshKhadse23!

I have no strong opinion against your code, that seems to work. Possibly minor comments here and there.

The thing is that for the Prices (in a broad sense) we need different objects with a "load more" feature: prices (with this PR), proofs, contributors, locations and products.

Do you feel confident enough in your OOP skills? If so you should refactor your current code with generic concepts like:

  • a loading class
    • with a load method that has the page number as a parameter
    • returning a list of items, a number of items, a number of pages
  • an item display class that takes an item as a parameter and displays it
  • a "load by page" class that displays items by page, with a "loader" and an "item display" in the constructor

I'm sure there are Design Patterns around those common features.

What do you think about that?

@AshutoshKhadse23
Copy link
Contributor Author

@monsieurtanuki, I tried to implement what you suggested—looking forward to your feedback!

Copy link
Contributor

@monsieurtanuki monsieurtanuki left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @AshutoshKhadse23!
Good job!
Please have a look at my comments, though, for code simplification.

@AshutoshKhadse23
Copy link
Contributor Author

Hello @monsieurtanuki ,
Updated code according to the comments. And is ready for review.

Copy link
Contributor

@monsieurtanuki monsieurtanuki left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @AshutoshKhadse23!
Obviously something wrong in your latest push, as we have twice the same class.
The idea was to get rid of parameters that are ALWAYS the same, and that's not was you pushed.

@AshutoshKhadse23
Copy link
Contributor Author

@monsieurtanuki, changed the code according to the comment.

Copy link
Contributor

@monsieurtanuki monsieurtanuki left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @AshutoshKhadse23!
Please have a look at my comments.

@AshutoshKhadse23
Copy link
Contributor Author

@monsieurtanuki,
Do you think this is alright?
Screenshot 2025-05-07 at 5 00 36 PM

@monsieurtanuki
Copy link
Contributor

@AshutoshKhadse23 I would say it's good enough. A bit surprised by the "All 3 proofs" on top, referring specifically to "proof" when it's supposed to be generic.
Regardless, please push your changes so I can review.

@AshutoshKhadse23
Copy link
Contributor Author

@monsieurtanuki,
I have completed the implementation of the list in the proof page with a date, and also applied an infinite list.
Looking forward to your feedback?

issue.6478.proof.updated.ui.mp4

@AshutoshKhadse23
Copy link
Contributor Author

@AshutoshKhadse23 I would say it's good enough. A bit surprised by the "All 3 proofs" on top, referring specifically to "proof" when it's supposed to be generic. Regardless, please push your changes so I can review.

That was before I made the change, in that I just want to ask about the UI from the grid to list.

Copy link
Contributor

@monsieurtanuki monsieurtanuki left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @AshutoshKhadse23!
Besides minor UI comments that I don't want you to work on, there's something wrong with the bearerToken:

  1. you never use fetchInit - it's precisely for the bearerToken that fetchInit was introduced
  2. you dismissed the test of the error when retrieving the bearerToken - you should not dismiss error tests
  3. you compute the bearerToken for every page - the bearerToken is to be computed only once for all pages

int? get totalPages => _totalPages;

@protected
Future<void> fetchInit() async {}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So now it's never used, right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right!

@AshutoshKhadse23
Copy link
Contributor Author

AshutoshKhadse23 commented May 8, 2025

Hi @AshutoshKhadse23! Besides minor UI comments that I don't want you to work on, there's something wrong with the bearerToken:

  1. you never use fetchInit - it's precisely for the bearerToken that fetchInit was introduced
  2. you dismissed the test of the error when retrieving the bearerToken - you should not dismiss error tests
  3. you compute the bearerToken for every page - the bearerToken is to be computed only once for all pages

Hello @monsieurtanuki,
For the consistency of the code overall, I changed the code accordingly. If you want, I can still use fetchInit in the code.

@monsieurtanuki
Copy link
Contributor

Hello @monsieurtanuki, For the consistency of the code overall, I changed the code accordingly. If you want, I can still use fetchInit in the code.

@AshutoshKhadse23 It has nothing to do with consistency.
For proofs, there's a special case: at init time, we must perform a specific action, once.
It's something that can be understood as "there's an init phase for all subclasses, but luckily most of the time we do nothing".
What would be the point of fetchInit otherwise?

@AshutoshKhadse23
Copy link
Contributor Author

Hello @monsieurtanuki, For the consistency of the code overall, I changed the code accordingly. If you want, I can still use fetchInit in the code.

@AshutoshKhadse23 It has nothing to do with consistency. For proofs, there's a special case: at init time, we must perform a specific action, once. It's something that can be understood as "there's an init phase for all subclasses, but luckily most of the time we do nothing". What would be the point of fetchInit otherwise?

@monsieurtanuki,
What do you think about this approach ?

class _InfiniteScrollProofManager extends InfiniteScrollManager<Proof> {
  _InfiniteScrollProofManager({
    required this.selectProof,
  });

  static const int _pageSize = 10;
  final bool selectProof;
  String? _bearerToken;

  @override
  Future<void> fetchInit() async {
    final User user = ProductQuery.getWriteUser();
    final MaybeError<String> token =
    await OpenPricesAPIClient.getAuthenticationToken(
      username: user.userId,
      password: user.password,
      uriHelper: ProductQuery.uriPricesHelper,
    );

    if (token.isError) {
      throw MaybeError<GetProofsResult>.error(
        error: token.error ?? 'Could not authenticate with the server',
        statusCode: token.statusCode ?? 500,
      );
    }

    _bearerToken = token.value;
  }

  @override
  Future<void> fetchData(final int pageNumber) async {
    if (_bearerToken == null) {
      await fetchInit();
      if (_bearerToken == null) {
        throw MaybeError<GetProofsResult>.error(
          error: 'Failed to obtain authentication token',
          statusCode: 500,
        );
      }
    }

    final User user = ProductQuery.getWriteUser();
    final MaybeError<GetProofsResult> result =
    await OpenPricesAPIClient.getProofs(
      GetProofsParameters()
        ..orderBy = <OrderBy<GetProofsOrderField>>[
          const OrderBy<GetProofsOrderField>(
            field: GetProofsOrderField.created,
            ascending: false,
          ),
        ]
        ..owner = user.userId
        ..pageSize = _pageSize
        ..pageNumber = pageNumber,
      uriHelper: ProductQuery.uriPricesHelper,
      bearerToken: _bearerToken!,
    );

    await OpenPricesAPIClient.deleteUserSession(
      uriHelper: ProductQuery.uriPricesHelper,
      bearerToken: _bearerToken!,
    );

    if (result.isError) {
      throw result.detailError;
    }

    final GetProofsResult value = result.value;
    updateItems(
      newItems: value.items,
      pageNumber: value.pageNumber,
      totalItems: value.total,
      totalPages: value.numberOfPages,
    );
  }

@monsieurtanuki
Copy link
Contributor

@AshutoshKhadse23

  • you're not supposed to throw a MaybeError. Just throw an exception in fetchInit
  • and you don't have to test if (_bearerToken == null) after fetchInit within fetchData, because it would have thrown an exception already
  • you're NOT supposed to close the session (deleteUserSession) after each page. Just do it in the dispose of the list. ONCE. And we don't care if the deleteUserSession is not successful.

@AshutoshKhadse23
Copy link
Contributor Author

@AshutoshKhadse23

  • you're not supposed to throw a MaybeError. Just throw an exception in fetchInit
  • and you don't have to test if (_bearerToken == null) after fetchInit within fetchData, because it would have thrown an exception already
  • you're NOT supposed to close the session (deleteUserSession) after each page. Just do it in the dispose of the list. ONCE. And we don't care if the deleteUserSession is not successful.

How about this? I just wanna to complete work perfectly so if you have time could you check it?

class _InfiniteScrollProofManager extends InfiniteScrollManager<Proof> {
  _InfiniteScrollProofManager({
    required this.selectProof,
  });

  static const int _pageSize = 10;
  final bool selectProof;
  String? _bearerToken;

  @override
  Future<void> fetchInit() async {
    final User user = ProductQuery.getWriteUser();
    final MaybeError<String> token =
    await OpenPricesAPIClient.getAuthenticationToken(
      username: user.userId,
      password: user.password,
      uriHelper: ProductQuery.uriPricesHelper,
    );

    if (token.isError) {
      throw Exception(token.error ?? 'Could not authenticate with the server');
    }

    _bearerToken = token.value;
  }

  @override
  Future<void> fetchData(final int pageNumber) async {
    if (_bearerToken == null) {
      await fetchInit();
    }

    final User user = ProductQuery.getWriteUser();
    final MaybeError<GetProofsResult> result =
    await OpenPricesAPIClient.getProofs(
      GetProofsParameters()
        ..orderBy = <OrderBy<GetProofsOrderField>>[
          const OrderBy<GetProofsOrderField>(
            field: GetProofsOrderField.created,
            ascending: false,
          ),
        ]
        ..owner = user.userId
        ..pageSize = _pageSize
        ..pageNumber = pageNumber,
      uriHelper: ProductQuery.uriPricesHelper,
      bearerToken: _bearerToken!,
    );

    if (result.isError) {
      throw Exception(result.error ?? 'Failed to fetch proofs');
    }

    final GetProofsResult value = result.value;
    updateItems(
      newItems: value.items,
      pageNumber: value.pageNumber,
      totalItems: value.total,
      totalPages: value.numberOfPages,
    );
  }

  /// Properly dispose of the session when the manager is no longer needed
  void dispose() {
    if (_bearerToken != null) {
      OpenPricesAPIClient.deleteUserSession(
        uriHelper: ProductQuery.uriPricesHelper,
        bearerToken: _bearerToken!,
      );
    }
  }

  @override
  Widget buildItem({
    required BuildContext context,
    required Proof item,
  }) {
    if (item.filePath == null) {
      return const SizedBox.shrink();
    }

    return SmoothCard(
      child: InkWell(
        onTap: () async {
          if (selectProof) {
            Navigator.of(context).pop(item);
            return;
          }
          return Navigator.push<void>(
            context,
            MaterialPageRoute<void>(
              builder: (BuildContext context) => PriceProofPage(item),
            ),
          );
        },
        child: _PriceProofListItem(item),
      ),
    );
  }
}

@monsieurtanuki
Copy link
Contributor

@AshutoshKhadse23 That's the general idea. But if you want your code to be reviewed, you have to push it, not comment. Besides, dispose is never called.
Waiting for your push.

@AshutoshKhadse23
Copy link
Contributor Author

@monsieurtanuki,
Check once!!

Copy link
Contributor

@monsieurtanuki monsieurtanuki left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you @AshutoshKhadse23!
I do believe the code looks better that way, what do you think? 😉

@github-project-automation github-project-automation bot moved this from Backlog to Ready in 💸 Open Prices May 8, 2025
@github-project-automation github-project-automation bot moved this from 💬 To discuss and validate to 🎊 Done in 🤳🥫 The Open Food Facts mobile app (Android & iOS) May 8, 2025
@monsieurtanuki monsieurtanuki merged commit 3e91178 into openfoodfacts:develop May 8, 2025
7 checks passed
@github-project-automation github-project-automation bot moved this from Ready to Done in 💸 Open Prices May 8, 2025
@AshutoshKhadse23
Copy link
Contributor Author

AshutoshKhadse23 commented May 8, 2025

Thank you @AshutoshKhadse23! I do believe the code looks better that way, what do you think? 😉

@monsieurtanuki,
Yes, I agree, and thank you for your patience.

andylin2004 added a commit to ossd-s25/openfoodfacts-smooth-app that referenced this pull request May 14, 2025
commit 6155ae2
Author: qq3173732005 <[email protected]>
Date:   Sat May 10 22:02:16 2025 -0400

    popup menu with edit option in product gallery view

commit 924c3c0
Merge: 1f53375 3e91178
Author: qq3173732005 <[email protected]>
Date:   Fri May 9 16:17:17 2025 -0400

    Merge branch 'openfoodfacts:develop' into sz-6119

commit 3e91178
Author: Ashutosh Khadse <[email protected]>
Date:   Thu May 8 18:45:48 2025 +0530

    feat: Add infinite scrolling to the various Open Prices ListViews. (openfoodfacts#6561)

    * feat: Add infinite scrolling to the various Open Prices ListViews.

    * feat: Add infinite scrolling to the various Open Prices ListViews.

    * feat: Add infinite scrolling to the proofs,location,prices,product,contribution using generic class.

    * fix: resolve code comment issue

    * fix: resolve code comment issue

    * fix: resolve code comment issue

    * fix: resolve conflict

    * fix: resolve conflict

    * fix: resolve code comment issue

    * fix: resolve code comment issue

    * fix: resolve code comment issue

    * fix: resolve code issue

    * fix: resolve code comment issue

    * fix: resolve code comment issue

    * fix: change code according to concept of OOP Java

    * fix: resolve code comment issue

    * fix: resolve code comment issue

    * fix: resolve code comment issue

    * fix: resolve code comment issue

    * fix: changed proofs page from grid to list with infinite scroll list

    * Update packages/smooth_app/lib/pages/prices/product_prices_list.dart

    * Update packages/smooth_app/lib/pages/prices/prices_proofs_page.dart

    * Update packages/smooth_app/lib/pages/prices/prices_proofs_page.dart

    * Update packages/smooth_app/lib/pages/prices/prices_proofs_page.dart

    * fix: resolve code comment issue

    ---------

    Co-authored-by: monsieurtanuki <[email protected]>

commit f1820a8
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Wed May 7 17:39:07 2025 +0200

    chore(deps): bump actions/checkout from 3 to 4 (openfoodfacts#6584)

    Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
    - [Release notes](https://github.com/actions/checkout/releases)
    - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
    - [Commits](actions/checkout@v3...v4)

    ---
    updated-dependencies:
    - dependency-name: actions/checkout
      dependency-version: '4'
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...

    Signed-off-by: dependabot[bot] <[email protected]>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

commit 6450b6d
Author: Edouard Marquez <[email protected]>
Date:   Wed May 7 17:38:47 2025 +0200

    chore: UI/UX for Robotoff suggestions improved (openfoodfacts#6585)

    * CW

    * Iteration

commit 23c4abd
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Tue May 6 11:53:17 2025 +0200

    chore(deps): bump fastlane in /packages/smooth_app/android (openfoodfacts#6583)

    Bumps [fastlane](https://github.com/fastlane/fastlane) from 2.227.1 to 2.227.2.
    - [Release notes](https://github.com/fastlane/fastlane/releases)
    - [Changelog](https://github.com/fastlane/fastlane/blob/master/CHANGELOG.latest.md)
    - [Commits](fastlane/fastlane@fastlane/2.227.1...fastlane/2.227.2)

    ---
    updated-dependencies:
    - dependency-name: fastlane
      dependency-version: 2.227.2
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...

    Signed-off-by: dependabot[bot] <[email protected]>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    Co-authored-by: Pierre Slamich <[email protected]>

commit bed4d8b
Author: monsieurtanuki <[email protected]>
Date:   Tue May 6 11:46:37 2025 +0200

    fix: 6560 - explicit readyForPriceTagValidation parameter for proof upload (openfoodfacts#6573)

    * fix: 6560 - explicit readyForPriceTagValidation parameter for proof upload

    Impacted files:
    * `background_task_add_price.dart`: added explicit `readyForPriceTagValidation` parameter for proof upload
    * `pubspec.lock`: wtf
    * `pubspec.yaml`: upgraded `openfoodfacts` to `3.22.0`

    * upgraded PricesStatsPage too to openfoodfacts 3.22.0

commit 0e8aecb
Author: Pierre Slamich <[email protected]>
Date:   Tue May 6 11:18:51 2025 +0200

    ci: Create one-check.yml (openfoodfacts#6570)

    * ci: Create one-check.yml

    * fix: Update one-check.yml

    * Potential fix for code scanning alert no. 29: Workflow does not contain permissions

    Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

    * fix: Update app_fr.arb

    * Update app_he.arb

    * Update app_pl.arb

    * fix: Update app_da.arb

    * fix: Update app_ro.arb

    * Update .github/workflows/one-check.yml

    ---------

    Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

commit 2b558dc
Author: Edouard Marquez <[email protected]>
Date:   Tue May 6 10:22:30 2025 +0200

    UI improvements (openfoodfacts#6581)

commit 6ca6a0b
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Tue May 6 10:16:51 2025 +0200

    chore(deps): bump fastlane in /packages/smooth_app/ios (openfoodfacts#6582)

    Bumps [fastlane](https://github.com/fastlane/fastlane) from 2.227.1 to 2.227.2.
    - [Release notes](https://github.com/fastlane/fastlane/releases)
    - [Changelog](https://github.com/fastlane/fastlane/blob/master/CHANGELOG.latest.md)
    - [Commits](fastlane/fastlane@fastlane/2.227.1...fastlane/2.227.2)

    ---
    updated-dependencies:
    - dependency-name: fastlane
      dependency-version: 2.227.2
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...

    Signed-off-by: dependabot[bot] <[email protected]>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

commit 453ccf5
Author: Edouard Marquez <[email protected]>
Date:   Mon May 5 19:23:01 2025 +0200

    feat: Improvements for Robotoff questions in Edit mode  (openfoodfacts#6579)

    * Improve robotoff questions in edit mode

    * SmoothImage for the proof

    * Remove print statement

commit a031602
Author: Cherish <[email protected]>
Date:   Mon May 5 18:37:39 2025 +0530

    feat: add packaging photo access in packaging components screen (openfoodfacts#6452)

commit 9a23a8c
Author: Cherish <[email protected]>
Date:   Mon May 5 04:35:51 2025 +0530

    feat: add properties (Folksonomy Engine) button to navbar  (openfoodfacts#6505)

    Co-authored-by: Edouard Marquez <[email protected]>

commit f0340fc
Author: vinay chavhan <[email protected]>
Date:   Mon May 5 03:15:44 2025 +0530

    fix: UI padding for better layout (openfoodfacts#6509)

    Co-authored-by: Edouard Marquez <[email protected]>

commit d1ba3f8
Author: Ashutosh Khadse <[email protected]>
Date:   Sun May 4 12:42:05 2025 +0530

    fix: dark mode issue in feedback page (openfoodfacts#6576)

    * fix: dark mode issue in feedback page

    * fix: dark mode issue in feedback page

    * fix: dark mode issue in feedback page

    * fix: dark mode issue in feedback page

    * fix: dark mode issue in feedback page

commit 44e4e5a
Author: Abhishek-P0207 <[email protected]>
Date:   Sat May 3 00:12:29 2025 +0530

    fix: Removed the option to add an item through barcode from Add a Price page (openfoodfacts#6525)

    * Fixed the add the item

    * refactor

    * fix-1:condition on usage of add an item

    * refactor

    * fix-2:add extra condition

    * Fix : Changed acc. to suggestion

    * Fix : Changed acc. to suggestion and formatted

    * suggested changes made

    * formatted

    * fixed formatting issues

    * format

    * small correction

    * changed acc. to suggestion

    * changed acc. to suggestion

commit c68b4d1
Author: Pierre Slamich <[email protected]>
Date:   Fri May 2 19:42:03 2025 +0200

    ci: Update mkdocs.yml

commit 1ad9e9f
Author: Pierre Slamich <[email protected]>
Date:   Fri May 2 19:34:56 2025 +0200

    fix: Update dartdoc.yml

commit b94a8e9
Author: Pierre Slamich <[email protected]>
Date:   Fri May 2 19:32:15 2025 +0200

    ci: Update dartdoc.yml

commit 8ed470b
Author: Open Food Facts Bot <[email protected]>
Date:   Wed Apr 30 20:49:26 2025 +0200

    chore: New translations to review and merge (openfoodfacts#6534)

    * New translations app_en.arb (Maltese)

    * New translations app_en.arb (Welsh)

    * New translations app_en.arb (Faroese)

    * New translations app_en.arb (Esperanto)

    * New translations app_en.arb (Uyghur)

    * New translations app_en.arb (Luxembourgish)

    * New translations app_en.arb (Chinese Traditional, Hong Kong)

    * New translations app_en.arb (Tatar)

    * New translations app_en.arb (Malayalam)

    * New translations app_en.arb (Breton)

    * New translations app_en.arb (Romansh)

    * New translations app_en.arb (Tibetan)

    * New translations app_en.arb (Latin)

    * New translations app_en.arb (Bosnian)

    * New translations app_en.arb (Sinhala)

    * New translations app_en.arb (Cornish)

    * New translations app_en.arb (Uzbek)

    * New translations app_en.arb (Kannada)

    * New translations app_en.arb (Akan)

    * New translations app_en.arb (Assamese)

    * New translations app_en.arb (Scottish Gaelic)

    * New translations app_en.arb (Wolof)

    * New translations app_en.arb (Southern Ndebele)

    * New translations app_en.arb (Walloon)

    * New translations app_en.arb (Malagasy)

    * New translations app_en.arb (Swahili)

    * New translations app_en.arb (Odia)

    * New translations app_en.arb (Norwegian Bokmal)

    * New translations app_en.arb (Occitan)

    * New translations app_en.arb (Serbian (Latin))

    * New translations app_en.arb (Amharic)

    * New translations app_en.arb (Nepali)

    * New translations app_en.arb (Montenegrin (Cyrillic))

    * New translations app_en.arb (Dutch, Belgium)

    * New translations app_en.arb (Tahitian)

    * New translations app_en.arb (Hausa)

    * New translations app_en.arb (Chuvash)

    * New translations app_en.arb (Tajik)

    * New translations app_en.arb (Lao)

    * New translations app_en.arb (Quechua)

    * New translations app_en.arb (Somali)

    * New translations app_en.arb (Yoruba)

    * New translations app_en.arb (Afar)

    * New translations app_en.arb (Bambara)

    * New translations app_en.arb (Chechen)

    * New translations app_en.arb (Corsican)

    * New translations app_en.arb (Haitian Creole)

    * New translations app_en.arb (Sichuan Yi)

    * New translations app_en.arb (Inuktitut)

    * New translations app_en.arb (Javanese)

    * New translations app_en.arb (Sardinian)

    * New translations app_en.arb (Sindhi)

    * New translations app_en.arb (Sango)

    * New translations app_en.arb (Shona)

    * New translations app_en.arb (Tigrinya)

    * New translations app_en.arb (Sanskrit)

    * New translations app_en.arb (Akan, Twi)

    * New translations app_en.arb (Urdu (India))

    * New translations app_en.arb (Karakalpak)

    * New translations app_en.arb (German)

    * New translations app_en.arb (Hebrew)

    * New translations app_en.arb (Greek)

    * New translations app_en.arb (Ukrainian)

    * New translations app_en.arb (Spanish)

    * New translations app_en.arb (Chinese Simplified)

    * New translations app_en.arb (Chinese Traditional)

    * New translations app_en.arb (Chinese Traditional, Hong Kong)

    * New translations infoplist.strings (Chinese Traditional)

    * New translations infoplist.strings (Chinese Traditional, Hong Kong)

    * New translations app_en.arb (Danish)

    * New translations app_en.arb (Danish)

    * New translations app_en.arb (Danish)

    * New translations app_en.arb (Dutch)

    * New translations app_en.arb (Danish)

    * New translations app_en.arb (Slovak)

    * New translations app_en.arb (Danish)

    * New translations app_en.arb (Slovak)

    * New translations app_en.arb (Portuguese)

    * New translations app_en.arb (Slovak)

    * New translations app_en.arb (Serbian (Cyrillic))

    * New translations app_en.arb (Chinese Simplified)

    * New translations app_en.arb (Chinese Traditional)

    * New translations app_en.arb (Portuguese, Brazilian)

    * New translations app_en.arb (English, Australia)

    * New translations app_en.arb (English, United Kingdom)

    * New translations app_en.arb (Chinese Traditional, Hong Kong)

    * New translations app_en.arb (Serbian (Latin))

    * New translations app_en.arb (Montenegrin (Cyrillic))

    * New translations app_en.arb (Dutch, Belgium)

    * New translations infoplist.strings (Slovak)

    * New translations app_en.arb (Danish)

    * New translations app_en.arb (Chinese Simplified)

    * New translations app_en.arb (Danish)

    * New translations app_en.arb (Slovak)

    * New translations app_en.arb (Slovak)

    * New translations app_en.arb (Slovak)

    * New translations app_en.arb (Slovak)

    * New translations app_en.arb (Slovak)

    * Delete packages/smooth_app/lib/l10n/app_kaa.arb

    * New translations app_en.arb (Greek)

    * New translations app_en.arb (Greek)

    * New translations app_en.arb (Romanian)

    * New translations app_en.arb (French)

    * New translations app_en.arb (Spanish)

    * New translations app_en.arb (Arabic)

    * New translations app_en.arb (Belarusian)

    * New translations app_en.arb (Bulgarian)

    * New translations app_en.arb (Catalan)

    * New translations app_en.arb (Czech)

    * New translations app_en.arb (Danish)

    * New translations app_en.arb (German)

    * New translations app_en.arb (Greek)

    * New translations app_en.arb (Basque)

    * New translations app_en.arb (Finnish)

    * New translations app_en.arb (Irish)

    * New translations app_en.arb (Gujarati)

    * New translations app_en.arb (Hebrew)

    * New translations app_en.arb (Hungarian)

    * New translations app_en.arb (Armenian)

    * New translations app_en.arb (Italian)

    * New translations app_en.arb (Japanese)

    * New translations app_en.arb (Georgian)

    * New translations app_en.arb (Korean)

    * New translations app_en.arb (Kurdish)

    * New translations app_en.arb (Lithuanian)

    * New translations app_en.arb (Mongolian)

    * New translations app_en.arb (Dutch)

    * New translations app_en.arb (Norwegian)

    * New translations app_en.arb (Punjabi)

    * New translations app_en.arb (Polish)

    * New translations app_en.arb (Portuguese)

    * New translations app_en.arb (Russian)

    * New translations app_en.arb (Slovak)

    * New translations app_en.arb (Slovenian)

    * New translations app_en.arb (Albanian)

    * New translations app_en.arb (Serbian (Cyrillic))

    * New translations app_en.arb (Swati)

    * New translations app_en.arb (Southern Sotho)

    * New translations app_en.arb (Swedish)

    * New translations app_en.arb (Tswana)

    * New translations app_en.arb (Turkish)

    * New translations app_en.arb (Tsonga)

    * New translations app_en.arb (Ukrainian)

    * New translations app_en.arb (Venda)

    * New translations app_en.arb (Xhosa)

    * New translations app_en.arb (Chinese Simplified)

    * New translations app_en.arb (Chinese Traditional)

    * New translations app_en.arb (Zulu)

    * New translations app_en.arb (English)

    * New translations app_en.arb (Vietnamese)

    * New translations app_en.arb (Galician)

    * New translations app_en.arb (Icelandic)

    * New translations app_en.arb (Portuguese, Brazilian)

    * New translations app_en.arb (Indonesian)

    * New translations app_en.arb (Persian)

    * New translations app_en.arb (Khmer)

    * New translations app_en.arb (Tamil)

    * New translations app_en.arb (Bengali)

    * New translations app_en.arb (Marathi)

    * New translations app_en.arb (Thai)

    * New translations app_en.arb (Croatian)

    * New translations app_en.arb (Norwegian Nynorsk)

    * New translations app_en.arb (Kazakh)

    * New translations app_en.arb (Estonian)

    * New translations app_en.arb (Latvian)

    * New translations app_en.arb (Azerbaijani)

    * New translations app_en.arb (Hindi)

    * New translations app_en.arb (Kyrgyz)

    * New translations app_en.arb (Malay)

    * New translations app_en.arb (Maori)

    * New translations app_en.arb (Telugu)

    * New translations app_en.arb (English, Australia)

    * New translations app_en.arb (English, United Kingdom)

    * New translations app_en.arb (Tagalog)

    * New translations app_en.arb (Burmese)

    * New translations app_en.arb (Yiddish)

    * New translations app_en.arb (Maltese)

    * New translations app_en.arb (Welsh)

    * New translations app_en.arb (Faroese)

    * New translations app_en.arb (Esperanto)

    * New translations app_en.arb (Uyghur)

    * New translations app_en.arb (Luxembourgish)

    * New translations app_en.arb (Chinese Traditional, Hong Kong)

    * New translations app_en.arb (Tatar)

    * New translations app_en.arb (Malayalam)

    * New translations app_en.arb (Breton)

    * New translations app_en.arb (Romansh)

    * New translations app_en.arb (Tibetan)

    * New translations app_en.arb (Latin)

    * New translations app_en.arb (Bosnian)

    * New translations app_en.arb (Sinhala)

    * New translations app_en.arb (Cornish)

    * New translations app_en.arb (Uzbek)

    * New translations app_en.arb (Kannada)

    * New translations app_en.arb (Akan)

    * New translations app_en.arb (Assamese)

    * New translations app_en.arb (Scottish Gaelic)

    * New translations app_en.arb (Wolof)

    * New translations app_en.arb (Southern Ndebele)

    * New translations app_en.arb (Walloon)

    * New translations app_en.arb (Malagasy)

    * New translations app_en.arb (Swahili)

    * New translations app_en.arb (Odia)

    * New translations app_en.arb (Norwegian Bokmal)

    * New translations app_en.arb (Occitan)

    * New translations app_en.arb (Serbian (Latin))

    * New translations app_en.arb (Amharic)

    * New translations app_en.arb (Nepali)

    * New translations app_en.arb (Montenegrin (Cyrillic))

    * New translations app_en.arb (Dutch, Belgium)

    * New translations app_en.arb (Tahitian)

    * New translations app_en.arb (Hausa)

    * New translations app_en.arb (Chuvash)

    * New translations app_en.arb (Tajik)

    * New translations app_en.arb (Lao)

    * New translations app_en.arb (Quechua)

    * New translations app_en.arb (Somali)

    * New translations app_en.arb (Yoruba)

    * New translations app_en.arb (Afar)

    * New translations app_en.arb (Bambara)

    * New translations app_en.arb (Chechen)

    * New translations app_en.arb (Corsican)

    * New translations app_en.arb (Haitian Creole)

    * New translations app_en.arb (Sichuan Yi)

    * New translations app_en.arb (Inuktitut)

    * New translations app_en.arb (Javanese)

    * New translations app_en.arb (Sardinian)

    * New translations app_en.arb (Sindhi)

    * New translations app_en.arb (Sango)

    * New translations app_en.arb (Shona)

    * New translations app_en.arb (Tigrinya)

    * New translations app_en.arb (Sanskrit)

    * New translations app_en.arb (Akan, Twi)

    * New translations app_en.arb (Urdu (India))

    * New translations app_en.arb (Karakalpak)

    * New translations app_en.arb (German)

    * New translations app_en.arb (Dutch)

    * New translations app_en.arb (Danish)

    * New translations app_en.arb (Ukrainian)

    * New translations app_en.arb (Danish)

    * New translations app_en.arb (Danish)

    * New translations app_en.arb (Chinese Traditional)

    * New translations app_en.arb (English, Australia)

    * New translations app_en.arb (English, United Kingdom)

    * New translations infoplist.strings (Chinese Traditional)

    * New translations app_en.arb (Hungarian)

    * New translations app_en.arb (Dutch, Belgium)

    * New translations app_en.arb (Slovak)

    * Delete packages/smooth_app/lib/l10n/app_kaa.arb

    ---------

    Co-authored-by: Pierre Slamich <[email protected]>

commit 11bf06d
Author: Lore <[email protected]>
Date:   Wed Apr 30 16:10:24 2025 +0200

    fix: Move Hunger Games to a real view instead of overlay (openfoodfacts#4681) (openfoodfacts#6555)

    * Fix openfoodfacts#4681: Move Hunger Games to a real view instead of overlay

    Committer: Lorenzo Mascia <[email protected]>

    Changes :
    	modified:   packages/smooth_app/lib/pages/hunger_games/question_card.dart
    	modified:   packages/smooth_app/lib/pages/hunger_games/question_page.dart
    	modified:   packages/smooth_app/lib/pages/preferences/user_preferences_contribute.dart
    	modified:   packages/smooth_app/lib/pages/product/product_questions_widget.dart

    * Fixes after code review

    Committer: Lorenzo Mascia <[email protected]>

    Changes:
    	modified:   packages/smooth_app/lib/pages/hunger_games/question_card.dart
    	modified:   packages/smooth_app/lib/pages/hunger_games/question_image_thumbnail.dart
    	modified:   packages/smooth_app/lib/pages/hunger_games/question_page.dart
    	modified:   packages/smooth_app/lib/pages/preferences/user_preferences_contribute.dart
    	modified:   packages/smooth_app/lib/pages/product/product_questions_widget.dart

    * Fixes after second review

    Committer: Lorenzo Mascia <[email protected]>

    Changes:
    	modified:   packages/smooth_app/lib/pages/hunger_games/question_image_thumbnail.dart
    	modified:   packages/smooth_app/lib/pages/hunger_games/question_page.dart
    	modified:   packages/smooth_app/lib/pages/preferences/user_preferences_contribute.dart
    	modified:   packages/smooth_app/lib/pages/product/product_questions_widget.dart

    * Update packages/smooth_app/lib/pages/hunger_games/question_card.dart

    Co-authored-by: monsieurtanuki <[email protected]>

    * Fixes after third review

    Committer: Lorenzo Mascia <[email protected]>

    Changes:
    	modified:   lib/pages/hunger_games/question_image_thumbnail.dart
    	modified:   lib/pages/hunger_games/question_page.dart

    ---------

    Co-authored-by: Lorenzo Mascia <[email protected]>
    Co-authored-by: monsieurtanuki <[email protected]>

commit 943db63
Author: Pierre Slamich <[email protected]>
Date:   Wed Apr 30 14:48:34 2025 +0200

    ci: Update mkdocs.yml by adding edit button

commit 913d888
Author: Pierre Slamich <[email protected]>
Date:   Sun Apr 27 12:19:27 2025 +0200

    fix: Update dartdoc.yml

commit dcf31fa
Author: Pierre Slamich <[email protected]>
Date:   Sun Apr 27 12:16:13 2025 +0200

    fix: Update dartdoc.yml

commit 7897374
Author: Pierre Slamich <[email protected]>
Date:   Sun Apr 27 12:10:00 2025 +0200

    fix: Update README.md

commit aca2b47
Author: Pierre Slamich <[email protected]>
Date:   Sun Apr 27 11:51:46 2025 +0200

    fix: Update dartdoc.yml

commit 4049d8f
Author: Pierre Slamich <[email protected]>
Date:   Sun Apr 27 11:47:01 2025 +0200

    fix: Update dartdoc.yml

commit cdd93b9
Author: Pierre Slamich <[email protected]>
Date:   Sun Apr 27 11:44:05 2025 +0200

    fix: Update dartdoc.yml

commit df0343e
Author: Pierre Slamich <[email protected]>
Date:   Sun Apr 27 11:36:46 2025 +0200

    fix: Update dartdoc.yml

commit 8ca9d82
Author: Pierre Slamich <[email protected]>
Date:   Sun Apr 27 11:30:55 2025 +0200

    ci: dartdoc + mkdocs (openfoodfacts#5717)

    * ci: dartdoc + mkdocs

commit f6284e0
Author: Primaël Quémerais <[email protected]>
Date:   Sat Apr 26 16:58:02 2025 +0200

    feat: Adding Robotoff Questions to product edition (openfoodfacts#6407)

    * feat: adds robotoff questions to SimpleInputPage

    * feat: add localization for Robotoff question answered message

    * fix: remove unused import

    * Added missing type annotation

    * feat: redesigned Robotoff questions integration.

    * fix: update state change notification mechanism in AbstractSimpleInputPageHelper

    * feat: improve layout and padding in SimpleInputWidget and SmoothIconButton

    * feat: implement SmoothBooleanButton for enhanced boolean selection UI

    * fix: take into account multiple questions

    * Merging translations

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

    Co-authored-by: monsieurtanuki <[email protected]>

    ---------

    Co-authored-by: monsieurtanuki <[email protected]>

commit 1d895ff
Author: Primaël Quémerais <[email protected]>
Date:   Sat Apr 26 16:11:54 2025 +0200

    fix: Update plural formatting in localization files for Greek and Dutch (openfoodfacts#6564)

commit 4cf4c65
Author: Pierre Slamich <[email protected]>
Date:   Sat Apr 26 14:38:52 2025 +0200

    fix: Update .gitignore with kaa.arb

commit 15d374d
Author: Pierre Slamich <[email protected]>
Date:   Sat Apr 26 12:06:27 2025 +0200

    ci: Update config.yaml

commit a0917eb
Author: Pierre Slamich <[email protected]>
Date:   Sat Apr 26 11:28:11 2025 +0200

    docs: Update config.yaml

commit d23b07a
Author: Pierre Slamich <[email protected]>
Date:   Sat Apr 26 10:49:52 2025 +0200

    ci: Update android-release-to-org-openfoodfacts-scanner.yml

commit f943f18
Author: Pierre Slamich <[email protected]>
Date:   Sat Apr 26 10:44:28 2025 +0200

    ci: Update xcversion in fastfile

commit ea22089
Author: Pierre Slamich <[email protected]>
Date:   Fri Apr 25 16:54:13 2025 +0200

    fix: design promo (openfoodfacts#6563)

commit 048d144
Author: Pierre Slamich <[email protected]>
Date:   Tue Apr 22 13:33:25 2025 +0200

    ci: Update github-projects-ventilation.yml

commit 1f53375
Merge: c04254d 4e8b6f3
Author: qq3173732005 <[email protected]>
Date:   Mon Apr 21 12:49:07 2025 -0400

    Merge branch 'openfoodfacts:develop' into sz-6119

commit 4e8b6f3
Author: Ashutosh Khadse <[email protected]>
Date:   Sun Apr 20 14:57:07 2025 +0530

    feat: Added stats view to the prices (openfoodfacts#6553)

    * add: Stats view to the prices

    * add: Stats view to the prices

    * feat: Add stats view to prices with refactored structure and full localization support

    * feat: Add stats view to prices with refactored structure and full localization support

    * feat: Add stats view to prices with simplified structure

    * feat: Add stats view to prices with simplified structure

    * feat: resolve code comment issue

    * feat: resolve code comment issue

commit bc306ae
Author: vinay chavhan <[email protected]>
Date:   Sun Apr 20 14:50:04 2025 +0530

    feat : add shortcut to GDPR requests Wikipage in Prices screen (openfoodfacts#6558)

commit 6ce17c3
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Sat Apr 19 12:39:17 2025 +0200

    chore(deps): bump flutter_svg from 2.0.17 to 2.1.0 in /packages/scanner/shared (openfoodfacts#6557)

    * chore(deps): bump flutter_svg in /packages/scanner/shared

    Bumps [flutter_svg](https://github.com/flutter/packages/tree/main/third_party/packages) from 2.0.17 to 2.1.0.
    - [Release notes](https://github.com/flutter/packages/releases)
    - [Commits](https://github.com/flutter/packages/commits/flutter_svg-v2.1.0/third_party/packages)

    ---
    updated-dependencies:
    - dependency-name: flutter_svg
      dependency-version: 2.1.0
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...

    Signed-off-by: dependabot[bot] <[email protected]>

    * upgraded both flutter_svg

    ---------

    Signed-off-by: dependabot[bot] <[email protected]>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    Co-authored-by: Cirrus CI <[email protected]>

commit c04254d
Merge: c914a89 120d810
Author: qq3173732005 <[email protected]>
Date:   Sun Apr 6 13:08:15 2025 -0400

    Merge branch 'develop' into sz-6119

commit c914a89
Author: qq3173732005 <[email protected]>
Date:   Sun Apr 6 13:06:37 2025 -0400

    Removed hardcoded strings for ImageField

commit b316b40
Author: qq3173732005 <[email protected]>
Date:   Sun Mar 30 23:57:20 2025 -0400

    Added edit shortcut to gallery screens
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

Successfully merging this pull request may close these issues.

Add infinite scrolling to the various Open Prices ListViews.
3 participants