From ddfb5f1e879f5d0a08ada1ccd652fd201e210ef9 Mon Sep 17 00:00:00 2001 From: Chen Asraf Date: Mon, 10 Jul 2023 02:52:05 +0300 Subject: [PATCH] feat: new pokemon api --- .gitignore | 4 + android/app/build.gradle | 7 +- android/build.gradle | 6 +- android/gradle.properties | 2 +- ios/Podfile.lock | 908 ++++++++++++++++ ios/Runner.xcodeproj/project.pbxproj | 72 ++ .../contents.xcworkspacedata | 3 + lib/core/models/pokemon.dart | 990 ------------------ lib/core/models/pokemon_helper.dart | 38 + lib/core/models/pokemon_species.dart | 447 -------- .../utils/extensions/string_extensions.dart | 11 + lib/main.dart | 43 + .../PokemonDetails/pokemon_details_page.dart | 23 +- .../PokemonList/pokemon_list_controller.dart | 66 +- .../PokemonList/pokemon_list_page.dart | 46 +- lib/widgets/pokemon_image.dart | 9 +- lib/widgets/pokemon_list_item.dart | 28 +- macos/Flutter/GeneratedPluginRegistrant.swift | 4 - macos/Podfile | 2 +- macos/Podfile.lock | 142 +-- macos/Runner.xcodeproj/project.pbxproj | 34 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- pubspec.lock | 447 +++++--- pubspec.yaml | 16 +- 24 files changed, 1585 insertions(+), 1765 deletions(-) create mode 100644 ios/Podfile.lock delete mode 100644 lib/core/models/pokemon.dart create mode 100644 lib/core/models/pokemon_helper.dart delete mode 100644 lib/core/models/pokemon_species.dart create mode 100644 lib/core/utils/extensions/string_extensions.dart diff --git a/.gitignore b/.gitignore index d8dd4e4..989bd76 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,7 @@ app.*.map.json tool/data lib/data +firebase_options.dart +firebase_app_id_file.json +google-services.json +GoogleService-Info.plist diff --git a/android/app/build.gradle b/android/app/build.gradle index e915b08..ea5701d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -22,6 +22,10 @@ if (flutterVersionName == null) { } apply plugin: 'com.android.application' +// START: FlutterFire Configuration +apply plugin: 'com.google.gms.google-services' +// apply plugin: 'com.google.firebase.crashlytics' +// END: FlutterFire Configuration apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" @@ -44,13 +48,14 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.pokedex" + applicationId "dev.casraf.pokedex" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName + multiDexEnabled true } buildTypes { diff --git a/android/build.gradle b/android/build.gradle index 58a8c74..9eb344f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -7,6 +7,10 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:7.2.0' + // START: FlutterFire Configuration + classpath 'com.google.gms:google-services:4.3.10' + // classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' + // END: FlutterFire Configuration classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } @@ -26,6 +30,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/android/gradle.properties b/android/gradle.properties index 94adc3a..f622fd8 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx1536M +org.gradle.jvmargs=-Xmx2048M android.useAndroidX=true android.enableJetifier=true diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..8363d47 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,908 @@ +PODS: + - abseil/algorithm (1.20211102.0): + - abseil/algorithm/algorithm (= 1.20211102.0) + - abseil/algorithm/container (= 1.20211102.0) + - abseil/algorithm/algorithm (1.20211102.0): + - abseil/base/config + - abseil/algorithm/container (1.20211102.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/base (1.20211102.0): + - abseil/base/atomic_hook (= 1.20211102.0) + - abseil/base/base (= 1.20211102.0) + - abseil/base/base_internal (= 1.20211102.0) + - abseil/base/config (= 1.20211102.0) + - abseil/base/core_headers (= 1.20211102.0) + - abseil/base/dynamic_annotations (= 1.20211102.0) + - abseil/base/endian (= 1.20211102.0) + - abseil/base/errno_saver (= 1.20211102.0) + - abseil/base/fast_type_id (= 1.20211102.0) + - abseil/base/log_severity (= 1.20211102.0) + - abseil/base/malloc_internal (= 1.20211102.0) + - abseil/base/pretty_function (= 1.20211102.0) + - abseil/base/raw_logging_internal (= 1.20211102.0) + - abseil/base/spinlock_wait (= 1.20211102.0) + - abseil/base/strerror (= 1.20211102.0) + - abseil/base/throw_delegate (= 1.20211102.0) + - abseil/base/atomic_hook (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/base (1.20211102.0): + - abseil/base/atomic_hook + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/log_severity + - abseil/base/raw_logging_internal + - abseil/base/spinlock_wait + - abseil/meta/type_traits + - abseil/base/base_internal (1.20211102.0): + - abseil/base/config + - abseil/meta/type_traits + - abseil/base/config (1.20211102.0) + - abseil/base/core_headers (1.20211102.0): + - abseil/base/config + - abseil/base/dynamic_annotations (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian (1.20211102.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/errno_saver (1.20211102.0): + - abseil/base/config + - abseil/base/fast_type_id (1.20211102.0): + - abseil/base/config + - abseil/base/log_severity (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/malloc_internal (1.20211102.0): + - abseil/base/base + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/raw_logging_internal + - abseil/base/pretty_function (1.20211102.0) + - abseil/base/raw_logging_internal (1.20211102.0): + - abseil/base/atomic_hook + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/base/spinlock_wait (1.20211102.0): + - abseil/base/base_internal + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/base/strerror (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/base/throw_delegate (1.20211102.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/container/common (1.20211102.0): + - abseil/meta/type_traits + - abseil/types/optional + - abseil/container/compressed_tuple (1.20211102.0): + - abseil/utility/utility + - abseil/container/container_memory (1.20211102.0): + - abseil/base/config + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/utility/utility + - abseil/container/fixed_array (1.20211102.0): + - abseil/algorithm/algorithm + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/throw_delegate + - abseil/container/compressed_tuple + - abseil/memory/memory + - abseil/container/flat_hash_map (1.20211102.0): + - abseil/algorithm/container + - abseil/container/container_memory + - abseil/container/hash_function_defaults + - abseil/container/raw_hash_map + - abseil/memory/memory + - abseil/container/hash_function_defaults (1.20211102.0): + - abseil/base/config + - abseil/hash/hash + - abseil/strings/cord + - abseil/strings/strings + - abseil/container/hash_policy_traits (1.20211102.0): + - abseil/meta/type_traits + - abseil/container/hashtable_debug_hooks (1.20211102.0): + - abseil/base/config + - abseil/container/hashtablez_sampler (1.20211102.0): + - abseil/base/base + - abseil/base/core_headers + - abseil/container/have_sse + - abseil/debugging/stacktrace + - abseil/memory/memory + - abseil/profiling/exponential_biased + - abseil/profiling/sample_recorder + - abseil/synchronization/synchronization + - abseil/utility/utility + - abseil/container/have_sse (1.20211102.0) + - abseil/container/inlined_vector (1.20211102.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/container/inlined_vector_internal + - abseil/memory/memory + - abseil/container/inlined_vector_internal (1.20211102.0): + - abseil/base/core_headers + - abseil/container/compressed_tuple + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/span + - abseil/container/layout (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/strings/strings + - abseil/types/span + - abseil/utility/utility + - abseil/container/raw_hash_map (1.20211102.0): + - abseil/base/throw_delegate + - abseil/container/container_memory + - abseil/container/raw_hash_set + - abseil/container/raw_hash_set (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/container/common + - abseil/container/compressed_tuple + - abseil/container/container_memory + - abseil/container/hash_policy_traits + - abseil/container/hashtable_debug_hooks + - abseil/container/hashtablez_sampler + - abseil/container/have_sse + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/utility/utility + - abseil/debugging/debugging_internal (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/errno_saver + - abseil/base/raw_logging_internal + - abseil/debugging/demangle_internal (1.20211102.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/debugging/stacktrace (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/debugging/debugging_internal + - abseil/debugging/symbolize (1.20211102.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/malloc_internal + - abseil/base/raw_logging_internal + - abseil/debugging/debugging_internal + - abseil/debugging/demangle_internal + - abseil/strings/strings + - abseil/functional/bind_front (1.20211102.0): + - abseil/base/base_internal + - abseil/container/compressed_tuple + - abseil/meta/type_traits + - abseil/utility/utility + - abseil/functional/function_ref (1.20211102.0): + - abseil/base/base_internal + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/hash/city (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/hash/hash (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/container/fixed_array + - abseil/hash/city + - abseil/hash/low_level_hash + - abseil/meta/type_traits + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/types/optional + - abseil/types/variant + - abseil/utility/utility + - abseil/hash/low_level_hash (1.20211102.0): + - abseil/base/config + - abseil/base/endian + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/memory (1.20211102.0): + - abseil/memory/memory (= 1.20211102.0) + - abseil/memory/memory (1.20211102.0): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/meta (1.20211102.0): + - abseil/meta/type_traits (= 1.20211102.0) + - abseil/meta/type_traits (1.20211102.0): + - abseil/base/config + - abseil/numeric/bits (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/numeric/int128 (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/numeric/bits + - abseil/numeric/representation (1.20211102.0): + - abseil/base/config + - abseil/profiling/exponential_biased (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/profiling/sample_recorder (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/synchronization/synchronization + - abseil/time/time + - abseil/random/distributions (1.20211102.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/random/internal/distribution_caller + - abseil/random/internal/fast_uniform_bits + - abseil/random/internal/fastmath + - abseil/random/internal/generate_real + - abseil/random/internal/iostream_state_saver + - abseil/random/internal/traits + - abseil/random/internal/uniform_helper + - abseil/random/internal/wide_multiply + - abseil/strings/strings + - abseil/random/internal/distribution_caller (1.20211102.0): + - abseil/base/config + - abseil/base/fast_type_id + - abseil/utility/utility + - abseil/random/internal/fast_uniform_bits (1.20211102.0): + - abseil/base/config + - abseil/meta/type_traits + - abseil/random/internal/fastmath (1.20211102.0): + - abseil/numeric/bits + - abseil/random/internal/generate_real (1.20211102.0): + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/random/internal/fastmath + - abseil/random/internal/traits + - abseil/random/internal/iostream_state_saver (1.20211102.0): + - abseil/meta/type_traits + - abseil/numeric/int128 + - abseil/random/internal/nonsecure_base (1.20211102.0): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/random/internal/pool_urbg + - abseil/random/internal/salted_seed_seq + - abseil/random/internal/seed_material + - abseil/types/optional + - abseil/types/span + - abseil/random/internal/pcg_engine (1.20211102.0): + - abseil/base/config + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/random/internal/fastmath + - abseil/random/internal/iostream_state_saver + - abseil/random/internal/platform (1.20211102.0): + - abseil/base/config + - abseil/random/internal/pool_urbg (1.20211102.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/random/internal/randen + - abseil/random/internal/seed_material + - abseil/random/internal/traits + - abseil/random/seed_gen_exception + - abseil/types/span + - abseil/random/internal/randen (1.20211102.0): + - abseil/base/raw_logging_internal + - abseil/random/internal/platform + - abseil/random/internal/randen_hwaes + - abseil/random/internal/randen_slow + - abseil/random/internal/randen_engine (1.20211102.0): + - abseil/base/endian + - abseil/meta/type_traits + - abseil/random/internal/iostream_state_saver + - abseil/random/internal/randen + - abseil/random/internal/randen_hwaes (1.20211102.0): + - abseil/base/config + - abseil/random/internal/platform + - abseil/random/internal/randen_hwaes_impl + - abseil/random/internal/randen_hwaes_impl (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/numeric/int128 + - abseil/random/internal/platform + - abseil/random/internal/randen_slow (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/numeric/int128 + - abseil/random/internal/platform + - abseil/random/internal/salted_seed_seq (1.20211102.0): + - abseil/container/inlined_vector + - abseil/meta/type_traits + - abseil/random/internal/seed_material + - abseil/types/optional + - abseil/types/span + - abseil/random/internal/seed_material (1.20211102.0): + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/raw_logging_internal + - abseil/random/internal/fast_uniform_bits + - abseil/strings/strings + - abseil/types/optional + - abseil/types/span + - abseil/random/internal/traits (1.20211102.0): + - abseil/base/config + - abseil/random/internal/uniform_helper (1.20211102.0): + - abseil/base/config + - abseil/meta/type_traits + - abseil/random/internal/traits + - abseil/random/internal/wide_multiply (1.20211102.0): + - abseil/base/config + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/random/internal/traits + - abseil/random/random (1.20211102.0): + - abseil/random/distributions + - abseil/random/internal/nonsecure_base + - abseil/random/internal/pcg_engine + - abseil/random/internal/pool_urbg + - abseil/random/internal/randen_engine + - abseil/random/seed_sequences + - abseil/random/seed_gen_exception (1.20211102.0): + - abseil/base/config + - abseil/random/seed_sequences (1.20211102.0): + - abseil/container/inlined_vector + - abseil/random/internal/nonsecure_base + - abseil/random/internal/pool_urbg + - abseil/random/internal/salted_seed_seq + - abseil/random/internal/seed_material + - abseil/random/seed_gen_exception + - abseil/types/span + - abseil/status/status (1.20211102.0): + - abseil/base/atomic_hook + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/container/inlined_vector + - abseil/debugging/stacktrace + - abseil/debugging/symbolize + - abseil/functional/function_ref + - abseil/strings/cord + - abseil/strings/str_format + - abseil/strings/strings + - abseil/types/optional + - abseil/status/statusor (1.20211102.0): + - abseil/base/base + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/meta/type_traits + - abseil/status/status + - abseil/strings/strings + - abseil/types/variant + - abseil/utility/utility + - abseil/strings/cord (1.20211102.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/container/fixed_array + - abseil/container/inlined_vector + - abseil/functional/function_ref + - abseil/meta/type_traits + - abseil/strings/cord_internal + - abseil/strings/cordz_functions + - abseil/strings/cordz_info + - abseil/strings/cordz_statistics + - abseil/strings/cordz_update_scope + - abseil/strings/cordz_update_tracker + - abseil/strings/internal + - abseil/strings/str_format + - abseil/strings/strings + - abseil/types/optional + - abseil/strings/cord_internal (1.20211102.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/base/throw_delegate + - abseil/container/compressed_tuple + - abseil/container/inlined_vector + - abseil/container/layout + - abseil/functional/function_ref + - abseil/meta/type_traits + - abseil/strings/strings + - abseil/types/span + - abseil/strings/cordz_functions (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/profiling/exponential_biased + - abseil/strings/cordz_handle (1.20211102.0): + - abseil/base/base + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/synchronization/synchronization + - abseil/strings/cordz_info (1.20211102.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/container/inlined_vector + - abseil/debugging/stacktrace + - abseil/strings/cord_internal + - abseil/strings/cordz_functions + - abseil/strings/cordz_handle + - abseil/strings/cordz_statistics + - abseil/strings/cordz_update_tracker + - abseil/synchronization/synchronization + - abseil/types/span + - abseil/strings/cordz_statistics (1.20211102.0): + - abseil/base/config + - abseil/strings/cordz_update_tracker + - abseil/strings/cordz_update_scope (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/strings/cord_internal + - abseil/strings/cordz_info + - abseil/strings/cordz_update_tracker + - abseil/strings/cordz_update_tracker (1.20211102.0): + - abseil/base/config + - abseil/strings/internal (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/meta/type_traits + - abseil/strings/str_format (1.20211102.0): + - abseil/strings/str_format_internal + - abseil/strings/str_format_internal (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/functional/function_ref + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/numeric/representation + - abseil/strings/strings + - abseil/types/optional + - abseil/types/span + - abseil/strings/strings (1.20211102.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/base/throw_delegate + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/strings/internal + - abseil/synchronization/graphcycles_internal (1.20211102.0): + - abseil/base/base + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/malloc_internal + - abseil/base/raw_logging_internal + - abseil/synchronization/kernel_timeout_internal (1.20211102.0): + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/time/time + - abseil/synchronization/synchronization (1.20211102.0): + - abseil/base/atomic_hook + - abseil/base/base + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/malloc_internal + - abseil/base/raw_logging_internal + - abseil/debugging/stacktrace + - abseil/debugging/symbolize + - abseil/synchronization/graphcycles_internal + - abseil/synchronization/kernel_timeout_internal + - abseil/time/time + - abseil/time (1.20211102.0): + - abseil/time/internal (= 1.20211102.0) + - abseil/time/time (= 1.20211102.0) + - abseil/time/internal (1.20211102.0): + - abseil/time/internal/cctz (= 1.20211102.0) + - abseil/time/internal/cctz (1.20211102.0): + - abseil/time/internal/cctz/civil_time (= 1.20211102.0) + - abseil/time/internal/cctz/time_zone (= 1.20211102.0) + - abseil/time/internal/cctz/civil_time (1.20211102.0): + - abseil/base/config + - abseil/time/internal/cctz/time_zone (1.20211102.0): + - abseil/base/config + - abseil/time/internal/cctz/civil_time + - abseil/time/time (1.20211102.0): + - abseil/base/base + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/time/internal/cctz/civil_time + - abseil/time/internal/cctz/time_zone + - abseil/types (1.20211102.0): + - abseil/types/any (= 1.20211102.0) + - abseil/types/bad_any_cast (= 1.20211102.0) + - abseil/types/bad_any_cast_impl (= 1.20211102.0) + - abseil/types/bad_optional_access (= 1.20211102.0) + - abseil/types/bad_variant_access (= 1.20211102.0) + - abseil/types/compare (= 1.20211102.0) + - abseil/types/optional (= 1.20211102.0) + - abseil/types/span (= 1.20211102.0) + - abseil/types/variant (= 1.20211102.0) + - abseil/types/any (1.20211102.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/fast_type_id + - abseil/meta/type_traits + - abseil/types/bad_any_cast + - abseil/utility/utility + - abseil/types/bad_any_cast (1.20211102.0): + - abseil/base/config + - abseil/types/bad_any_cast_impl + - abseil/types/bad_any_cast_impl (1.20211102.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/bad_optional_access (1.20211102.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/bad_variant_access (1.20211102.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/compare (1.20211102.0): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/optional (1.20211102.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/bad_optional_access + - abseil/utility/utility + - abseil/types/span (1.20211102.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/meta/type_traits + - abseil/types/variant (1.20211102.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/bad_variant_access + - abseil/utility/utility + - abseil/utility/utility (1.20211102.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/meta/type_traits + - AppAuth (1.6.2): + - AppAuth/Core (= 1.6.2) + - AppAuth/ExternalUserAgent (= 1.6.2) + - AppAuth/Core (1.6.2) + - AppAuth/ExternalUserAgent (1.6.2): + - AppAuth/Core + - BoringSSL-GRPC (0.0.24): + - BoringSSL-GRPC/Implementation (= 0.0.24) + - BoringSSL-GRPC/Interface (= 0.0.24) + - BoringSSL-GRPC/Implementation (0.0.24): + - BoringSSL-GRPC/Interface (= 0.0.24) + - BoringSSL-GRPC/Interface (0.0.24) + - cloud_firestore (4.2.0): + - Firebase/Firestore (= 10.3.0) + - firebase_core + - Flutter + - nanopb (< 2.30910.0, >= 2.30908.0) + - Firebase/Auth (10.3.0): + - Firebase/CoreOnly + - FirebaseAuth (~> 10.3.0) + - Firebase/CoreOnly (10.3.0): + - FirebaseCore (= 10.3.0) + - Firebase/Crashlytics (10.3.0): + - Firebase/CoreOnly + - FirebaseCrashlytics (~> 10.3.0) + - Firebase/Firestore (10.3.0): + - Firebase/CoreOnly + - FirebaseFirestore (~> 10.3.0) + - Firebase/RemoteConfig (10.3.0): + - Firebase/CoreOnly + - FirebaseRemoteConfig (~> 10.3.0) + - firebase_auth (4.2.0): + - Firebase/Auth (= 10.3.0) + - firebase_core + - Flutter + - firebase_core (2.4.0): + - Firebase/CoreOnly (= 10.3.0) + - Flutter + - firebase_crashlytics (3.0.7): + - Firebase/Crashlytics (= 10.3.0) + - firebase_core + - Flutter + - firebase_remote_config (3.0.7): + - Firebase/RemoteConfig (= 10.3.0) + - firebase_core + - Flutter + - FirebaseABTesting (10.11.0): + - FirebaseCore (~> 10.0) + - FirebaseAuth (10.3.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/Environment (~> 7.8) + - GTMSessionFetcher/Core (< 4.0, >= 2.1) + - FirebaseCore (10.3.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Logger (~> 7.8) + - FirebaseCoreInternal (10.11.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseCrashlytics (10.3.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleDataTransport (~> 9.2) + - GoogleUtilities/Environment (~> 7.8) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesObjC (~> 2.1) + - FirebaseFirestore (10.3.0): + - abseil/algorithm (~> 1.20211102.0) + - abseil/base (~> 1.20211102.0) + - abseil/container/flat_hash_map (~> 1.20211102.0) + - abseil/memory (~> 1.20211102.0) + - abseil/meta (~> 1.20211102.0) + - abseil/strings/strings (~> 1.20211102.0) + - abseil/time (~> 1.20211102.0) + - abseil/types (~> 1.20211102.0) + - FirebaseCore (~> 10.0) + - "gRPC-C++ (~> 1.44.0)" + - leveldb-library (~> 1.22) + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseInstallations (10.11.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - PromisesObjC (~> 2.1) + - FirebaseRemoteConfig (10.3.0): + - FirebaseABTesting (~> 10.0) + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - Flutter (1.0.0) + - FMDB (2.7.5): + - FMDB/standard (= 2.7.5) + - FMDB/standard (2.7.5) + - google_sign_in_ios (0.0.1): + - Flutter + - GoogleSignIn (~> 6.2) + - GoogleDataTransport (9.2.3): + - GoogleUtilities/Environment (~> 7.7) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesObjC (< 3.0, >= 1.2) + - GoogleSignIn (6.2.4): + - AppAuth (~> 1.5) + - GTMAppAuth (~> 1.3) + - GTMSessionFetcher/Core (< 3.0, >= 1.1) + - GoogleUtilities/AppDelegateSwizzler (7.11.1): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (7.11.1): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.11.1): + - GoogleUtilities/Environment + - GoogleUtilities/Network (7.11.1): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.11.1)" + - GoogleUtilities/Reachability (7.11.1): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (7.11.1): + - GoogleUtilities/Logger + - "gRPC-C++ (1.44.0)": + - "gRPC-C++/Implementation (= 1.44.0)" + - "gRPC-C++/Interface (= 1.44.0)" + - "gRPC-C++/Implementation (1.44.0)": + - abseil/base/base (= 1.20211102.0) + - abseil/base/core_headers (= 1.20211102.0) + - abseil/container/flat_hash_map (= 1.20211102.0) + - abseil/container/inlined_vector (= 1.20211102.0) + - abseil/functional/bind_front (= 1.20211102.0) + - abseil/hash/hash (= 1.20211102.0) + - abseil/memory/memory (= 1.20211102.0) + - abseil/random/random (= 1.20211102.0) + - abseil/status/status (= 1.20211102.0) + - abseil/status/statusor (= 1.20211102.0) + - abseil/strings/cord (= 1.20211102.0) + - abseil/strings/str_format (= 1.20211102.0) + - abseil/strings/strings (= 1.20211102.0) + - abseil/synchronization/synchronization (= 1.20211102.0) + - abseil/time/time (= 1.20211102.0) + - abseil/types/optional (= 1.20211102.0) + - abseil/types/variant (= 1.20211102.0) + - abseil/utility/utility (= 1.20211102.0) + - "gRPC-C++/Interface (= 1.44.0)" + - gRPC-Core (= 1.44.0) + - "gRPC-C++/Interface (1.44.0)" + - gRPC-Core (1.44.0): + - gRPC-Core/Implementation (= 1.44.0) + - gRPC-Core/Interface (= 1.44.0) + - gRPC-Core/Implementation (1.44.0): + - abseil/base/base (= 1.20211102.0) + - abseil/base/core_headers (= 1.20211102.0) + - abseil/container/flat_hash_map (= 1.20211102.0) + - abseil/container/inlined_vector (= 1.20211102.0) + - abseil/functional/bind_front (= 1.20211102.0) + - abseil/hash/hash (= 1.20211102.0) + - abseil/memory/memory (= 1.20211102.0) + - abseil/random/random (= 1.20211102.0) + - abseil/status/status (= 1.20211102.0) + - abseil/status/statusor (= 1.20211102.0) + - abseil/strings/cord (= 1.20211102.0) + - abseil/strings/str_format (= 1.20211102.0) + - abseil/strings/strings (= 1.20211102.0) + - abseil/synchronization/synchronization (= 1.20211102.0) + - abseil/time/time (= 1.20211102.0) + - abseil/types/optional (= 1.20211102.0) + - abseil/types/variant (= 1.20211102.0) + - abseil/utility/utility (= 1.20211102.0) + - BoringSSL-GRPC (= 0.0.24) + - gRPC-Core/Interface (= 1.44.0) + - Libuv-gRPC (= 0.0.10) + - gRPC-Core/Interface (1.44.0) + - GTMAppAuth (1.3.1): + - AppAuth/Core (~> 1.6) + - GTMSessionFetcher/Core (< 3.0, >= 1.5) + - GTMSessionFetcher/Core (2.3.0) + - leveldb-library (1.22.2) + - Libuv-gRPC (0.0.10): + - Libuv-gRPC/Implementation (= 0.0.10) + - Libuv-gRPC/Interface (= 0.0.10) + - Libuv-gRPC/Implementation (0.0.10): + - Libuv-gRPC/Interface (= 0.0.10) + - Libuv-gRPC/Interface (0.0.10) + - nanopb (2.30909.0): + - nanopb/decode (= 2.30909.0) + - nanopb/encode (= 2.30909.0) + - nanopb/decode (2.30909.0) + - nanopb/encode (2.30909.0) + - path_provider_ios (0.0.1): + - Flutter + - PromisesObjC (2.2.0) + - shared_preferences_ios (0.0.1): + - Flutter + - sign_in_with_apple (0.0.1): + - Flutter + - sqflite (0.0.2): + - Flutter + - FMDB (>= 2.7.5) + - wakelock (0.0.1): + - Flutter + +DEPENDENCIES: + - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) + - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`) + - firebase_remote_config (from `.symlinks/plugins/firebase_remote_config/ios`) + - Flutter (from `Flutter`) + - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/ios`) + - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) + - shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`) + - sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`) + - sqflite (from `.symlinks/plugins/sqflite/ios`) + - wakelock (from `.symlinks/plugins/wakelock/ios`) + +SPEC REPOS: + trunk: + - abseil + - AppAuth + - BoringSSL-GRPC + - Firebase + - FirebaseABTesting + - FirebaseAuth + - FirebaseCore + - FirebaseCoreInternal + - FirebaseCrashlytics + - FirebaseFirestore + - FirebaseInstallations + - FirebaseRemoteConfig + - FMDB + - GoogleDataTransport + - GoogleSignIn + - GoogleUtilities + - "gRPC-C++" + - gRPC-Core + - GTMAppAuth + - GTMSessionFetcher + - leveldb-library + - Libuv-gRPC + - nanopb + - PromisesObjC + +EXTERNAL SOURCES: + cloud_firestore: + :path: ".symlinks/plugins/cloud_firestore/ios" + firebase_auth: + :path: ".symlinks/plugins/firebase_auth/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + firebase_crashlytics: + :path: ".symlinks/plugins/firebase_crashlytics/ios" + firebase_remote_config: + :path: ".symlinks/plugins/firebase_remote_config/ios" + Flutter: + :path: Flutter + google_sign_in_ios: + :path: ".symlinks/plugins/google_sign_in_ios/ios" + path_provider_ios: + :path: ".symlinks/plugins/path_provider_ios/ios" + shared_preferences_ios: + :path: ".symlinks/plugins/shared_preferences_ios/ios" + sign_in_with_apple: + :path: ".symlinks/plugins/sign_in_with_apple/ios" + sqflite: + :path: ".symlinks/plugins/sqflite/ios" + wakelock: + :path: ".symlinks/plugins/wakelock/ios" + +SPEC CHECKSUMS: + abseil: ebe5b5529fb05d93a8bdb7951607be08b7fa71bc + AppAuth: 3bb1d1cd9340bd09f5ed189fb00b1cc28e1e8570 + BoringSSL-GRPC: 3175b25143e648463a56daeaaa499c6cb86dad33 + cloud_firestore: cf019e947a49ebb56ddf4ae7f6f2ca13469da1b1 + Firebase: f92fc551ead69c94168d36c2b26188263860acd9 + firebase_auth: 579a0dc15451491cc83fccaa5102296635f24938 + firebase_core: 6f2f753e316765799d88568232ed59e300ff53db + firebase_crashlytics: 4aecad95b85802572a72804e4ca57385357e5255 + firebase_remote_config: 7fba03b2c711b07b78c12a832730827a6bee7a74 + FirebaseABTesting: 3f6b711718feb87346dc05f8c964601bc8fb2cf6 + FirebaseAuth: 0e415d29d846c1dce2fb641e46f35e9888d9bec6 + FirebaseCore: 988754646ab3bd4bdcb740f1bfe26b9f6c0d5f2a + FirebaseCoreInternal: 9e46c82a14a3b3a25be4e1e151ce6d21536b89c0 + FirebaseCrashlytics: f20d956f8229010b645e534693c39e0b7843c268 + FirebaseFirestore: 244f71ff14ef44f39e00b44d356eac708ce03103 + FirebaseInstallations: 2a2c6859354cbec0a228a863d4daf6de7c74ced4 + FirebaseRemoteConfig: c24f767c17b0440ee63c7e93380d599173556113 + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + google_sign_in_ios: 4f85eb9f937450765c8573bb85fd8cd6a5af675c + GoogleDataTransport: f0308f5905a745f94fb91fea9c6cbaf3831cb1bd + GoogleSignIn: 5651ce3a61e56ca864160e79b484cd9ed3f49b7a + GoogleUtilities: 9aa0ad5a7bc171f8bae016300bfcfa3fb8425749 + "gRPC-C++": 9675f953ace2b3de7c506039d77be1f2e77a8db2 + gRPC-Core: 943e491cb0d45598b0b0eb9e910c88080369290b + GTMAppAuth: 0ff230db599948a9ad7470ca667337803b3fc4dd + GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2 + leveldb-library: f03246171cce0484482ec291f88b6d563699ee06 + Libuv-gRPC: 55e51798e14ef436ad9bc45d12d43b77b49df378 + nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 + path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 + PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef + shared_preferences_ios: 548a61f8053b9b8a49ac19c1ffbc8b92c50d68ad + sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440 + sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 + wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f + +PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 + +COCOAPODS: 1.11.3 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index ddd9cf9..cc029e7 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + 9A1A74E2C39B643942CDB63F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B614AFF32CE791A460397DB9 /* Pods_Runner.framework */; }; + C2CC0F1923E610831217F9E6 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 00CF6856B2390472A7F3A6A9 /* GoogleService-Info.plist */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -29,9 +31,11 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 00CF6856B2390472A7F3A6A9 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 58CEA867CEE857662A23AA44 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -42,6 +46,9 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B614AFF32CE791A460397DB9 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B77515FB5AB0901F271935E1 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + D4FB3FC7D19154CCF9372164 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -49,12 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 9A1A74E2C39B643942CDB63F /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 2BC63D6D5787BDE1BE1CA2E6 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B614AFF32CE791A460397DB9 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -72,6 +88,9 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, + 00CF6856B2390472A7F3A6A9 /* GoogleService-Info.plist */, + B7C44D14200ED22966A00960 /* Pods */, + 2BC63D6D5787BDE1BE1CA2E6 /* Frameworks */, ); sourceTree = ""; }; @@ -98,6 +117,17 @@ path = Runner; sourceTree = ""; }; + B7C44D14200ED22966A00960 /* Pods */ = { + isa = PBXGroup; + children = ( + B77515FB5AB0901F271935E1 /* Pods-Runner.debug.xcconfig */, + 58CEA867CEE857662A23AA44 /* Pods-Runner.release.xcconfig */, + D4FB3FC7D19154CCF9372164 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -105,12 +135,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + B65BB4A0FAFA225023536A8E /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + CDD68F33122F6E61B969A1F9 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -163,6 +195,7 @@ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + C2CC0F1923E610831217F9E6 /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -199,6 +232,45 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + B65BB4A0FAFA225023536A8E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + CDD68F33122F6E61B969A1F9 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/lib/core/models/pokemon.dart b/lib/core/models/pokemon.dart deleted file mode 100644 index 62f3129..0000000 --- a/lib/core/models/pokemon.dart +++ /dev/null @@ -1,990 +0,0 @@ -import 'dart:convert'; -import 'package:strings/strings.dart' as strings; - -import '../utils/extensions/iterable_extensions.dart'; -import 'pokemon_species.dart'; - -class Pokemon { - const Pokemon({ - required this.abilities, - required this.baseExperience, - required this.forms, - required this.gameIndices, - required this.height, - required this.heldItems, - required this.id, - required this.isDefault, - required this.locationAreaEncounters, - required this.moves, - required this.name, - required this.order, - required this.pastTypes, - required this.species, - required this.sprites, - required this.stats, - required this.types, - required this.weight, - required this.speciesData, - }); - - final List abilities; - final int? baseExperience; - final List forms; - final List gameIndices; - final int height; - final List heldItems; - final int id; - final bool isDefault; - final String locationAreaEncounters; - final List moves; - final String name; - final int order; - final List pastTypes; - final ObjectRef species; - final Sprites sprites; - final List stats; - final List types; - final int weight; - final PokemonSpecies? speciesData; - - String? get imageUrl => - sprites.other?.home.frontDefault ?? - sprites.frontDefault ?? - sprites.versions?.generationViii.icons.frontDefault; - - String get displayName { - final speciesName = speciesData?.names - .firstWhereOrNull((n) => n.language.name == 'en') - ?.name; - return speciesName != null - ? strings.capitalize(speciesName) - : name.splitMapJoin( - RegExp(r'[ -]'), - onMatch: (m) => - strings.capitalize(m.input.substring(m.start, m.end)), - onNonMatch: (n) => strings.capitalize(n), - ); - } - - String? get formName { - final speciesName = species.name; - if (speciesName == name) { - return null; - } - final form = name.split('-').last; - final presets = { - 'gmax': 'Gygantamax', - 'alola': 'Alolan', - 'galar': 'Galarian', - 'hisui': 'Hisuian', - }; - return presets[form] ?? strings.capitalize(form); - } - - Pokemon copyWith({ - List? abilities, - int? baseExperience, - List? forms, - List? gameIndices, - int? height, - List? heldItems, - int? id, - bool? isDefault, - String? locationAreaEncounters, - List? moves, - String? name, - int? order, - List? pastTypes, - ObjectRef? species, - Sprites? sprites, - List? stats, - List? types, - int? weight, - PokemonSpecies? speciesData, - }) => - Pokemon( - abilities: abilities ?? this.abilities, - baseExperience: baseExperience ?? this.baseExperience, - forms: forms ?? this.forms, - gameIndices: gameIndices ?? this.gameIndices, - height: height ?? this.height, - heldItems: heldItems ?? this.heldItems, - id: id ?? this.id, - isDefault: isDefault ?? this.isDefault, - locationAreaEncounters: - locationAreaEncounters ?? this.locationAreaEncounters, - moves: moves ?? this.moves, - name: name ?? this.name, - order: order ?? this.order, - pastTypes: pastTypes ?? this.pastTypes, - species: species ?? this.species, - sprites: sprites ?? this.sprites, - stats: stats ?? this.stats, - types: types ?? this.types, - weight: weight ?? this.weight, - speciesData: speciesData ?? this.speciesData, - ); - - factory Pokemon.fromRawJson(String str) => Pokemon.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory Pokemon.fromJson(Map json) => Pokemon( - abilities: List.from( - json["abilities"].map((x) => Ability.fromJson(x))), - baseExperience: json["base_experience"], - forms: List.from( - json["forms"].map((x) => ObjectRef.fromJson(x))), - gameIndices: List.from( - json["game_indices"].map((x) => GameIndex.fromJson(x))), - height: json["height"], - heldItems: List.from( - json["held_items"].map((x) => HeldItem.fromJson(x))), - id: json["id"], - isDefault: json["is_default"], - locationAreaEncounters: json["location_area_encounters"], - moves: List.from(json["moves"].map((x) => Move.fromJson(x))), - name: json["name"], - order: json["order"], - pastTypes: List.from(json["past_types"].map((x) => x)), - species: ObjectRef.fromJson(json["species"]), - sprites: Sprites.fromJson(json["sprites"]), - stats: List.from(json["stats"].map((x) => Stat.fromJson(x))), - types: List.from(json["types"].map((x) => Type.fromJson(x))), - weight: json["weight"], - speciesData: json['species_data'] != null - ? PokemonSpecies.fromJson(json['species_data']) - : null, - // speciesData: PokemonSpecies.fromJson(json['species_data']), - ); - - Map toJson() => { - "abilities": List.from(abilities.map((x) => x.toJson())), - "base_experience": baseExperience, - "forms": List.from(forms.map((x) => x.toJson())), - "game_indices": List.from(gameIndices.map((x) => x.toJson())), - "height": height, - "held_items": List.from(heldItems.map((x) => x.toJson())), - "id": id, - "is_default": isDefault, - "location_area_encounters": locationAreaEncounters, - "moves": List.from(moves.map((x) => x.toJson())), - "name": name, - "order": order, - "past_types": List.from(pastTypes.map((x) => x)), - "species": species.toJson(), - "sprites": sprites.toJson(), - "stats": List.from(stats.map((x) => x.toJson())), - "types": List.from(types.map((x) => x.toJson())), - "weight": weight, - "species_data": speciesData?.toJson(), - }; -} - -class Ability { - Ability({ - required this.ability, - required this.isHidden, - required this.slot, - }); - - final ObjectRef ability; - final bool isHidden; - final int slot; - - Ability copyWith({ - ObjectRef? ability, - bool? isHidden, - int? slot, - }) => - Ability( - ability: ability ?? this.ability, - isHidden: isHidden ?? this.isHidden, - slot: slot ?? this.slot, - ); - - factory Ability.fromRawJson(String str) => Ability.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory Ability.fromJson(Map json) => Ability( - ability: ObjectRef.fromJson(json["ability"]), - isHidden: json["is_hidden"], - slot: json["slot"], - ); - - Map toJson() => { - "ability": ability.toJson(), - "is_hidden": isHidden, - "slot": slot, - }; -} - -class ObjectRef { - ObjectRef({ - required this.name, - required this.url, - }); - - final String name; - final String url; - - ObjectRef copyWith({ - String? name, - String? url, - }) => - ObjectRef( - name: name ?? this.name, - url: url ?? this.url, - ); - - factory ObjectRef.fromRawJson(String str) => - ObjectRef.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory ObjectRef.fromJson(Map json) => ObjectRef( - name: json["name"], - url: json["url"], - ); - - Map toJson() => { - "name": name, - "url": url, - }; -} - -class GameIndex { - GameIndex({ - required this.gameIndex, - required this.version, - }); - - final int gameIndex; - final ObjectRef version; - - GameIndex copyWith({ - int? gameIndex, - ObjectRef? version, - }) => - GameIndex( - gameIndex: gameIndex ?? this.gameIndex, - version: version ?? this.version, - ); - - factory GameIndex.fromRawJson(String str) => - GameIndex.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory GameIndex.fromJson(Map json) => GameIndex( - gameIndex: json["game_index"], - version: ObjectRef.fromJson(json["version"]), - ); - - Map toJson() => { - "game_index": gameIndex, - "version": version.toJson(), - }; -} - -class HeldItem { - HeldItem({ - required this.item, - required this.versionDetails, - }); - - final ObjectRef item; - final List versionDetails; - - HeldItem copyWith({ - ObjectRef? item, - List? versionDetails, - }) => - HeldItem( - item: item ?? this.item, - versionDetails: versionDetails ?? this.versionDetails, - ); - - factory HeldItem.fromRawJson(String str) => - HeldItem.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory HeldItem.fromJson(Map json) => HeldItem( - item: ObjectRef.fromJson(json["item"]), - versionDetails: List.from( - json["version_details"].map((x) => VersionDetail.fromJson(x))), - ); - - Map toJson() => { - "item": item.toJson(), - "version_details": - List.from(versionDetails.map((x) => x.toJson())), - }; -} - -class VersionDetail { - VersionDetail({ - required this.rarity, - required this.version, - }); - - final int rarity; - final ObjectRef version; - - VersionDetail copyWith({ - int? rarity, - ObjectRef? version, - }) => - VersionDetail( - rarity: rarity ?? this.rarity, - version: version ?? this.version, - ); - - factory VersionDetail.fromRawJson(String str) => - VersionDetail.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory VersionDetail.fromJson(Map json) => VersionDetail( - rarity: json["rarity"], - version: ObjectRef.fromJson(json["version"]), - ); - - Map toJson() => { - "rarity": rarity, - "version": version.toJson(), - }; -} - -class Move { - Move({ - required this.move, - required this.versionGroupDetails, - }); - - final ObjectRef move; - final List versionGroupDetails; - - Move copyWith({ - ObjectRef? move, - List? versionGroupDetails, - }) => - Move( - move: move ?? this.move, - versionGroupDetails: versionGroupDetails ?? this.versionGroupDetails, - ); - - factory Move.fromRawJson(String str) => Move.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory Move.fromJson(Map json) => Move( - move: ObjectRef.fromJson(json["move"]), - versionGroupDetails: List.from( - json["version_group_details"] - .map((x) => VersionGroupDetail.fromJson(x))), - ); - - Map toJson() => { - "move": move.toJson(), - "version_group_details": - List.from(versionGroupDetails.map((x) => x.toJson())), - }; -} - -class VersionGroupDetail { - VersionGroupDetail({ - required this.levelLearnedAt, - required this.moveLearnMethod, - required this.versionGroup, - }); - - final int levelLearnedAt; - final ObjectRef moveLearnMethod; - final ObjectRef versionGroup; - - VersionGroupDetail copyWith({ - int? levelLearnedAt, - ObjectRef? moveLearnMethod, - ObjectRef? versionGroup, - }) => - VersionGroupDetail( - levelLearnedAt: levelLearnedAt ?? this.levelLearnedAt, - moveLearnMethod: moveLearnMethod ?? this.moveLearnMethod, - versionGroup: versionGroup ?? this.versionGroup, - ); - - factory VersionGroupDetail.fromRawJson(String str) => - VersionGroupDetail.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory VersionGroupDetail.fromJson(Map json) => - VersionGroupDetail( - levelLearnedAt: json["level_learned_at"], - moveLearnMethod: ObjectRef.fromJson(json["move_learn_method"]), - versionGroup: ObjectRef.fromJson(json["version_group"]), - ); - - Map toJson() => { - "level_learned_at": levelLearnedAt, - "move_learn_method": moveLearnMethod.toJson(), - "version_group": versionGroup.toJson(), - }; -} - -class GenerationV { - GenerationV({ - required this.blackWhite, - }); - - final Sprites blackWhite; - - GenerationV copyWith({ - Sprites? blackWhite, - }) => - GenerationV( - blackWhite: blackWhite ?? this.blackWhite, - ); - - factory GenerationV.fromRawJson(String str) => - GenerationV.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory GenerationV.fromJson(Map json) => GenerationV( - blackWhite: Sprites.fromJson(json["black-white"]), - ); - - Map toJson() => { - "black-white": blackWhite.toJson(), - }; -} - -class GenerationVI { - GenerationVI({ - required this.xY, - required this.omegaRubyAlphaSapphire, - }); - - final Sprites xY; - final Sprites omegaRubyAlphaSapphire; - - GenerationVI copyWith({ - Sprites? xY, - Sprites? omegaRubyAlphaSapphire, - }) => - GenerationVI( - xY: xY ?? this.xY, - omegaRubyAlphaSapphire: - omegaRubyAlphaSapphire ?? this.omegaRubyAlphaSapphire, - ); - - factory GenerationVI.fromRawJson(String str) => - GenerationVI.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory GenerationVI.fromJson(Map json) => GenerationVI( - xY: Sprites.fromJson(json["x-y"]), - omegaRubyAlphaSapphire: - Sprites.fromJson(json["omegaruby-alphasapphire"]), - ); - - Map toJson() => { - "x-y": xY.toJson(), - "omegaruby-alphasapphire": xY.toJson(), - }; -} - -class GenerationIV { - GenerationIV({ - required this.diamondPearl, - required this.heartGoldSoulSilver, - required this.platinum, - }); - - final Sprites diamondPearl; - final Sprites heartGoldSoulSilver; - final Sprites platinum; - - GenerationIV copyWith({ - Sprites? diamondPearl, - Sprites? heartGoldSoulSilver, - Sprites? platinum, - }) => - GenerationIV( - diamondPearl: diamondPearl ?? this.diamondPearl, - heartGoldSoulSilver: heartGoldSoulSilver ?? this.heartGoldSoulSilver, - platinum: platinum ?? this.platinum, - ); - - factory GenerationIV.fromRawJson(String str) => - GenerationIV.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory GenerationIV.fromJson(Map json) => GenerationIV( - diamondPearl: Sprites.fromJson(json["diamond-pearl"]), - heartGoldSoulSilver: Sprites.fromJson(json["heartgold-soulsilver"]), - platinum: Sprites.fromJson(json["platinum"]), - ); - - Map toJson() => { - "diamond-pearl": diamondPearl.toJson(), - "heartgold-soulsilver": heartGoldSoulSilver.toJson(), - "platinum": platinum.toJson(), - }; -} - -class VersionSprites { - VersionSprites({ - required this.generationI, - required this.generationIi, - required this.generationIii, - required this.generationIv, - required this.generationV, - required this.generationVi, - required this.generationVii, - required this.generationViii, - }); - - final GenerationI generationI; - final GenerationII generationIi; - final GenerationIII generationIii; - final GenerationIV generationIv; - final GenerationV generationV; - final GenerationVI generationVi; - final GenerationVII generationVii; - final GenerationVIII generationViii; - - VersionSprites copyWith({ - GenerationI? generationI, - GenerationII? generationIi, - GenerationIII? generationIii, - GenerationIV? generationIv, - GenerationV? generationV, - GenerationVI? generationVi, - GenerationVII? generationVii, - GenerationVIII? generationViii, - }) => - VersionSprites( - generationI: generationI ?? this.generationI, - generationIi: generationIi ?? this.generationIi, - generationIii: generationIii ?? this.generationIii, - generationIv: generationIv ?? this.generationIv, - generationV: generationV ?? this.generationV, - generationVi: generationVi ?? this.generationVi, - generationVii: generationVii ?? this.generationVii, - generationViii: generationViii ?? this.generationViii, - ); - - factory VersionSprites.fromRawJson(String str) => - VersionSprites.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory VersionSprites.fromJson(Map json) => VersionSprites( - generationI: GenerationI.fromJson(json["generation-i"]), - generationIi: GenerationII.fromJson(json["generation-ii"]), - generationIii: GenerationIII.fromJson(json["generation-iii"]), - generationIv: GenerationIV.fromJson(json["generation-iv"]), - generationV: GenerationV.fromJson(json["generation-v"]), - generationVi: GenerationVI.fromJson(json["generation-vi"]), - generationVii: GenerationVII.fromJson(json["generation-vii"]), - generationViii: GenerationVIII.fromJson(json["generation-viii"]), - ); - - Map toJson() => { - "generation-i": generationI.toJson(), - "generation-ii": generationIi.toJson(), - "generation-iii": generationIii.toJson(), - "generation-iv": generationIv.toJson(), - "generation-v": generationV.toJson(), - "generation-vi": generationVi.toJson(), - "generation-vii": generationVii.toJson(), - "generation-viii": generationViii.toJson(), - }; -} - -class Sprites { - Sprites({ - required this.backDefault, - required this.backFemale, - required this.backShiny, - required this.backShinyFemale, - required this.frontDefault, - required this.frontFemale, - required this.frontShiny, - required this.frontShinyFemale, - required this.other, - required this.versions, - required this.animated, - }); - - final String? backDefault; - final String? backFemale; - final String? backShiny; - final String? backShinyFemale; - final String? frontDefault; - final String? frontFemale; - final String? frontShiny; - final String? frontShinyFemale; - final OtherSprites? other; - final VersionSprites? versions; - final Sprites? animated; - - Sprites copyWith({ - String? backDefault, - String? backFemale, - String? backShiny, - String? backShinyFemale, - String? frontDefault, - String? frontFemale, - String? frontShiny, - String? frontShinyFemale, - OtherSprites? other, - VersionSprites? versions, - Sprites? animated, - }) => - Sprites( - backDefault: backDefault ?? this.backDefault, - backFemale: backFemale ?? this.backFemale, - backShiny: backShiny ?? this.backShiny, - backShinyFemale: backShinyFemale ?? this.backShinyFemale, - frontDefault: frontDefault ?? this.frontDefault, - frontFemale: frontFemale ?? this.frontFemale, - frontShiny: frontShiny ?? this.frontShiny, - frontShinyFemale: frontShinyFemale ?? this.frontShinyFemale, - other: other ?? this.other, - versions: versions ?? this.versions, - animated: animated ?? this.animated, - ); - - factory Sprites.fromRawJson(String str) => Sprites.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory Sprites.fromJson(Map json) => Sprites( - backDefault: json["back_default"], - backFemale: json["back_female"], - backShiny: json["back_shiny"], - backShinyFemale: json["back_shiny_female"], - frontDefault: json["front_default"], - frontFemale: json["front_female"], - frontShiny: json["front_shiny"], - frontShinyFemale: json["front_shiny_female"], - other: - json["other"] == null ? null : OtherSprites.fromJson(json["other"]), - versions: json["versions"] == null - ? null - : VersionSprites.fromJson(json["versions"]), - animated: json["animated"] == null - ? null - : Sprites.fromJson(json["animated"]), - ); - - Map toJson() => { - "back_default": backDefault, - "back_female": backFemale, - "back_shiny": backShiny, - "back_shiny_female": backShinyFemale, - "front_default": frontDefault, - "front_female": frontFemale, - "front_shiny": frontShiny, - "front_shiny_female": frontShinyFemale, - "other": other?.toJson(), - "versions": versions?.toJson(), - "animated": animated?.toJson(), - }; -} - -class GenerationI { - GenerationI({ - required this.redBlue, - required this.yellow, - }); - - final Sprites redBlue; - final Sprites yellow; - - GenerationI copyWith({ - Sprites? redBlue, - Sprites? yellow, - }) => - GenerationI( - redBlue: redBlue ?? this.redBlue, - yellow: yellow ?? this.yellow, - ); - - factory GenerationI.fromRawJson(String str) => - GenerationI.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory GenerationI.fromJson(Map json) => GenerationI( - redBlue: Sprites.fromJson(json["red-blue"]), - yellow: Sprites.fromJson(json["yellow"]), - ); - - Map toJson() => { - "red-blue": redBlue.toJson(), - "yellow": yellow.toJson(), - }; -} - -class GenerationII { - GenerationII({ - required this.crystal, - required this.gold, - required this.silver, - }); - - final Sprites crystal; - final Sprites gold; - final Sprites silver; - - GenerationII copyWith({ - Sprites? crystal, - Sprites? gold, - Sprites? silver, - }) => - GenerationII( - crystal: crystal ?? this.crystal, - gold: gold ?? this.gold, - silver: silver ?? this.silver, - ); - - factory GenerationII.fromRawJson(String str) => - GenerationII.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory GenerationII.fromJson(Map json) => GenerationII( - crystal: Sprites.fromJson(json["crystal"]), - gold: Sprites.fromJson(json["gold"]), - silver: Sprites.fromJson(json["silver"]), - ); - - Map toJson() => { - "crystal": crystal.toJson(), - "gold": gold.toJson(), - "silver": silver.toJson(), - }; -} - -class GenerationIII { - GenerationIII({ - required this.emerald, - required this.fireRedLeafGreen, - required this.rubySapphire, - }); - - final Sprites emerald; - final Sprites fireRedLeafGreen; - final Sprites rubySapphire; - - GenerationIII copyWith({ - Sprites? emerald, - Sprites? fireRedLeafGreen, - Sprites? rubySapphire, - }) => - GenerationIII( - emerald: emerald ?? this.emerald, - fireRedLeafGreen: fireRedLeafGreen ?? this.fireRedLeafGreen, - rubySapphire: rubySapphire ?? this.rubySapphire, - ); - - factory GenerationIII.fromRawJson(String str) => - GenerationIII.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory GenerationIII.fromJson(Map json) => GenerationIII( - emerald: Sprites.fromJson(json["emerald"]), - fireRedLeafGreen: Sprites.fromJson(json["firered-leafgreen"]), - rubySapphire: Sprites.fromJson(json["ruby-sapphire"]), - ); - - Map toJson() => { - "emerald": emerald.toJson(), - "firered-leafgreen": fireRedLeafGreen.toJson(), - "ruby-sapphire": rubySapphire.toJson(), - }; -} - -class GenerationVII { - GenerationVII({ - required this.icons, - required this.ultraSunUltraMoon, - }); - - final Sprites icons; - final Sprites ultraSunUltraMoon; - - GenerationVII copyWith({ - Sprites? icons, - Sprites? ultraSunUltraMoon, - }) => - GenerationVII( - icons: icons ?? this.icons, - ultraSunUltraMoon: ultraSunUltraMoon ?? this.ultraSunUltraMoon, - ); - - factory GenerationVII.fromRawJson(String str) => - GenerationVII.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory GenerationVII.fromJson(Map json) => GenerationVII( - icons: Sprites.fromJson(json["icons"]), - ultraSunUltraMoon: Sprites.fromJson(json["ultra-sun-ultra-moon"]), - ); - - Map toJson() => { - "icons": icons.toJson(), - "ultra-sun-ultra-moon": ultraSunUltraMoon.toJson(), - }; -} - -class GenerationVIII { - GenerationVIII({ - required this.icons, - }); - - final Sprites icons; - - GenerationVIII copyWith({ - Sprites? icons, - }) => - GenerationVIII( - icons: icons ?? this.icons, - ); - - factory GenerationVIII.fromRawJson(String str) => - GenerationVIII.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory GenerationVIII.fromJson(Map json) => GenerationVIII( - icons: Sprites.fromJson(json["icons"]), - ); - - Map toJson() => { - "icons": icons.toJson(), - }; -} - -class OtherSprites { - OtherSprites({ - required this.dreamWorld, - required this.home, - required this.officialArtwork, - }); - - final Sprites dreamWorld; - final Sprites home; - final Sprites officialArtwork; - - OtherSprites copyWith({ - Sprites? dreamWorld, - Sprites? home, - Sprites? officialArtwork, - }) => - OtherSprites( - dreamWorld: dreamWorld ?? this.dreamWorld, - home: home ?? this.home, - officialArtwork: officialArtwork ?? this.officialArtwork, - ); - - factory OtherSprites.fromRawJson(String str) => - OtherSprites.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory OtherSprites.fromJson(Map json) => OtherSprites( - dreamWorld: Sprites.fromJson(json["dream_world"]), - home: Sprites.fromJson(json["home"]), - officialArtwork: Sprites.fromJson(json["official-artwork"]), - ); - - Map toJson() => { - "dream_world": dreamWorld.toJson(), - "home": home.toJson(), - "official-artwork": officialArtwork.toJson(), - }; -} - -class Stat { - Stat({ - required this.baseStat, - required this.effort, - required this.stat, - }); - - final int baseStat; - final int effort; - final ObjectRef stat; - - Stat copyWith({ - int? baseStat, - int? effort, - ObjectRef? stat, - }) => - Stat( - baseStat: baseStat ?? this.baseStat, - effort: effort ?? this.effort, - stat: stat ?? this.stat, - ); - - factory Stat.fromRawJson(String str) => Stat.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory Stat.fromJson(Map json) => Stat( - baseStat: json["base_stat"], - effort: json["effort"], - stat: ObjectRef.fromJson(json["stat"]), - ); - - Map toJson() => { - "base_stat": baseStat, - "effort": effort, - "stat": stat.toJson(), - }; -} - -class Type { - Type({ - required this.slot, - required this.type, - }); - - final int slot; - final ObjectRef type; - - Type copyWith({ - int? slot, - ObjectRef? type, - }) => - Type( - slot: slot ?? this.slot, - type: type ?? this.type, - ); - - factory Type.fromRawJson(String str) => Type.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory Type.fromJson(Map json) => Type( - slot: json["slot"], - type: ObjectRef.fromJson(json["type"]), - ); - - Map toJson() => { - "slot": slot, - "type": type.toJson(), - }; -} diff --git a/lib/core/models/pokemon_helper.dart b/lib/core/models/pokemon_helper.dart new file mode 100644 index 0000000..3a08c70 --- /dev/null +++ b/lib/core/models/pokemon_helper.dart @@ -0,0 +1,38 @@ +import 'package:pokemon_api/pokemon_api.dart'; +import 'package:strings/strings.dart' as strings; + +import '../utils/extensions/string_extensions.dart'; +import '../utils/extensions/iterable_extensions.dart'; + +class PokemonHelper { + static String? imageUrl(Pokemon pokemon) => + pokemon.sprites.other?.home.frontDefault ?? + pokemon.sprites.frontDefault ?? + pokemon.sprites.versions?.generation8.icons.frontDefault; + + static String? shinyImageUrl(Pokemon pokemon) => + pokemon.sprites.other?.home.frontShiny ?? + pokemon.sprites.frontShiny ?? + pokemon.sprites.versions?.generation8.icons.frontShiny; + + static String displayName(PokemonSpecies pokemon) { + final speciesName = pokemon.names.firstWhereOrNull((n) => n.language.name == 'en')?.name; + + return speciesName != null ? strings.capitalize(speciesName) : pokemon.name.capitalize(); + } + + static String? formName(Pokemon pokemon, PokemonSpecies species) { + final speciesName = species.name; + if (speciesName == pokemon.name) { + return null; + } + final form = pokemon.name.split('-').sublist(1).join(' '); + final presets = { + 'gmax': 'Gygantamax', + 'alola': 'Alolan', + 'galar': 'Galarian', + 'hisui': 'Hisuian', + }; + return presets[form] ?? form.capitalize(); + } +} diff --git a/lib/core/models/pokemon_species.dart b/lib/core/models/pokemon_species.dart deleted file mode 100644 index 63ca893..0000000 --- a/lib/core/models/pokemon_species.dart +++ /dev/null @@ -1,447 +0,0 @@ -import 'dart:convert'; - -import 'pokemon.dart'; - -class PokemonSpecies { - PokemonSpecies({ - required this.baseHappiness, - required this.captureRate, - required this.color, - required this.eggGroups, - required this.evolutionChain, - required this.evolvesFromSpecies, - required this.flavorTextEntries, - required this.formDescriptions, - required this.formsSwitchable, - required this.genderRate, - required this.genera, - required this.generation, - required this.growthRate, - required this.habitat, - required this.hasGenderDifferences, - required this.hatchCounter, - required this.id, - required this.isBaby, - required this.isLegendary, - required this.isMythical, - required this.name, - required this.names, - required this.order, - required this.palParkEncounters, - required this.pokedexNumbers, - required this.shape, - required this.varieties, - }); - - final int? baseHappiness; - final int captureRate; - final ObjectRef color; - final List eggGroups; - final EvolutionChain? evolutionChain; - final ObjectRef? evolvesFromSpecies; - final List flavorTextEntries; - final List formDescriptions; - final bool formsSwitchable; - final int genderRate; - final List genera; - final ObjectRef generation; - final ObjectRef growthRate; - final ObjectRef? habitat; - final bool hasGenderDifferences; - final int? hatchCounter; - final int id; - final bool isBaby; - final bool isLegendary; - final bool isMythical; - final String name; - final List names; - final int order; - final List palParkEncounters; - final List pokedexNumbers; - final ObjectRef? shape; - final List varieties; - - PokemonSpecies copyWith({ - int? baseHappiness, - int? captureRate, - ObjectRef? color, - List? eggGroups, - EvolutionChain? evolutionChain, - ObjectRef? evolvesFromSpecies, - List? flavorTextEntries, - List? formDescriptions, - bool? formsSwitchable, - int? genderRate, - List? genera, - ObjectRef? generation, - ObjectRef? growthRate, - ObjectRef? habitat, - bool? hasGenderDifferences, - int? hatchCounter, - int? id, - bool? isBaby, - bool? isLegendary, - bool? isMythical, - String? name, - List? names, - int? order, - List? palParkEncounters, - List? pokedexNumbers, - ObjectRef? shape, - List? varieties, - }) => - PokemonSpecies( - baseHappiness: baseHappiness ?? this.baseHappiness, - captureRate: captureRate ?? this.captureRate, - color: color ?? this.color, - eggGroups: eggGroups ?? this.eggGroups, - evolutionChain: evolutionChain ?? this.evolutionChain, - evolvesFromSpecies: evolvesFromSpecies ?? this.evolvesFromSpecies, - flavorTextEntries: flavorTextEntries ?? this.flavorTextEntries, - formDescriptions: formDescriptions ?? this.formDescriptions, - formsSwitchable: formsSwitchable ?? this.formsSwitchable, - genderRate: genderRate ?? this.genderRate, - genera: genera ?? this.genera, - generation: generation ?? this.generation, - growthRate: growthRate ?? this.growthRate, - habitat: habitat ?? this.habitat, - hasGenderDifferences: hasGenderDifferences ?? this.hasGenderDifferences, - hatchCounter: hatchCounter ?? this.hatchCounter, - id: id ?? this.id, - isBaby: isBaby ?? this.isBaby, - isLegendary: isLegendary ?? this.isLegendary, - isMythical: isMythical ?? this.isMythical, - name: name ?? this.name, - names: names ?? this.names, - order: order ?? this.order, - palParkEncounters: palParkEncounters ?? this.palParkEncounters, - pokedexNumbers: pokedexNumbers ?? this.pokedexNumbers, - shape: shape ?? this.shape, - varieties: varieties ?? this.varieties, - ); - - factory PokemonSpecies.fromRawJson(String str) => - PokemonSpecies.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory PokemonSpecies.fromJson(Map json) => PokemonSpecies( - baseHappiness: json["base_happiness"], - captureRate: json["capture_rate"], - color: ObjectRef.fromJson(json["color"]), - eggGroups: List.from( - json["egg_groups"].map((x) => ObjectRef.fromJson(x))), - evolutionChain: json["evolution_chain"] != null - ? EvolutionChain.fromJson(json["evolution_chain"]) - : null, - evolvesFromSpecies: json["evolves_from_species"] == null - ? null - : ObjectRef.fromJson(json["evolves_from_species"]), - flavorTextEntries: List.from( - json["flavor_text_entries"] - .map((x) => FlavorTextEntry.fromJson(x))), - formDescriptions: - List.from(json["form_descriptions"].map((x) => x)), - formsSwitchable: json["forms_switchable"], - genderRate: json["gender_rate"], - genera: List.from(json["genera"].map((x) => Genus.fromJson(x))), - generation: ObjectRef.fromJson(json["generation"]), - growthRate: ObjectRef.fromJson(json["growth_rate"]), - habitat: json["habitat"] == null - ? null - : ObjectRef.fromJson(json["habitat"]), - hasGenderDifferences: json["has_gender_differences"], - hatchCounter: json["hatch_counter"], - id: json["id"], - isBaby: json["is_baby"], - isLegendary: json["is_legendary"], - isMythical: json["is_mythical"], - name: json["name"], - names: List.from(json["names"].map((x) => Name.fromJson(x))), - order: json["order"], - palParkEncounters: List.from( - json["pal_park_encounters"] - .map((x) => PalParkEncounter.fromJson(x))), - pokedexNumbers: List.from( - json["pokedex_numbers"].map((x) => PokedexNumber.fromJson(x))), - shape: json["shape"] != null ? ObjectRef.fromJson(json["shape"]) : null, - varieties: List.from( - json["varieties"].map((x) => Variety.fromJson(x))), - ); - - Map toJson() => { - "base_happiness": baseHappiness, - "capture_rate": captureRate, - "color": color.toJson(), - "egg_groups": List.from(eggGroups.map((x) => x.toJson())), - "evolution_chain": evolutionChain?.toJson(), - "evolves_from_species": evolvesFromSpecies?.toJson(), - "flavor_text_entries": - List.from(flavorTextEntries.map((x) => x.toJson())), - "form_descriptions": List.from(formDescriptions.map((x) => x)), - "forms_switchable": formsSwitchable, - "gender_rate": genderRate, - "genera": List.from(genera.map((x) => x.toJson())), - "generation": generation.toJson(), - "growth_rate": growthRate.toJson(), - "habitat": habitat?.toJson(), - "has_gender_differences": hasGenderDifferences, - "hatch_counter": hatchCounter, - "id": id, - "is_baby": isBaby, - "is_legendary": isLegendary, - "is_mythical": isMythical, - "name": name, - "names": List.from(names.map((x) => x.toJson())), - "order": order, - "pal_park_encounters": - List.from(palParkEncounters.map((x) => x.toJson())), - "pokedex_numbers": - List.from(pokedexNumbers.map((x) => x.toJson())), - "shape": shape?.toJson(), - "varieties": List.from(varieties.map((x) => x.toJson())), - }; -} - -class EvolutionChain { - EvolutionChain({ - required this.url, - }); - - final String url; - - EvolutionChain copyWith({ - String? url, - }) => - EvolutionChain( - url: url ?? this.url, - ); - - factory EvolutionChain.fromRawJson(String str) => - EvolutionChain.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory EvolutionChain.fromJson(Map json) => EvolutionChain( - url: json["url"], - ); - - Map toJson() => { - "url": url, - }; -} - -class FlavorTextEntry { - FlavorTextEntry({ - required this.flavorText, - required this.language, - required this.version, - }); - - final String flavorText; - final ObjectRef language; - final ObjectRef version; - - FlavorTextEntry copyWith({ - String? flavorText, - ObjectRef? language, - ObjectRef? version, - }) => - FlavorTextEntry( - flavorText: flavorText ?? this.flavorText, - language: language ?? this.language, - version: version ?? this.version, - ); - - factory FlavorTextEntry.fromRawJson(String str) => - FlavorTextEntry.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory FlavorTextEntry.fromJson(Map json) => - FlavorTextEntry( - flavorText: json["flavor_text"], - language: ObjectRef.fromJson(json["language"]), - version: ObjectRef.fromJson(json["version"]), - ); - - Map toJson() => { - "flavor_text": flavorText, - "language": language.toJson(), - "version": version.toJson(), - }; -} - -class Genus { - Genus({ - required this.genus, - required this.language, - }); - - final String genus; - final ObjectRef language; - - Genus copyWith({ - String? genus, - ObjectRef? language, - }) => - Genus( - genus: genus ?? this.genus, - language: language ?? this.language, - ); - - factory Genus.fromRawJson(String str) => Genus.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory Genus.fromJson(Map json) => Genus( - genus: json["genus"], - language: ObjectRef.fromJson(json["language"]), - ); - - Map toJson() => { - "genus": genus, - "language": language.toJson(), - }; -} - -class Name { - Name({ - required this.language, - required this.name, - }); - - final ObjectRef language; - final String name; - - Name copyWith({ - ObjectRef? language, - String? name, - }) => - Name( - language: language ?? this.language, - name: name ?? this.name, - ); - - factory Name.fromRawJson(String str) => Name.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory Name.fromJson(Map json) => Name( - language: ObjectRef.fromJson(json["language"]), - name: json["name"], - ); - - Map toJson() => { - "language": language.toJson(), - "name": name, - }; -} - -class PalParkEncounter { - PalParkEncounter({ - required this.area, - required this.baseScore, - required this.rate, - }); - - final ObjectRef area; - final int baseScore; - final int rate; - - PalParkEncounter copyWith({ - ObjectRef? area, - int? baseScore, - int? rate, - }) => - PalParkEncounter( - area: area ?? this.area, - baseScore: baseScore ?? this.baseScore, - rate: rate ?? this.rate, - ); - - factory PalParkEncounter.fromRawJson(String str) => - PalParkEncounter.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory PalParkEncounter.fromJson(Map json) => - PalParkEncounter( - area: ObjectRef.fromJson(json["area"]), - baseScore: json["base_score"], - rate: json["rate"], - ); - - Map toJson() => { - "area": area.toJson(), - "base_score": baseScore, - "rate": rate, - }; -} - -class PokedexNumber { - PokedexNumber({ - required this.entryNumber, - required this.pokedex, - }); - - final int entryNumber; - final ObjectRef pokedex; - - PokedexNumber copyWith({ - int? entryNumber, - ObjectRef? pokedex, - }) => - PokedexNumber( - entryNumber: entryNumber ?? this.entryNumber, - pokedex: pokedex ?? this.pokedex, - ); - - factory PokedexNumber.fromRawJson(String str) => - PokedexNumber.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory PokedexNumber.fromJson(Map json) => PokedexNumber( - entryNumber: json["entry_number"], - pokedex: ObjectRef.fromJson(json["pokedex"]), - ); - - Map toJson() => { - "entry_number": entryNumber, - "pokedex": pokedex.toJson(), - }; -} - -class Variety { - Variety({ - required this.isDefault, - required this.pokemon, - }); - - final bool isDefault; - final ObjectRef pokemon; - - Variety copyWith({ - bool? isDefault, - ObjectRef? pokemon, - }) => - Variety( - isDefault: isDefault ?? this.isDefault, - pokemon: pokemon ?? this.pokemon, - ); - - factory Variety.fromRawJson(String str) => Variety.fromJson(json.decode(str)); - - String toRawJson() => json.encode(toJson()); - - factory Variety.fromJson(Map json) => Variety( - isDefault: json["is_default"], - pokemon: ObjectRef.fromJson(json["pokemon"]), - ); - - Map toJson() => { - "is_default": isDefault, - "pokemon": pokemon.toJson(), - }; -} diff --git a/lib/core/utils/extensions/string_extensions.dart b/lib/core/utils/extensions/string_extensions.dart new file mode 100644 index 0000000..99486ef --- /dev/null +++ b/lib/core/utils/extensions/string_extensions.dart @@ -0,0 +1,11 @@ +import 'package:strings/strings.dart' as strings; + +extension StringCapitalization on String { + String capitalize() { + return splitMapJoin( + RegExp(r'[ -]'), + onMatch: (m) => strings.capitalize(m.input.substring(m.start, m.end)), + onNonMatch: (n) => strings.capitalize(n), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index 86acd55..7910064 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,9 @@ +import 'dart:convert'; + +import 'package:crypto/crypto.dart'; import 'package:flutter/material.dart'; +import 'package:localstore/localstore.dart'; +import 'package:pokemon_api/pokemon_api.dart'; import 'package:provider/provider.dart'; import 'core/routes.dart'; @@ -6,7 +11,44 @@ import 'modules/PokemonDetails/pokemon_details_page.dart'; import 'modules/PokemonList/pokemon_list_controller.dart'; import 'modules/PokemonList/pokemon_list_page.dart'; +class LocalstoreCache extends CacheManager { + static const String collection = 'cache'; + + String _filename(String key) => '${md5.convert(utf8.encode(key))}.json'; + + @override + Future add(String key, value) { + return Localstore.instance.collection(collection).doc(_filename(key)).set(value); + } + + @override + Future clear() { + return Localstore.instance.collection(collection).delete(); + } + + @override + Future contains(String key) async { + return (await Localstore.instance.collection(collection).doc(_filename(key)).get()) != null; + } + + @override + Future fill(Map cache) { + return Future.wait(cache.entries.map((doc) => add(doc.key, doc.value))); + } + + @override + Future get(String key) { + return Localstore.instance.collection(collection).doc(_filename(key)).get(); + } + + @override + Future remove(String key) { + return Localstore.instance.collection(collection).doc(_filename(key)).delete(); + } +} + void main() { + PokemonAPIClient.instance.setCache(LocalstoreCache()); runApp(const MyApp()); } @@ -119,3 +161,4 @@ class _MyHomePageState extends State { ); } } + diff --git a/lib/modules/PokemonDetails/pokemon_details_page.dart b/lib/modules/PokemonDetails/pokemon_details_page.dart index 09e315b..846900c 100644 --- a/lib/modules/PokemonDetails/pokemon_details_page.dart +++ b/lib/modules/PokemonDetails/pokemon_details_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:pokedex/core/models/pokemon_helper.dart'; import 'pokemon_details_args.dart'; import '../PokemonList/pokemon_list_controller.dart'; import '../../widgets/pokemon_image.dart'; @@ -6,18 +7,31 @@ import '../../widgets/pokemon_image.dart'; class PokemonDetailsPage extends StatelessWidget { const PokemonDetailsPage({super.key}); + PokemonDetailsArgs argsOf(BuildContext context) => PokemonDetailsArgs.of(context); + @override Widget build(BuildContext context) { final ctrl = PokemonListController.of(context); - final poke = ctrl.pokemonMap[PokemonDetailsArgs.of(context).name]!; + final args = argsOf(context); + final poke = ctrl.pokemonMap[args.name]!; + final species = ctrl.speciesMap[poke.species.name]!; final children = [ - () => Text(poke.displayName), - () => PokemonImage(poke: poke, size: 250), + () => Text(PokemonHelper.displayName(species)), + () => Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Hero( + tag: 'pokemon-${poke.name}', + child: PokemonImage(poke: poke, size: 250), + ), + PokemonImage(poke: poke, size: 250, shiny: true), + ], + ), ]; return Scaffold( appBar: AppBar( - title: Text(poke.displayName), + title: Text(PokemonHelper.displayName(species)), ), body: ListView.builder( itemBuilder: (context, index) => children[index].call(), @@ -26,3 +40,4 @@ class PokemonDetailsPage extends StatelessWidget { ); } } + diff --git a/lib/modules/PokemonList/pokemon_list_controller.dart b/lib/modules/PokemonList/pokemon_list_controller.dart index 725d30e..3099005 100644 --- a/lib/modules/PokemonList/pokemon_list_controller.dart +++ b/lib/modules/PokemonList/pokemon_list_controller.dart @@ -1,30 +1,76 @@ import 'package:flutter/material.dart'; -import 'package:pokedex/data/pokemon.dart'; +import 'package:pokemon_api/pokemon_api.dart'; import 'package:provider/provider.dart'; -import '../../core/models/pokemon.dart'; - class PokemonListController extends ChangeNotifier { bool loading = false; - Iterable pokemonList = []; + List pokemonList = []; Map pokemonMap = {}; + List speciesList = []; + Map speciesMap = {}; PokemonListController() { debugPrint('PokemonListController()'); getPokemon(); } - static PokemonListController of(BuildContext context) => - Provider.of(context, listen: false); + static PokemonListController of(BuildContext context) => Provider.of(context, listen: false); Future getPokemon() async { debugPrint('getPokemon()'); loading = true; - await Future.microtask(() { - pokemonMap = getAllPokemon(); - pokemonList = pokemonMap.values; - }); + final pokemonListResources = await PokemonAPIClient.instance.getPokemonList(PageOptions(), maxPages: null); + final pokemonSpeciesListResources = + await PokemonAPIClient.instance.getPokemonSpeciesList(PageOptions(), maxPages: null); + + final pokemonFutures = >[]; + final speciesFutures = >[]; + + var i = 0; + for (final resource in pokemonListResources) { + pokemonFutures.add(resource.get()); + if (i < pokemonSpeciesListResources.length) { + speciesFutures.add(pokemonSpeciesListResources[i].get()); + } + + if (pokemonFutures.length == 5) { + await Future.wait([ + Future.wait(pokemonFutures).then((value) => pokemonList.addAll(value)), + Future.wait(speciesFutures).then((value) => speciesList.addAll(value)), + ]); + pokemonFutures.clear(); + speciesFutures.clear(); + } + i++; + } + + if (pokemonFutures.isNotEmpty) { + await Future.wait(pokemonFutures).then((value) => pokemonList.addAll(value)); + } + + if (speciesFutures.isNotEmpty) { + await Future.wait(speciesFutures).then((value) => speciesList.addAll(value)); + } + + pokemonMap = Map.fromEntries(pokemonList.map((e) => MapEntry(e.name, e))); + speciesMap = Map.fromEntries(speciesList.map((e) => MapEntry(e.name, e))); loading = false; notifyListeners(); } } + +class ProgressReporter { + final int total; + int count = 0; + ProgressReporter(this.total); + + void increment() { + count++; + debugPrint('ProgressReporter: $count/$total'); + } + + bool get isDone => count >= total; + + double get progress => count / total; +} + diff --git a/lib/modules/PokemonList/pokemon_list_page.dart b/lib/modules/PokemonList/pokemon_list_page.dart index 7e91c6b..2b3e6cb 100644 --- a/lib/modules/PokemonList/pokemon_list_page.dart +++ b/lib/modules/PokemonList/pokemon_list_page.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:pokedex/core/models/pokemon_helper.dart'; import 'package:pokedex/modules/PokemonList/pokemon_list_controller.dart'; +import 'package:pokemon_api/pokemon_api.dart'; import 'package:provider/provider.dart'; -import '../../core/models/pokemon.dart'; import '../../widgets/pokemon_list_item.dart'; class PokemonListPage extends StatefulWidget { @@ -18,6 +19,8 @@ class _PokemonListPageState extends State { bool searching = false; bool afterInit = false; + PokemonListController get ctrl => PokemonListController.of(context); + @override void initState() { super.initState(); @@ -54,27 +57,37 @@ class _PokemonListPageState extends State { super.dispose(); } - PokemonListController get ctrl => PokemonListController.of(context); - - Iterable _applyFilters(Iterable list) => - list.where((poke) => [poke.displayName, poke.formName] - .join(' ') - .toLowerCase() - .contains(search.text.toLowerCase())); + Iterable _applyFilters(Iterable list) => list.where((poke) { + final species = ctrl.speciesMap[poke.species.name]; + return [ + species != null ? PokemonHelper.displayName(species) : null, + species != null ? PokemonHelper.formName(poke, species) : null, + poke.name, + ].whereType().join(' ').toLowerCase().contains(search.text.toLowerCase()); + }); @override Widget build(BuildContext context) { + debugPrint("pokemon count: ${ctrl.pokemonList.length}"); return Scaffold( appBar: AppBar( - title: searching - ? TextField( - controller: search, - decoration: const InputDecoration(hintText: 'Search by name'), - autofocus: true, - ) - : const Text('Pokedex')), + title: searching + ? TextField( + controller: search, + decoration: InputDecoration( + hintText: 'Search by name', + suffixIcon: search.text.isNotEmpty + ? IconButton( + icon: const Icon(Icons.close), + onPressed: () => search.clear(), + ) + : null, + ), + autofocus: true, + ) + : const Text('Pokedex'), + ), floatingActionButton: FloatingActionButton( - // child: const Icon(Icons.catching_pokemon), child: const Icon(Icons.search), onPressed: () => setState(() => searching = !searching), ), @@ -99,3 +112,4 @@ class _PokemonListPageState extends State { ); } } + diff --git a/lib/widgets/pokemon_image.dart b/lib/widgets/pokemon_image.dart index a7f91a7..64d0f0b 100644 --- a/lib/widgets/pokemon_image.dart +++ b/lib/widgets/pokemon_image.dart @@ -1,22 +1,24 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; - -import '../core/models/pokemon.dart'; +import 'package:pokedex/core/models/pokemon_helper.dart'; +import 'package:pokemon_api/pokemon_api.dart'; class PokemonImage extends StatelessWidget { const PokemonImage({ super.key, this.size = 64, required this.poke, + this.shiny = false, }); final Pokemon poke; final double size; + final bool shiny; @override Widget build(BuildContext context) { return CachedNetworkImage( - imageUrl: poke.imageUrl!, + imageUrl: !shiny ? PokemonHelper.imageUrl(poke)! : PokemonHelper.shinyImageUrl(poke)!, width: size, height: size, progressIndicatorBuilder: (context, url, progress) => const Center( @@ -26,3 +28,4 @@ class PokemonImage extends StatelessWidget { ); } } + diff --git a/lib/widgets/pokemon_list_item.dart b/lib/widgets/pokemon_list_item.dart index 69ea9ca..36f06b8 100644 --- a/lib/widgets/pokemon_list_item.dart +++ b/lib/widgets/pokemon_list_item.dart @@ -1,9 +1,11 @@ -import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; +import 'package:pokedex/core/models/pokemon_helper.dart'; +import 'package:pokedex/core/routes.dart'; +import 'package:pokedex/core/utils/extensions/string_extensions.dart'; import 'package:pokedex/modules/PokemonDetails/pokemon_details_args.dart'; +import 'package:pokemon_api/pokemon_api.dart'; -import '../core/models/pokemon.dart'; -import '../core/routes.dart'; +import '../modules/PokemonList/pokemon_list_controller.dart'; import 'pokemon_image.dart'; class PokemonListItem extends StatelessWidget { @@ -16,6 +18,8 @@ class PokemonListItem extends StatelessWidget { @override Widget build(BuildContext context) { + final species = PokemonListController.of(context).speciesMap[poke.species.name]; + print('poke: ${poke.name}, species: ${species?.name}'); return Card( child: InkWell( onTap: () => Navigator.pushNamed( @@ -27,18 +31,19 @@ class PokemonListItem extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.all(8).copyWith(top: 0), - child: poke.imageUrl != null - ? SizedBox.square( - dimension: 64, - child: PokemonImage(poke: poke, size: 64), - ) - : const SizedBox.square(dimension: 64), + child: Hero( + tag: 'pokemon-${poke.name}', + child: PokemonImage(poke: poke, size: 64), + // child: poke != null + // ? PokemonImage(poke: poke, size: 64) + // : const SizedBox.square(dimension: 64, child: Placeholder()), + ), ), const SizedBox(width: 8), Text( [ - poke.displayName, - poke.formName != null ? '(${poke.formName})' : null, + species != null ? PokemonHelper.displayName(species) : poke.name.capitalize(), + species != null && PokemonHelper.formName(poke, species) != null ? '(${PokemonHelper.formName(poke, species)})' : null, ].whereType().join(' '), style: Theme.of(context).textTheme.titleMedium, ), @@ -48,3 +53,4 @@ class PokemonListItem extends StatelessWidget { ); } } + diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index a888b44..6e2df3b 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -8,8 +8,6 @@ import Foundation import cloud_firestore import firebase_auth import firebase_core -import firebase_crashlytics -import firebase_remote_config import path_provider_macos import shared_preferences_macos import sign_in_with_apple @@ -20,8 +18,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FLTFirebaseFirestorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseFirestorePlugin")) FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) - FLTFirebaseCrashlyticsPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCrashlyticsPlugin")) - FLTFirebaseRemoteConfigPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseRemoteConfigPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SignInWithApplePlugin.register(with: registry.registrar(forPlugin: "SignInWithApplePlugin")) diff --git a/macos/Podfile b/macos/Podfile index fe73390..049abe2 100644 --- a/macos/Podfile +++ b/macos/Podfile @@ -1,4 +1,4 @@ -platform :osx, '10.13' +platform :osx, '10.14' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 3fb1982..28c4698 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -602,65 +602,40 @@ PODS: - BoringSSL-GRPC/Implementation (0.0.24): - BoringSSL-GRPC/Interface (= 0.0.24) - BoringSSL-GRPC/Interface (0.0.24) - - cloud_firestore (4.1.0): - - Firebase/CoreOnly (~> 10.2.0) - - Firebase/Firestore (~> 10.2.0) + - cloud_firestore (4.2.0): + - Firebase/CoreOnly (~> 10.3.0) + - Firebase/Firestore (~> 10.3.0) - firebase_core - FlutterMacOS - nanopb (< 2.30910.0, >= 2.30908.0) - - Firebase/Auth (10.2.0): + - Firebase/Auth (10.3.0): - Firebase/CoreOnly - - FirebaseAuth (~> 10.2.0) - - Firebase/CoreOnly (10.2.0): - - FirebaseCore (= 10.2.0) - - Firebase/Crashlytics (10.2.0): + - FirebaseAuth (~> 10.3.0) + - Firebase/CoreOnly (10.3.0): + - FirebaseCore (= 10.3.0) + - Firebase/Firestore (10.3.0): - Firebase/CoreOnly - - FirebaseCrashlytics (~> 10.2.0) - - Firebase/Firestore (10.2.0): - - Firebase/CoreOnly - - FirebaseFirestore (~> 10.2.0) - - Firebase/RemoteConfig (10.2.0): - - Firebase/CoreOnly - - FirebaseRemoteConfig (~> 10.2.0) - - firebase_auth (4.1.5): - - Firebase/Auth (~> 10.2.0) - - Firebase/CoreOnly (~> 10.2.0) + - FirebaseFirestore (~> 10.3.0) + - firebase_auth (4.2.0): + - Firebase/Auth (~> 10.3.0) + - Firebase/CoreOnly (~> 10.3.0) - firebase_core - FlutterMacOS - - firebase_core (2.3.0): - - Firebase/CoreOnly (~> 10.2.0) + - firebase_core (2.4.0): + - Firebase/CoreOnly (~> 10.3.0) - FlutterMacOS - - firebase_crashlytics (3.0.6): - - Firebase/CoreOnly (~> 10.2.0) - - Firebase/Crashlytics (~> 10.2.0) - - firebase_core - - FlutterMacOS - - firebase_remote_config (3.0.6): - - Firebase/CoreOnly (~> 10.2.0) - - Firebase/RemoteConfig (~> 10.2.0) - - firebase_core - - FlutterMacOS - - FirebaseABTesting (10.3.0): - - FirebaseCore (~> 10.0) - - FirebaseAuth (10.2.0): + - FirebaseAuth (10.3.0): - FirebaseCore (~> 10.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - GoogleUtilities/Environment (~> 7.8) - GTMSessionFetcher/Core (< 4.0, >= 2.1) - - FirebaseCore (10.2.0): + - FirebaseCore (10.3.0): - FirebaseCoreInternal (~> 10.0) - GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/Logger (~> 7.8) - - FirebaseCoreInternal (10.3.0): + - FirebaseCoreInternal (10.11.0): - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseCrashlytics (10.2.0): - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleDataTransport (~> 9.2) - - GoogleUtilities/Environment (~> 7.8) - - nanopb (< 2.30910.0, >= 2.30908.0) - - PromisesObjC (~> 2.1) - - FirebaseFirestore (10.2.0): + - FirebaseFirestore (10.3.0): - abseil/algorithm (~> 1.20211102.0) - abseil/base (~> 1.20211102.0) - abseil/container/flat_hash_map (~> 1.20211102.0) @@ -673,41 +648,24 @@ PODS: - "gRPC-C++ (~> 1.44.0)" - leveldb-library (~> 1.22) - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseInstallations (10.3.0): - - FirebaseCore (~> 10.0) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/UserDefaults (~> 7.8) - - PromisesObjC (~> 2.1) - - FirebaseRemoteConfig (10.2.0): - - FirebaseABTesting (~> 10.0) - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleUtilities/Environment (~> 7.8) - - "GoogleUtilities/NSData+zlib (~> 7.8)" - FlutterMacOS (1.0.0) - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) - - GoogleDataTransport (9.2.0): - - GoogleUtilities/Environment (~> 7.7) - - nanopb (< 2.30910.0, >= 2.30908.0) - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/AppDelegateSwizzler (7.10.0): + - GoogleUtilities/AppDelegateSwizzler (7.11.1): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - - GoogleUtilities/Environment (7.10.0): + - GoogleUtilities/Environment (7.11.1): - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.10.0): + - GoogleUtilities/Logger (7.11.1): - GoogleUtilities/Environment - - GoogleUtilities/Network (7.10.0): + - GoogleUtilities/Network (7.11.1): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.10.0)" - - GoogleUtilities/Reachability (7.10.0): - - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.10.0): + - "GoogleUtilities/NSData+zlib (7.11.1)" + - GoogleUtilities/Reachability (7.11.1): - GoogleUtilities/Logger - "gRPC-C++ (1.44.0)": - "gRPC-C++/Implementation (= 1.44.0)" @@ -760,8 +718,8 @@ PODS: - gRPC-Core/Interface (= 1.44.0) - Libuv-gRPC (= 0.0.10) - gRPC-Core/Interface (1.44.0) - - GTMSessionFetcher/Core (3.0.0) - - leveldb-library (1.22.1) + - GTMSessionFetcher/Core (3.1.1) + - leveldb-library (1.22.2) - Libuv-gRPC (0.0.10): - Libuv-gRPC/Implementation (= 0.0.10) - Libuv-gRPC/Interface (= 0.0.10) @@ -775,7 +733,7 @@ PODS: - nanopb/encode (2.30909.0) - path_provider_macos (0.0.1): - FlutterMacOS - - PromisesObjC (2.1.1) + - PromisesObjC (2.2.0) - shared_preferences_macos (0.0.1): - FlutterMacOS - sign_in_with_apple (0.0.1): @@ -790,8 +748,6 @@ DEPENDENCIES: - cloud_firestore (from `Flutter/ephemeral/.symlinks/plugins/cloud_firestore/macos`) - firebase_auth (from `Flutter/ephemeral/.symlinks/plugins/firebase_auth/macos`) - firebase_core (from `Flutter/ephemeral/.symlinks/plugins/firebase_core/macos`) - - firebase_crashlytics (from `Flutter/ephemeral/.symlinks/plugins/firebase_crashlytics/macos`) - - firebase_remote_config (from `Flutter/ephemeral/.symlinks/plugins/firebase_remote_config/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`) - shared_preferences_macos (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_macos/macos`) @@ -804,16 +760,11 @@ SPEC REPOS: - abseil - BoringSSL-GRPC - Firebase - - FirebaseABTesting - FirebaseAuth - FirebaseCore - FirebaseCoreInternal - - FirebaseCrashlytics - FirebaseFirestore - - FirebaseInstallations - - FirebaseRemoteConfig - FMDB - - GoogleDataTransport - GoogleUtilities - "gRPC-C++" - gRPC-Core @@ -830,10 +781,6 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/firebase_auth/macos firebase_core: :path: Flutter/ephemeral/.symlinks/plugins/firebase_core/macos - firebase_crashlytics: - :path: Flutter/ephemeral/.symlinks/plugins/firebase_crashlytics/macos - firebase_remote_config: - :path: Flutter/ephemeral/.symlinks/plugins/firebase_remote_config/macos FlutterMacOS: :path: Flutter/ephemeral path_provider_macos: @@ -850,37 +797,30 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: abseil: ebe5b5529fb05d93a8bdb7951607be08b7fa71bc BoringSSL-GRPC: 3175b25143e648463a56daeaaa499c6cb86dad33 - cloud_firestore: 5bfd8f92a2f11f9d25a0ee69303ca069cadc7637 - Firebase: a3ea7eba4382afd83808376edb99acdaff078dcf - firebase_auth: 89ed93a8d1d8f657fec8fe149bdeeb02e55c92d4 - firebase_core: f6f75d92dcdd5ef1b43876017affde02b7b402ec - firebase_crashlytics: e8ef15b4479fcdff5b4e4e2bec9e503a3a0c1a19 - firebase_remote_config: 6ab273e930bca58db45485074073e54ea6173860 - FirebaseABTesting: e6660693429b4663573c82f8d2f1041deff1753a - FirebaseAuth: 08e7739244eeae5216d0a3f8d9f16a76be9c252e - FirebaseCore: 813838072b797b64f529f3c2ee35e696e5641dd1 - FirebaseCoreInternal: 29b76f784d607df8b2a1259d73c3f04f1210137b - FirebaseCrashlytics: df7406152189d48346deafb716806d7bd9ebb573 - FirebaseFirestore: bda7a1ca8c19319a2acd2761cd4b962022c1d5ea - FirebaseInstallations: e2f26126089dcf41e215f7b8925af8d953c7d602 - FirebaseRemoteConfig: 5bdeadd64a042dad0f6a38fee7e017818240c3d2 - FlutterMacOS: 85f90bfb3f1703249cf1539e4dfbff31e8584698 + cloud_firestore: 9d2cc3475f9f2f3cbb7099c8c17bc7e23fccfbf2 + Firebase: f92fc551ead69c94168d36c2b26188263860acd9 + firebase_auth: 845851827499eb92e56bed878ff756ae75c0324e + firebase_core: 7bd6c8dabdeba26600cf939a5f59b20e78156d7c + FirebaseAuth: 0e415d29d846c1dce2fb641e46f35e9888d9bec6 + FirebaseCore: 988754646ab3bd4bdcb740f1bfe26b9f6c0d5f2a + FirebaseCoreInternal: 9e46c82a14a3b3a25be4e1e151ce6d21536b89c0 + FirebaseFirestore: 244f71ff14ef44f39e00b44d356eac708ce03103 + FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - GoogleDataTransport: 1c8145da7117bd68bbbed00cf304edb6a24de00f - GoogleUtilities: bad72cb363809015b1f7f19beb1f1cd23c589f95 + GoogleUtilities: 9aa0ad5a7bc171f8bae016300bfcfa3fb8425749 "gRPC-C++": 9675f953ace2b3de7c506039d77be1f2e77a8db2 gRPC-Core: 943e491cb0d45598b0b0eb9e910c88080369290b - GTMSessionFetcher: c1edebe64e9fb4e8f6415d018edf1fd3eac074a1 - leveldb-library: 50c7b45cbd7bf543c81a468fe557a16ae3db8729 + GTMSessionFetcher: e8647203b65cee28c5f73d0f473d096653945e72 + leveldb-library: f03246171cce0484482ec291f88b6d563699ee06 Libuv-gRPC: 55e51798e14ef436ad9bc45d12d43b77b49df378 nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 path_provider_macos: 3c0c3b4b0d4a76d2bf989a913c2de869c5641a19 - PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb + PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef shared_preferences_macos: a64dc611287ed6cbe28fd1297898db1336975727 sign_in_with_apple: a9e97e744e8edc36aefc2723111f652102a7a727 sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9 -PODFILE CHECKSUM: a884f6dd3f7494f3892ee6c81feea3a3abbf9153 +PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7 COCOAPODS: 1.11.3 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 771dfb3..32141e7 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -21,6 +21,7 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 1E595A3214DA9687C2EEDD33 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 759A7BFF29CB8253C577BDA3 /* GoogleService-Info.plist */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; @@ -68,6 +69,7 @@ 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; 69925F0F6FF72430A287E27B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 759A7BFF29CB8253C577BDA3 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; 75CA243D7B808268DDE27297 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; @@ -106,6 +108,7 @@ 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, FCCE5DF74820964B24566096 /* Pods */, + 759A7BFF29CB8253C577BDA3 /* GoogleService-Info.plist */, ); sourceTree = ""; }; @@ -167,7 +170,6 @@ 75CA243D7B808268DDE27297 /* Pods-Runner.release.xcconfig */, A68B3A09A66BCC18FAA0BF11 /* Pods-Runner.profile.xcconfig */, ); - name = Pods; path = Pods; sourceTree = ""; }; @@ -185,6 +187,7 @@ 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, A09979528FB9ECC4475F5769 /* [CP] Embed Pods Frameworks */, + 701C8C718B7F59663EA21B6A /* [firebase_crashlytics] Crashlytics Upload Symbols (disabled) */, ); buildRules = ( ); @@ -203,7 +206,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { @@ -248,6 +251,7 @@ files = ( 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + 1E595A3214DA9687C2EEDD33 /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -314,6 +318,26 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + 701C8C718B7F59663EA21B6A /* [firebase_crashlytics] Crashlytics Upload Symbols (disabled) */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}\"", + "\"$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)\"", + ); + name = "[firebase_crashlytics] Crashlytics Upload Symbols (disabled)"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# \"$PODS_ROOT/FirebaseCrashlytics/upload-symbols\" --flutter-project \"$PROJECT_DIR/firebase_app_id_file.json\" \n"; + }; A09979528FB9ECC4475F5769 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -405,7 +429,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; @@ -484,7 +508,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -531,7 +555,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index e2e5143..701234f 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ =2.19.0-255.2.beta <3.0.0" + dart: ">=3.1.0-163.1.beta <4.0.0" flutter: ">=3.3.0" diff --git a/pubspec.yaml b/pubspec.yaml index e26b501..b2d5178 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -37,8 +37,8 @@ dependencies: cupertino_icons: ^1.0.2 firebase_core: ^2.3.0 cloud_firestore: ^4.1.0 - firebase_crashlytics: ^3.0.6 - firebase_remote_config: ^3.0.6 + # firebase_crashlytics: ^3.0.6 + # firebase_remote_config: ^3.0.6 firebase_auth: ^4.1.5 provider: ^6.0.4 shared_preferences: ^2.0.15 @@ -51,6 +51,15 @@ dependencies: intl_generator: ^0.4.0 sqflite: ^2.2.2 strings: ^0.2.2 + palette_generator: ^0.3.3+2 + # pokemon_api: + # git: + # url: https://github.com/chenasraf/pokemon_api_dart.git + # ref: master + pokemon_api: + path: ../pokemon_api + localstore: ^1.3.5 + crypto: ^3.0.3 dev_dependencies: flutter_test: @@ -66,6 +75,7 @@ dev_dependencies: # rules and activating additional ones. flutter_lints: ^2.0.0 queue: ^3.1.0+2 + btool: ^0.1.2 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec @@ -117,7 +127,7 @@ script_runner: - name: get-name cmd: dart run btool get packageName suppress_header_output: true - - push: 'version=$(get-version); name=$(get-name); echo "Pushing ${name}-$version.apk"; adb push build/app/outputs/flutter-apk/app-release.apk /sdcard/Download/${name}-${version}.apk' + - push: 'version=$(get-version); name=$(get-name); echo "Pushing ${name}-$version.apk"; adb push "build/app/outputs/flutter-apk/app-release.apk" "/sdcard/Download/${name}-${version}.apk"' - install: adb install -r build/app/outputs/flutter-apk/app-release.apk - to-device: build:apk && push && install - auto-fix: dart fix --apply