From 997aed08795194fac96e2235c7d6e7fb933d6b64 Mon Sep 17 00:00:00 2001 From: pavaniroid Date: Thu, 10 Apr 2025 23:38:57 +0530 Subject: [PATCH 1/9] refactor: migrate from iso_countries to l10n_countries --- .../country_selector/country_selector.dart | 26 +- .../country_selector_provider.dart | 24 +- .../open_food_facts_country_map.dart | 262 +++++++++ .../openfoodfacts_country_name_extension.dart | 506 ++++++++++++++++++ .../product/common/product_query_page.dart | 35 +- .../product/simple_input_page_helpers.dart | 2 +- packages/smooth_app/pubspec.yaml | 4 +- 7 files changed, 833 insertions(+), 26 deletions(-) create mode 100644 packages/smooth_app/lib/pages/preferences/country_selector/open_food_facts_country_map.dart create mode 100644 packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart index 3600b2222d5f..e6eed1b8b35b 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart @@ -3,13 +3,14 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' hide Listener; import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:iso_countries/iso_countries.dart'; +import 'package:l10n_countries/l10n_countries.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:provider/provider.dart'; import 'package:smooth_app/data_models/preferences/user_preferences.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/helpers/provider_helper.dart'; +import 'package:smooth_app/pages/preferences/country_selector/open_food_facts_country_map.dart'; import 'package:smooth_app/pages/prices/emoji_helper.dart'; import 'package:smooth_app/services/smooth_services.dart'; import 'package:smooth_app/widgets/selector_screen/smooth_screen_list_choice.dart'; @@ -28,6 +29,7 @@ class CountrySelector extends StatelessWidget { this.inkWellBorderRadius, this.loadingHeight = 48.0, this.autoValidate = true, + super.key, }); final TextStyle? textStyle; @@ -51,19 +53,19 @@ class CountrySelector extends StatelessWidget { builder: (BuildContext context, _CountrySelectorProvider provider, _) { return switch (provider.value) { PreferencesSelectorLoadingState _ => SizedBox( - height: loadingHeight, - child: const Center( - child: CircularProgressIndicator.adaptive(), - ), + height: loadingHeight, + child: const Center( + child: CircularProgressIndicator.adaptive(), ), + ), PreferencesSelectorLoadedState _ => _CountrySelectorButton( - icon: icon, - innerPadding: padding ?? EdgeInsets.zero, - textStyle: textStyle, - inkWellBorderRadius: inkWellBorderRadius, - forceCurrencyChange: forceCurrencyChange, - autoValidate: autoValidate, - ), + icon: icon, + innerPadding: padding ?? EdgeInsets.zero, + textStyle: textStyle, + inkWellBorderRadius: inkWellBorderRadius, + forceCurrencyChange: forceCurrencyChange, + autoValidate: autoValidate, + ), }; }, ), diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart index 48b2e08067ba..9dd927f90e5c 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart @@ -175,7 +175,29 @@ class CountriesHelper { static Future?> getCountries(String? userLanguageCode) async { try { - return await IsoCountries.isoCountriesForLocale(userLanguageCode); + final CountriesLocaleMapper mapper = CountriesLocaleMapper(); + + // Use the ISO3 codes from your custom map + final Set iso3Codes = iso3ToCountry.keys.toSet(); + + final LocaleMap localized = mapper.localize( + iso3Codes, + mainLocale: userLanguageCode ?? 'en', + fallbackLocale: 'en', + ); + + // Build the list using your existing OpenFoodFactsCountry mapping + final List countriesList = localized.entries.map((entry) { + final String iso3 = entry.key.isoCode; // like 'IND' + final String localizedName = entry.value; + + final OpenFoodFactsCountry? offCountry = iso3ToCountry[iso3]; + final String alpha2 = offCountry?.offTag.toUpperCase() ?? 'UN'; + + return Country(name: localizedName, countryCode: alpha2); + }).toList(); + + return countriesList; } on MissingPluginException catch (_) { // Locales are not implemented on desktop and web return [ diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/open_food_facts_country_map.dart b/packages/smooth_app/lib/pages/preferences/country_selector/open_food_facts_country_map.dart new file mode 100644 index 000000000000..388fe3998ecc --- /dev/null +++ b/packages/smooth_app/lib/pages/preferences/country_selector/open_food_facts_country_map.dart @@ -0,0 +1,262 @@ +import 'package:openfoodfacts/openfoodfacts.dart'; + +const Map iso3ToCountry = { + 'AND': OpenFoodFactsCountry.ANDORRA, + 'ARE': OpenFoodFactsCountry.UNITED_ARAB_EMIRATES, + 'AFG': OpenFoodFactsCountry.AFGHANISTAN, + 'ATG': OpenFoodFactsCountry.ANTIGUA_AND_BARBUDA, + 'AIA': OpenFoodFactsCountry.ANGUILLA, + 'ALB': OpenFoodFactsCountry.ALBANIA, + 'ARM': OpenFoodFactsCountry.ARMENIA, + 'AGO': OpenFoodFactsCountry.ANGOLA, + 'ATA': OpenFoodFactsCountry.ANTARCTICA, + 'ARG': OpenFoodFactsCountry.ARGENTINA, + 'ASM': OpenFoodFactsCountry.AMERICAN_SAMOA, + 'AUT': OpenFoodFactsCountry.AUSTRIA, + 'AUS': OpenFoodFactsCountry.AUSTRALIA, + 'ABW': OpenFoodFactsCountry.ARUBA, + 'ALA': OpenFoodFactsCountry.ALAND_ISLANDS, + 'AZE': OpenFoodFactsCountry.AZERBAIJAN, + 'BIH': OpenFoodFactsCountry.BOSNIA_AND_HERZEGOVINA, + 'BRB': OpenFoodFactsCountry.BARBADOS, + 'BGD': OpenFoodFactsCountry.BANGLADESH, + 'BEL': OpenFoodFactsCountry.BELGIUM, + 'BFA': OpenFoodFactsCountry.BURKINA_FASO, + 'BGR': OpenFoodFactsCountry.BULGARIA, + 'BHR': OpenFoodFactsCountry.BAHRAIN, + 'BDI': OpenFoodFactsCountry.BURUNDI, + 'BEN': OpenFoodFactsCountry.BENIN, + 'BLM': OpenFoodFactsCountry.SAINT_BARTHELEMY, + 'BMU': OpenFoodFactsCountry.BERMUDA, + 'BRN': OpenFoodFactsCountry.BRUNEI_DARUSSALAM, + 'BOL': OpenFoodFactsCountry.BOLIVIA, + 'BES': OpenFoodFactsCountry.BONAIRE, + 'BRA': OpenFoodFactsCountry.BRAZIL, + 'BHS': OpenFoodFactsCountry.BAHAMAS, + 'BTN': OpenFoodFactsCountry.BHUTAN, + 'BVT': OpenFoodFactsCountry.BOUVET_ISLAND, + 'BWA': OpenFoodFactsCountry.BOTSWANA, + 'BLR': OpenFoodFactsCountry.BELARUS, + 'BLZ': OpenFoodFactsCountry.BELIZE, + 'CAN': OpenFoodFactsCountry.CANADA, + 'CCK': OpenFoodFactsCountry.COCOS_ISLANDS, + 'COD': OpenFoodFactsCountry.DEMOCRATIC_REPUBLIC_OF_THE_CONGO, + 'CAF': OpenFoodFactsCountry.CENTRAL_AFRICAN_REPUBLIC, + 'COG': OpenFoodFactsCountry.CONGO, + 'CHE': OpenFoodFactsCountry.SWITZERLAND, + 'CIV': OpenFoodFactsCountry.COTE_D_IVOIRE, + 'COK': OpenFoodFactsCountry.COOK_ISLANDS, + 'CHL': OpenFoodFactsCountry.CHILE, + 'CMR': OpenFoodFactsCountry.CAMEROON, + 'CHN': OpenFoodFactsCountry.CHINA, + 'COL': OpenFoodFactsCountry.COLOMBIA, + 'CRI': OpenFoodFactsCountry.COSTA_RICA, + 'CUB': OpenFoodFactsCountry.CUBA, + 'CPV': OpenFoodFactsCountry.CABO_VERDE, + 'CUW': OpenFoodFactsCountry.CURACAO, + 'CXR': OpenFoodFactsCountry.CHRISTMAS_ISLAND, + 'CYP': OpenFoodFactsCountry.CYPRUS, + 'CZE': OpenFoodFactsCountry.CZECHIA, + 'DEU': OpenFoodFactsCountry.GERMANY, + 'DJI': OpenFoodFactsCountry.DJIBOUTI, + 'DNK': OpenFoodFactsCountry.DENMARK, + 'DMA': OpenFoodFactsCountry.DOMINICA, + 'DOM': OpenFoodFactsCountry.DOMINICAN_REPUBLIC, + 'DZA': OpenFoodFactsCountry.ALGERIA, + 'ECU': OpenFoodFactsCountry.ECUADOR, + 'EST': OpenFoodFactsCountry.ESTONIA, + 'EGY': OpenFoodFactsCountry.EGYPT, + 'ESH': OpenFoodFactsCountry.WESTERN_SAHARA, + 'ERI': OpenFoodFactsCountry.ERITREA, + 'ESP': OpenFoodFactsCountry.SPAIN, + 'ETH': OpenFoodFactsCountry.ETHIOPIA, + 'FIN': OpenFoodFactsCountry.FINLAND, + 'FJI': OpenFoodFactsCountry.FIJI, + 'FLK': OpenFoodFactsCountry.FALKLAND_ISLANDS, + 'FSM': OpenFoodFactsCountry.MICRONESIA, + 'FRO': OpenFoodFactsCountry.FAROE_ISLANDS, + 'FRA': OpenFoodFactsCountry.FRANCE, + 'GAB': OpenFoodFactsCountry.GABON, + 'GBR': OpenFoodFactsCountry.UNITED_KINGDOM, + 'GRD': OpenFoodFactsCountry.GRENADA, + 'GEO': OpenFoodFactsCountry.GEORGIA, + 'GUF': OpenFoodFactsCountry.FRENCH_GUIANA, + 'GGY': OpenFoodFactsCountry.GUERNSEY, + 'GHA': OpenFoodFactsCountry.GHANA, + 'GIB': OpenFoodFactsCountry.GIBRALTAR, + 'GRL': OpenFoodFactsCountry.GREENLAND, + 'GMB': OpenFoodFactsCountry.GAMBIA, + 'GIN': OpenFoodFactsCountry.GUINEA, + 'GLP': OpenFoodFactsCountry.GUADELOUPE, + 'GNQ': OpenFoodFactsCountry.EQUATORIAL_GUINEA, + 'GRC': OpenFoodFactsCountry.GREECE, + 'SGS': OpenFoodFactsCountry.SOUTH_GEORGIA, + 'GTM': OpenFoodFactsCountry.GUATEMALA, + 'GUM': OpenFoodFactsCountry.GUAM, + 'GNB': OpenFoodFactsCountry.GUINEA_BISSAU, + 'GUY': OpenFoodFactsCountry.GUYANA, + 'HKG': OpenFoodFactsCountry.HONG_KONG, + 'HMD': OpenFoodFactsCountry.HEARD_ISLAND, + 'HND': OpenFoodFactsCountry.HONDURAS, + 'HRV': OpenFoodFactsCountry.CROATIA, + 'HTI': OpenFoodFactsCountry.HAITI, + 'HUN': OpenFoodFactsCountry.HUNGARY, + 'IDN': OpenFoodFactsCountry.INDONESIA, + 'IRL': OpenFoodFactsCountry.IRELAND, + 'ISR': OpenFoodFactsCountry.ISRAEL, + 'IMN': OpenFoodFactsCountry.ISLE_OF_MAN, + 'IND': OpenFoodFactsCountry.INDIA, + 'IOT': OpenFoodFactsCountry.BRITISH_INDIAN_OCEAN_TERRITORY, + 'IRQ': OpenFoodFactsCountry.IRAQ, + 'IRN': OpenFoodFactsCountry.IRAN, + 'ISL': OpenFoodFactsCountry.ICELAND, + 'ITA': OpenFoodFactsCountry.ITALY, + 'JEY': OpenFoodFactsCountry.JERSEY, + 'JAM': OpenFoodFactsCountry.JAMAICA, + 'JOR': OpenFoodFactsCountry.JORDAN, + 'JPN': OpenFoodFactsCountry.JAPAN, + 'KEN': OpenFoodFactsCountry.KENYA, + 'KGZ': OpenFoodFactsCountry.KYRGYZSTAN, + 'KHM': OpenFoodFactsCountry.CAMBODIA, + 'KIR': OpenFoodFactsCountry.KIRIBATI, + 'COM': OpenFoodFactsCountry.COMOROS, + 'KNA': OpenFoodFactsCountry.SAINT_KITTS_AND_NEVIS, + 'PRK': OpenFoodFactsCountry.NORTH_KOREA, + 'KOR': OpenFoodFactsCountry.SOUTH_KOREA, + 'KWT': OpenFoodFactsCountry.KUWAIT, + 'CYM': OpenFoodFactsCountry.CAYMAN_ISLANDS, + 'KAZ': OpenFoodFactsCountry.KAZAKHSTAN, + 'LAO': OpenFoodFactsCountry.LAOS, + 'LBN': OpenFoodFactsCountry.LEBANON, + 'LCA': OpenFoodFactsCountry.SAINT_LUCIA, + 'LIE': OpenFoodFactsCountry.LIECHTENSTEIN, + 'LKA': OpenFoodFactsCountry.SRI_LANKA, + 'LBR': OpenFoodFactsCountry.LIBERIA, + 'LSO': OpenFoodFactsCountry.LESOTHO, + 'LTU': OpenFoodFactsCountry.LITHUANIA, + 'LUX': OpenFoodFactsCountry.LUXEMBOURG, + 'LVA': OpenFoodFactsCountry.LATVIA, + 'LBY': OpenFoodFactsCountry.LIBYA, + 'MAR': OpenFoodFactsCountry.MOROCCO, + 'MCO': OpenFoodFactsCountry.MONACO, + 'MDA': OpenFoodFactsCountry.MOLDOVA, + 'MNE': OpenFoodFactsCountry.MONTENEGRO, + 'MAF': OpenFoodFactsCountry.SAINT_MARTIN, + 'MDG': OpenFoodFactsCountry.MADAGASCAR, + 'MHL': OpenFoodFactsCountry.MARSHALL_ISLANDS, + 'MKD': OpenFoodFactsCountry.NORTH_MACEDONIA, + 'MLI': OpenFoodFactsCountry.MALI, + 'MMR': OpenFoodFactsCountry.MYANMAR, + 'MNG': OpenFoodFactsCountry.MONGOLIA, + 'MAC': OpenFoodFactsCountry.MACAO, + 'MNP': OpenFoodFactsCountry.NORTHERN_MARIANA_ISLANDS, + 'MTQ': OpenFoodFactsCountry.MARTINIQUE, + 'MRT': OpenFoodFactsCountry.MAURITANIA, + 'MSR': OpenFoodFactsCountry.MONTSERRAT, + 'MLT': OpenFoodFactsCountry.MALTA, + 'MUS': OpenFoodFactsCountry.MAURITIUS, + 'MDV': OpenFoodFactsCountry.MALDIVES, + 'MWI': OpenFoodFactsCountry.MALAWI, + 'MEX': OpenFoodFactsCountry.MEXICO, + 'MYS': OpenFoodFactsCountry.MALAYSIA, + 'MOZ': OpenFoodFactsCountry.MOZAMBIQUE, + 'NAM': OpenFoodFactsCountry.NAMIBIA, + 'NCL': OpenFoodFactsCountry.NEW_CALEDONIA, + 'NER': OpenFoodFactsCountry.NIGER, + 'NFK': OpenFoodFactsCountry.NORFOLK_ISLAND, + 'NGA': OpenFoodFactsCountry.NIGERIA, + 'NIC': OpenFoodFactsCountry.NICARAGUA, + 'NLD': OpenFoodFactsCountry.NETHERLANDS, + 'NOR': OpenFoodFactsCountry.NORWAY, + 'NPL': OpenFoodFactsCountry.NEPAL, + 'NRU': OpenFoodFactsCountry.NAURU, + 'NIU': OpenFoodFactsCountry.NIUE, + 'NZL': OpenFoodFactsCountry.NEW_ZEALAND, + 'OMN': OpenFoodFactsCountry.OMAN, + 'PAN': OpenFoodFactsCountry.PANAMA, + 'PER': OpenFoodFactsCountry.PERU, + 'PYF': OpenFoodFactsCountry.FRENCH_POLYNESIA, + 'PNG': OpenFoodFactsCountry.PAPUA_NEW_GUINEA, + 'PHL': OpenFoodFactsCountry.PHILIPPINES, + 'PAK': OpenFoodFactsCountry.PAKISTAN, + 'POL': OpenFoodFactsCountry.POLAND, + 'SPM': OpenFoodFactsCountry.SAINT_PIERRE_AND_MIQUELON, + 'PCN': OpenFoodFactsCountry.PITCAIRN, + 'PRI': OpenFoodFactsCountry.PUERTO_RICO, + 'PSE': OpenFoodFactsCountry.PALESTINE, + 'PRT': OpenFoodFactsCountry.PORTUGAL, + 'PLW': OpenFoodFactsCountry.PALAU, + 'PRY': OpenFoodFactsCountry.PARAGUAY, + 'QAT': OpenFoodFactsCountry.QATAR, + 'REU': OpenFoodFactsCountry.REUNION, + 'ROU': OpenFoodFactsCountry.ROMANIA, + 'SRB': OpenFoodFactsCountry.SERBIA, + 'RUS': OpenFoodFactsCountry.RUSSIA, + 'RWA': OpenFoodFactsCountry.RWANDA, + 'SAU': OpenFoodFactsCountry.SAUDI_ARABIA, + 'SLB': OpenFoodFactsCountry.SOLOMON_ISLANDS, + 'SYC': OpenFoodFactsCountry.SEYCHELLES, + 'SDN': OpenFoodFactsCountry.SUDAN, + 'SWE': OpenFoodFactsCountry.SWEDEN, + 'SGP': OpenFoodFactsCountry.SINGAPORE, + 'SHN': OpenFoodFactsCountry.SAINT_HELENA, + 'SVN': OpenFoodFactsCountry.SLOVENIA, + 'SJM': OpenFoodFactsCountry.SVALBARD_AND_JAN_MAYEN, + 'SVK': OpenFoodFactsCountry.SLOVAKIA, + 'SLE': OpenFoodFactsCountry.SIERRA_LEONE, + 'SMR': OpenFoodFactsCountry.SAN_MARINO, + 'SEN': OpenFoodFactsCountry.SENEGAL, + 'SOM': OpenFoodFactsCountry.SOMALIA, + 'SUR': OpenFoodFactsCountry.SURINAME, + 'SSD': OpenFoodFactsCountry.SOUTH_SUDAN, + 'STP': OpenFoodFactsCountry.SAO_TOME_AND_PRINCIPE, + 'SLV': OpenFoodFactsCountry.EL_SALVADOR, + 'SXM': OpenFoodFactsCountry.SINT_MAARTEN, + 'SYR': OpenFoodFactsCountry.SYRIA, + 'SWZ': OpenFoodFactsCountry.ESWATINI, + 'TCA': OpenFoodFactsCountry.TURKS_AND_CAICOS_ISLANDS, + 'TCD': OpenFoodFactsCountry.CHAD, + 'ATF': OpenFoodFactsCountry.FRENCH_SOUTHERN_TERRITORIES, + 'TGO': OpenFoodFactsCountry.TOGO, + 'THA': OpenFoodFactsCountry.THAILAND, + 'TJK': OpenFoodFactsCountry.TAJIKISTAN, + 'TKL': OpenFoodFactsCountry.TOKELAU, + 'TLS': OpenFoodFactsCountry.TIMOR_LESTE, + 'TKM': OpenFoodFactsCountry.TURKMENISTAN, + 'TUN': OpenFoodFactsCountry.TUNISIA, + 'TON': OpenFoodFactsCountry.TONGA, + 'TUR': OpenFoodFactsCountry.TURKEY, + 'TTO': OpenFoodFactsCountry.TRINIDAD_AND_TOBAGO, + 'TUV': OpenFoodFactsCountry.TUVALU, + 'TWN': OpenFoodFactsCountry.TAIWAN, + 'TZA': OpenFoodFactsCountry.TANZANIA, + 'UKR': OpenFoodFactsCountry.UKRAINE, + 'UGA': OpenFoodFactsCountry.UGANDA, + 'UMI': OpenFoodFactsCountry.UNITED_STATES_MINOR_OUTLYING_ISLANDS, + 'USA': OpenFoodFactsCountry.USA, + 'URY': OpenFoodFactsCountry.URUGUAY, + 'UZB': OpenFoodFactsCountry.UZBEKISTAN, + 'VAT': OpenFoodFactsCountry.HOLY_SEE, + 'VCT': OpenFoodFactsCountry.SAINT_VINCENT_AND_THE_GRENADINES, + 'VEN': OpenFoodFactsCountry.VENEZUELA, + 'VGB': OpenFoodFactsCountry.BRITISH_VIRGIN_ISLANDS, + 'VIR': OpenFoodFactsCountry.US_VIRGIN_ISLANDS, + 'VNM': OpenFoodFactsCountry.VIET_NAM, + 'VUT': OpenFoodFactsCountry.VANUATU, + 'WLF': OpenFoodFactsCountry.WALLIS_AND_FUTUNA, + 'WSM': OpenFoodFactsCountry.SAMOA, + 'YEM': OpenFoodFactsCountry.YEMEN, + 'MYT': OpenFoodFactsCountry.MAYOTTE, + 'ZAF': OpenFoodFactsCountry.SOUTH_AFRICA, + 'ZMB': OpenFoodFactsCountry.ZAMBIA, + 'ZWE': OpenFoodFactsCountry.ZIMBABWE, +}; +class Country { + final String name; + final String countryCode; + + const Country({ + required this.name, + required this.countryCode, + }); +} diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart new file mode 100644 index 000000000000..0b75452fc114 --- /dev/null +++ b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart @@ -0,0 +1,506 @@ +import 'package:openfoodfacts/openfoodfacts.dart'; + +extension OpenFoodFactsCountryNameExtension on OpenFoodFactsCountry { + String getEnglishName() { + switch (this) { + case OpenFoodFactsCountry.ANDORRA: + return 'Andorra'; + case OpenFoodFactsCountry.UNITED_ARAB_EMIRATES: + return 'United Arab Emirates'; + case OpenFoodFactsCountry.AFGHANISTAN: + return 'Afghanistan'; + case OpenFoodFactsCountry.ANTIGUA_AND_BARBUDA: + return 'Antigua and Barbuda'; + case OpenFoodFactsCountry.ANGUILLA: + return 'Anguilla'; + case OpenFoodFactsCountry.ALBANIA: + return 'Albania'; + case OpenFoodFactsCountry.ARMENIA: + return 'Armenia'; + case OpenFoodFactsCountry.ANGOLA: + return 'Angola'; + case OpenFoodFactsCountry.ANTARCTICA: + return 'Antarctica'; + case OpenFoodFactsCountry.ARGENTINA: + return 'Argentina'; + case OpenFoodFactsCountry.AMERICAN_SAMOA: + return 'American Samoa'; + case OpenFoodFactsCountry.AUSTRIA: + return 'Austria'; + case OpenFoodFactsCountry.AUSTRALIA: + return 'Australia'; + case OpenFoodFactsCountry.ARUBA: + return 'Aruba'; + case OpenFoodFactsCountry.ALAND_ISLANDS: + return 'Åland Islands'; + case OpenFoodFactsCountry.AZERBAIJAN: + return 'Azerbaijan'; + case OpenFoodFactsCountry.BOSNIA_AND_HERZEGOVINA: + return 'Bosnia and Herzegovina'; + case OpenFoodFactsCountry.BARBADOS: + return 'Barbados'; + case OpenFoodFactsCountry.BANGLADESH: + return 'Bangladesh'; + case OpenFoodFactsCountry.BELGIUM: + return 'Belgium'; + case OpenFoodFactsCountry.BURKINA_FASO: + return 'Burkina Faso'; + case OpenFoodFactsCountry.BULGARIA: + return 'Bulgaria'; + case OpenFoodFactsCountry.BAHRAIN: + return 'Bahrain'; + case OpenFoodFactsCountry.BURUNDI: + return 'Burundi'; + case OpenFoodFactsCountry.BENIN: + return 'Benin'; + case OpenFoodFactsCountry.SAINT_BARTHELEMY: + return 'Saint Barthélemy'; + case OpenFoodFactsCountry.BERMUDA: + return 'Bermuda'; + case OpenFoodFactsCountry.BRUNEI_DARUSSALAM: + return 'Brunei Darussalam'; + case OpenFoodFactsCountry.BOLIVIA: + return 'Bolivia'; + case OpenFoodFactsCountry.BONAIRE: + return 'Bonaire, Sint Eustatius and Saba'; + case OpenFoodFactsCountry.BRAZIL: + return 'Brazil'; + case OpenFoodFactsCountry.BAHAMAS: + return 'Bahamas'; + case OpenFoodFactsCountry.BHUTAN: + return 'Bhutan'; + case OpenFoodFactsCountry.BOUVET_ISLAND: + return 'Bouvet Island'; + case OpenFoodFactsCountry.BOTSWANA: + return 'Botswana'; + case OpenFoodFactsCountry.BELARUS: + return 'Belarus'; + case OpenFoodFactsCountry.BELIZE: + return 'Belize'; + case OpenFoodFactsCountry.CANADA: + return 'Canada'; + case OpenFoodFactsCountry.COCOS_ISLANDS: + return 'Cocos (Keeling) Islands'; + case OpenFoodFactsCountry.DEMOCRATIC_REPUBLIC_OF_THE_CONGO: + return 'Democratic Republic of the Congo'; + case OpenFoodFactsCountry.CENTRAL_AFRICAN_REPUBLIC: + return 'Central African Republic'; + case OpenFoodFactsCountry.CONGO: + return 'Congo'; + case OpenFoodFactsCountry.SWITZERLAND: + return 'Switzerland'; + case OpenFoodFactsCountry.COTE_D_IVOIRE: + return "Côte d'Ivoire"; + case OpenFoodFactsCountry.COOK_ISLANDS: + return 'Cook Islands'; + case OpenFoodFactsCountry.CHILE: + return 'Chile'; + case OpenFoodFactsCountry.CAMEROON: + return 'Cameroon'; + case OpenFoodFactsCountry.CHINA: + return 'China'; + case OpenFoodFactsCountry.COLOMBIA: + return 'Colombia'; + case OpenFoodFactsCountry.COSTA_RICA: + return 'Costa Rica'; + case OpenFoodFactsCountry.CUBA: + return 'Cuba'; + case OpenFoodFactsCountry.CABO_VERDE: + return 'Cabo Verde'; + case OpenFoodFactsCountry.CURACAO: + return 'Curaçao'; + case OpenFoodFactsCountry.CHRISTMAS_ISLAND: + return 'Christmas Island'; + case OpenFoodFactsCountry.CYPRUS: + return 'Cyprus'; + case OpenFoodFactsCountry.CZECHIA: + return 'Czechia'; + case OpenFoodFactsCountry.GERMANY: + return 'Germany'; + case OpenFoodFactsCountry.DJIBOUTI: + return 'Djibouti'; + case OpenFoodFactsCountry.DENMARK: + return 'Denmark'; + case OpenFoodFactsCountry.DOMINICA: + return 'Dominica'; + case OpenFoodFactsCountry.DOMINICAN_REPUBLIC: + return 'Dominican Republic'; + case OpenFoodFactsCountry.ALGERIA: + return 'Algeria'; + case OpenFoodFactsCountry.ECUADOR: + return 'Ecuador'; + case OpenFoodFactsCountry.ESTONIA: + return 'Estonia'; + case OpenFoodFactsCountry.EGYPT: + return 'Egypt'; + case OpenFoodFactsCountry.WESTERN_SAHARA: + return 'Western Sahara'; + case OpenFoodFactsCountry.ERITREA: + return 'Eritrea'; + case OpenFoodFactsCountry.SPAIN: + return 'Spain'; + case OpenFoodFactsCountry.ETHIOPIA: + return 'Ethiopia'; + case OpenFoodFactsCountry.FINLAND: + return 'Finland'; + case OpenFoodFactsCountry.FIJI: + return 'Fiji'; + case OpenFoodFactsCountry.FALKLAND_ISLANDS: + return 'Falkland Islands (Malvinas)'; + case OpenFoodFactsCountry.MICRONESIA: + return 'Micronesia'; + case OpenFoodFactsCountry.FAROE_ISLANDS: + return 'Faroe Islands'; + case OpenFoodFactsCountry.FRANCE: + return 'France'; + case OpenFoodFactsCountry.GABON: + return 'Gabon'; + case OpenFoodFactsCountry.UNITED_KINGDOM: + return 'United Kingdom'; + case OpenFoodFactsCountry.GRENADA: + return 'Grenada'; + case OpenFoodFactsCountry.GEORGIA: + return 'Georgia'; + case OpenFoodFactsCountry.FRENCH_GUIANA: + return 'French Guiana'; + case OpenFoodFactsCountry.GUERNSEY: + return 'Guernsey'; + case OpenFoodFactsCountry.GHANA: + return 'Ghana'; + case OpenFoodFactsCountry.GIBRALTAR: + return 'Gibraltar'; + case OpenFoodFactsCountry.GREENLAND: + return 'Greenland'; + case OpenFoodFactsCountry.GAMBIA: + return 'Gambia'; + case OpenFoodFactsCountry.GUINEA: + return 'Guinea'; + case OpenFoodFactsCountry.GUADELOUPE: + return 'Guadeloupe'; + case OpenFoodFactsCountry.EQUATORIAL_GUINEA: + return 'Equatorial Guinea'; + case OpenFoodFactsCountry.GREECE: + return 'Greece'; + case OpenFoodFactsCountry.SOUTH_GEORGIA: + return 'South Georgia and the South Sandwich Islands'; + case OpenFoodFactsCountry.GUATEMALA: + return 'Guatemala'; + case OpenFoodFactsCountry.GUAM: + return 'Guam'; + case OpenFoodFactsCountry.GUINEA_BISSAU: + return 'Guinea-Bissau'; + case OpenFoodFactsCountry.GUYANA: + return 'Guyana'; + case OpenFoodFactsCountry.HONG_KONG: + return 'Hong Kong'; + case OpenFoodFactsCountry.HEARD_ISLAND: + return 'Heard Island and McDonald Islands'; + case OpenFoodFactsCountry.HONDURAS: + return 'Honduras'; + case OpenFoodFactsCountry.CROATIA: + return 'Croatia'; + case OpenFoodFactsCountry.HAITI: + return 'Haiti'; + case OpenFoodFactsCountry.HUNGARY: + return 'Hungary'; + case OpenFoodFactsCountry.INDONESIA: + return 'Indonesia'; + case OpenFoodFactsCountry.IRELAND: + return 'Ireland'; + case OpenFoodFactsCountry.ISRAEL: + return 'Israel'; + case OpenFoodFactsCountry.ISLE_OF_MAN: + return 'Isle of Man'; + case OpenFoodFactsCountry.INDIA: + return 'India'; + case OpenFoodFactsCountry.BRITISH_INDIAN_OCEAN_TERRITORY: + return 'British Indian Ocean Territory'; + case OpenFoodFactsCountry.IRAQ: + return 'Iraq'; + case OpenFoodFactsCountry.IRAN: + return 'Iran'; + case OpenFoodFactsCountry.ICELAND: + return 'Iceland'; + case OpenFoodFactsCountry.ITALY: + return 'Italy'; + case OpenFoodFactsCountry.JERSEY: + return 'Jersey'; + case OpenFoodFactsCountry.JAMAICA: + return 'Jamaica'; + case OpenFoodFactsCountry.JORDAN: + return 'Jordan'; + case OpenFoodFactsCountry.JAPAN: + return 'Japan'; + case OpenFoodFactsCountry.KENYA: + return 'Kenya'; + case OpenFoodFactsCountry.KYRGYZSTAN: + return 'Kyrgyzstan'; + case OpenFoodFactsCountry.CAMBODIA: + return 'Cambodia'; + case OpenFoodFactsCountry.KIRIBATI: + return 'Kiribati'; + case OpenFoodFactsCountry.COMOROS: + return 'Comoros'; + case OpenFoodFactsCountry.SAINT_KITTS_AND_NEVIS: + return 'Saint Kitts and Nevis'; + case OpenFoodFactsCountry.NORTH_KOREA: + return 'North Korea'; + case OpenFoodFactsCountry.SOUTH_KOREA: + return 'South Korea'; + case OpenFoodFactsCountry.KUWAIT: + return 'Kuwait'; + case OpenFoodFactsCountry.CAYMAN_ISLANDS: + return 'Cayman Islands'; + case OpenFoodFactsCountry.KAZAKHSTAN: + return 'Kazakhstan'; + case OpenFoodFactsCountry.LAOS: + return 'Laos'; + case OpenFoodFactsCountry.LEBANON: + return 'Lebanon'; + case OpenFoodFactsCountry.SAINT_LUCIA: + return 'Saint Lucia'; + case OpenFoodFactsCountry.LIECHTENSTEIN: + return 'Liechtenstein'; + case OpenFoodFactsCountry.SRI_LANKA: + return 'Sri Lanka'; + case OpenFoodFactsCountry.LIBERIA: + return 'Liberia'; + case OpenFoodFactsCountry.LESOTHO: + return 'Lesotho'; + case OpenFoodFactsCountry.LITHUANIA: + return 'Lithuania'; + case OpenFoodFactsCountry.LUXEMBOURG: + return 'Luxembourg'; + case OpenFoodFactsCountry.LATVIA: + return 'Latvia'; + case OpenFoodFactsCountry.LIBYA: + return 'Libya'; + case OpenFoodFactsCountry.MOROCCO: + return 'Morocco'; + case OpenFoodFactsCountry.MONACO: + return 'Monaco'; + case OpenFoodFactsCountry.MOLDOVA: + return 'Moldova'; + case OpenFoodFactsCountry.MONTENEGRO: + return 'Montenegro'; + case OpenFoodFactsCountry.SAINT_MARTIN: + return 'Saint Martin'; + case OpenFoodFactsCountry.MADAGASCAR: + return 'Madagascar'; + case OpenFoodFactsCountry.MARSHALL_ISLANDS: + return 'Marshall Islands'; + case OpenFoodFactsCountry.NORTH_MACEDONIA: + return 'North Macedonia'; + case OpenFoodFactsCountry.MALI: + return 'Mali'; + case OpenFoodFactsCountry.MYANMAR: + return 'Myanmar'; + case OpenFoodFactsCountry.MONGOLIA: + return 'Mongolia'; + case OpenFoodFactsCountry.MACAO: + return 'Macao'; + case OpenFoodFactsCountry.NORTHERN_MARIANA_ISLANDS: + return 'Northern Mariana Islands'; + case OpenFoodFactsCountry.MARTINIQUE: + return 'Martinique'; + case OpenFoodFactsCountry.MAURITANIA: + return 'Mauritania'; + case OpenFoodFactsCountry.MONTSERRAT: + return 'Montserrat'; + case OpenFoodFactsCountry.MALTA: + return 'Malta'; + case OpenFoodFactsCountry.MAURITIUS: + return 'Mauritius'; + case OpenFoodFactsCountry.MALDIVES: + return 'Maldives'; + case OpenFoodFactsCountry.MALAWI: + return 'Malawi'; + case OpenFoodFactsCountry.MEXICO: + return 'Mexico'; + case OpenFoodFactsCountry.MALAYSIA: + return 'Malaysia'; + case OpenFoodFactsCountry.MOZAMBIQUE: + return 'Mozambique'; + case OpenFoodFactsCountry.NAMIBIA: + return 'Namibia'; + case OpenFoodFactsCountry.NEW_CALEDONIA: + return 'New Caledonia'; + case OpenFoodFactsCountry.NIGER: + return 'Niger'; + case OpenFoodFactsCountry.NORFOLK_ISLAND: + return 'Norfolk Island'; + case OpenFoodFactsCountry.NIGERIA: + return 'Nigeria'; + case OpenFoodFactsCountry.NICARAGUA: + return 'Nicaragua'; + case OpenFoodFactsCountry.NETHERLANDS: + return 'Netherlands'; + case OpenFoodFactsCountry.NORWAY: + return 'Norway'; + case OpenFoodFactsCountry.NEPAL: + return 'Nepal'; + case OpenFoodFactsCountry.NAURU: + return 'Nauru'; + case OpenFoodFactsCountry.NIUE: + return 'Niue'; + case OpenFoodFactsCountry.NEW_ZEALAND: + return 'New Zealand'; + case OpenFoodFactsCountry.OMAN: + return 'Oman'; + case OpenFoodFactsCountry.PANAMA: + return 'Panama'; + case OpenFoodFactsCountry.PERU: + return 'Peru'; + case OpenFoodFactsCountry.FRENCH_POLYNESIA: + return 'French Polynesia'; + case OpenFoodFactsCountry.PAPUA_NEW_GUINEA: + return 'Papua New Guinea'; + case OpenFoodFactsCountry.PHILIPPINES: + return 'Philippines'; + case OpenFoodFactsCountry.PAKISTAN: + return 'Pakistan'; + case OpenFoodFactsCountry.POLAND: + return 'Poland'; + case OpenFoodFactsCountry.SAINT_PIERRE_AND_MIQUELON: + return 'Saint Pierre and Miquelon'; + case OpenFoodFactsCountry.PITCAIRN: + return 'Pitcairn'; + case OpenFoodFactsCountry.PUERTO_RICO: + return 'Puerto Rico'; + case OpenFoodFactsCountry.PALESTINE: + return 'Palestine'; + case OpenFoodFactsCountry.PORTUGAL: + return 'Portugal'; + case OpenFoodFactsCountry.PALAU: + return 'Palau'; + case OpenFoodFactsCountry.PARAGUAY: + return 'Paraguay'; + case OpenFoodFactsCountry.QATAR: + return 'Qatar'; + case OpenFoodFactsCountry.REUNION: + return 'Réunion'; + case OpenFoodFactsCountry.ROMANIA: + return 'Romania'; + case OpenFoodFactsCountry.SERBIA: + return 'Serbia'; + case OpenFoodFactsCountry.RUSSIA: + return 'Russia'; + case OpenFoodFactsCountry.RWANDA: + return 'Rwanda'; + case OpenFoodFactsCountry.SAUDI_ARABIA: + return 'Saudi Arabia'; + case OpenFoodFactsCountry.SOLOMON_ISLANDS: + return 'Solomon Islands'; + case OpenFoodFactsCountry.SEYCHELLES: + return 'Seychelles'; + case OpenFoodFactsCountry.SUDAN: + return 'Sudan'; + case OpenFoodFactsCountry.SWEDEN: + return 'Sweden'; + case OpenFoodFactsCountry.SINGAPORE: + return 'Singapore'; + case OpenFoodFactsCountry.SAINT_HELENA: + return 'Saint Helena, Ascension and Tristan da Cunha'; + case OpenFoodFactsCountry.SLOVENIA: + return 'Slovenia'; + case OpenFoodFactsCountry.SVALBARD_AND_JAN_MAYEN: + return 'Svalbard and Jan Mayen'; + case OpenFoodFactsCountry.SLOVAKIA: + return 'Slovakia'; + case OpenFoodFactsCountry.SIERRA_LEONE: + return 'Sierra Leone'; + case OpenFoodFactsCountry.SAN_MARINO: + return 'San Marino'; + case OpenFoodFactsCountry.SENEGAL: + return 'Senegal'; + case OpenFoodFactsCountry.SOMALIA: + return 'Somalia'; + case OpenFoodFactsCountry.SURINAME: + return 'Suriname'; + case OpenFoodFactsCountry.SOUTH_SUDAN: + return 'South Sudan'; + case OpenFoodFactsCountry.SAO_TOME_AND_PRINCIPE: + return 'Sao Tome and Principe'; + case OpenFoodFactsCountry.EL_SALVADOR: + return 'El Salvador'; + case OpenFoodFactsCountry.SINT_MAARTEN: + return 'Sint Maarten'; + case OpenFoodFactsCountry.SYRIA: + return 'Syria'; + case OpenFoodFactsCountry.ESWATINI: + return 'Eswatini'; + case OpenFoodFactsCountry.TURKS_AND_CAICOS_ISLANDS: + return 'Turks and Caicos Islands'; + case OpenFoodFactsCountry.CHAD: + return 'Chad'; + case OpenFoodFactsCountry.FRENCH_SOUTHERN_TERRITORIES: + return 'French Southern Territories'; + case OpenFoodFactsCountry.TOGO: + return 'Togo'; + case OpenFoodFactsCountry.THAILAND: + return 'Thailand'; + case OpenFoodFactsCountry.TAJIKISTAN: + return 'Tajikistan'; + case OpenFoodFactsCountry.TOKELAU: + return 'Tokelau'; + case OpenFoodFactsCountry.TIMOR_LESTE: + return 'Timor-Leste'; + case OpenFoodFactsCountry.TURKMENISTAN: + return 'Turkmenistan'; + case OpenFoodFactsCountry.TUNISIA: + return 'Tunisia'; + case OpenFoodFactsCountry.TONGA: + return 'Tonga'; + case OpenFoodFactsCountry.TURKEY: + return 'Turkey'; + case OpenFoodFactsCountry.TRINIDAD_AND_TOBAGO: + return 'Trinidad and Tobago'; + case OpenFoodFactsCountry.TUVALU: + return 'Tuvalu'; + case OpenFoodFactsCountry.TAIWAN: + return 'Taiwan'; + case OpenFoodFactsCountry.TANZANIA: + return 'Tanzania'; + case OpenFoodFactsCountry.UKRAINE: + return 'Ukraine'; + case OpenFoodFactsCountry.UGANDA: + return 'Uganda'; + case OpenFoodFactsCountry.UNITED_STATES_MINOR_OUTLYING_ISLANDS: + return 'United States Minor Outlying Islands'; + case OpenFoodFactsCountry.USA: + return 'United States'; + case OpenFoodFactsCountry.URUGUAY: + return 'Uruguay'; + case OpenFoodFactsCountry.UZBEKISTAN: + return 'Uzbekistan'; + case OpenFoodFactsCountry.HOLY_SEE: + return 'Holy See'; + case OpenFoodFactsCountry.SAINT_VINCENT_AND_THE_GRENADINES: + return 'Saint Vincent and the Grenadines'; + case OpenFoodFactsCountry.VENEZUELA: + return 'Venezuela'; + case OpenFoodFactsCountry.BRITISH_VIRGIN_ISLANDS: + return 'British Virgin Islands'; + case OpenFoodFactsCountry.US_VIRGIN_ISLANDS: + return 'U.S. Virgin Islands'; + case OpenFoodFactsCountry.VIET_NAM: + return 'Vietnam'; + case OpenFoodFactsCountry.VANUATU: + return 'Vanuatu'; + case OpenFoodFactsCountry.WALLIS_AND_FUTUNA: + return 'Wallis and Futuna'; + case OpenFoodFactsCountry.SAMOA: + return 'Samoa'; + case OpenFoodFactsCountry.YEMEN: + return 'Yemen'; + case OpenFoodFactsCountry.MAYOTTE: + return 'Mayotte'; + case OpenFoodFactsCountry.SOUTH_AFRICA: + return 'South Africa'; + case OpenFoodFactsCountry.ZAMBIA: + return 'Zambia'; + case OpenFoodFactsCountry.ZIMBABWE: + return 'Zimbabwe'; + } + } +} diff --git a/packages/smooth_app/lib/pages/product/common/product_query_page.dart b/packages/smooth_app/lib/pages/product/common/product_query_page.dart index d7cb513ee821..8537824a9dce 100644 --- a/packages/smooth_app/lib/pages/product/common/product_query_page.dart +++ b/packages/smooth_app/lib/pages/product/common/product_query_page.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:iso_countries/iso_countries.dart'; +import 'package:l10n_countries/l10n_countries.dart'; import 'package:matomo_tracker/matomo_tracker.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:provider/provider.dart'; @@ -20,6 +20,7 @@ import 'package:smooth_app/generic_lib/widgets/smooth_card.dart'; import 'package:smooth_app/generic_lib/widgets/smooth_error_card.dart'; import 'package:smooth_app/helpers/analytics_helper.dart'; import 'package:smooth_app/pages/personalized_ranking_page.dart'; +import 'package:smooth_app/pages/preferences/country_selector/open_food_facts_country_map.dart'; import 'package:smooth_app/pages/product/common/loading_status.dart'; import 'package:smooth_app/pages/product/common/product_list_item_simple.dart'; import 'package:smooth_app/pages/product/common/product_query_page_helper.dart'; @@ -427,20 +428,34 @@ class _ProductQueryPageState extends State } Future _getTranslatedCountry() async { - if (_country == null) { + if (_country == null) return null; + + // Find the matching ISO3 code for the given _country + final String? iso3 = iso3ToCountry.entries + .firstWhere( + (entry) => entry.value == _country, + orElse: () => const MapEntry('', OpenFoodFactsCountry.UNITED_KINGDOM), + ) + .key; + + if (iso3!.isEmpty) { return null; } + + final CountriesLocaleMapper mapper = CountriesLocaleMapper(); final String locale = Localizations.localeOf(context).languageCode; - final List localizedCountries = - await IsoCountries.isoCountriesForLocale(locale); - for (final Country country in localizedCountries) { - if (country.countryCode.toLowerCase() == _country?.offTag.toLowerCase()) { - return country.name; - } - } - return null; + + final LocaleMap localized = mapper.localize( + {iso3}, + mainLocale: locale, + fallbackLocale: 'en', + ); + + return localized.values.firstOrNull; } + + Widget _getLargeButtonWithIcon(final _Action action) => SmoothLargeButtonWithIcon( text: action.text, diff --git a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart index a09ac22339cb..cb423a5af170 100644 --- a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart +++ b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart @@ -1,7 +1,6 @@ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:iso_countries/country.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:smooth_app/background/background_task_details.dart'; import 'package:smooth_app/data_models/preferences/user_preferences.dart'; @@ -10,6 +9,7 @@ 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/preferences/country_selector/country_selector.dart'; +import 'package:smooth_app/pages/preferences/country_selector/open_food_facts_country_map.dart'; import 'package:smooth_app/pages/product/multilingual_helper.dart'; import 'package:smooth_app/query/product_query.dart'; import 'package:smooth_app/resources/app_icons.dart' as icons; diff --git a/packages/smooth_app/pubspec.yaml b/packages/smooth_app/pubspec.yaml index f5acc43607e2..07b9abc874a2 100644 --- a/packages/smooth_app/pubspec.yaml +++ b/packages/smooth_app/pubspec.yaml @@ -27,7 +27,6 @@ dependencies: http: 1.3.0 http_parser: 4.1.2 image_picker: 1.1.2 - iso_countries: 2.2.0 latlong2: 0.9.1 matomo_tracker: 5.1.0 package_info_plus: 8.2.1 @@ -36,7 +35,7 @@ dependencies: photo_view: 0.15.0 uuid: 4.5.1 provider: 6.1.4 - sentry_flutter: 8.14.1 + sentry_flutter: 8.12.0 sqflite: 2.4.1 sqflite_common_ffi: 2.3.4+4 url_launcher: 6.3.1 @@ -101,6 +100,7 @@ dependencies: openfoodfacts: 3.20.0 + l10n_countries: ^1.0.0 # openfoodfacts: # path: ../../../openfoodfacts-dart From 380e83bd198d9127825251b825262076c15c51d7 Mon Sep 17 00:00:00 2001 From: pavaniroid Date: Sun, 13 Apr 2025 00:37:19 +0530 Subject: [PATCH 2/9] fix: apply reviewer suggestions. --- .../country_selector/country_selector.dart | 135 ++--- .../country_selector_provider.dart | 223 +++----- .../open_food_facts_country_map.dart | 262 --------- .../openfoodfacts_country_name_extension.dart | 510 +----------------- .../country_selector/tmp_country_iso3.dart | 255 +++++++++ .../product/common/product_query_page.dart | 18 +- .../product/simple_input_page_helpers.dart | 34 +- packages/smooth_app/pubspec.yaml | 5 +- 8 files changed, 430 insertions(+), 1012 deletions(-) delete mode 100644 packages/smooth_app/lib/pages/preferences/country_selector/open_food_facts_country_map.dart create mode 100644 packages/smooth_app/lib/pages/preferences/country_selector/tmp_country_iso3.dart diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart index e6eed1b8b35b..5e540511e430 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart @@ -1,18 +1,14 @@ import 'package:auto_size_text/auto_size_text.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' hide Listener; -import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:l10n_countries/l10n_countries.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:provider/provider.dart'; import 'package:smooth_app/data_models/preferences/user_preferences.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/helpers/provider_helper.dart'; -import 'package:smooth_app/pages/preferences/country_selector/open_food_facts_country_map.dart'; +import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart'; import 'package:smooth_app/pages/prices/emoji_helper.dart'; -import 'package:smooth_app/services/smooth_services.dart'; import 'package:smooth_app/widgets/selector_screen/smooth_screen_list_choice.dart'; import 'package:smooth_app/widgets/selector_screen/smooth_screen_selector_provider.dart'; import 'package:smooth_app/widgets/smooth_text.dart'; @@ -21,16 +17,14 @@ part 'country_selector_provider.dart'; /// A button that will open a list of countries and save it in the preferences. class CountrySelector extends StatelessWidget { - const CountrySelector({ - required this.forceCurrencyChange, - this.textStyle, - this.padding, - this.icon, - this.inkWellBorderRadius, - this.loadingHeight = 48.0, - this.autoValidate = true, - super.key, - }); + const CountrySelector( + {required this.forceCurrencyChange, + this.textStyle, + this.padding, + this.icon, + this.inkWellBorderRadius, + this.loadingHeight = 48.0, + this.autoValidate = true}); final TextStyle? textStyle; final EdgeInsetsGeometry? padding; @@ -52,20 +46,21 @@ class CountrySelector extends StatelessWidget { child: Consumer<_CountrySelectorProvider>( builder: (BuildContext context, _CountrySelectorProvider provider, _) { return switch (provider.value) { - PreferencesSelectorLoadingState _ => SizedBox( - height: loadingHeight, - child: const Center( - child: CircularProgressIndicator.adaptive(), + PreferencesSelectorLoadingState _ => SizedBox( + height: loadingHeight, + child: const Center( + child: CircularProgressIndicator.adaptive(), + ), + ), + PreferencesSelectorLoadedState _ => + _CountrySelectorButton( + icon: icon, + innerPadding: padding ?? EdgeInsets.zero, + textStyle: textStyle, + inkWellBorderRadius: inkWellBorderRadius, + forceCurrencyChange: forceCurrencyChange, + autoValidate: autoValidate, ), - ), - PreferencesSelectorLoadedState _ => _CountrySelectorButton( - icon: icon, - innerPadding: padding ?? EdgeInsets.zero, - textStyle: textStyle, - inkWellBorderRadius: inkWellBorderRadius, - forceCurrencyChange: forceCurrencyChange, - autoValidate: autoValidate, - ), }; }, ), @@ -102,19 +97,24 @@ class _CountrySelectorButton extends StatelessWidget { child: ConstrainedBox( constraints: const BoxConstraints(minHeight: 40.0), child: ConsumerValueNotifierFilter<_CountrySelectorProvider, - PreferencesSelectorState>( - buildWhen: (PreferencesSelectorState? previousValue, - PreferencesSelectorState currentValue) => - previousValue != null && - currentValue is! PreferencesSelectorEditingState && - (currentValue as PreferencesSelectorLoadedState) - .selectedItem != - (previousValue as PreferencesSelectorLoadedState) - .selectedItem, - builder: (_, PreferencesSelectorState value, __) { - final Country? country = - (value as PreferencesSelectorLoadedState) - .selectedItem; + PreferencesSelectorState>( + buildWhen: + (PreferencesSelectorState? previousValue, + PreferencesSelectorState + currentValue) => + previousValue != null && + currentValue is! PreferencesSelectorEditingState && + (currentValue as PreferencesSelectorLoadedState< + OpenFoodFactsCountry>) + .selectedItem != + (previousValue as PreferencesSelectorLoadedState< + OpenFoodFactsCountry>) + .selectedItem, + builder: + (_, PreferencesSelectorState value, __) { + final OpenFoodFactsCountry? country = (value + as PreferencesSelectorLoadedState) + .selectedItem; return Padding( padding: innerPadding, @@ -124,8 +124,7 @@ class _CountrySelectorButton extends StatelessWidget { SizedBox( width: IconTheme.of(context).size! + LARGE_SPACE, child: AutoSizeText( - EmojiHelper.getEmojiByCountryCode( - country.countryCode)!, + EmojiHelper.getEmojiByCountryCode(country.offTag)!, textAlign: TextAlign.center, style: TextStyle(fontSize: IconTheme.of(context).size), @@ -193,7 +192,7 @@ class _CountrySelectorButton extends StatelessWidget { /// (eg: the user uses the Android back button). if (newCountry == null) { context.read<_CountrySelectorProvider>().dismissSelectedItem(); - } else if (newCountry is Country) { + } else if (newCountry is OpenFoodFactsCountry) { _changeCurrencyIfRelevant(context, newCountry); } } @@ -201,11 +200,11 @@ class _CountrySelectorButton extends StatelessWidget { // TODO(g123k): move this to a dedicated Provider Future _changeCurrencyIfRelevant( final BuildContext context, - final Country country, + final OpenFoodFactsCountry country, ) async { final UserPreferences userPreferences = context.read(); final OpenFoodFactsCountry? offCountry = - OpenFoodFactsCountry.fromOffTag(country.countryCode); + OpenFoodFactsCountry.fromOffTag(country.offTag); final String? possibleCurrencyCode = offCountry?.currency?.name; if (possibleCurrencyCode == null) { @@ -261,12 +260,12 @@ class _CountrySelectorScreen extends StatelessWidget { Widget build(BuildContext context) { final AppLocalizations appLocalizations = AppLocalizations.of(context); - return SmoothSelectorScreen( + return SmoothSelectorScreen( provider: provider, title: appLocalizations.country_selector_title, itemBuilder: ( BuildContext context, - Country country, + OpenFoodFactsCountry country, bool selected, String filter, ) { @@ -275,14 +274,14 @@ class _CountrySelectorScreen extends StatelessWidget { Expanded( flex: 1, child: Text( - EmojiHelper.getEmojiByCountryCode(country.countryCode) ?? '', + EmojiHelper.getEmojiByCountryCode(country.offTag) ?? '', style: const TextStyle(fontSize: 25.0), ), ), Expanded( flex: 2, child: Text( - country.countryCode.toUpperCase(), + country.offTag.toUpperCase(), textAlign: TextAlign.center, maxLines: 1, overflow: TextOverflow.ellipsis, @@ -291,7 +290,8 @@ class _CountrySelectorScreen extends StatelessWidget { Expanded( flex: 7, child: TextHighlighter( - text: country.name, + text: country + .getLocalizedName(AppLocalizations.of(context).localeName), filter: filter, textStyle: const TextStyle( fontWeight: FontWeight.w600, @@ -301,35 +301,36 @@ class _CountrySelectorScreen extends StatelessWidget { ], ); }, - itemsFilter: (List list, Country? selectedItem, - Country? selectedItemOverride, String filter) => + itemsFilter: (List list, + OpenFoodFactsCountry? selectedItem, + OpenFoodFactsCountry? selectedItemOverride, + String filter) => _filterCountries( - list, - selectedItem, - selectedItemOverride, - filter, - ), + list, selectedItem, selectedItemOverride, filter, context), ); } - Iterable _filterCountries( - List countries, - Country? userCountry, - Country? selectedCountry, - String? filter, - ) { + Iterable _filterCountries( + List countries, + OpenFoodFactsCountry? userCountry, + OpenFoodFactsCountry? selectedCountry, + String? filter, + BuildContext context) { if (filter == null || filter.isEmpty) { return countries; } return countries.where( - (Country country) => + (OpenFoodFactsCountry country) => country == userCountry || country == selectedCountry || - country.name.toLowerCase().contains( + country + .getLocalizedName(AppLocalizations.of(context).localeName) + .toLowerCase() + .contains( filter.toLowerCase(), ) || - country.countryCode.toLowerCase().contains( + country.offTag.toLowerCase().contains( filter.toLowerCase(), ), ); diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart index 9dd927f90e5c..9fc49eeebfe3 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart @@ -6,7 +6,9 @@ part of 'country_selector.dart'; /// * [_CountrySelectorLoadedState]: countries loaded and/or saved /// * [_CountrySelectorEditingState]: the user has selected a country /// (temporary selection) -class _CountrySelectorProvider extends PreferencesSelectorProvider { + +class _CountrySelectorProvider + extends PreferencesSelectorProvider { _CountrySelectorProvider({ required super.preferences, required super.autoValidate, @@ -28,14 +30,13 @@ class _CountrySelectorProvider extends PreferencesSelectorProvider { userCountryCode = newCountryCode; userAppLanguageCode = newLanguageCode; - if (value is PreferencesSelectorInitialState) { + if (value is PreferencesSelectorInitialState) { return loadValues(); } else { - final PreferencesSelectorLoadedState state = - value as PreferencesSelectorLoadedState; + final state = + value as PreferencesSelectorLoadedState; - /// Reorder items - final List countries = state.items; + final List countries = state.items; _reorderCountries(countries, userCountryCode); value = state.copyWith( @@ -47,168 +48,94 @@ class _CountrySelectorProvider extends PreferencesSelectorProvider { } @override - Future> onLoadValues() async { - final List localizedCountries = await CountriesHelper.getCountries( - userAppLanguageCode, - ) ?? - []; - - final List countries = await compute( - _reformatCountries, - (localizedCountries, userCountryCode), - ); - - return countries; - } - - static Future> _reformatCountries( - (List, String?) localizedCountriesAndUserCountry, - ) async { - final List countries = - _sanitizeCountriesList(localizedCountriesAndUserCountry.$1); - _reorderCountries(countries, localizedCountriesAndUserCountry.$2); + Future> onLoadValues() async { + final List countries = + _sanitizeAndSortCountries(userAppLanguageCode); return countries; } - /// Sanitizes the country list, but without reordering it. - /// * by removing countries that are not in [OpenFoodFactsCountry] - /// * and providing a fallback English name for countries that are in - /// [OpenFoodFactsCountry] but not in [localizedCountries]. - static List _sanitizeCountriesList( - List localizedCountries, - ) { - final List finalCountriesList = []; - final Map oFFIsoCodeToCountry = - {}; - final Map localizedIsoCodeToCountry = {}; - for (final OpenFoodFactsCountry c in OpenFoodFactsCountry.values) { - oFFIsoCodeToCountry[c.offTag.toLowerCase()] = c; - } - for (final Country c in localizedCountries) { - localizedIsoCodeToCountry.putIfAbsent( - c.countryCode.toLowerCase(), () => c); - } - for (final String countryCode in oFFIsoCodeToCountry.keys) { - final Country? localizedCountry = localizedIsoCodeToCountry[countryCode]; - if (localizedCountry == null) { - // No localization for the country name was found, use English name as - // default. - String countryName = oFFIsoCodeToCountry[countryCode] - .toString() - .replaceAll('OpenFoodFactsCountry.', '') - .replaceAll('_', ' '); - countryName = - '${countryName[0].toUpperCase()}${countryName.substring(1).toLowerCase()}'; - finalCountriesList.add( - Country( - name: _fixCountryName(countryName), - countryCode: _fixCountryCode(countryCode)), - ); - continue; - } - final String fixedCountryCode = _fixCountryCode(countryCode); - final Country country = fixedCountryCode == countryCode - ? localizedCountry - : Country(name: localizedCountry.name, countryCode: countryCode); - finalCountriesList.add(country); - } - - return finalCountriesList; - } + static List _sanitizeAndSortCountries(String? locale) { + final List countries = + List.from(OpenFoodFactsCountry.values); - /// Fix the countryCode if needed so Backend can process it. - static String _fixCountryCode(String countryCode) { - // 'gb' is handled as 'uk' in the backend. - if (countryCode == 'gb') { - countryCode = 'uk'; - } - return countryCode; - } + countries.sort( + (a, b) => a + .getLocalizedName(locale ?? 'en') + .compareTo(b.getLocalizedName(locale ?? 'en')), + ); - /// Fix the issues where United Kingdom appears with lowercase 'k'. - static String _fixCountryName(String countryName) { - if (countryName == 'United kingdom') { - countryName = 'United Kingdom'; - } - return countryName; + return countries; } - /// Reorder countries alphabetically, bring user's locale country to top. static void _reorderCountries( - List countries, + List countries, String? userCountryCode, ) { countries.sort( - (final Country a, final Country b) { - if (a.countryCode == userCountryCode) { - return -1; - } - if (b.countryCode == userCountryCode) { - return 1; - } - return a.name.compareTo(b.name); + (a, b) { + if (a.offTag == userCountryCode) return -1; + if (b.offTag == userCountryCode) return 1; + return a.getLocalizedName('en').compareTo(b.getLocalizedName('en')); }, ); } @override - Country getSelectedValue(List countries) { + OpenFoodFactsCountry getSelectedValue(List countries) { if (userCountryCode != null) { - for (final Country country in countries) { - if (country.countryCode.toLowerCase() == - userCountryCode?.toLowerCase()) { - return country; - } - } + return countries.firstWhere( + (country) => + country.offTag.toLowerCase() == userCountryCode?.toLowerCase(), + orElse: () => countries.first, + ); } - return countries[0]; + return countries.first; } @override - Future onSaveItem(Country country) => preferences.setUserCountryCode( - country.countryCode, - ); + Future onSaveItem(OpenFoodFactsCountry country) => + preferences.setUserCountryCode(country.offTag); } -class CountriesHelper { - const CountriesHelper._(); - - static Future?> getCountries(String? userLanguageCode) async { - try { - final CountriesLocaleMapper mapper = CountriesLocaleMapper(); - - // Use the ISO3 codes from your custom map - final Set iso3Codes = iso3ToCountry.keys.toSet(); - - final LocaleMap localized = mapper.localize( - iso3Codes, - mainLocale: userLanguageCode ?? 'en', - fallbackLocale: 'en', - ); - - // Build the list using your existing OpenFoodFactsCountry mapping - final List countriesList = localized.entries.map((entry) { - final String iso3 = entry.key.isoCode; // like 'IND' - final String localizedName = entry.value; - - final OpenFoodFactsCountry? offCountry = iso3ToCountry[iso3]; - final String alpha2 = offCountry?.offTag.toUpperCase() ?? 'UN'; - - return Country(name: localizedName, countryCode: alpha2); - }).toList(); - - return countriesList; - } on MissingPluginException catch (_) { - // Locales are not implemented on desktop and web - return [ - const Country(name: 'United States', countryCode: 'US'), - const Country(name: 'France', countryCode: 'FR'), - const Country(name: 'Germany', countryCode: 'DE'), - const Country(name: 'India', countryCode: 'IN'), - ]; - } catch (e) { - Logs.e('Failed to load countries', ex: e); - return null; - } - } -} +// class CountriesHelper { +// const CountriesHelper._(); +// +// static Future?> getCountries(String? userLanguageCode) async { +// try { +// final CountriesLocaleMapper mapper = CountriesLocaleMapper(); +// +// // Use the ISO3 codes from your custom map +// final Set iso3Codes = iso3ToCountry.keys.toSet(); +// +// final LocaleMap localized = mapper.localize( +// iso3Codes, +// mainLocale: userLanguageCode ?? 'en', +// fallbackLocale: 'en', +// ); +// +// // Build the list using your existing OpenFoodFactsCountry mapping +// final List countriesList = localized.entries.map((entry) { +// final String iso3 = entry.key.isoCode; // like 'IND' +// final String localizedName = entry.value; +// +// final OpenFoodFactsCountry? offCountry = iso3ToCountry[iso3]; +// final String alpha2 = offCountry?.offTag.toUpperCase() ?? 'UN'; +// +// return Country(name: localizedName, countryCode: alpha2); +// }).toList(); +// +// return countriesList; +// } on MissingPluginException catch (_) { +// // Locales are not implemented on desktop and web +// return [ +// const Country(name: 'United States', countryCode: 'US'), +// const Country(name: 'France', countryCode: 'FR'), +// const Country(name: 'Germany', countryCode: 'DE'), +// const Country(name: 'India', countryCode: 'IN'), +// ]; +// } catch (e) { +// Logs.e('Failed to load countries', ex: e); +// return null; +// } +// } +// } diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/open_food_facts_country_map.dart b/packages/smooth_app/lib/pages/preferences/country_selector/open_food_facts_country_map.dart deleted file mode 100644 index 388fe3998ecc..000000000000 --- a/packages/smooth_app/lib/pages/preferences/country_selector/open_food_facts_country_map.dart +++ /dev/null @@ -1,262 +0,0 @@ -import 'package:openfoodfacts/openfoodfacts.dart'; - -const Map iso3ToCountry = { - 'AND': OpenFoodFactsCountry.ANDORRA, - 'ARE': OpenFoodFactsCountry.UNITED_ARAB_EMIRATES, - 'AFG': OpenFoodFactsCountry.AFGHANISTAN, - 'ATG': OpenFoodFactsCountry.ANTIGUA_AND_BARBUDA, - 'AIA': OpenFoodFactsCountry.ANGUILLA, - 'ALB': OpenFoodFactsCountry.ALBANIA, - 'ARM': OpenFoodFactsCountry.ARMENIA, - 'AGO': OpenFoodFactsCountry.ANGOLA, - 'ATA': OpenFoodFactsCountry.ANTARCTICA, - 'ARG': OpenFoodFactsCountry.ARGENTINA, - 'ASM': OpenFoodFactsCountry.AMERICAN_SAMOA, - 'AUT': OpenFoodFactsCountry.AUSTRIA, - 'AUS': OpenFoodFactsCountry.AUSTRALIA, - 'ABW': OpenFoodFactsCountry.ARUBA, - 'ALA': OpenFoodFactsCountry.ALAND_ISLANDS, - 'AZE': OpenFoodFactsCountry.AZERBAIJAN, - 'BIH': OpenFoodFactsCountry.BOSNIA_AND_HERZEGOVINA, - 'BRB': OpenFoodFactsCountry.BARBADOS, - 'BGD': OpenFoodFactsCountry.BANGLADESH, - 'BEL': OpenFoodFactsCountry.BELGIUM, - 'BFA': OpenFoodFactsCountry.BURKINA_FASO, - 'BGR': OpenFoodFactsCountry.BULGARIA, - 'BHR': OpenFoodFactsCountry.BAHRAIN, - 'BDI': OpenFoodFactsCountry.BURUNDI, - 'BEN': OpenFoodFactsCountry.BENIN, - 'BLM': OpenFoodFactsCountry.SAINT_BARTHELEMY, - 'BMU': OpenFoodFactsCountry.BERMUDA, - 'BRN': OpenFoodFactsCountry.BRUNEI_DARUSSALAM, - 'BOL': OpenFoodFactsCountry.BOLIVIA, - 'BES': OpenFoodFactsCountry.BONAIRE, - 'BRA': OpenFoodFactsCountry.BRAZIL, - 'BHS': OpenFoodFactsCountry.BAHAMAS, - 'BTN': OpenFoodFactsCountry.BHUTAN, - 'BVT': OpenFoodFactsCountry.BOUVET_ISLAND, - 'BWA': OpenFoodFactsCountry.BOTSWANA, - 'BLR': OpenFoodFactsCountry.BELARUS, - 'BLZ': OpenFoodFactsCountry.BELIZE, - 'CAN': OpenFoodFactsCountry.CANADA, - 'CCK': OpenFoodFactsCountry.COCOS_ISLANDS, - 'COD': OpenFoodFactsCountry.DEMOCRATIC_REPUBLIC_OF_THE_CONGO, - 'CAF': OpenFoodFactsCountry.CENTRAL_AFRICAN_REPUBLIC, - 'COG': OpenFoodFactsCountry.CONGO, - 'CHE': OpenFoodFactsCountry.SWITZERLAND, - 'CIV': OpenFoodFactsCountry.COTE_D_IVOIRE, - 'COK': OpenFoodFactsCountry.COOK_ISLANDS, - 'CHL': OpenFoodFactsCountry.CHILE, - 'CMR': OpenFoodFactsCountry.CAMEROON, - 'CHN': OpenFoodFactsCountry.CHINA, - 'COL': OpenFoodFactsCountry.COLOMBIA, - 'CRI': OpenFoodFactsCountry.COSTA_RICA, - 'CUB': OpenFoodFactsCountry.CUBA, - 'CPV': OpenFoodFactsCountry.CABO_VERDE, - 'CUW': OpenFoodFactsCountry.CURACAO, - 'CXR': OpenFoodFactsCountry.CHRISTMAS_ISLAND, - 'CYP': OpenFoodFactsCountry.CYPRUS, - 'CZE': OpenFoodFactsCountry.CZECHIA, - 'DEU': OpenFoodFactsCountry.GERMANY, - 'DJI': OpenFoodFactsCountry.DJIBOUTI, - 'DNK': OpenFoodFactsCountry.DENMARK, - 'DMA': OpenFoodFactsCountry.DOMINICA, - 'DOM': OpenFoodFactsCountry.DOMINICAN_REPUBLIC, - 'DZA': OpenFoodFactsCountry.ALGERIA, - 'ECU': OpenFoodFactsCountry.ECUADOR, - 'EST': OpenFoodFactsCountry.ESTONIA, - 'EGY': OpenFoodFactsCountry.EGYPT, - 'ESH': OpenFoodFactsCountry.WESTERN_SAHARA, - 'ERI': OpenFoodFactsCountry.ERITREA, - 'ESP': OpenFoodFactsCountry.SPAIN, - 'ETH': OpenFoodFactsCountry.ETHIOPIA, - 'FIN': OpenFoodFactsCountry.FINLAND, - 'FJI': OpenFoodFactsCountry.FIJI, - 'FLK': OpenFoodFactsCountry.FALKLAND_ISLANDS, - 'FSM': OpenFoodFactsCountry.MICRONESIA, - 'FRO': OpenFoodFactsCountry.FAROE_ISLANDS, - 'FRA': OpenFoodFactsCountry.FRANCE, - 'GAB': OpenFoodFactsCountry.GABON, - 'GBR': OpenFoodFactsCountry.UNITED_KINGDOM, - 'GRD': OpenFoodFactsCountry.GRENADA, - 'GEO': OpenFoodFactsCountry.GEORGIA, - 'GUF': OpenFoodFactsCountry.FRENCH_GUIANA, - 'GGY': OpenFoodFactsCountry.GUERNSEY, - 'GHA': OpenFoodFactsCountry.GHANA, - 'GIB': OpenFoodFactsCountry.GIBRALTAR, - 'GRL': OpenFoodFactsCountry.GREENLAND, - 'GMB': OpenFoodFactsCountry.GAMBIA, - 'GIN': OpenFoodFactsCountry.GUINEA, - 'GLP': OpenFoodFactsCountry.GUADELOUPE, - 'GNQ': OpenFoodFactsCountry.EQUATORIAL_GUINEA, - 'GRC': OpenFoodFactsCountry.GREECE, - 'SGS': OpenFoodFactsCountry.SOUTH_GEORGIA, - 'GTM': OpenFoodFactsCountry.GUATEMALA, - 'GUM': OpenFoodFactsCountry.GUAM, - 'GNB': OpenFoodFactsCountry.GUINEA_BISSAU, - 'GUY': OpenFoodFactsCountry.GUYANA, - 'HKG': OpenFoodFactsCountry.HONG_KONG, - 'HMD': OpenFoodFactsCountry.HEARD_ISLAND, - 'HND': OpenFoodFactsCountry.HONDURAS, - 'HRV': OpenFoodFactsCountry.CROATIA, - 'HTI': OpenFoodFactsCountry.HAITI, - 'HUN': OpenFoodFactsCountry.HUNGARY, - 'IDN': OpenFoodFactsCountry.INDONESIA, - 'IRL': OpenFoodFactsCountry.IRELAND, - 'ISR': OpenFoodFactsCountry.ISRAEL, - 'IMN': OpenFoodFactsCountry.ISLE_OF_MAN, - 'IND': OpenFoodFactsCountry.INDIA, - 'IOT': OpenFoodFactsCountry.BRITISH_INDIAN_OCEAN_TERRITORY, - 'IRQ': OpenFoodFactsCountry.IRAQ, - 'IRN': OpenFoodFactsCountry.IRAN, - 'ISL': OpenFoodFactsCountry.ICELAND, - 'ITA': OpenFoodFactsCountry.ITALY, - 'JEY': OpenFoodFactsCountry.JERSEY, - 'JAM': OpenFoodFactsCountry.JAMAICA, - 'JOR': OpenFoodFactsCountry.JORDAN, - 'JPN': OpenFoodFactsCountry.JAPAN, - 'KEN': OpenFoodFactsCountry.KENYA, - 'KGZ': OpenFoodFactsCountry.KYRGYZSTAN, - 'KHM': OpenFoodFactsCountry.CAMBODIA, - 'KIR': OpenFoodFactsCountry.KIRIBATI, - 'COM': OpenFoodFactsCountry.COMOROS, - 'KNA': OpenFoodFactsCountry.SAINT_KITTS_AND_NEVIS, - 'PRK': OpenFoodFactsCountry.NORTH_KOREA, - 'KOR': OpenFoodFactsCountry.SOUTH_KOREA, - 'KWT': OpenFoodFactsCountry.KUWAIT, - 'CYM': OpenFoodFactsCountry.CAYMAN_ISLANDS, - 'KAZ': OpenFoodFactsCountry.KAZAKHSTAN, - 'LAO': OpenFoodFactsCountry.LAOS, - 'LBN': OpenFoodFactsCountry.LEBANON, - 'LCA': OpenFoodFactsCountry.SAINT_LUCIA, - 'LIE': OpenFoodFactsCountry.LIECHTENSTEIN, - 'LKA': OpenFoodFactsCountry.SRI_LANKA, - 'LBR': OpenFoodFactsCountry.LIBERIA, - 'LSO': OpenFoodFactsCountry.LESOTHO, - 'LTU': OpenFoodFactsCountry.LITHUANIA, - 'LUX': OpenFoodFactsCountry.LUXEMBOURG, - 'LVA': OpenFoodFactsCountry.LATVIA, - 'LBY': OpenFoodFactsCountry.LIBYA, - 'MAR': OpenFoodFactsCountry.MOROCCO, - 'MCO': OpenFoodFactsCountry.MONACO, - 'MDA': OpenFoodFactsCountry.MOLDOVA, - 'MNE': OpenFoodFactsCountry.MONTENEGRO, - 'MAF': OpenFoodFactsCountry.SAINT_MARTIN, - 'MDG': OpenFoodFactsCountry.MADAGASCAR, - 'MHL': OpenFoodFactsCountry.MARSHALL_ISLANDS, - 'MKD': OpenFoodFactsCountry.NORTH_MACEDONIA, - 'MLI': OpenFoodFactsCountry.MALI, - 'MMR': OpenFoodFactsCountry.MYANMAR, - 'MNG': OpenFoodFactsCountry.MONGOLIA, - 'MAC': OpenFoodFactsCountry.MACAO, - 'MNP': OpenFoodFactsCountry.NORTHERN_MARIANA_ISLANDS, - 'MTQ': OpenFoodFactsCountry.MARTINIQUE, - 'MRT': OpenFoodFactsCountry.MAURITANIA, - 'MSR': OpenFoodFactsCountry.MONTSERRAT, - 'MLT': OpenFoodFactsCountry.MALTA, - 'MUS': OpenFoodFactsCountry.MAURITIUS, - 'MDV': OpenFoodFactsCountry.MALDIVES, - 'MWI': OpenFoodFactsCountry.MALAWI, - 'MEX': OpenFoodFactsCountry.MEXICO, - 'MYS': OpenFoodFactsCountry.MALAYSIA, - 'MOZ': OpenFoodFactsCountry.MOZAMBIQUE, - 'NAM': OpenFoodFactsCountry.NAMIBIA, - 'NCL': OpenFoodFactsCountry.NEW_CALEDONIA, - 'NER': OpenFoodFactsCountry.NIGER, - 'NFK': OpenFoodFactsCountry.NORFOLK_ISLAND, - 'NGA': OpenFoodFactsCountry.NIGERIA, - 'NIC': OpenFoodFactsCountry.NICARAGUA, - 'NLD': OpenFoodFactsCountry.NETHERLANDS, - 'NOR': OpenFoodFactsCountry.NORWAY, - 'NPL': OpenFoodFactsCountry.NEPAL, - 'NRU': OpenFoodFactsCountry.NAURU, - 'NIU': OpenFoodFactsCountry.NIUE, - 'NZL': OpenFoodFactsCountry.NEW_ZEALAND, - 'OMN': OpenFoodFactsCountry.OMAN, - 'PAN': OpenFoodFactsCountry.PANAMA, - 'PER': OpenFoodFactsCountry.PERU, - 'PYF': OpenFoodFactsCountry.FRENCH_POLYNESIA, - 'PNG': OpenFoodFactsCountry.PAPUA_NEW_GUINEA, - 'PHL': OpenFoodFactsCountry.PHILIPPINES, - 'PAK': OpenFoodFactsCountry.PAKISTAN, - 'POL': OpenFoodFactsCountry.POLAND, - 'SPM': OpenFoodFactsCountry.SAINT_PIERRE_AND_MIQUELON, - 'PCN': OpenFoodFactsCountry.PITCAIRN, - 'PRI': OpenFoodFactsCountry.PUERTO_RICO, - 'PSE': OpenFoodFactsCountry.PALESTINE, - 'PRT': OpenFoodFactsCountry.PORTUGAL, - 'PLW': OpenFoodFactsCountry.PALAU, - 'PRY': OpenFoodFactsCountry.PARAGUAY, - 'QAT': OpenFoodFactsCountry.QATAR, - 'REU': OpenFoodFactsCountry.REUNION, - 'ROU': OpenFoodFactsCountry.ROMANIA, - 'SRB': OpenFoodFactsCountry.SERBIA, - 'RUS': OpenFoodFactsCountry.RUSSIA, - 'RWA': OpenFoodFactsCountry.RWANDA, - 'SAU': OpenFoodFactsCountry.SAUDI_ARABIA, - 'SLB': OpenFoodFactsCountry.SOLOMON_ISLANDS, - 'SYC': OpenFoodFactsCountry.SEYCHELLES, - 'SDN': OpenFoodFactsCountry.SUDAN, - 'SWE': OpenFoodFactsCountry.SWEDEN, - 'SGP': OpenFoodFactsCountry.SINGAPORE, - 'SHN': OpenFoodFactsCountry.SAINT_HELENA, - 'SVN': OpenFoodFactsCountry.SLOVENIA, - 'SJM': OpenFoodFactsCountry.SVALBARD_AND_JAN_MAYEN, - 'SVK': OpenFoodFactsCountry.SLOVAKIA, - 'SLE': OpenFoodFactsCountry.SIERRA_LEONE, - 'SMR': OpenFoodFactsCountry.SAN_MARINO, - 'SEN': OpenFoodFactsCountry.SENEGAL, - 'SOM': OpenFoodFactsCountry.SOMALIA, - 'SUR': OpenFoodFactsCountry.SURINAME, - 'SSD': OpenFoodFactsCountry.SOUTH_SUDAN, - 'STP': OpenFoodFactsCountry.SAO_TOME_AND_PRINCIPE, - 'SLV': OpenFoodFactsCountry.EL_SALVADOR, - 'SXM': OpenFoodFactsCountry.SINT_MAARTEN, - 'SYR': OpenFoodFactsCountry.SYRIA, - 'SWZ': OpenFoodFactsCountry.ESWATINI, - 'TCA': OpenFoodFactsCountry.TURKS_AND_CAICOS_ISLANDS, - 'TCD': OpenFoodFactsCountry.CHAD, - 'ATF': OpenFoodFactsCountry.FRENCH_SOUTHERN_TERRITORIES, - 'TGO': OpenFoodFactsCountry.TOGO, - 'THA': OpenFoodFactsCountry.THAILAND, - 'TJK': OpenFoodFactsCountry.TAJIKISTAN, - 'TKL': OpenFoodFactsCountry.TOKELAU, - 'TLS': OpenFoodFactsCountry.TIMOR_LESTE, - 'TKM': OpenFoodFactsCountry.TURKMENISTAN, - 'TUN': OpenFoodFactsCountry.TUNISIA, - 'TON': OpenFoodFactsCountry.TONGA, - 'TUR': OpenFoodFactsCountry.TURKEY, - 'TTO': OpenFoodFactsCountry.TRINIDAD_AND_TOBAGO, - 'TUV': OpenFoodFactsCountry.TUVALU, - 'TWN': OpenFoodFactsCountry.TAIWAN, - 'TZA': OpenFoodFactsCountry.TANZANIA, - 'UKR': OpenFoodFactsCountry.UKRAINE, - 'UGA': OpenFoodFactsCountry.UGANDA, - 'UMI': OpenFoodFactsCountry.UNITED_STATES_MINOR_OUTLYING_ISLANDS, - 'USA': OpenFoodFactsCountry.USA, - 'URY': OpenFoodFactsCountry.URUGUAY, - 'UZB': OpenFoodFactsCountry.UZBEKISTAN, - 'VAT': OpenFoodFactsCountry.HOLY_SEE, - 'VCT': OpenFoodFactsCountry.SAINT_VINCENT_AND_THE_GRENADINES, - 'VEN': OpenFoodFactsCountry.VENEZUELA, - 'VGB': OpenFoodFactsCountry.BRITISH_VIRGIN_ISLANDS, - 'VIR': OpenFoodFactsCountry.US_VIRGIN_ISLANDS, - 'VNM': OpenFoodFactsCountry.VIET_NAM, - 'VUT': OpenFoodFactsCountry.VANUATU, - 'WLF': OpenFoodFactsCountry.WALLIS_AND_FUTUNA, - 'WSM': OpenFoodFactsCountry.SAMOA, - 'YEM': OpenFoodFactsCountry.YEMEN, - 'MYT': OpenFoodFactsCountry.MAYOTTE, - 'ZAF': OpenFoodFactsCountry.SOUTH_AFRICA, - 'ZMB': OpenFoodFactsCountry.ZAMBIA, - 'ZWE': OpenFoodFactsCountry.ZIMBABWE, -}; -class Country { - final String name; - final String countryCode; - - const Country({ - required this.name, - required this.countryCode, - }); -} diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart index 0b75452fc114..0f25ca858ddd 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart @@ -1,506 +1,14 @@ +import 'package:l10n_countries/l10n_countries.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; +import 'package:smooth_app/pages/preferences/country_selector/tmp_country_iso3.dart'; extension OpenFoodFactsCountryNameExtension on OpenFoodFactsCountry { - String getEnglishName() { - switch (this) { - case OpenFoodFactsCountry.ANDORRA: - return 'Andorra'; - case OpenFoodFactsCountry.UNITED_ARAB_EMIRATES: - return 'United Arab Emirates'; - case OpenFoodFactsCountry.AFGHANISTAN: - return 'Afghanistan'; - case OpenFoodFactsCountry.ANTIGUA_AND_BARBUDA: - return 'Antigua and Barbuda'; - case OpenFoodFactsCountry.ANGUILLA: - return 'Anguilla'; - case OpenFoodFactsCountry.ALBANIA: - return 'Albania'; - case OpenFoodFactsCountry.ARMENIA: - return 'Armenia'; - case OpenFoodFactsCountry.ANGOLA: - return 'Angola'; - case OpenFoodFactsCountry.ANTARCTICA: - return 'Antarctica'; - case OpenFoodFactsCountry.ARGENTINA: - return 'Argentina'; - case OpenFoodFactsCountry.AMERICAN_SAMOA: - return 'American Samoa'; - case OpenFoodFactsCountry.AUSTRIA: - return 'Austria'; - case OpenFoodFactsCountry.AUSTRALIA: - return 'Australia'; - case OpenFoodFactsCountry.ARUBA: - return 'Aruba'; - case OpenFoodFactsCountry.ALAND_ISLANDS: - return 'Åland Islands'; - case OpenFoodFactsCountry.AZERBAIJAN: - return 'Azerbaijan'; - case OpenFoodFactsCountry.BOSNIA_AND_HERZEGOVINA: - return 'Bosnia and Herzegovina'; - case OpenFoodFactsCountry.BARBADOS: - return 'Barbados'; - case OpenFoodFactsCountry.BANGLADESH: - return 'Bangladesh'; - case OpenFoodFactsCountry.BELGIUM: - return 'Belgium'; - case OpenFoodFactsCountry.BURKINA_FASO: - return 'Burkina Faso'; - case OpenFoodFactsCountry.BULGARIA: - return 'Bulgaria'; - case OpenFoodFactsCountry.BAHRAIN: - return 'Bahrain'; - case OpenFoodFactsCountry.BURUNDI: - return 'Burundi'; - case OpenFoodFactsCountry.BENIN: - return 'Benin'; - case OpenFoodFactsCountry.SAINT_BARTHELEMY: - return 'Saint Barthélemy'; - case OpenFoodFactsCountry.BERMUDA: - return 'Bermuda'; - case OpenFoodFactsCountry.BRUNEI_DARUSSALAM: - return 'Brunei Darussalam'; - case OpenFoodFactsCountry.BOLIVIA: - return 'Bolivia'; - case OpenFoodFactsCountry.BONAIRE: - return 'Bonaire, Sint Eustatius and Saba'; - case OpenFoodFactsCountry.BRAZIL: - return 'Brazil'; - case OpenFoodFactsCountry.BAHAMAS: - return 'Bahamas'; - case OpenFoodFactsCountry.BHUTAN: - return 'Bhutan'; - case OpenFoodFactsCountry.BOUVET_ISLAND: - return 'Bouvet Island'; - case OpenFoodFactsCountry.BOTSWANA: - return 'Botswana'; - case OpenFoodFactsCountry.BELARUS: - return 'Belarus'; - case OpenFoodFactsCountry.BELIZE: - return 'Belize'; - case OpenFoodFactsCountry.CANADA: - return 'Canada'; - case OpenFoodFactsCountry.COCOS_ISLANDS: - return 'Cocos (Keeling) Islands'; - case OpenFoodFactsCountry.DEMOCRATIC_REPUBLIC_OF_THE_CONGO: - return 'Democratic Republic of the Congo'; - case OpenFoodFactsCountry.CENTRAL_AFRICAN_REPUBLIC: - return 'Central African Republic'; - case OpenFoodFactsCountry.CONGO: - return 'Congo'; - case OpenFoodFactsCountry.SWITZERLAND: - return 'Switzerland'; - case OpenFoodFactsCountry.COTE_D_IVOIRE: - return "Côte d'Ivoire"; - case OpenFoodFactsCountry.COOK_ISLANDS: - return 'Cook Islands'; - case OpenFoodFactsCountry.CHILE: - return 'Chile'; - case OpenFoodFactsCountry.CAMEROON: - return 'Cameroon'; - case OpenFoodFactsCountry.CHINA: - return 'China'; - case OpenFoodFactsCountry.COLOMBIA: - return 'Colombia'; - case OpenFoodFactsCountry.COSTA_RICA: - return 'Costa Rica'; - case OpenFoodFactsCountry.CUBA: - return 'Cuba'; - case OpenFoodFactsCountry.CABO_VERDE: - return 'Cabo Verde'; - case OpenFoodFactsCountry.CURACAO: - return 'Curaçao'; - case OpenFoodFactsCountry.CHRISTMAS_ISLAND: - return 'Christmas Island'; - case OpenFoodFactsCountry.CYPRUS: - return 'Cyprus'; - case OpenFoodFactsCountry.CZECHIA: - return 'Czechia'; - case OpenFoodFactsCountry.GERMANY: - return 'Germany'; - case OpenFoodFactsCountry.DJIBOUTI: - return 'Djibouti'; - case OpenFoodFactsCountry.DENMARK: - return 'Denmark'; - case OpenFoodFactsCountry.DOMINICA: - return 'Dominica'; - case OpenFoodFactsCountry.DOMINICAN_REPUBLIC: - return 'Dominican Republic'; - case OpenFoodFactsCountry.ALGERIA: - return 'Algeria'; - case OpenFoodFactsCountry.ECUADOR: - return 'Ecuador'; - case OpenFoodFactsCountry.ESTONIA: - return 'Estonia'; - case OpenFoodFactsCountry.EGYPT: - return 'Egypt'; - case OpenFoodFactsCountry.WESTERN_SAHARA: - return 'Western Sahara'; - case OpenFoodFactsCountry.ERITREA: - return 'Eritrea'; - case OpenFoodFactsCountry.SPAIN: - return 'Spain'; - case OpenFoodFactsCountry.ETHIOPIA: - return 'Ethiopia'; - case OpenFoodFactsCountry.FINLAND: - return 'Finland'; - case OpenFoodFactsCountry.FIJI: - return 'Fiji'; - case OpenFoodFactsCountry.FALKLAND_ISLANDS: - return 'Falkland Islands (Malvinas)'; - case OpenFoodFactsCountry.MICRONESIA: - return 'Micronesia'; - case OpenFoodFactsCountry.FAROE_ISLANDS: - return 'Faroe Islands'; - case OpenFoodFactsCountry.FRANCE: - return 'France'; - case OpenFoodFactsCountry.GABON: - return 'Gabon'; - case OpenFoodFactsCountry.UNITED_KINGDOM: - return 'United Kingdom'; - case OpenFoodFactsCountry.GRENADA: - return 'Grenada'; - case OpenFoodFactsCountry.GEORGIA: - return 'Georgia'; - case OpenFoodFactsCountry.FRENCH_GUIANA: - return 'French Guiana'; - case OpenFoodFactsCountry.GUERNSEY: - return 'Guernsey'; - case OpenFoodFactsCountry.GHANA: - return 'Ghana'; - case OpenFoodFactsCountry.GIBRALTAR: - return 'Gibraltar'; - case OpenFoodFactsCountry.GREENLAND: - return 'Greenland'; - case OpenFoodFactsCountry.GAMBIA: - return 'Gambia'; - case OpenFoodFactsCountry.GUINEA: - return 'Guinea'; - case OpenFoodFactsCountry.GUADELOUPE: - return 'Guadeloupe'; - case OpenFoodFactsCountry.EQUATORIAL_GUINEA: - return 'Equatorial Guinea'; - case OpenFoodFactsCountry.GREECE: - return 'Greece'; - case OpenFoodFactsCountry.SOUTH_GEORGIA: - return 'South Georgia and the South Sandwich Islands'; - case OpenFoodFactsCountry.GUATEMALA: - return 'Guatemala'; - case OpenFoodFactsCountry.GUAM: - return 'Guam'; - case OpenFoodFactsCountry.GUINEA_BISSAU: - return 'Guinea-Bissau'; - case OpenFoodFactsCountry.GUYANA: - return 'Guyana'; - case OpenFoodFactsCountry.HONG_KONG: - return 'Hong Kong'; - case OpenFoodFactsCountry.HEARD_ISLAND: - return 'Heard Island and McDonald Islands'; - case OpenFoodFactsCountry.HONDURAS: - return 'Honduras'; - case OpenFoodFactsCountry.CROATIA: - return 'Croatia'; - case OpenFoodFactsCountry.HAITI: - return 'Haiti'; - case OpenFoodFactsCountry.HUNGARY: - return 'Hungary'; - case OpenFoodFactsCountry.INDONESIA: - return 'Indonesia'; - case OpenFoodFactsCountry.IRELAND: - return 'Ireland'; - case OpenFoodFactsCountry.ISRAEL: - return 'Israel'; - case OpenFoodFactsCountry.ISLE_OF_MAN: - return 'Isle of Man'; - case OpenFoodFactsCountry.INDIA: - return 'India'; - case OpenFoodFactsCountry.BRITISH_INDIAN_OCEAN_TERRITORY: - return 'British Indian Ocean Territory'; - case OpenFoodFactsCountry.IRAQ: - return 'Iraq'; - case OpenFoodFactsCountry.IRAN: - return 'Iran'; - case OpenFoodFactsCountry.ICELAND: - return 'Iceland'; - case OpenFoodFactsCountry.ITALY: - return 'Italy'; - case OpenFoodFactsCountry.JERSEY: - return 'Jersey'; - case OpenFoodFactsCountry.JAMAICA: - return 'Jamaica'; - case OpenFoodFactsCountry.JORDAN: - return 'Jordan'; - case OpenFoodFactsCountry.JAPAN: - return 'Japan'; - case OpenFoodFactsCountry.KENYA: - return 'Kenya'; - case OpenFoodFactsCountry.KYRGYZSTAN: - return 'Kyrgyzstan'; - case OpenFoodFactsCountry.CAMBODIA: - return 'Cambodia'; - case OpenFoodFactsCountry.KIRIBATI: - return 'Kiribati'; - case OpenFoodFactsCountry.COMOROS: - return 'Comoros'; - case OpenFoodFactsCountry.SAINT_KITTS_AND_NEVIS: - return 'Saint Kitts and Nevis'; - case OpenFoodFactsCountry.NORTH_KOREA: - return 'North Korea'; - case OpenFoodFactsCountry.SOUTH_KOREA: - return 'South Korea'; - case OpenFoodFactsCountry.KUWAIT: - return 'Kuwait'; - case OpenFoodFactsCountry.CAYMAN_ISLANDS: - return 'Cayman Islands'; - case OpenFoodFactsCountry.KAZAKHSTAN: - return 'Kazakhstan'; - case OpenFoodFactsCountry.LAOS: - return 'Laos'; - case OpenFoodFactsCountry.LEBANON: - return 'Lebanon'; - case OpenFoodFactsCountry.SAINT_LUCIA: - return 'Saint Lucia'; - case OpenFoodFactsCountry.LIECHTENSTEIN: - return 'Liechtenstein'; - case OpenFoodFactsCountry.SRI_LANKA: - return 'Sri Lanka'; - case OpenFoodFactsCountry.LIBERIA: - return 'Liberia'; - case OpenFoodFactsCountry.LESOTHO: - return 'Lesotho'; - case OpenFoodFactsCountry.LITHUANIA: - return 'Lithuania'; - case OpenFoodFactsCountry.LUXEMBOURG: - return 'Luxembourg'; - case OpenFoodFactsCountry.LATVIA: - return 'Latvia'; - case OpenFoodFactsCountry.LIBYA: - return 'Libya'; - case OpenFoodFactsCountry.MOROCCO: - return 'Morocco'; - case OpenFoodFactsCountry.MONACO: - return 'Monaco'; - case OpenFoodFactsCountry.MOLDOVA: - return 'Moldova'; - case OpenFoodFactsCountry.MONTENEGRO: - return 'Montenegro'; - case OpenFoodFactsCountry.SAINT_MARTIN: - return 'Saint Martin'; - case OpenFoodFactsCountry.MADAGASCAR: - return 'Madagascar'; - case OpenFoodFactsCountry.MARSHALL_ISLANDS: - return 'Marshall Islands'; - case OpenFoodFactsCountry.NORTH_MACEDONIA: - return 'North Macedonia'; - case OpenFoodFactsCountry.MALI: - return 'Mali'; - case OpenFoodFactsCountry.MYANMAR: - return 'Myanmar'; - case OpenFoodFactsCountry.MONGOLIA: - return 'Mongolia'; - case OpenFoodFactsCountry.MACAO: - return 'Macao'; - case OpenFoodFactsCountry.NORTHERN_MARIANA_ISLANDS: - return 'Northern Mariana Islands'; - case OpenFoodFactsCountry.MARTINIQUE: - return 'Martinique'; - case OpenFoodFactsCountry.MAURITANIA: - return 'Mauritania'; - case OpenFoodFactsCountry.MONTSERRAT: - return 'Montserrat'; - case OpenFoodFactsCountry.MALTA: - return 'Malta'; - case OpenFoodFactsCountry.MAURITIUS: - return 'Mauritius'; - case OpenFoodFactsCountry.MALDIVES: - return 'Maldives'; - case OpenFoodFactsCountry.MALAWI: - return 'Malawi'; - case OpenFoodFactsCountry.MEXICO: - return 'Mexico'; - case OpenFoodFactsCountry.MALAYSIA: - return 'Malaysia'; - case OpenFoodFactsCountry.MOZAMBIQUE: - return 'Mozambique'; - case OpenFoodFactsCountry.NAMIBIA: - return 'Namibia'; - case OpenFoodFactsCountry.NEW_CALEDONIA: - return 'New Caledonia'; - case OpenFoodFactsCountry.NIGER: - return 'Niger'; - case OpenFoodFactsCountry.NORFOLK_ISLAND: - return 'Norfolk Island'; - case OpenFoodFactsCountry.NIGERIA: - return 'Nigeria'; - case OpenFoodFactsCountry.NICARAGUA: - return 'Nicaragua'; - case OpenFoodFactsCountry.NETHERLANDS: - return 'Netherlands'; - case OpenFoodFactsCountry.NORWAY: - return 'Norway'; - case OpenFoodFactsCountry.NEPAL: - return 'Nepal'; - case OpenFoodFactsCountry.NAURU: - return 'Nauru'; - case OpenFoodFactsCountry.NIUE: - return 'Niue'; - case OpenFoodFactsCountry.NEW_ZEALAND: - return 'New Zealand'; - case OpenFoodFactsCountry.OMAN: - return 'Oman'; - case OpenFoodFactsCountry.PANAMA: - return 'Panama'; - case OpenFoodFactsCountry.PERU: - return 'Peru'; - case OpenFoodFactsCountry.FRENCH_POLYNESIA: - return 'French Polynesia'; - case OpenFoodFactsCountry.PAPUA_NEW_GUINEA: - return 'Papua New Guinea'; - case OpenFoodFactsCountry.PHILIPPINES: - return 'Philippines'; - case OpenFoodFactsCountry.PAKISTAN: - return 'Pakistan'; - case OpenFoodFactsCountry.POLAND: - return 'Poland'; - case OpenFoodFactsCountry.SAINT_PIERRE_AND_MIQUELON: - return 'Saint Pierre and Miquelon'; - case OpenFoodFactsCountry.PITCAIRN: - return 'Pitcairn'; - case OpenFoodFactsCountry.PUERTO_RICO: - return 'Puerto Rico'; - case OpenFoodFactsCountry.PALESTINE: - return 'Palestine'; - case OpenFoodFactsCountry.PORTUGAL: - return 'Portugal'; - case OpenFoodFactsCountry.PALAU: - return 'Palau'; - case OpenFoodFactsCountry.PARAGUAY: - return 'Paraguay'; - case OpenFoodFactsCountry.QATAR: - return 'Qatar'; - case OpenFoodFactsCountry.REUNION: - return 'Réunion'; - case OpenFoodFactsCountry.ROMANIA: - return 'Romania'; - case OpenFoodFactsCountry.SERBIA: - return 'Serbia'; - case OpenFoodFactsCountry.RUSSIA: - return 'Russia'; - case OpenFoodFactsCountry.RWANDA: - return 'Rwanda'; - case OpenFoodFactsCountry.SAUDI_ARABIA: - return 'Saudi Arabia'; - case OpenFoodFactsCountry.SOLOMON_ISLANDS: - return 'Solomon Islands'; - case OpenFoodFactsCountry.SEYCHELLES: - return 'Seychelles'; - case OpenFoodFactsCountry.SUDAN: - return 'Sudan'; - case OpenFoodFactsCountry.SWEDEN: - return 'Sweden'; - case OpenFoodFactsCountry.SINGAPORE: - return 'Singapore'; - case OpenFoodFactsCountry.SAINT_HELENA: - return 'Saint Helena, Ascension and Tristan da Cunha'; - case OpenFoodFactsCountry.SLOVENIA: - return 'Slovenia'; - case OpenFoodFactsCountry.SVALBARD_AND_JAN_MAYEN: - return 'Svalbard and Jan Mayen'; - case OpenFoodFactsCountry.SLOVAKIA: - return 'Slovakia'; - case OpenFoodFactsCountry.SIERRA_LEONE: - return 'Sierra Leone'; - case OpenFoodFactsCountry.SAN_MARINO: - return 'San Marino'; - case OpenFoodFactsCountry.SENEGAL: - return 'Senegal'; - case OpenFoodFactsCountry.SOMALIA: - return 'Somalia'; - case OpenFoodFactsCountry.SURINAME: - return 'Suriname'; - case OpenFoodFactsCountry.SOUTH_SUDAN: - return 'South Sudan'; - case OpenFoodFactsCountry.SAO_TOME_AND_PRINCIPE: - return 'Sao Tome and Principe'; - case OpenFoodFactsCountry.EL_SALVADOR: - return 'El Salvador'; - case OpenFoodFactsCountry.SINT_MAARTEN: - return 'Sint Maarten'; - case OpenFoodFactsCountry.SYRIA: - return 'Syria'; - case OpenFoodFactsCountry.ESWATINI: - return 'Eswatini'; - case OpenFoodFactsCountry.TURKS_AND_CAICOS_ISLANDS: - return 'Turks and Caicos Islands'; - case OpenFoodFactsCountry.CHAD: - return 'Chad'; - case OpenFoodFactsCountry.FRENCH_SOUTHERN_TERRITORIES: - return 'French Southern Territories'; - case OpenFoodFactsCountry.TOGO: - return 'Togo'; - case OpenFoodFactsCountry.THAILAND: - return 'Thailand'; - case OpenFoodFactsCountry.TAJIKISTAN: - return 'Tajikistan'; - case OpenFoodFactsCountry.TOKELAU: - return 'Tokelau'; - case OpenFoodFactsCountry.TIMOR_LESTE: - return 'Timor-Leste'; - case OpenFoodFactsCountry.TURKMENISTAN: - return 'Turkmenistan'; - case OpenFoodFactsCountry.TUNISIA: - return 'Tunisia'; - case OpenFoodFactsCountry.TONGA: - return 'Tonga'; - case OpenFoodFactsCountry.TURKEY: - return 'Turkey'; - case OpenFoodFactsCountry.TRINIDAD_AND_TOBAGO: - return 'Trinidad and Tobago'; - case OpenFoodFactsCountry.TUVALU: - return 'Tuvalu'; - case OpenFoodFactsCountry.TAIWAN: - return 'Taiwan'; - case OpenFoodFactsCountry.TANZANIA: - return 'Tanzania'; - case OpenFoodFactsCountry.UKRAINE: - return 'Ukraine'; - case OpenFoodFactsCountry.UGANDA: - return 'Uganda'; - case OpenFoodFactsCountry.UNITED_STATES_MINOR_OUTLYING_ISLANDS: - return 'United States Minor Outlying Islands'; - case OpenFoodFactsCountry.USA: - return 'United States'; - case OpenFoodFactsCountry.URUGUAY: - return 'Uruguay'; - case OpenFoodFactsCountry.UZBEKISTAN: - return 'Uzbekistan'; - case OpenFoodFactsCountry.HOLY_SEE: - return 'Holy See'; - case OpenFoodFactsCountry.SAINT_VINCENT_AND_THE_GRENADINES: - return 'Saint Vincent and the Grenadines'; - case OpenFoodFactsCountry.VENEZUELA: - return 'Venezuela'; - case OpenFoodFactsCountry.BRITISH_VIRGIN_ISLANDS: - return 'British Virgin Islands'; - case OpenFoodFactsCountry.US_VIRGIN_ISLANDS: - return 'U.S. Virgin Islands'; - case OpenFoodFactsCountry.VIET_NAM: - return 'Vietnam'; - case OpenFoodFactsCountry.VANUATU: - return 'Vanuatu'; - case OpenFoodFactsCountry.WALLIS_AND_FUTUNA: - return 'Wallis and Futuna'; - case OpenFoodFactsCountry.SAMOA: - return 'Samoa'; - case OpenFoodFactsCountry.YEMEN: - return 'Yemen'; - case OpenFoodFactsCountry.MAYOTTE: - return 'Mayotte'; - case OpenFoodFactsCountry.SOUTH_AFRICA: - return 'South Africa'; - case OpenFoodFactsCountry.ZAMBIA: - return 'Zambia'; - case OpenFoodFactsCountry.ZIMBABWE: - return 'Zimbabwe'; - } + String getLocalizedName(String locale) { + final CountriesLocaleMapper mapper = CountriesLocaleMapper(); + final LocaleMap result = mapper.localize({tmpCountryIso3[this] ?? 'UN'}, + mainLocale: locale, fallbackLocale: 'en'); + return result.values.first; } + + String getEnglishName() => getLocalizedName('en'); } diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/tmp_country_iso3.dart b/packages/smooth_app/lib/pages/preferences/country_selector/tmp_country_iso3.dart new file mode 100644 index 000000000000..525c7c80a22b --- /dev/null +++ b/packages/smooth_app/lib/pages/preferences/country_selector/tmp_country_iso3.dart @@ -0,0 +1,255 @@ +import 'package:openfoodfacts/openfoodfacts.dart'; + +// This map should eventually move to openfoodfacts-dart as a shared utility. +const Map tmpCountryIso3 = + { + OpenFoodFactsCountry.ANDORRA: 'AND', + OpenFoodFactsCountry.UNITED_ARAB_EMIRATES: 'ARE', + OpenFoodFactsCountry.AFGHANISTAN: 'AFG', + OpenFoodFactsCountry.ANTIGUA_AND_BARBUDA: 'ATG', + OpenFoodFactsCountry.ANGUILLA: 'AIA', + OpenFoodFactsCountry.ALBANIA: 'ALB', + OpenFoodFactsCountry.ARMENIA: 'ARM', + OpenFoodFactsCountry.ANGOLA: 'AGO', + OpenFoodFactsCountry.ANTARCTICA: 'ATA', + OpenFoodFactsCountry.ARGENTINA: 'ARG', + OpenFoodFactsCountry.AMERICAN_SAMOA: 'ASM', + OpenFoodFactsCountry.AUSTRIA: 'AUT', + OpenFoodFactsCountry.AUSTRALIA: 'AUS', + OpenFoodFactsCountry.ARUBA: 'ABW', + OpenFoodFactsCountry.ALAND_ISLANDS: 'ALA', + OpenFoodFactsCountry.AZERBAIJAN: 'AZE', + OpenFoodFactsCountry.BOSNIA_AND_HERZEGOVINA: 'BIH', + OpenFoodFactsCountry.BARBADOS: 'BRB', + OpenFoodFactsCountry.BANGLADESH: 'BGD', + OpenFoodFactsCountry.BELGIUM: 'BEL', + OpenFoodFactsCountry.BURKINA_FASO: 'BFA', + OpenFoodFactsCountry.BULGARIA: 'BGR', + OpenFoodFactsCountry.BAHRAIN: 'BHR', + OpenFoodFactsCountry.BURUNDI: 'BDI', + OpenFoodFactsCountry.BENIN: 'BEN', + OpenFoodFactsCountry.SAINT_BARTHELEMY: 'BLM', + OpenFoodFactsCountry.BERMUDA: 'BMU', + OpenFoodFactsCountry.BRUNEI_DARUSSALAM: 'BRN', + OpenFoodFactsCountry.BOLIVIA: 'BOL', + OpenFoodFactsCountry.BONAIRE: 'BES', + OpenFoodFactsCountry.BRAZIL: 'BRA', + OpenFoodFactsCountry.BAHAMAS: 'BHS', + OpenFoodFactsCountry.BHUTAN: 'BTN', + OpenFoodFactsCountry.BOUVET_ISLAND: 'BVT', + OpenFoodFactsCountry.BOTSWANA: 'BWA', + OpenFoodFactsCountry.BELARUS: 'BLR', + OpenFoodFactsCountry.BELIZE: 'BLZ', + OpenFoodFactsCountry.CANADA: 'CAN', + OpenFoodFactsCountry.COCOS_ISLANDS: 'CCK', + OpenFoodFactsCountry.DEMOCRATIC_REPUBLIC_OF_THE_CONGO: 'COD', + OpenFoodFactsCountry.CENTRAL_AFRICAN_REPUBLIC: 'CAF', + OpenFoodFactsCountry.CONGO: 'COG', + OpenFoodFactsCountry.SWITZERLAND: 'CHE', + OpenFoodFactsCountry.COTE_D_IVOIRE: 'CIV', + OpenFoodFactsCountry.COOK_ISLANDS: 'COK', + OpenFoodFactsCountry.CHILE: 'CHL', + OpenFoodFactsCountry.CAMEROON: 'CMR', + OpenFoodFactsCountry.CHINA: 'CHN', + OpenFoodFactsCountry.COLOMBIA: 'COL', + OpenFoodFactsCountry.COSTA_RICA: 'CRI', + OpenFoodFactsCountry.CUBA: 'CUB', + OpenFoodFactsCountry.CABO_VERDE: 'CPV', + OpenFoodFactsCountry.CURACAO: 'CUW', + OpenFoodFactsCountry.CHRISTMAS_ISLAND: 'CXR', + OpenFoodFactsCountry.CYPRUS: 'CYP', + OpenFoodFactsCountry.CZECHIA: 'CZE', + OpenFoodFactsCountry.GERMANY: 'DEU', + OpenFoodFactsCountry.DJIBOUTI: 'DJI', + OpenFoodFactsCountry.DENMARK: 'DNK', + OpenFoodFactsCountry.DOMINICA: 'DMA', + OpenFoodFactsCountry.DOMINICAN_REPUBLIC: 'DOM', + OpenFoodFactsCountry.ALGERIA: 'DZA', + OpenFoodFactsCountry.ECUADOR: 'ECU', + OpenFoodFactsCountry.ESTONIA: 'EST', + OpenFoodFactsCountry.EGYPT: 'EGY', + OpenFoodFactsCountry.WESTERN_SAHARA: 'ESH', + OpenFoodFactsCountry.ERITREA: 'ERI', + OpenFoodFactsCountry.SPAIN: 'ESP', + OpenFoodFactsCountry.ETHIOPIA: 'ETH', + OpenFoodFactsCountry.FINLAND: 'FIN', + OpenFoodFactsCountry.FIJI: 'FJI', + OpenFoodFactsCountry.FALKLAND_ISLANDS: 'FLK', + OpenFoodFactsCountry.MICRONESIA: 'FSM', + OpenFoodFactsCountry.FAROE_ISLANDS: 'FRO', + OpenFoodFactsCountry.FRANCE: 'FRA', + OpenFoodFactsCountry.GABON: 'GAB', + OpenFoodFactsCountry.UNITED_KINGDOM: 'GBR', + OpenFoodFactsCountry.GRENADA: 'GRD', + OpenFoodFactsCountry.GEORGIA: 'GEO', + OpenFoodFactsCountry.FRENCH_GUIANA: 'GUF', + OpenFoodFactsCountry.GUERNSEY: 'GGY', + OpenFoodFactsCountry.GHANA: 'GHA', + OpenFoodFactsCountry.GIBRALTAR: 'GIB', + OpenFoodFactsCountry.GREENLAND: 'GRL', + OpenFoodFactsCountry.GAMBIA: 'GMB', + OpenFoodFactsCountry.GUINEA: 'GIN', + OpenFoodFactsCountry.GUADELOUPE: 'GLP', + OpenFoodFactsCountry.EQUATORIAL_GUINEA: 'GNQ', + OpenFoodFactsCountry.GREECE: 'GRC', + OpenFoodFactsCountry.SOUTH_GEORGIA: 'SGS', + OpenFoodFactsCountry.GUATEMALA: 'GTM', + OpenFoodFactsCountry.GUAM: 'GUM', + OpenFoodFactsCountry.GUINEA_BISSAU: 'GNB', + OpenFoodFactsCountry.GUYANA: 'GUY', + OpenFoodFactsCountry.HONG_KONG: 'HKG', + OpenFoodFactsCountry.HEARD_ISLAND: 'HMD', + OpenFoodFactsCountry.HONDURAS: 'HND', + OpenFoodFactsCountry.CROATIA: 'HRV', + OpenFoodFactsCountry.HAITI: 'HTI', + OpenFoodFactsCountry.HUNGARY: 'HUN', + OpenFoodFactsCountry.INDONESIA: 'IDN', + OpenFoodFactsCountry.IRELAND: 'IRL', + OpenFoodFactsCountry.ISRAEL: 'ISR', + OpenFoodFactsCountry.ISLE_OF_MAN: 'IMN', + OpenFoodFactsCountry.INDIA: 'IND', + OpenFoodFactsCountry.BRITISH_INDIAN_OCEAN_TERRITORY: 'IOT', + OpenFoodFactsCountry.IRAQ: 'IRQ', + OpenFoodFactsCountry.IRAN: 'IRN', + OpenFoodFactsCountry.ICELAND: 'ISL', + OpenFoodFactsCountry.ITALY: 'ITA', + OpenFoodFactsCountry.JERSEY: 'JEY', + OpenFoodFactsCountry.JAMAICA: 'JAM', + OpenFoodFactsCountry.JORDAN: 'JOR', + OpenFoodFactsCountry.JAPAN: 'JPN', + OpenFoodFactsCountry.KENYA: 'KEN', + OpenFoodFactsCountry.KYRGYZSTAN: 'KGZ', + OpenFoodFactsCountry.CAMBODIA: 'KHM', + OpenFoodFactsCountry.KIRIBATI: 'KIR', + OpenFoodFactsCountry.COMOROS: 'COM', + OpenFoodFactsCountry.SAINT_KITTS_AND_NEVIS: 'KNA', + OpenFoodFactsCountry.NORTH_KOREA: 'PRK', + OpenFoodFactsCountry.SOUTH_KOREA: 'KOR', + OpenFoodFactsCountry.KUWAIT: 'KWT', + OpenFoodFactsCountry.CAYMAN_ISLANDS: 'CYM', + OpenFoodFactsCountry.KAZAKHSTAN: 'KAZ', + OpenFoodFactsCountry.LAOS: 'LAO', + OpenFoodFactsCountry.LEBANON: 'LBN', + OpenFoodFactsCountry.SAINT_LUCIA: 'LCA', + OpenFoodFactsCountry.LIECHTENSTEIN: 'LIE', + OpenFoodFactsCountry.SRI_LANKA: 'LKA', + OpenFoodFactsCountry.LIBERIA: 'LBR', + OpenFoodFactsCountry.LESOTHO: 'LSO', + OpenFoodFactsCountry.LITHUANIA: 'LTU', + OpenFoodFactsCountry.LUXEMBOURG: 'LUX', + OpenFoodFactsCountry.LATVIA: 'LVA', + OpenFoodFactsCountry.LIBYA: 'LBY', + OpenFoodFactsCountry.MOROCCO: 'MAR', + OpenFoodFactsCountry.MONACO: 'MCO', + OpenFoodFactsCountry.MOLDOVA: 'MDA', + OpenFoodFactsCountry.MONTENEGRO: 'MNE', + OpenFoodFactsCountry.SAINT_MARTIN: 'MAF', + OpenFoodFactsCountry.MADAGASCAR: 'MDG', + OpenFoodFactsCountry.MARSHALL_ISLANDS: 'MHL', + OpenFoodFactsCountry.NORTH_MACEDONIA: 'MKD', + OpenFoodFactsCountry.MALI: 'MLI', + OpenFoodFactsCountry.MYANMAR: 'MMR', + OpenFoodFactsCountry.MONGOLIA: 'MNG', + OpenFoodFactsCountry.MACAO: 'MAC', + OpenFoodFactsCountry.NORTHERN_MARIANA_ISLANDS: 'MNP', + OpenFoodFactsCountry.MARTINIQUE: 'MTQ', + OpenFoodFactsCountry.MAURITANIA: 'MRT', + OpenFoodFactsCountry.MONTSERRAT: 'MSR', + OpenFoodFactsCountry.MALTA: 'MLT', + OpenFoodFactsCountry.MAURITIUS: 'MUS', + OpenFoodFactsCountry.MALDIVES: 'MDV', + OpenFoodFactsCountry.MALAWI: 'MWI', + OpenFoodFactsCountry.MEXICO: 'MEX', + OpenFoodFactsCountry.MALAYSIA: 'MYS', + OpenFoodFactsCountry.MOZAMBIQUE: 'MOZ', + OpenFoodFactsCountry.NAMIBIA: 'NAM', + OpenFoodFactsCountry.NEW_CALEDONIA: 'NCL', + OpenFoodFactsCountry.NIGER: 'NER', + OpenFoodFactsCountry.NORFOLK_ISLAND: 'NFK', + OpenFoodFactsCountry.NIGERIA: 'NGA', + OpenFoodFactsCountry.NICARAGUA: 'NIC', + OpenFoodFactsCountry.NETHERLANDS: 'NLD', + OpenFoodFactsCountry.NORWAY: 'NOR', + OpenFoodFactsCountry.NEPAL: 'NPL', + OpenFoodFactsCountry.NAURU: 'NRU', + OpenFoodFactsCountry.NIUE: 'NIU', + OpenFoodFactsCountry.NEW_ZEALAND: 'NZL', + OpenFoodFactsCountry.OMAN: 'OMN', + OpenFoodFactsCountry.PANAMA: 'PAN', + OpenFoodFactsCountry.PERU: 'PER', + OpenFoodFactsCountry.FRENCH_POLYNESIA: 'PYF', + OpenFoodFactsCountry.PAPUA_NEW_GUINEA: 'PNG', + OpenFoodFactsCountry.PHILIPPINES: 'PHL', + OpenFoodFactsCountry.PAKISTAN: 'PAK', + OpenFoodFactsCountry.POLAND: 'POL', + OpenFoodFactsCountry.SAINT_PIERRE_AND_MIQUELON: 'SPM', + OpenFoodFactsCountry.PITCAIRN: 'PCN', + OpenFoodFactsCountry.PUERTO_RICO: 'PRI', + OpenFoodFactsCountry.PALESTINE: 'PSE', + OpenFoodFactsCountry.PORTUGAL: 'PRT', + OpenFoodFactsCountry.PALAU: 'PLW', + OpenFoodFactsCountry.PARAGUAY: 'PRY', + OpenFoodFactsCountry.QATAR: 'QAT', + OpenFoodFactsCountry.REUNION: 'REU', + OpenFoodFactsCountry.ROMANIA: 'ROU', + OpenFoodFactsCountry.SERBIA: 'SRB', + OpenFoodFactsCountry.RUSSIA: 'RUS', + OpenFoodFactsCountry.RWANDA: 'RWA', + OpenFoodFactsCountry.SAUDI_ARABIA: 'SAU', + OpenFoodFactsCountry.SOLOMON_ISLANDS: 'SLB', + OpenFoodFactsCountry.SEYCHELLES: 'SYC', + OpenFoodFactsCountry.SUDAN: 'SDN', + OpenFoodFactsCountry.SWEDEN: 'SWE', + OpenFoodFactsCountry.SINGAPORE: 'SGP', + OpenFoodFactsCountry.SAINT_HELENA: 'SHN', + OpenFoodFactsCountry.SLOVENIA: 'SVN', + OpenFoodFactsCountry.SVALBARD_AND_JAN_MAYEN: 'SJM', + OpenFoodFactsCountry.SLOVAKIA: 'SVK', + OpenFoodFactsCountry.SIERRA_LEONE: 'SLE', + OpenFoodFactsCountry.SAN_MARINO: 'SMR', + OpenFoodFactsCountry.SENEGAL: 'SEN', + OpenFoodFactsCountry.SOMALIA: 'SOM', + OpenFoodFactsCountry.SURINAME: 'SUR', + OpenFoodFactsCountry.SOUTH_SUDAN: 'SSD', + OpenFoodFactsCountry.SAO_TOME_AND_PRINCIPE: 'STP', + OpenFoodFactsCountry.EL_SALVADOR: 'SLV', + OpenFoodFactsCountry.SINT_MAARTEN: 'SXM', + OpenFoodFactsCountry.SYRIA: 'SYR', + OpenFoodFactsCountry.ESWATINI: 'SWZ', + OpenFoodFactsCountry.TURKS_AND_CAICOS_ISLANDS: 'TCA', + OpenFoodFactsCountry.CHAD: 'TCD', + OpenFoodFactsCountry.FRENCH_SOUTHERN_TERRITORIES: 'ATF', + OpenFoodFactsCountry.TOGO: 'TGO', + OpenFoodFactsCountry.THAILAND: 'THA', + OpenFoodFactsCountry.TAJIKISTAN: 'TJK', + OpenFoodFactsCountry.TOKELAU: 'TKL', + OpenFoodFactsCountry.TIMOR_LESTE: 'TLS', + OpenFoodFactsCountry.TURKMENISTAN: 'TKM', + OpenFoodFactsCountry.TUNISIA: 'TUN', + OpenFoodFactsCountry.TONGA: 'TON', + OpenFoodFactsCountry.TURKEY: 'TUR', + OpenFoodFactsCountry.TRINIDAD_AND_TOBAGO: 'TTO', + OpenFoodFactsCountry.TUVALU: 'TUV', + OpenFoodFactsCountry.TAIWAN: 'TWN', + OpenFoodFactsCountry.TANZANIA: 'TZA', + OpenFoodFactsCountry.UKRAINE: 'UKR', + OpenFoodFactsCountry.UGANDA: 'UGA', + OpenFoodFactsCountry.UNITED_STATES_MINOR_OUTLYING_ISLANDS: 'UMI', + OpenFoodFactsCountry.USA: 'USA', + OpenFoodFactsCountry.URUGUAY: 'URY', + OpenFoodFactsCountry.UZBEKISTAN: 'UZB', + OpenFoodFactsCountry.HOLY_SEE: 'VAT', + OpenFoodFactsCountry.SAINT_VINCENT_AND_THE_GRENADINES: 'VCT', + OpenFoodFactsCountry.VENEZUELA: 'VEN', + OpenFoodFactsCountry.BRITISH_VIRGIN_ISLANDS: 'VGB', + OpenFoodFactsCountry.US_VIRGIN_ISLANDS: 'VIR', + OpenFoodFactsCountry.VIET_NAM: 'VNM', + OpenFoodFactsCountry.VANUATU: 'VUT', + OpenFoodFactsCountry.WALLIS_AND_FUTUNA: 'WLF', + OpenFoodFactsCountry.SAMOA: 'WSM', + OpenFoodFactsCountry.YEMEN: 'YEM', + OpenFoodFactsCountry.MAYOTTE: 'MYT', + OpenFoodFactsCountry.SOUTH_AFRICA: 'ZAF', + OpenFoodFactsCountry.ZAMBIA: 'ZMB', + OpenFoodFactsCountry.ZIMBABWE: 'ZWE', +}; diff --git a/packages/smooth_app/lib/pages/product/common/product_query_page.dart b/packages/smooth_app/lib/pages/product/common/product_query_page.dart index 8537824a9dce..f5698d1dd66f 100644 --- a/packages/smooth_app/lib/pages/product/common/product_query_page.dart +++ b/packages/smooth_app/lib/pages/product/common/product_query_page.dart @@ -20,7 +20,7 @@ import 'package:smooth_app/generic_lib/widgets/smooth_card.dart'; import 'package:smooth_app/generic_lib/widgets/smooth_error_card.dart'; import 'package:smooth_app/helpers/analytics_helper.dart'; import 'package:smooth_app/pages/personalized_ranking_page.dart'; -import 'package:smooth_app/pages/preferences/country_selector/open_food_facts_country_map.dart'; +import 'package:smooth_app/pages/preferences/country_selector/tmp_country_iso3.dart'; import 'package:smooth_app/pages/product/common/loading_status.dart'; import 'package:smooth_app/pages/product/common/product_list_item_simple.dart'; import 'package:smooth_app/pages/product/common/product_query_page_helper.dart'; @@ -431,14 +431,12 @@ class _ProductQueryPageState extends State if (_country == null) return null; // Find the matching ISO3 code for the given _country - final String? iso3 = iso3ToCountry.entries - .firstWhere( - (entry) => entry.value == _country, - orElse: () => const MapEntry('', OpenFoodFactsCountry.UNITED_KINGDOM), - ) - .key; - - if (iso3!.isEmpty) { + final String? iso3 = tmpCountryIso3[_country!]; + if (iso3 == null) { + return null; + } + + if (iso3.isEmpty) { return null; } @@ -454,8 +452,6 @@ class _ProductQueryPageState extends State return localized.values.firstOrNull; } - - Widget _getLargeButtonWithIcon(final _Action action) => SmoothLargeButtonWithIcon( text: action.text, diff --git a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart index cb423a5af170..2c763c89c9a1 100644 --- a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart +++ b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart @@ -8,8 +8,7 @@ import 'package:smooth_app/generic_lib/design_constants.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/preferences/country_selector/country_selector.dart'; -import 'package:smooth_app/pages/preferences/country_selector/open_food_facts_country_map.dart'; +import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart'; import 'package:smooth_app/pages/product/multilingual_helper.dart'; import 'package:smooth_app/query/product_query.dart'; import 'package:smooth_app/resources/app_icons.dart' as icons; @@ -926,13 +925,8 @@ class SimpleInputPageCategoryNotFoodHelper /// Implementation for "Countries" of an [AbstractSimpleInputPageHelper]. class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { SimpleInputPageCountryHelper(UserPreferences userPreferences) - : _userCountryCode = userPreferences.userCountryCode ?? 'en' { - CountriesHelper.getCountries( - getLanguage().offTag, - ).then((List? countries) { - _countries = countries ?? []; - }); - } + : _userCountryCode = + userPreferences.userCountryCode?.toUpperCase() ?? 'EN'; final String _userCountryCode; @@ -940,7 +934,7 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { ValueNotifier( const SimpleInputSuggestionsLoading(), ); - List? _countries; + List? _countries; @override List initTerms(final Product product) => @@ -959,6 +953,7 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { ); } + _countries = OpenFoodFactsCountry.values; _reloadSuggestions(); } @@ -991,19 +986,16 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { _suggestionsNotifier; Future _reloadSuggestions() async { - _countries ??= await CountriesHelper.getCountries( - getLanguage().offTag, - ); - if (_countries == null) { - _suggestionsNotifier.value = const SimpleInputSuggestionsNoSuggestion(); - return; - } + _countries = OpenFoodFactsCountry.values; - final Country? country = _countries!.firstWhereOrNull( - (Country country) => country.countryCode == _userCountryCode, + final OpenFoodFactsCountry? country = _countries!.firstWhereOrNull( + (OpenFoodFactsCountry country) => + country.offTag.toUpperCase() == _userCountryCode.toUpperCase(), ); - if (country == null || _terms.contains(country.name) == true) { + final String locale = getLanguage().offTag; + + if (country == null || _terms.contains(country.getLocalizedName(locale))) { _suggestionsNotifier.value = const SimpleInputSuggestionsLoaded( suggestions: [], ); @@ -1011,7 +1003,7 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { } _suggestionsNotifier.value = SimpleInputSuggestionsLoaded( - suggestions: [country.name], + suggestions: [country.getLocalizedName(locale)], ); } diff --git a/packages/smooth_app/pubspec.yaml b/packages/smooth_app/pubspec.yaml index 07b9abc874a2..ad8e81ffe8c2 100644 --- a/packages/smooth_app/pubspec.yaml +++ b/packages/smooth_app/pubspec.yaml @@ -35,7 +35,7 @@ dependencies: photo_view: 0.15.0 uuid: 4.5.1 provider: 6.1.4 - sentry_flutter: 8.12.0 + sentry_flutter: 8.14.1 sqflite: 2.4.1 sqflite_common_ffi: 2.3.4+4 url_launcher: 6.3.1 @@ -100,7 +100,8 @@ dependencies: openfoodfacts: 3.20.0 - l10n_countries: ^1.0.0 + l10n_countries: 1.0.0 + iso_countries: ^2.2.0 # openfoodfacts: # path: ../../../openfoodfacts-dart From f058bcb1bf23bfae81f9d0634e41a8e047db7b99 Mon Sep 17 00:00:00 2001 From: pavaniroid Date: Mon, 14 Apr 2025 23:55:32 +0530 Subject: [PATCH 3/9] fix: apply monsieurtanuki feedback. --- .../country_selector/country_selector.dart | 44 +++++++------- .../country_selector_provider.dart | 57 +++---------------- ...openfoodfacts_country_emoji_extension.dart | 8 +++ ...nfoodfacts_country_iso2code_extension.dart | 6 ++ .../openfoodfacts_country_name_extension.dart | 20 +++++-- .../product/common/product_query_page.dart | 24 +------- .../product/simple_input_page_helpers.dart | 16 +++--- packages/smooth_app/pubspec.yaml | 9 ++- 8 files changed, 72 insertions(+), 112 deletions(-) create mode 100644 packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart create mode 100644 packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart index 5e540511e430..f5824bdabecf 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart @@ -7,8 +7,9 @@ import 'package:smooth_app/data_models/preferences/user_preferences.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/helpers/provider_helper.dart'; +import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart'; import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart'; -import 'package:smooth_app/pages/prices/emoji_helper.dart'; +import 'package:smooth_app/query/product_query.dart'; import 'package:smooth_app/widgets/selector_screen/smooth_screen_list_choice.dart'; import 'package:smooth_app/widgets/selector_screen/smooth_screen_selector_provider.dart'; import 'package:smooth_app/widgets/smooth_text.dart'; @@ -17,14 +18,15 @@ part 'country_selector_provider.dart'; /// A button that will open a list of countries and save it in the preferences. class CountrySelector extends StatelessWidget { - const CountrySelector( - {required this.forceCurrencyChange, - this.textStyle, - this.padding, - this.icon, - this.inkWellBorderRadius, - this.loadingHeight = 48.0, - this.autoValidate = true}); + const CountrySelector({ + required this.forceCurrencyChange, + this.textStyle, + this.padding, + this.icon, + this.inkWellBorderRadius, + this.loadingHeight = 48.0, + this.autoValidate = true, + }); final TextStyle? textStyle; final EdgeInsetsGeometry? padding; @@ -124,7 +126,7 @@ class _CountrySelectorButton extends StatelessWidget { SizedBox( width: IconTheme.of(context).size! + LARGE_SPACE, child: AutoSizeText( - EmojiHelper.getEmojiByCountryCode(country.offTag)!, + country.emoji, textAlign: TextAlign.center, style: TextStyle(fontSize: IconTheme.of(context).size), @@ -203,9 +205,7 @@ class _CountrySelectorButton extends StatelessWidget { final OpenFoodFactsCountry country, ) async { final UserPreferences userPreferences = context.read(); - final OpenFoodFactsCountry? offCountry = - OpenFoodFactsCountry.fromOffTag(country.offTag); - final String? possibleCurrencyCode = offCountry?.currency?.name; + final String? possibleCurrencyCode = country.currency?.name; if (possibleCurrencyCode == null) { return; @@ -274,7 +274,7 @@ class _CountrySelectorScreen extends StatelessWidget { Expanded( flex: 1, child: Text( - EmojiHelper.getEmojiByCountryCode(country.offTag) ?? '', + country.emoji, style: const TextStyle(fontSize: 25.0), ), ), @@ -290,8 +290,9 @@ class _CountrySelectorScreen extends StatelessWidget { Expanded( flex: 7, child: TextHighlighter( - text: country - .getLocalizedName(AppLocalizations.of(context).localeName), + text: + country.getLocalizedName(ProductQuery.getLanguage().code) ?? + '', filter: filter, textStyle: const TextStyle( fontWeight: FontWeight.w600, @@ -324,12 +325,11 @@ class _CountrySelectorScreen extends StatelessWidget { (OpenFoodFactsCountry country) => country == userCountry || country == selectedCountry || - country - .getLocalizedName(AppLocalizations.of(context).localeName) - .toLowerCase() - .contains( - filter.toLowerCase(), - ) || + (country + .getLocalizedName(ProductQuery.getLanguage().code) + ?.toLowerCase() + .contains(filter.toLowerCase()) ?? + false) || country.offTag.toLowerCase().contains( filter.toLowerCase(), ), diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart index 9fc49eeebfe3..4f5c7d020fac 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart @@ -50,18 +50,17 @@ class _CountrySelectorProvider @override Future> onLoadValues() async { final List countries = - _sanitizeAndSortCountries(userAppLanguageCode); + _sanitizeCountriesList(userAppLanguageCode); return countries; } - static List _sanitizeAndSortCountries(String? locale) { + static List _sanitizeCountriesList(String? locale) { final List countries = - List.from(OpenFoodFactsCountry.values); + List.from(OpenFoodFactsCountry.values); countries.sort( - (a, b) => a - .getLocalizedName(locale ?? 'en') - .compareTo(b.getLocalizedName(locale ?? 'en')), + (a, b) => (a.getLocalizedName(locale ?? 'en') ?? '') + .compareTo(b.getLocalizedName(locale ?? 'en') ?? ''), ); return countries; @@ -75,7 +74,8 @@ class _CountrySelectorProvider (a, b) { if (a.offTag == userCountryCode) return -1; if (b.offTag == userCountryCode) return 1; - return a.getLocalizedName('en').compareTo(b.getLocalizedName('en')); + return (a.getLocalizedName('en') ?? '') + .compareTo(b.getLocalizedName('en') ?? ''); }, ); } @@ -96,46 +96,3 @@ class _CountrySelectorProvider Future onSaveItem(OpenFoodFactsCountry country) => preferences.setUserCountryCode(country.offTag); } - -// class CountriesHelper { -// const CountriesHelper._(); -// -// static Future?> getCountries(String? userLanguageCode) async { -// try { -// final CountriesLocaleMapper mapper = CountriesLocaleMapper(); -// -// // Use the ISO3 codes from your custom map -// final Set iso3Codes = iso3ToCountry.keys.toSet(); -// -// final LocaleMap localized = mapper.localize( -// iso3Codes, -// mainLocale: userLanguageCode ?? 'en', -// fallbackLocale: 'en', -// ); -// -// // Build the list using your existing OpenFoodFactsCountry mapping -// final List countriesList = localized.entries.map((entry) { -// final String iso3 = entry.key.isoCode; // like 'IND' -// final String localizedName = entry.value; -// -// final OpenFoodFactsCountry? offCountry = iso3ToCountry[iso3]; -// final String alpha2 = offCountry?.offTag.toUpperCase() ?? 'UN'; -// -// return Country(name: localizedName, countryCode: alpha2); -// }).toList(); -// -// return countriesList; -// } on MissingPluginException catch (_) { -// // Locales are not implemented on desktop and web -// return [ -// const Country(name: 'United States', countryCode: 'US'), -// const Country(name: 'France', countryCode: 'FR'), -// const Country(name: 'Germany', countryCode: 'DE'), -// const Country(name: 'India', countryCode: 'IN'), -// ]; -// } catch (e) { -// Logs.e('Failed to load countries', ex: e); -// return null; -// } -// } -// } diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart new file mode 100644 index 000000000000..a1fd091223f9 --- /dev/null +++ b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart @@ -0,0 +1,8 @@ +import 'package:openfoodfacts/openfoodfacts.dart'; +import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart'; +import 'package:smooth_app/pages/prices/emoji_helper.dart'; + +extension OpenFoodFactsCountryEmojiExtension on OpenFoodFactsCountry { + String get emoji => EmojiHelper.getEmojiByCountryCode(iso2Code) ?? ''; +} + diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart new file mode 100644 index 000000000000..24386a3905a5 --- /dev/null +++ b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart @@ -0,0 +1,6 @@ +import 'package:openfoodfacts/openfoodfacts.dart'; + +extension OpenFoodFactsCountryIso2Extension on OpenFoodFactsCountry { + String get iso2Code => offTag.toUpperCase() == 'UK' ? 'GB' : offTag.toUpperCase(); +} + diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart index 0f25ca858ddd..ad32db6b5163 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart @@ -3,12 +3,22 @@ import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:smooth_app/pages/preferences/country_selector/tmp_country_iso3.dart'; extension OpenFoodFactsCountryNameExtension on OpenFoodFactsCountry { - String getLocalizedName(String locale) { + String? getLocalizedName(String locale) { + final String? iso3 = tmpCountryIso3[this]; + if (iso3 == null) { + return null; + } + final CountriesLocaleMapper mapper = CountriesLocaleMapper(); - final LocaleMap result = mapper.localize({tmpCountryIso3[this] ?? 'UN'}, - mainLocale: locale, fallbackLocale: 'en'); - return result.values.first; + final LocaleMap result = mapper.localize( + {iso3}, + mainLocale: locale, + fallbackLocale: 'en', + ); + + return result.values.firstOrNull; } - String getEnglishName() => getLocalizedName('en'); + String getEnglishName() => + getLocalizedName('en') ?? toString().split('.').last; } diff --git a/packages/smooth_app/lib/pages/product/common/product_query_page.dart b/packages/smooth_app/lib/pages/product/common/product_query_page.dart index f5698d1dd66f..f8ca6e9a5760 100644 --- a/packages/smooth_app/lib/pages/product/common/product_query_page.dart +++ b/packages/smooth_app/lib/pages/product/common/product_query_page.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:l10n_countries/l10n_countries.dart'; import 'package:matomo_tracker/matomo_tracker.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:provider/provider.dart'; @@ -20,7 +19,7 @@ import 'package:smooth_app/generic_lib/widgets/smooth_card.dart'; import 'package:smooth_app/generic_lib/widgets/smooth_error_card.dart'; import 'package:smooth_app/helpers/analytics_helper.dart'; import 'package:smooth_app/pages/personalized_ranking_page.dart'; -import 'package:smooth_app/pages/preferences/country_selector/tmp_country_iso3.dart'; +import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart'; import 'package:smooth_app/pages/product/common/loading_status.dart'; import 'package:smooth_app/pages/product/common/product_list_item_simple.dart'; import 'package:smooth_app/pages/product/common/product_query_page_helper.dart'; @@ -428,28 +427,11 @@ class _ProductQueryPageState extends State } Future _getTranslatedCountry() async { - if (_country == null) return null; - - // Find the matching ISO3 code for the given _country - final String? iso3 = tmpCountryIso3[_country!]; - if (iso3 == null) { - return null; - } - - if (iso3.isEmpty) { + if (_country == null) { return null; } - - final CountriesLocaleMapper mapper = CountriesLocaleMapper(); final String locale = Localizations.localeOf(context).languageCode; - - final LocaleMap localized = mapper.localize( - {iso3}, - mainLocale: locale, - fallbackLocale: 'en', - ); - - return localized.values.firstOrNull; + return _country!.getLocalizedName(locale); } Widget _getLargeButtonWithIcon(final _Action action) => diff --git a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart index 2c763c89c9a1..468f4ae5c72f 100644 --- a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart +++ b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart @@ -925,8 +925,8 @@ class SimpleInputPageCategoryNotFoodHelper /// Implementation for "Countries" of an [AbstractSimpleInputPageHelper]. class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { SimpleInputPageCountryHelper(UserPreferences userPreferences) - : _userCountryCode = - userPreferences.userCountryCode?.toUpperCase() ?? 'EN'; + : _userCountryCode = userPreferences.userCountryCode?.toUpperCase() ?? + OpenFoodFactsCountry.FRANCE.offTag.toUpperCase(); final String _userCountryCode; @@ -934,8 +934,7 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { ValueNotifier( const SimpleInputSuggestionsLoading(), ); - List? _countries; - + List get _countries => OpenFoodFactsCountry.values; @override List initTerms(final Product product) => product.countriesTagsInLanguages?[getLanguage()] ?? []; @@ -953,7 +952,6 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { ); } - _countries = OpenFoodFactsCountry.values; _reloadSuggestions(); } @@ -986,9 +984,7 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { _suggestionsNotifier; Future _reloadSuggestions() async { - _countries = OpenFoodFactsCountry.values; - - final OpenFoodFactsCountry? country = _countries!.firstWhereOrNull( + final OpenFoodFactsCountry? country = _countries.firstWhereOrNull( (OpenFoodFactsCountry country) => country.offTag.toUpperCase() == _userCountryCode.toUpperCase(), ); @@ -1003,7 +999,9 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { } _suggestionsNotifier.value = SimpleInputSuggestionsLoaded( - suggestions: [country.getLocalizedName(locale)], + suggestions: country.getLocalizedName(locale) != null + ? [country.getLocalizedName(locale)!] + : [], ); } diff --git a/packages/smooth_app/pubspec.yaml b/packages/smooth_app/pubspec.yaml index ad8e81ffe8c2..09518e8c29ae 100644 --- a/packages/smooth_app/pubspec.yaml +++ b/packages/smooth_app/pubspec.yaml @@ -27,6 +27,7 @@ dependencies: http: 1.3.0 http_parser: 4.1.2 image_picker: 1.1.2 + l10n_countries: 1.0.0 latlong2: 0.9.1 matomo_tracker: 5.1.0 package_info_plus: 8.2.1 @@ -84,11 +85,11 @@ dependencies: app_store_uri: path: ../app_store/uri_store - # We use two different scanning engines, + # We use two different scanning engines, # mobile scanner powered by ML Kit for the Play Store and Apple App Store, # but qr_code_scanner which uses the open source ZXing for F-Droid camera: 0.11.1 - + scanner_shared: path: ../scanner/shared @@ -99,9 +100,7 @@ dependencies: path: ../scanner/zxing - openfoodfacts: 3.20.0 - l10n_countries: 1.0.0 - iso_countries: ^2.2.0 + openfoodfacts: 3.21.0 # openfoodfacts: # path: ../../../openfoodfacts-dart From d4f7dfeb7213ac105efb13630d3a43e45bcc0619 Mon Sep 17 00:00:00 2001 From: pavaniroid Date: Mon, 14 Apr 2025 23:57:17 +0530 Subject: [PATCH 4/9] fix: apply monsieurtanuki feedback. --- .../country_selector/country_selector_provider.dart | 2 +- .../openfoodfacts_country_emoji_extension.dart | 1 - .../openfoodfacts_country_iso2code_extension.dart | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart index 4f5c7d020fac..087c19170764 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart @@ -50,7 +50,7 @@ class _CountrySelectorProvider @override Future> onLoadValues() async { final List countries = - _sanitizeCountriesList(userAppLanguageCode); + _sanitizeCountriesList(userAppLanguageCode); return countries; } diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart index a1fd091223f9..25dabd2533a1 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart @@ -5,4 +5,3 @@ import 'package:smooth_app/pages/prices/emoji_helper.dart'; extension OpenFoodFactsCountryEmojiExtension on OpenFoodFactsCountry { String get emoji => EmojiHelper.getEmojiByCountryCode(iso2Code) ?? ''; } - diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart index 24386a3905a5..510dca52063c 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart @@ -1,6 +1,6 @@ import 'package:openfoodfacts/openfoodfacts.dart'; extension OpenFoodFactsCountryIso2Extension on OpenFoodFactsCountry { - String get iso2Code => offTag.toUpperCase() == 'UK' ? 'GB' : offTag.toUpperCase(); + String get iso2Code => + offTag.toUpperCase() == 'UK' ? 'GB' : offTag.toUpperCase(); } - From c11ab2e2a0d8b9094e63a0e19db3f9be75c0be59 Mon Sep 17 00:00:00 2001 From: pavaniroid Date: Wed, 16 Apr 2025 01:42:30 +0530 Subject: [PATCH 5/9] fix: finalize logic based on reviewer feedback --- .../country_selector/country_selector.dart | 29 ++--- .../country_selector_provider.dart | 58 +++++++--- ...openfoodfacts_country_emoji_extension.dart | 7 -- ...nfoodfacts_country_iso2code_extension.dart | 2 +- .../openfoodfacts_country_name_extension.dart | 6 +- .../lib/pages/prices/emoji_helper.dart | 10 +- .../product/common/product_query_page.dart | 100 +++++++++--------- .../product/simple_input_page_helpers.dart | 19 ++-- 8 files changed, 125 insertions(+), 106 deletions(-) delete mode 100644 packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart index f5824bdabecf..e7ee2c35a329 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart @@ -1,4 +1,5 @@ import 'package:auto_size_text/auto_size_text.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' hide Listener; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; @@ -7,8 +8,9 @@ import 'package:smooth_app/data_models/preferences/user_preferences.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/helpers/provider_helper.dart'; -import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart'; +import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart'; import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart'; +import 'package:smooth_app/pages/prices/emoji_helper.dart'; import 'package:smooth_app/query/product_query.dart'; import 'package:smooth_app/widgets/selector_screen/smooth_screen_list_choice.dart'; import 'package:smooth_app/widgets/selector_screen/smooth_screen_selector_provider.dart'; @@ -126,7 +128,8 @@ class _CountrySelectorButton extends StatelessWidget { SizedBox( width: IconTheme.of(context).size! + LARGE_SPACE, child: AutoSizeText( - country.emoji, + EmojiHelper.getEmojiByCountryCode(country.iso2Code) ?? + '', textAlign: TextAlign.center, style: TextStyle(fontSize: IconTheme.of(context).size), @@ -274,14 +277,14 @@ class _CountrySelectorScreen extends StatelessWidget { Expanded( flex: 1, child: Text( - country.emoji, + EmojiHelper.getEmojiByCountryCode(country.iso2Code) ?? '', style: const TextStyle(fontSize: 25.0), ), ), Expanded( flex: 2, child: Text( - country.offTag.toUpperCase(), + country.iso2Code, textAlign: TextAlign.center, maxLines: 1, overflow: TextOverflow.ellipsis, @@ -291,8 +294,7 @@ class _CountrySelectorScreen extends StatelessWidget { flex: 7, child: TextHighlighter( text: - country.getLocalizedName(ProductQuery.getLanguage().code) ?? - '', + country.getLocalizedName(ProductQuery.getLanguage()) ?? '', filter: filter, textStyle: const TextStyle( fontWeight: FontWeight.w600, @@ -306,17 +308,16 @@ class _CountrySelectorScreen extends StatelessWidget { OpenFoodFactsCountry? selectedItem, OpenFoodFactsCountry? selectedItemOverride, String filter) => - _filterCountries( - list, selectedItem, selectedItemOverride, filter, context), + _filterCountries(list, selectedItem, selectedItemOverride, filter), ); } Iterable _filterCountries( - List countries, - OpenFoodFactsCountry? userCountry, - OpenFoodFactsCountry? selectedCountry, - String? filter, - BuildContext context) { + List countries, + OpenFoodFactsCountry? userCountry, + OpenFoodFactsCountry? selectedCountry, + String? filter, + ) { if (filter == null || filter.isEmpty) { return countries; } @@ -326,7 +327,7 @@ class _CountrySelectorScreen extends StatelessWidget { country == userCountry || country == selectedCountry || (country - .getLocalizedName(ProductQuery.getLanguage().code) + .getLocalizedName(ProductQuery.getLanguage()) ?.toLowerCase() .contains(filter.toLowerCase()) ?? false) || diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart index 087c19170764..cfdacaa32155 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart @@ -6,7 +6,6 @@ part of 'country_selector.dart'; /// * [_CountrySelectorLoadedState]: countries loaded and/or saved /// * [_CountrySelectorEditingState]: the user has selected a country /// (temporary selection) - class _CountrySelectorProvider extends PreferencesSelectorProvider { _CountrySelectorProvider({ @@ -15,25 +14,27 @@ class _CountrySelectorProvider }); String? userCountryCode; - String? userAppLanguageCode; + OpenFoodFactsLanguage? userAppLanguage; @override Future onPreferencesChanged() async { final String? newCountryCode = preferences.userCountryCode; final String? newLanguageCode = preferences.appLanguageCode; + final OpenFoodFactsLanguage? newLanguage = + _getLanguageFromCode(newLanguageCode); - if (newLanguageCode != userAppLanguageCode) { + if (newLanguage != userAppLanguage) { userCountryCode = newCountryCode; - userAppLanguageCode = newLanguageCode; + userAppLanguage = newLanguage; return loadValues(); } else if (newCountryCode != userCountryCode) { userCountryCode = newCountryCode; - userAppLanguageCode = newLanguageCode; + userAppLanguage = newLanguage; if (value is PreferencesSelectorInitialState) { return loadValues(); } else { - final state = + final PreferencesSelectorLoadedState state = value as PreferencesSelectorLoadedState; final List countries = state.items; @@ -49,21 +50,34 @@ class _CountrySelectorProvider @override Future> onLoadValues() async { - final List countries = - _sanitizeCountriesList(userAppLanguageCode); + final List countries = await compute( + _reformatCountries, + (OpenFoodFactsCountry.values, userCountryCode), + ); + return countries; } - static List _sanitizeCountriesList(String? locale) { + static Future> _reformatCountries( + (List, String?) countriesAndUserCode, + ) async { final List countries = - List.from(OpenFoodFactsCountry.values); + _sanitizeCountriesList(countriesAndUserCode.$1); + _reorderCountries(countries, countriesAndUserCode.$2); + return countries; + } - countries.sort( - (a, b) => (a.getLocalizedName(locale ?? 'en') ?? '') - .compareTo(b.getLocalizedName(locale ?? 'en') ?? ''), + /// Keep all countries from the enum, and sort them alphabetically + static List _sanitizeCountriesList( + List allCountries, + ) { + final List sorted = + List.from(allCountries); + sorted.sort( + (a, b) => (a.getLocalizedName(OpenFoodFactsLanguage.ENGLISH) ?? '') + .compareTo(b.getLocalizedName(OpenFoodFactsLanguage.ENGLISH) ?? ''), ); - - return countries; + return sorted; } static void _reorderCountries( @@ -74,8 +88,8 @@ class _CountrySelectorProvider (a, b) { if (a.offTag == userCountryCode) return -1; if (b.offTag == userCountryCode) return 1; - return (a.getLocalizedName('en') ?? '') - .compareTo(b.getLocalizedName('en') ?? ''); + return (a.getLocalizedName(OpenFoodFactsLanguage.ENGLISH) ?? '') + .compareTo(b.getLocalizedName(OpenFoodFactsLanguage.ENGLISH) ?? ''); }, ); } @@ -95,4 +109,14 @@ class _CountrySelectorProvider @override Future onSaveItem(OpenFoodFactsCountry country) => preferences.setUserCountryCode(country.offTag); + + OpenFoodFactsLanguage? _getLanguageFromCode(String? code) { + if (code == null) { + return null; + } + return OpenFoodFactsLanguage.values.firstWhere( + (lang) => lang.code == code, + orElse: () => OpenFoodFactsLanguage.ENGLISH, + ); + } } diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart deleted file mode 100644 index 25dabd2533a1..000000000000 --- a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_emoji_extension.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:openfoodfacts/openfoodfacts.dart'; -import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart'; -import 'package:smooth_app/pages/prices/emoji_helper.dart'; - -extension OpenFoodFactsCountryEmojiExtension on OpenFoodFactsCountry { - String get emoji => EmojiHelper.getEmojiByCountryCode(iso2Code) ?? ''; -} diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart index 510dca52063c..05275a18151f 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart @@ -2,5 +2,5 @@ import 'package:openfoodfacts/openfoodfacts.dart'; extension OpenFoodFactsCountryIso2Extension on OpenFoodFactsCountry { String get iso2Code => - offTag.toUpperCase() == 'UK' ? 'GB' : offTag.toUpperCase(); + this == OpenFoodFactsCountry.UNITED_KINGDOM ? 'GB' : offTag.toUpperCase(); } diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart index ad32db6b5163..42bcaa3190b5 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart @@ -3,7 +3,7 @@ import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:smooth_app/pages/preferences/country_selector/tmp_country_iso3.dart'; extension OpenFoodFactsCountryNameExtension on OpenFoodFactsCountry { - String? getLocalizedName(String locale) { + String? getLocalizedName(OpenFoodFactsLanguage locale) { final String? iso3 = tmpCountryIso3[this]; if (iso3 == null) { return null; @@ -13,12 +13,12 @@ extension OpenFoodFactsCountryNameExtension on OpenFoodFactsCountry { final LocaleMap result = mapper.localize( {iso3}, mainLocale: locale, - fallbackLocale: 'en', ); return result.values.firstOrNull; } String getEnglishName() => - getLocalizedName('en') ?? toString().split('.').last; + getLocalizedName(OpenFoodFactsLanguage.ENGLISH) ?? + toString().split('.').last; } diff --git a/packages/smooth_app/lib/pages/prices/emoji_helper.dart b/packages/smooth_app/lib/pages/prices/emoji_helper.dart index 57a5d2b6aff4..ea3deb636791 100644 --- a/packages/smooth_app/lib/pages/prices/emoji_helper.dart +++ b/packages/smooth_app/lib/pages/prices/emoji_helper.dart @@ -1,6 +1,9 @@ import 'package:openfoodfacts/openfoodfacts.dart'; +import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart'; /// Generic helper about emoji display. +/// +/// cf. https://emojipedia.org/flag-italy class EmojiHelper { const EmojiHelper._(); @@ -11,16 +14,13 @@ class EmojiHelper { if (country == null) { return null; } - return getEmojiByCountryCode(country.offTag); + return getEmojiByCountryCode(country.iso2Code); } static String? getEmojiByCountryCode(final String countryCode) { if (countryCode.isEmpty) { return null; - } else if (countryCode.toUpperCase() == 'UK') { - return _getCountryEmojiFromUnicode('GB'); } - return _getCountryEmojiFromUnicode(countryCode); } @@ -35,7 +35,7 @@ class EmojiHelper { if (countryLetterEmoji1 == null) { return null; } - //OpenFoodFactsCountry + final String? countryLetterEmoji2 = _getCountryLetterEmoji( unicode.substring(1, 2), ); diff --git a/packages/smooth_app/lib/pages/product/common/product_query_page.dart b/packages/smooth_app/lib/pages/product/common/product_query_page.dart index f8ca6e9a5760..ae1d1e9b3747 100644 --- a/packages/smooth_app/lib/pages/product/common/product_query_page.dart +++ b/packages/smooth_app/lib/pages/product/common/product_query_page.dart @@ -27,6 +27,7 @@ import 'package:smooth_app/pages/product/common/search_app_bar_title.dart'; import 'package:smooth_app/pages/product/common/search_empty_screen.dart'; import 'package:smooth_app/pages/product/common/search_loading_screen.dart'; import 'package:smooth_app/query/paged_product_query.dart'; +import 'package:smooth_app/query/product_query.dart'; import 'package:smooth_app/widgets/ranking_floating_action_button.dart'; import 'package:smooth_app/widgets/smooth_app_bar.dart'; import 'package:smooth_app/widgets/smooth_scaffold.dart'; @@ -373,64 +374,63 @@ class _ProductQueryPageState extends State final PagedProductQuery pagedProductQuery = _model.supplier.productQuery; final PagedProductQuery? worldQuery = pagedProductQuery.getWorldQuery(); - return FutureBuilder( - future: _getTranslatedCountry(), - builder: ( - final BuildContext context, - final AsyncSnapshot snapshot, - ) { - final AppLocalizations appLocalizations = AppLocalizations.of(context); - final List messages = []; - String counting = appLocalizations.user_list_length( - _model.supplier.partialProductList.totalSize, - ); - if (pagedProductQuery.hasDifferentCountryWorldData()) { - if (pagedProductQuery.world) { - counting += ' (${appLocalizations.world_results_label})'; - } else { - if (snapshot.data != null) { - counting += ' (${snapshot.data})'; - } - } - } - messages.add(counting); - final int? lastUpdate = _model.supplier.timestamp; - if (lastUpdate != null) { - final String lastTime = - ProductQueryPageHelper.getDurationStringFromTimestamp( - lastUpdate, context); - messages.add('${appLocalizations.cached_results_from} $lastTime'); + final AppLocalizations appLocalizations = AppLocalizations.of(context); + final List messages = []; + + String counting = appLocalizations.user_list_length( + _model.supplier.partialProductList.totalSize, + ); + + final String? translatedCountry = _getTranslatedCountry(); + + if (pagedProductQuery.hasDifferentCountryWorldData()) { + if (pagedProductQuery.world) { + counting += ' (${appLocalizations.world_results_label})'; + } else { + if (translatedCountry != null) { + counting += ' ($translatedCountry)'; } - return SizedBox( - width: double.infinity, - child: SmoothCard( - child: Padding( - padding: const EdgeInsets.all(SMALL_SPACE), - child: Row( - children: [ - Expanded(child: Text(messages.join('\n'))), - if (pagedProductQuery.getWorldQuery() != null) - _getIconButton( - _getWorldAction( - appLocalizations, - worldQuery!, - widget.includeAppBar, - ), - ), - ], - ), - ), + } + } + + messages.add(counting); + + final int? lastUpdate = _model.supplier.timestamp; + if (lastUpdate != null) { + final String lastTime = + ProductQueryPageHelper.getDurationStringFromTimestamp( + lastUpdate, context); + messages.add('${appLocalizations.cached_results_from} $lastTime'); + } + + return SizedBox( + width: double.infinity, + child: SmoothCard( + child: Padding( + padding: const EdgeInsets.all(SMALL_SPACE), + child: Row( + children: [ + Expanded(child: Text(messages.join('\n'))), + if (pagedProductQuery.getWorldQuery() != null) + _getIconButton( + _getWorldAction( + appLocalizations, + worldQuery!, + widget.includeAppBar, + ), + ), + ], ), - ); - }, + ), + ), ); } - Future _getTranslatedCountry() async { + String? _getTranslatedCountry() { if (_country == null) { return null; } - final String locale = Localizations.localeOf(context).languageCode; + final OpenFoodFactsLanguage locale = ProductQuery.getLanguage(); return _country!.getLocalizedName(locale); } diff --git a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart index 468f4ae5c72f..0977f9435b85 100644 --- a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart +++ b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart @@ -8,6 +8,7 @@ import 'package:smooth_app/generic_lib/design_constants.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/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart'; import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart'; import 'package:smooth_app/pages/product/multilingual_helper.dart'; import 'package:smooth_app/query/product_query.dart'; @@ -925,10 +926,11 @@ class SimpleInputPageCategoryNotFoodHelper /// Implementation for "Countries" of an [AbstractSimpleInputPageHelper]. class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { SimpleInputPageCountryHelper(UserPreferences userPreferences) - : _userCountryCode = userPreferences.userCountryCode?.toUpperCase() ?? - OpenFoodFactsCountry.FRANCE.offTag.toUpperCase(); + : _userCountry = OpenFoodFactsCountry.fromOffTag( + userPreferences.userCountryCode ?? '') ?? + OpenFoodFactsCountry.FRANCE; - final String _userCountryCode; + final OpenFoodFactsCountry _userCountry; ValueNotifier _suggestionsNotifier = ValueNotifier( @@ -986,12 +988,13 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { Future _reloadSuggestions() async { final OpenFoodFactsCountry? country = _countries.firstWhereOrNull( (OpenFoodFactsCountry country) => - country.offTag.toUpperCase() == _userCountryCode.toUpperCase(), + country.iso2Code == _userCountry.iso2Code, ); - final String locale = getLanguage().offTag; + final OpenFoodFactsLanguage locale = getLanguage(); + final String? localizedName = country?.getLocalizedName(locale); - if (country == null || _terms.contains(country.getLocalizedName(locale))) { + if (country == null || _terms.contains(localizedName)) { _suggestionsNotifier.value = const SimpleInputSuggestionsLoaded( suggestions: [], ); @@ -999,9 +1002,7 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { } _suggestionsNotifier.value = SimpleInputSuggestionsLoaded( - suggestions: country.getLocalizedName(locale) != null - ? [country.getLocalizedName(locale)!] - : [], + suggestions: localizedName != null ? [localizedName] : [], ); } From d2d4583f8d6d0457acc73d659ab77faa8b747d31 Mon Sep 17 00:00:00 2001 From: pavaniroid Date: Wed, 16 Apr 2025 23:20:31 +0530 Subject: [PATCH 6/9] fix: apply reviewer feedback --- .../country_selector/country_selector.dart | 28 ++++++++----------- .../country_selector_provider.dart | 11 ++++---- ...nfoodfacts_country_iso2code_extension.dart | 1 + .../openfoodfacts_country_name_extension.dart | 13 +++++++-- .../product/common/product_query_page.dart | 3 +- .../product/simple_input_page_helpers.dart | 20 ++++--------- 6 files changed, 35 insertions(+), 41 deletions(-) diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart index e7ee2c35a329..65792d317e92 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart @@ -128,8 +128,7 @@ class _CountrySelectorButton extends StatelessWidget { SizedBox( width: IconTheme.of(context).size! + LARGE_SPACE, child: AutoSizeText( - EmojiHelper.getEmojiByCountryCode(country.iso2Code) ?? - '', + EmojiHelper.getCountryEmoji(country) ?? '', textAlign: TextAlign.center, style: TextStyle(fontSize: IconTheme.of(context).size), @@ -277,7 +276,7 @@ class _CountrySelectorScreen extends StatelessWidget { Expanded( flex: 1, child: Text( - EmojiHelper.getEmojiByCountryCode(country.iso2Code) ?? '', + EmojiHelper.getCountryEmoji(country) ?? '', style: const TextStyle(fontSize: 25.0), ), ), @@ -322,18 +321,15 @@ class _CountrySelectorScreen extends StatelessWidget { return countries; } - return countries.where( - (OpenFoodFactsCountry country) => - country == userCountry || - country == selectedCountry || - (country - .getLocalizedName(ProductQuery.getLanguage()) - ?.toLowerCase() - .contains(filter.toLowerCase()) ?? - false) || - country.offTag.toLowerCase().contains( - filter.toLowerCase(), - ), - ); + return countries.where((OpenFoodFactsCountry country) => + country == userCountry || + country == selectedCountry || + (country + .getLocalizedName(ProductQuery.getLanguage()) + ?.toLowerCase() + .contains(filter.toLowerCase()) ?? + false) || + country.iso2Code.toLowerCase().contains(filter.toLowerCase()) || + country.offTag.toLowerCase().contains(filter.toLowerCase())); } } diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart index cfdacaa32155..d9ad55b0d963 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart @@ -18,7 +18,8 @@ class _CountrySelectorProvider @override Future onPreferencesChanged() async { - final String? newCountryCode = preferences.userCountryCode; + final String? newCountryCode = + preferences.userCountryCode; // Stored as offTag final String? newLanguageCode = preferences.appLanguageCode; final OpenFoodFactsLanguage? newLanguage = _getLanguageFromCode(newLanguageCode); @@ -108,15 +109,13 @@ class _CountrySelectorProvider @override Future onSaveItem(OpenFoodFactsCountry country) => - preferences.setUserCountryCode(country.offTag); + preferences.setUserCountryCode( + country.offTag); // Save offTag (not iso2code) in preferences OpenFoodFactsLanguage? _getLanguageFromCode(String? code) { if (code == null) { return null; } - return OpenFoodFactsLanguage.values.firstWhere( - (lang) => lang.code == code, - orElse: () => OpenFoodFactsLanguage.ENGLISH, - ); + return OpenFoodFactsLanguage.fromOffTag(code); } } diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart index 05275a18151f..ebccfa928ee7 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart @@ -1,6 +1,7 @@ import 'package:openfoodfacts/openfoodfacts.dart'; extension OpenFoodFactsCountryIso2Extension on OpenFoodFactsCountry { + // Uses iso2Code to display the UI and emoji. String get iso2Code => this == OpenFoodFactsCountry.UNITED_KINGDOM ? 'GB' : offTag.toUpperCase(); } diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart index 42bcaa3190b5..55c72e90afee 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart @@ -3,7 +3,7 @@ import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:smooth_app/pages/preferences/country_selector/tmp_country_iso3.dart'; extension OpenFoodFactsCountryNameExtension on OpenFoodFactsCountry { - String? getLocalizedName(OpenFoodFactsLanguage locale) { + String? getLocalizedName(OpenFoodFactsLanguage language) { final String? iso3 = tmpCountryIso3[this]; if (iso3 == null) { return null; @@ -12,10 +12,17 @@ extension OpenFoodFactsCountryNameExtension on OpenFoodFactsCountry { final CountriesLocaleMapper mapper = CountriesLocaleMapper(); final LocaleMap result = mapper.localize( {iso3}, - mainLocale: locale, + mainLocale: language, ); - return result.values.firstOrNull; + String? name = result.values.firstOrNull; + + if (language != OpenFoodFactsLanguage.ENGLISH || name != null) { + return name; + } + name = + toString().replaceAll('OpenFoodFactsCountry.', '').replaceAll('_', ' '); + return '${name[0].toUpperCase()}${name.substring(1).toLowerCase()}'; } String getEnglishName() => diff --git a/packages/smooth_app/lib/pages/product/common/product_query_page.dart b/packages/smooth_app/lib/pages/product/common/product_query_page.dart index ae1d1e9b3747..0d7457e3648b 100644 --- a/packages/smooth_app/lib/pages/product/common/product_query_page.dart +++ b/packages/smooth_app/lib/pages/product/common/product_query_page.dart @@ -430,8 +430,7 @@ class _ProductQueryPageState extends State if (_country == null) { return null; } - final OpenFoodFactsLanguage locale = ProductQuery.getLanguage(); - return _country!.getLocalizedName(locale); + return _country!.getLocalizedName(ProductQuery.getLanguage()); } Widget _getLargeButtonWithIcon(final _Action action) => diff --git a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart index 0977f9435b85..3a4a98bc9478 100644 --- a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart +++ b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart @@ -8,7 +8,6 @@ import 'package:smooth_app/generic_lib/design_constants.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/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart'; import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart'; import 'package:smooth_app/pages/product/multilingual_helper.dart'; import 'package:smooth_app/query/product_query.dart'; @@ -926,9 +925,9 @@ class SimpleInputPageCategoryNotFoodHelper /// Implementation for "Countries" of an [AbstractSimpleInputPageHelper]. class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { SimpleInputPageCountryHelper(UserPreferences userPreferences) - : _userCountry = OpenFoodFactsCountry.fromOffTag( - userPreferences.userCountryCode ?? '') ?? - OpenFoodFactsCountry.FRANCE; + : _userCountry = + OpenFoodFactsCountry.fromOffTag(userPreferences.userCountryCode) ?? + OpenFoodFactsCountry.FRANCE; final OpenFoodFactsCountry _userCountry; @@ -936,7 +935,6 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { ValueNotifier( const SimpleInputSuggestionsLoading(), ); - List get _countries => OpenFoodFactsCountry.values; @override List initTerms(final Product product) => product.countriesTagsInLanguages?[getLanguage()] ?? []; @@ -986,15 +984,9 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { _suggestionsNotifier; Future _reloadSuggestions() async { - final OpenFoodFactsCountry? country = _countries.firstWhereOrNull( - (OpenFoodFactsCountry country) => - country.iso2Code == _userCountry.iso2Code, - ); - - final OpenFoodFactsLanguage locale = getLanguage(); - final String? localizedName = country?.getLocalizedName(locale); + final String? localizedName = _userCountry.getLocalizedName(getLanguage()); - if (country == null || _terms.contains(localizedName)) { + if (localizedName == null || _terms.contains(localizedName)) { _suggestionsNotifier.value = const SimpleInputSuggestionsLoaded( suggestions: [], ); @@ -1002,7 +994,7 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { } _suggestionsNotifier.value = SimpleInputSuggestionsLoaded( - suggestions: localizedName != null ? [localizedName] : [], + suggestions: [localizedName], ); } From 335b3f28cdf64985bd76fc3df270c2276244db91 Mon Sep 17 00:00:00 2001 From: pavaniroid Date: Sun, 20 Apr 2025 23:55:11 +0530 Subject: [PATCH 7/9] fix: create LocalizedCountry class --- .../country_selector/country_selector.dart | 83 +++++++++---------- .../country_selector_provider.dart | 46 ++++------ .../country_selector/localized_country.dart | 83 +++++++++++++++++++ .../openfoodfacts_country_name_extension.dart | 31 ------- .../product/common/product_query_page.dart | 5 +- .../product/simple_input_page_helpers.dart | 5 +- .../smooth_app/lib/query/product_query.dart | 32 ++++--- 7 files changed, 162 insertions(+), 123 deletions(-) create mode 100644 packages/smooth_app/lib/pages/preferences/country_selector/localized_country.dart delete mode 100644 packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart index 65792d317e92..2138a6dca514 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart @@ -1,5 +1,5 @@ import 'package:auto_size_text/auto_size_text.dart'; -import 'package:flutter/foundation.dart'; +import 'package:collection/collection.dart'; import 'package:flutter/material.dart' hide Listener; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; @@ -8,10 +8,9 @@ import 'package:smooth_app/data_models/preferences/user_preferences.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/helpers/provider_helper.dart'; +import 'package:smooth_app/pages/preferences/country_selector/localized_country.dart'; import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart'; -import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart'; import 'package:smooth_app/pages/prices/emoji_helper.dart'; -import 'package:smooth_app/query/product_query.dart'; import 'package:smooth_app/widgets/selector_screen/smooth_screen_list_choice.dart'; import 'package:smooth_app/widgets/selector_screen/smooth_screen_selector_provider.dart'; import 'package:smooth_app/widgets/smooth_text.dart'; @@ -120,26 +119,26 @@ class _CountrySelectorButton extends StatelessWidget { as PreferencesSelectorLoadedState) .selectedItem; + final String displayName = + LocalizedCountry.getSingleLocalizedName(country!) ?? + AppLocalizations.of(context).loading; + return Padding( padding: innerPadding, child: Row( children: [ - if (country != null) - SizedBox( - width: IconTheme.of(context).size! + LARGE_SPACE, - child: AutoSizeText( - EmojiHelper.getCountryEmoji(country) ?? '', - textAlign: TextAlign.center, - style: - TextStyle(fontSize: IconTheme.of(context).size), - ), - ) - else - const Icon(Icons.public), + SizedBox( + width: IconTheme.of(context).size! + LARGE_SPACE, + child: AutoSizeText( + EmojiHelper.getCountryEmoji(country) ?? '', + textAlign: TextAlign.center, + style: TextStyle(fontSize: IconTheme.of(context).size), + ), + ), const SizedBox(width: SMALL_SPACE), Expanded( child: Text( - country?.name ?? AppLocalizations.of(context).loading, + displayName, style: Theme.of(context) .textTheme .displaySmall @@ -201,7 +200,6 @@ class _CountrySelectorButton extends StatelessWidget { } } -// TODO(g123k): move this to a dedicated Provider Future _changeCurrencyIfRelevant( final BuildContext context, final OpenFoodFactsCountry country, @@ -262,6 +260,9 @@ class _CountrySelectorScreen extends StatelessWidget { Widget build(BuildContext context) { final AppLocalizations appLocalizations = AppLocalizations.of(context); + final List localizedCountries = + LocalizedCountry.getLocalizedCountries(); + return SmoothSelectorScreen( provider: provider, title: appLocalizations.country_selector_title, @@ -271,6 +272,9 @@ class _CountrySelectorScreen extends StatelessWidget { bool selected, String filter, ) { + final LocalizedCountry? lc = localizedCountries + .firstWhereOrNull((LocalizedCountry c) => c.country == country); + return Row( children: [ Expanded( @@ -292,8 +296,7 @@ class _CountrySelectorScreen extends StatelessWidget { Expanded( flex: 7, child: TextHighlighter( - text: - country.getLocalizedName(ProductQuery.getLanguage()) ?? '', + text: lc?.localizedName ?? '', filter: filter, textStyle: const TextStyle( fontWeight: FontWeight.w600, @@ -304,32 +307,22 @@ class _CountrySelectorScreen extends StatelessWidget { ); }, itemsFilter: (List list, - OpenFoodFactsCountry? selectedItem, - OpenFoodFactsCountry? selectedItemOverride, - String filter) => - _filterCountries(list, selectedItem, selectedItemOverride, filter), + OpenFoodFactsCountry? selectedItem, + OpenFoodFactsCountry? selectedItemOverride, + String filter) { + final List localized = + LocalizedCountry.getLocalizedCountries(); + return list.where((OpenFoodFactsCountry country) { + final LocalizedCountry? lc = + localized.firstWhereOrNull((c) => c.country == country); + return country == selectedItem || + country == selectedItemOverride || + (lc?.localizedName.toLowerCase().contains(filter.toLowerCase()) ?? + false) || + country.iso2Code.toLowerCase().contains(filter.toLowerCase()) || + country.offTag.toLowerCase().contains(filter.toLowerCase()); + }); + }, ); } - - Iterable _filterCountries( - List countries, - OpenFoodFactsCountry? userCountry, - OpenFoodFactsCountry? selectedCountry, - String? filter, - ) { - if (filter == null || filter.isEmpty) { - return countries; - } - - return countries.where((OpenFoodFactsCountry country) => - country == userCountry || - country == selectedCountry || - (country - .getLocalizedName(ProductQuery.getLanguage()) - ?.toLowerCase() - .contains(filter.toLowerCase()) ?? - false) || - country.iso2Code.toLowerCase().contains(filter.toLowerCase()) || - country.offTag.toLowerCase().contains(filter.toLowerCase())); - } } diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart index d9ad55b0d963..a026fc5e93df 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart @@ -51,46 +51,30 @@ class _CountrySelectorProvider @override Future> onLoadValues() async { - final List countries = await compute( - _reformatCountries, - (OpenFoodFactsCountry.values, userCountryCode), - ); - - return countries; - } - - static Future> _reformatCountries( - (List, String?) countriesAndUserCode, - ) async { final List countries = - _sanitizeCountriesList(countriesAndUserCode.$1); - _reorderCountries(countries, countriesAndUserCode.$2); + LocalizedCountry.getLocalizedCountries().map((e) => e.country).toList(); return countries; } - /// Keep all countries from the enum, and sort them alphabetically - static List _sanitizeCountriesList( - List allCountries, - ) { - final List sorted = - List.from(allCountries); - sorted.sort( - (a, b) => (a.getLocalizedName(OpenFoodFactsLanguage.ENGLISH) ?? '') - .compareTo(b.getLocalizedName(OpenFoodFactsLanguage.ENGLISH) ?? ''), - ); - return sorted; - } - static void _reorderCountries( List countries, String? userCountryCode, ) { + final Map localizedMap = { + for (final c in LocalizedCountry.getLocalizedCountries()) c.country: c + }; + countries.sort( (a, b) { - if (a.offTag == userCountryCode) return -1; - if (b.offTag == userCountryCode) return 1; - return (a.getLocalizedName(OpenFoodFactsLanguage.ENGLISH) ?? '') - .compareTo(b.getLocalizedName(OpenFoodFactsLanguage.ENGLISH) ?? ''); + if (a.offTag == userCountryCode) { + return -1; + } + if (b.offTag == userCountryCode) { + return 1; + } + final String nameA = localizedMap[a]?.localizedName ?? ''; + final String nameB = localizedMap[b]?.localizedName ?? ''; + return nameA.compareTo(nameB); }, ); } @@ -99,7 +83,7 @@ class _CountrySelectorProvider OpenFoodFactsCountry getSelectedValue(List countries) { if (userCountryCode != null) { return countries.firstWhere( - (country) => + (OpenFoodFactsCountry country) => country.offTag.toLowerCase() == userCountryCode?.toLowerCase(), orElse: () => countries.first, ); diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/localized_country.dart b/packages/smooth_app/lib/pages/preferences/country_selector/localized_country.dart new file mode 100644 index 000000000000..4867bbab2ef2 --- /dev/null +++ b/packages/smooth_app/lib/pages/preferences/country_selector/localized_country.dart @@ -0,0 +1,83 @@ +import 'package:l10n_countries/l10n_countries.dart'; +import 'package:openfoodfacts/openfoodfacts.dart'; +import 'package:smooth_app/pages/preferences/country_selector/tmp_country_iso3.dart'; +import 'package:smooth_app/query/product_query.dart'; + +class LocalizedCountry { + const LocalizedCountry({ + required this.country, + required this.localizedName, + required this.englishName, + }); + + final OpenFoodFactsCountry country; + final String localizedName; + final String englishName; + + String get preferenceCode => country.offTag; + + static List getLocalizedCountries() { + final OpenFoodFactsLanguage language = ProductQuery.getLanguage(); + final CountriesLocaleMapper mapper = CountriesLocaleMapper(); + + final Set iso3Codes = tmpCountryIso3.values.toSet(); + final LocaleMap localizedMap = mapper.localize( + iso3Codes, + mainLocale: language, + fallbackLocale: OpenFoodFactsLanguage.ENGLISH, + ); + + final List result = []; + for (final OpenFoodFactsCountry country in OpenFoodFactsCountry.values) { + final String? iso3 = tmpCountryIso3[country]; + if (iso3 == null) { + continue; + } + + final String? localized = localizedMap[iso3]; + + String fallbackEnglish = + country.toString().split('.').last.replaceAll('_', ' '); + fallbackEnglish = fallbackEnglish[0].toUpperCase() + + fallbackEnglish.substring(1).toLowerCase(); + + result.add( + LocalizedCountry( + country: country, + localizedName: localized ?? fallbackEnglish, + englishName: fallbackEnglish, + ), + ); + } + + result.sort((a, b) => a.localizedName.compareTo(b.localizedName)); + return result; + } + + static String? getSingleLocalizedName(OpenFoodFactsCountry country) { + final String? iso3 = tmpCountryIso3[country]; + if (iso3 == null) { + return null; + } + + final CountriesLocaleMapper mapper = CountriesLocaleMapper(); + final OpenFoodFactsLanguage language = ProductQuery.getLanguage(); + + final LocaleMap map = mapper.localize( + {iso3}, + mainLocale: language, + fallbackLocale: OpenFoodFactsLanguage.ENGLISH, + ); + + final String? localized = map.values.firstOrNull; + + if (language != OpenFoodFactsLanguage.ENGLISH || localized != null) { + return localized; + } + + final String fallbackEnglish = + country.toString().split('.').last.replaceAll('_', ' '); + return fallbackEnglish[0].toUpperCase() + + fallbackEnglish.substring(1).toLowerCase(); + } +} diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart deleted file mode 100644 index 55c72e90afee..000000000000 --- a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:l10n_countries/l10n_countries.dart'; -import 'package:openfoodfacts/openfoodfacts.dart'; -import 'package:smooth_app/pages/preferences/country_selector/tmp_country_iso3.dart'; - -extension OpenFoodFactsCountryNameExtension on OpenFoodFactsCountry { - String? getLocalizedName(OpenFoodFactsLanguage language) { - final String? iso3 = tmpCountryIso3[this]; - if (iso3 == null) { - return null; - } - - final CountriesLocaleMapper mapper = CountriesLocaleMapper(); - final LocaleMap result = mapper.localize( - {iso3}, - mainLocale: language, - ); - - String? name = result.values.firstOrNull; - - if (language != OpenFoodFactsLanguage.ENGLISH || name != null) { - return name; - } - name = - toString().replaceAll('OpenFoodFactsCountry.', '').replaceAll('_', ' '); - return '${name[0].toUpperCase()}${name.substring(1).toLowerCase()}'; - } - - String getEnglishName() => - getLocalizedName(OpenFoodFactsLanguage.ENGLISH) ?? - toString().split('.').last; -} diff --git a/packages/smooth_app/lib/pages/product/common/product_query_page.dart b/packages/smooth_app/lib/pages/product/common/product_query_page.dart index 0d7457e3648b..3dcd8a691667 100644 --- a/packages/smooth_app/lib/pages/product/common/product_query_page.dart +++ b/packages/smooth_app/lib/pages/product/common/product_query_page.dart @@ -19,7 +19,7 @@ import 'package:smooth_app/generic_lib/widgets/smooth_card.dart'; import 'package:smooth_app/generic_lib/widgets/smooth_error_card.dart'; import 'package:smooth_app/helpers/analytics_helper.dart'; import 'package:smooth_app/pages/personalized_ranking_page.dart'; -import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_name_extension.dart'; +import 'package:smooth_app/pages/preferences/country_selector/localized_country.dart'; import 'package:smooth_app/pages/product/common/loading_status.dart'; import 'package:smooth_app/pages/product/common/product_list_item_simple.dart'; import 'package:smooth_app/pages/product/common/product_query_page_helper.dart'; @@ -27,7 +27,6 @@ import 'package:smooth_app/pages/product/common/search_app_bar_title.dart'; import 'package:smooth_app/pages/product/common/search_empty_screen.dart'; import 'package:smooth_app/pages/product/common/search_loading_screen.dart'; import 'package:smooth_app/query/paged_product_query.dart'; -import 'package:smooth_app/query/product_query.dart'; import 'package:smooth_app/widgets/ranking_floating_action_button.dart'; import 'package:smooth_app/widgets/smooth_app_bar.dart'; import 'package:smooth_app/widgets/smooth_scaffold.dart'; @@ -430,7 +429,7 @@ class _ProductQueryPageState extends State if (_country == null) { return null; } - return _country!.getLocalizedName(ProductQuery.getLanguage()); + return LocalizedCountry.getSingleLocalizedName(_country!); } Widget _getLargeButtonWithIcon(final _Action action) => diff --git a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart index 3a4a98bc9478..2abe2e236f44 100644 --- a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart +++ b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart @@ -8,7 +8,7 @@ import 'package:smooth_app/generic_lib/design_constants.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/preferences/country_selector/openfoodfacts_country_name_extension.dart'; +import 'package:smooth_app/pages/preferences/country_selector/localized_country.dart'; import 'package:smooth_app/pages/product/multilingual_helper.dart'; import 'package:smooth_app/query/product_query.dart'; import 'package:smooth_app/resources/app_icons.dart' as icons; @@ -984,7 +984,8 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { _suggestionsNotifier; Future _reloadSuggestions() async { - final String? localizedName = _userCountry.getLocalizedName(getLanguage()); + final String? localizedName = + LocalizedCountry.getSingleLocalizedName(_userCountry); if (localizedName == null || _terms.contains(localizedName)) { _suggestionsNotifier.value = const SimpleInputSuggestionsLoaded( diff --git a/packages/smooth_app/lib/query/product_query.dart b/packages/smooth_app/lib/query/product_query.dart index 9b19b8627612..bb1300f1fc76 100644 --- a/packages/smooth_app/lib/query/product_query.dart +++ b/packages/smooth_app/lib/query/product_query.dart @@ -7,6 +7,7 @@ import 'package:smooth_app/data_models/preferences/user_preferences.dart'; import 'package:smooth_app/database/dao_string.dart'; import 'package:smooth_app/database/local_database.dart'; import 'package:smooth_app/helpers/analytics_helper.dart'; +import 'package:smooth_app/pages/preferences/country_selector/localized_country.dart'; import 'package:smooth_app/pages/preferences/user_preferences_dev_mode.dart'; import 'package:smooth_app/pages/product/product_type_extensions.dart'; import 'package:uuid/uuid.dart'; @@ -67,12 +68,17 @@ abstract class ProductQuery { const OpenFoodFactsCountry defaultCountry = OpenFoodFactsCountry.FRANCE; final String? isoCode = userPreferences.userCountryCode ?? PlatformDispatcher.instance.locale.countryCode?.toLowerCase(); - final OpenFoodFactsCountry country = + final OpenFoodFactsCountry resolvedCountry = OpenFoodFactsCountry.fromOffTag(isoCode) ?? defaultCountry; - await _setCountry(userPreferences, country); + + final LocalizedCountry localizedCountry = + LocalizedCountry.getLocalizedCountries() + .firstWhere((lc) => lc.country == resolvedCountry); + + await _setCountry(userPreferences, localizedCountry); + if (userPreferences.userCurrencyCode == null) { - // very very first time, or old app with new code - final Currency? possibleCurrency = country.currency; + final Currency? possibleCurrency = localizedCountry.country.currency; if (possibleCurrency != null) { await userPreferences.setUserCurrencyCode(possibleCurrency.name); } @@ -91,22 +97,26 @@ abstract class ProductQuery { if (country == null) { return false; } - await _setCountry(userPreferences, country); + + final LocalizedCountry localizedCountry = + LocalizedCountry.getLocalizedCountries() + .firstWhere((lc) => lc.country == country); + + await _setCountry(userPreferences, localizedCountry); return true; } /// Sets the global country for API queries. static Future _setCountry( final UserPreferences userPreferences, - final OpenFoodFactsCountry country, + final LocalizedCountry country, ) async { - _country = country; - // we need this to run "world" queries + _country = country.country; OpenFoodAPIConfiguration.globalCountry = null; - final String isoCode = country.offTag; - if (isoCode != userPreferences.userCountryCode) { - await userPreferences.setUserCountryCode(isoCode); + final String preferenceCode = country.preferenceCode; + if (preferenceCode != userPreferences.userCountryCode) { + await userPreferences.setUserCountryCode(preferenceCode); } } From 73d1bd57bf3bae3ba1c80cf584c1081d7006ed25 Mon Sep 17 00:00:00 2001 From: pavanlashkari Date: Tue, 22 Apr 2025 20:32:01 +0530 Subject: [PATCH 8/9] refactor: apply reviewer feedback to LocalizedCountry --- .../country_selector/country_selector.dart | 200 ++++++------------ .../country_selector_provider.dart | 65 +++--- .../country_selector/localized_country.dart | 51 +++-- .../smooth_app/lib/query/product_query.dart | 35 ++- 4 files changed, 150 insertions(+), 201 deletions(-) diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart index 2138a6dca514..7c040773c1fd 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart @@ -1,5 +1,4 @@ import 'package:auto_size_text/auto_size_text.dart'; -import 'package:collection/collection.dart'; import 'package:flutter/material.dart' hide Listener; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; @@ -17,7 +16,6 @@ import 'package:smooth_app/widgets/smooth_text.dart'; part 'country_selector_provider.dart'; -/// A button that will open a list of countries and save it in the preferences. class CountrySelector extends StatelessWidget { const CountrySelector({ required this.forceCurrencyChange, @@ -35,8 +33,6 @@ class CountrySelector extends StatelessWidget { final Widget? icon; final bool forceCurrencyChange; final double loadingHeight; - - /// A click on a new country will automatically save it final bool autoValidate; @override @@ -47,15 +43,14 @@ class CountrySelector extends StatelessWidget { autoValidate: autoValidate, ), child: Consumer<_CountrySelectorProvider>( - builder: (BuildContext context, _CountrySelectorProvider provider, _) { + builder: (context, provider, _) { return switch (provider.value) { - PreferencesSelectorLoadingState _ => SizedBox( + PreferencesSelectorLoadingState() => SizedBox( height: loadingHeight, - child: const Center( - child: CircularProgressIndicator.adaptive(), - ), + child: + const Center(child: CircularProgressIndicator.adaptive()), ), - PreferencesSelectorLoadedState _ => + PreferencesSelectorLoadedState() => _CountrySelectorButton( icon: icon, innerPadding: padding ?? EdgeInsets.zero, @@ -100,37 +95,25 @@ class _CountrySelectorButton extends StatelessWidget { child: ConstrainedBox( constraints: const BoxConstraints(minHeight: 40.0), child: ConsumerValueNotifierFilter<_CountrySelectorProvider, - PreferencesSelectorState>( - buildWhen: - (PreferencesSelectorState? previousValue, - PreferencesSelectorState - currentValue) => - previousValue != null && - currentValue is! PreferencesSelectorEditingState && - (currentValue as PreferencesSelectorLoadedState< - OpenFoodFactsCountry>) - .selectedItem != - (previousValue as PreferencesSelectorLoadedState< - OpenFoodFactsCountry>) - .selectedItem, - builder: - (_, PreferencesSelectorState value, __) { - final OpenFoodFactsCountry? country = (value - as PreferencesSelectorLoadedState) - .selectedItem; - - final String displayName = - LocalizedCountry.getSingleLocalizedName(country!) ?? - AppLocalizations.of(context).loading; + PreferencesSelectorState>( + buildWhen: (previous, current) => + previous is PreferencesSelectorLoadedState && + current is PreferencesSelectorLoadedState && + current.selectedItem != previous.selectedItem, + builder: (_, state, __) { + final country = + (state as PreferencesSelectorLoadedState) + .selectedItem; + final String displayName = country?.localizedName ?? ''; return Padding( padding: innerPadding, child: Row( - children: [ + children: [ SizedBox( width: IconTheme.of(context).size! + LARGE_SPACE, child: AutoSizeText( - EmojiHelper.getCountryEmoji(country) ?? '', + EmojiHelper.getCountryEmoji(country?.country) ?? '', textAlign: TextAlign.center, style: TextStyle(fontSize: IconTheme.of(context).size), ), @@ -157,79 +140,51 @@ class _CountrySelectorButton extends StatelessWidget { } Future _openCountrySelector(BuildContext context) async { - final dynamic newCountry = - await Navigator.of(context, rootNavigator: true).push( - PageRouteBuilder( - pageBuilder: (_, __, ___) => _CountrySelectorScreen( - provider: context.read<_CountrySelectorProvider>(), - ), - transitionsBuilder: (BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child) { - final Tween tween = Tween( - begin: const Offset(0.0, 1.0), - end: Offset.zero, - ); - final CurvedAnimation curvedAnimation = CurvedAnimation( - parent: animation, - curve: Curves.easeInOut, - ); - final Animation position = tween.animate(curvedAnimation); - - return SlideTransition( - position: position, - child: FadeTransition( - opacity: animation, - child: child, - ), - ); - }), + final newCountry = await Navigator.of(context, rootNavigator: true).push( + PageRouteBuilder( + pageBuilder: (_, __, ___) => _CountrySelectorScreen( + provider: context.read<_CountrySelectorProvider>(), + ), + transitionsBuilder: (context, animation, secondaryAnimation, child) { + final offset = Tween( + begin: const Offset(0.0, 1.0), end: Offset.zero) + .animate( + CurvedAnimation(parent: animation, curve: Curves.easeInOut)); + return SlideTransition( + position: offset, + child: FadeTransition(opacity: animation, child: child), + ); + }, + ), ); - if (!context.mounted) { - return; - } + if (!context.mounted) return; - /// Ensure to restore the previous state - /// (eg: the user uses the Android back button). if (newCountry == null) { context.read<_CountrySelectorProvider>().dismissSelectedItem(); - } else if (newCountry is OpenFoodFactsCountry) { - _changeCurrencyIfRelevant(context, newCountry); + } else if (newCountry is LocalizedCountry) { + _changeCurrencyIfRelevant(context, newCountry.country); } } Future _changeCurrencyIfRelevant( - final BuildContext context, - final OpenFoodFactsCountry country, - ) async { - final UserPreferences userPreferences = context.read(); - final String? possibleCurrencyCode = country.currency?.name; - - if (possibleCurrencyCode == null) { - return; - } + BuildContext context, OpenFoodFactsCountry country) async { + final userPreferences = context.read(); + final possibleCurrencyCode = country.currency?.name; + if (possibleCurrencyCode == null) return; bool? changeCurrency; - final String? currentCurrencyCode = userPreferences.userCurrencyCode; + final currentCurrencyCode = userPreferences.userCurrencyCode; - if (currentCurrencyCode == null) { - changeCurrency = true; - } else if (forceCurrencyChange) { - changeCurrency = true; - } else if (currentCurrencyCode != possibleCurrencyCode) { - final AppLocalizations appLocalizations = AppLocalizations.of(context); + if (currentCurrencyCode == null || + forceCurrencyChange || + currentCurrencyCode != possibleCurrencyCode) { + final appLocalizations = AppLocalizations.of(context); changeCurrency = await showDialog( context: context, - builder: (final BuildContext context) => SmoothAlertDialog( + builder: (context) => SmoothAlertDialog( body: Text( - '${appLocalizations.country_change_message}' - '\n' - '${appLocalizations.currency_auto_change_message( - currentCurrencyCode, - possibleCurrencyCode, - )}', + '${appLocalizations.country_change_message}\n${appLocalizations.currency_auto_change_message(currentCurrencyCode ?? '', possibleCurrencyCode)}', ), negativeAction: SmoothActionButton( onPressed: () => Navigator.of(context, rootNavigator: true).pop(), @@ -243,6 +198,7 @@ class _CountrySelectorButton extends StatelessWidget { ), ); } + if (changeCurrency == true) { await userPreferences.setUserCurrencyCode(possibleCurrencyCode); } @@ -250,44 +206,32 @@ class _CountrySelectorButton extends StatelessWidget { } class _CountrySelectorScreen extends StatelessWidget { - const _CountrySelectorScreen({ - required this.provider, - }); + const _CountrySelectorScreen({required this.provider}); final _CountrySelectorProvider provider; @override Widget build(BuildContext context) { - final AppLocalizations appLocalizations = AppLocalizations.of(context); + final appLocalizations = AppLocalizations.of(context); + LocalizedCountry.getLocalizedCountries(); - final List localizedCountries = - LocalizedCountry.getLocalizedCountries(); - - return SmoothSelectorScreen( + return SmoothSelectorScreen( provider: provider, title: appLocalizations.country_selector_title, - itemBuilder: ( - BuildContext context, - OpenFoodFactsCountry country, - bool selected, - String filter, - ) { - final LocalizedCountry? lc = localizedCountries - .firstWhereOrNull((LocalizedCountry c) => c.country == country); - + itemBuilder: (context, country, selected, filter) { return Row( - children: [ + children: [ Expanded( flex: 1, child: Text( - EmojiHelper.getCountryEmoji(country) ?? '', + EmojiHelper.getCountryEmoji(country.country) ?? '', style: const TextStyle(fontSize: 25.0), ), ), Expanded( flex: 2, child: Text( - country.iso2Code, + country.country.iso2Code, textAlign: TextAlign.center, maxLines: 1, overflow: TextOverflow.ellipsis, @@ -296,31 +240,27 @@ class _CountrySelectorScreen extends StatelessWidget { Expanded( flex: 7, child: TextHighlighter( - text: lc?.localizedName ?? '', + text: country.localizedName, filter: filter, - textStyle: const TextStyle( - fontWeight: FontWeight.w600, - ), + textStyle: const TextStyle(fontWeight: FontWeight.w600), ), - ) + ), ], ); }, - itemsFilter: (List list, - OpenFoodFactsCountry? selectedItem, - OpenFoodFactsCountry? selectedItemOverride, - String filter) { - final List localized = - LocalizedCountry.getLocalizedCountries(); - return list.where((OpenFoodFactsCountry country) { - final LocalizedCountry? lc = - localized.firstWhereOrNull((c) => c.country == country); + itemsFilter: (list, selectedItem, selectedItemOverride, filter) { + return list.where((country) { return country == selectedItem || country == selectedItemOverride || - (lc?.localizedName.toLowerCase().contains(filter.toLowerCase()) ?? - false) || - country.iso2Code.toLowerCase().contains(filter.toLowerCase()) || - country.offTag.toLowerCase().contains(filter.toLowerCase()); + country.localizedName + .toLowerCase() + .contains(filter.toLowerCase()) || + country.country.iso2Code + .toLowerCase() + .contains(filter.toLowerCase()) || + country.preferenceCode + .toLowerCase() + .contains(filter.toLowerCase()); }); }, ); diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart index a026fc5e93df..dec090a76406 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart @@ -7,7 +7,7 @@ part of 'country_selector.dart'; /// * [_CountrySelectorEditingState]: the user has selected a country /// (temporary selection) class _CountrySelectorProvider - extends PreferencesSelectorProvider { + extends PreferencesSelectorProvider { _CountrySelectorProvider({ required super.preferences, required super.autoValidate, @@ -18,8 +18,7 @@ class _CountrySelectorProvider @override Future onPreferencesChanged() async { - final String? newCountryCode = - preferences.userCountryCode; // Stored as offTag + final String? newCountryCode = preferences.userCountryCode; final String? newLanguageCode = preferences.appLanguageCode; final OpenFoodFactsLanguage? newLanguage = _getLanguageFromCode(newLanguageCode); @@ -32,13 +31,13 @@ class _CountrySelectorProvider userCountryCode = newCountryCode; userAppLanguage = newLanguage; - if (value is PreferencesSelectorInitialState) { + if (value is PreferencesSelectorInitialState) { return loadValues(); } else { - final PreferencesSelectorLoadedState state = - value as PreferencesSelectorLoadedState; + final PreferencesSelectorLoadedState state = + value as PreferencesSelectorLoadedState; - final List countries = state.items; + final List countries = state.items; _reorderCountries(countries, userCountryCode); value = state.copyWith( @@ -50,41 +49,46 @@ class _CountrySelectorProvider } @override - Future> onLoadValues() async { - final List countries = - LocalizedCountry.getLocalizedCountries().map((e) => e.country).toList(); - return countries; + Future> onLoadValues() async { + return _sanitizeCountriesList(LocalizedCountry.getLocalizedCountries()); + } + + /// Sanitizes the country list, but without reordering it. + /// * by removing countries that are not in [OpenFoodFactsCountry] + /// * and providing a fallback English name for countries that are in + /// [OpenFoodFactsCountry] but not in [localizedCountries]. + static List _sanitizeCountriesList( + List localizedCountries, + ) { + final Set validCountries = + OpenFoodFactsCountry.values.toSet(); + final List sanitizedList = localizedCountries + .where((country) => validCountries.contains(country.country)) + .toList(); + + return sanitizedList; } static void _reorderCountries( - List countries, + List countries, String? userCountryCode, ) { - final Map localizedMap = { - for (final c in LocalizedCountry.getLocalizedCountries()) c.country: c - }; - countries.sort( (a, b) { - if (a.offTag == userCountryCode) { - return -1; - } - if (b.offTag == userCountryCode) { - return 1; - } - final String nameA = localizedMap[a]?.localizedName ?? ''; - final String nameB = localizedMap[b]?.localizedName ?? ''; - return nameA.compareTo(nameB); + if (a.preferenceCode == userCountryCode) return -1; + if (b.preferenceCode == userCountryCode) return 1; + return a.localizedName.compareTo(b.localizedName); }, ); } @override - OpenFoodFactsCountry getSelectedValue(List countries) { + LocalizedCountry getSelectedValue(List countries) { if (userCountryCode != null) { return countries.firstWhere( - (OpenFoodFactsCountry country) => - country.offTag.toLowerCase() == userCountryCode?.toLowerCase(), + (country) => + country.preferenceCode.toLowerCase() == + userCountryCode?.toLowerCase(), orElse: () => countries.first, ); } @@ -92,9 +96,8 @@ class _CountrySelectorProvider } @override - Future onSaveItem(OpenFoodFactsCountry country) => - preferences.setUserCountryCode( - country.offTag); // Save offTag (not iso2code) in preferences + Future onSaveItem(LocalizedCountry country) => + preferences.setUserCountryCode(country.preferenceCode); OpenFoodFactsLanguage? _getLanguageFromCode(String? code) { if (code == null) { diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/localized_country.dart b/packages/smooth_app/lib/pages/preferences/country_selector/localized_country.dart index 4867bbab2ef2..0e2d66448137 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/localized_country.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/localized_country.dart @@ -1,5 +1,6 @@ import 'package:l10n_countries/l10n_countries.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; +import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart'; import 'package:smooth_app/pages/preferences/country_selector/tmp_country_iso3.dart'; import 'package:smooth_app/query/product_query.dart'; @@ -15,8 +16,10 @@ class LocalizedCountry { final String englishName; String get preferenceCode => country.offTag; + String get iso2Code => country.iso2Code; - static List getLocalizedCountries() { + static Map + getLocalizedCountriesMap() { final OpenFoodFactsLanguage language = ProductQuery.getLanguage(); final CountriesLocaleMapper mapper = CountriesLocaleMapper(); @@ -27,7 +30,12 @@ class LocalizedCountry { fallbackLocale: OpenFoodFactsLanguage.ENGLISH, ); - final List result = []; + final LocaleMap englishMap = mapper.localize( + iso3Codes, + mainLocale: OpenFoodFactsLanguage.ENGLISH, + ); + + final Map result = {}; for (final OpenFoodFactsCountry country in OpenFoodFactsCountry.values) { final String? iso3 = tmpCountryIso3[country]; if (iso3 == null) { @@ -35,25 +43,23 @@ class LocalizedCountry { } final String? localized = localizedMap[iso3]; + final String fallbackEnglish = + englishMap[iso3] ?? _getFallbackEnglishName(country); - String fallbackEnglish = - country.toString().split('.').last.replaceAll('_', ' '); - fallbackEnglish = fallbackEnglish[0].toUpperCase() + - fallbackEnglish.substring(1).toLowerCase(); - - result.add( - LocalizedCountry( - country: country, - localizedName: localized ?? fallbackEnglish, - englishName: fallbackEnglish, - ), + result[country] = LocalizedCountry( + country: country, + localizedName: localized ?? fallbackEnglish, + englishName: fallbackEnglish, ); } - result.sort((a, b) => a.localizedName.compareTo(b.localizedName)); return result; } + static List getLocalizedCountries() => + getLocalizedCountriesMap().values.toList() + ..sort((a, b) => a.localizedName.compareTo(b.localizedName)); + static String? getSingleLocalizedName(OpenFoodFactsCountry country) { final String? iso3 = tmpCountryIso3[country]; if (iso3 == null) { @@ -69,15 +75,22 @@ class LocalizedCountry { fallbackLocale: OpenFoodFactsLanguage.ENGLISH, ); - final String? localized = map.values.firstOrNull; + final String? localized = map[iso3]; if (language != OpenFoodFactsLanguage.ENGLISH || localized != null) { return localized; } - final String fallbackEnglish = - country.toString().split('.').last.replaceAll('_', ' '); - return fallbackEnglish[0].toUpperCase() + - fallbackEnglish.substring(1).toLowerCase(); + final LocaleMap englishMap = mapper.localize( + {iso3}, + mainLocale: OpenFoodFactsLanguage.ENGLISH, + ); + + return englishMap[iso3] ?? _getFallbackEnglishName(country); + } + + static String _getFallbackEnglishName(OpenFoodFactsCountry country) { + final String raw = country.toString().split('.').last.replaceAll('_', ' '); + return raw[0].toUpperCase() + raw.substring(1).toLowerCase(); } } diff --git a/packages/smooth_app/lib/query/product_query.dart b/packages/smooth_app/lib/query/product_query.dart index bb1300f1fc76..44fdcffdbc5c 100644 --- a/packages/smooth_app/lib/query/product_query.dart +++ b/packages/smooth_app/lib/query/product_query.dart @@ -7,7 +7,6 @@ import 'package:smooth_app/data_models/preferences/user_preferences.dart'; import 'package:smooth_app/database/dao_string.dart'; import 'package:smooth_app/database/local_database.dart'; import 'package:smooth_app/helpers/analytics_helper.dart'; -import 'package:smooth_app/pages/preferences/country_selector/localized_country.dart'; import 'package:smooth_app/pages/preferences/user_preferences_dev_mode.dart'; import 'package:smooth_app/pages/product/product_type_extensions.dart'; import 'package:uuid/uuid.dart'; @@ -68,17 +67,12 @@ abstract class ProductQuery { const OpenFoodFactsCountry defaultCountry = OpenFoodFactsCountry.FRANCE; final String? isoCode = userPreferences.userCountryCode ?? PlatformDispatcher.instance.locale.countryCode?.toLowerCase(); - final OpenFoodFactsCountry resolvedCountry = + final OpenFoodFactsCountry country = OpenFoodFactsCountry.fromOffTag(isoCode) ?? defaultCountry; - - final LocalizedCountry localizedCountry = - LocalizedCountry.getLocalizedCountries() - .firstWhere((lc) => lc.country == resolvedCountry); - - await _setCountry(userPreferences, localizedCountry); - + await _setCountry(userPreferences, country); if (userPreferences.userCurrencyCode == null) { - final Currency? possibleCurrency = localizedCountry.country.currency; + // very very first time, or old app with new code + final Currency? possibleCurrency = country.currency; if (possibleCurrency != null) { await userPreferences.setUserCurrencyCode(possibleCurrency.name); } @@ -97,26 +91,22 @@ abstract class ProductQuery { if (country == null) { return false; } - - final LocalizedCountry localizedCountry = - LocalizedCountry.getLocalizedCountries() - .firstWhere((lc) => lc.country == country); - - await _setCountry(userPreferences, localizedCountry); + await _setCountry(userPreferences, country); return true; } /// Sets the global country for API queries. static Future _setCountry( final UserPreferences userPreferences, - final LocalizedCountry country, + final OpenFoodFactsCountry country, ) async { - _country = country.country; + _country = country; + // we need this to run "world" queries OpenFoodAPIConfiguration.globalCountry = null; - final String preferenceCode = country.preferenceCode; - if (preferenceCode != userPreferences.userCountryCode) { - await userPreferences.setUserCountryCode(preferenceCode); + final String isoCode = country.offTag; + if (isoCode != userPreferences.userCountryCode) { + await userPreferences.setUserCountryCode(isoCode); } } @@ -317,5 +307,8 @@ abstract class ProductQuery { ProductField.OBSOLETE, ProductField.OWNER_FIELDS, ProductField.OWNER, + ProductField.TRACES, + ProductField.TRACES_TAGS, + ProductField.TRACES_TAGS_IN_LANGUAGES, ]; } From 832cc796b7bfcb810385979687043eaaeaa1f21d Mon Sep 17 00:00:00 2001 From: pavanlashkari Date: Sat, 3 May 2025 11:51:59 +0530 Subject: [PATCH 9/9] refactor: apply minor changes --- .../pages/preferences/country_selector/country_selector.dart | 3 +++ packages/smooth_app/lib/query/product_query.dart | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart index 7c040773c1fd..a97533044562 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart @@ -16,6 +16,7 @@ import 'package:smooth_app/widgets/smooth_text.dart'; part 'country_selector_provider.dart'; +/// A button that will open a list of countries and save it in the preferences. class CountrySelector extends StatelessWidget { const CountrySelector({ required this.forceCurrencyChange, @@ -33,6 +34,8 @@ class CountrySelector extends StatelessWidget { final Widget? icon; final bool forceCurrencyChange; final double loadingHeight; + + /// A click on a new country will automatically save it final bool autoValidate; @override diff --git a/packages/smooth_app/lib/query/product_query.dart b/packages/smooth_app/lib/query/product_query.dart index 44fdcffdbc5c..9b19b8627612 100644 --- a/packages/smooth_app/lib/query/product_query.dart +++ b/packages/smooth_app/lib/query/product_query.dart @@ -307,8 +307,5 @@ abstract class ProductQuery { ProductField.OBSOLETE, ProductField.OWNER_FIELDS, ProductField.OWNER, - ProductField.TRACES, - ProductField.TRACES_TAGS, - ProductField.TRACES_TAGS_IN_LANGUAGES, ]; }