From 9ca9e84ab13c55c348f6d8af65726c37fd04e14e Mon Sep 17 00:00:00 2001 From: sidhdhi canopas Date: Mon, 29 Jan 2024 11:40:07 +0530 Subject: [PATCH] auth flow --- build_watch | 2 +- data/.flutter-plugins | 8 + data/.flutter-plugins-dependencies | 2 +- data/lib/api/user/user_models.dart | 45 +- data/lib/api/user/user_models.freezed.dart | 150 ++-- data/lib/api/user/user_models.g.dart | 56 +- data/lib/service/auth/auth_service.dart | 69 ++ .../file_upload/file_upload_service.dart | 37 + data/lib/service/user/user_service.dart | 53 +- data/lib/storage/app_preferences.dart | 4 +- data/pubspec.yaml | 13 +- khelo/android/app/build.gradle | 1 + khelo/assets/images/ic_camera.png | Bin 0 -> 72691 bytes khelo/assets/images/ic_gallery.png | Bin 0 -> 200960 bytes khelo/assets/locales/app_en.arb | 60 +- khelo/ios/Podfile.lock | 813 ++++++++++++++++++ khelo/ios/Runner/Info.plist | 4 + khelo/lib/components/app_page.dart | 3 +- .../domain/extensions/string_extensions.dart | 8 + khelo/lib/main.dart | 18 +- khelo/lib/ui/app.dart | 2 +- khelo/lib/ui/app_route.dart | 16 +- khelo/lib/ui/flow/intro/intro_screen.dart | 4 +- khelo/lib/ui/flow/profile/profile_screen.dart | 187 +++- .../ui/flow/profile/profile_view_model.dart | 48 ++ .../profile/profile_view_model.freezed.dart | 151 ++++ .../settings/profile/edit_profile_screen.dart | 550 +++++++++++- .../profile/edit_profile_view_model.dart | 210 +++++ .../edit_profile_view_model.freezed.dart | 429 +++++++++ .../phone_verification_screen.dart | 6 +- .../phone_verification_view_model.dart | 85 +- ...phone_verification_view_model.freezed.dart | 42 +- .../sign_in_with_phone_screen.dart | 23 +- .../sign_in_with_phone_view_model.dart | 59 +- ...sign_in_with_phone_view_model.freezed.dart | 26 +- .../flutter/generated_plugin_registrant.cc | 4 + khelo/linux/flutter/generated_plugins.cmake | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + khelo/pubspec.lock | 286 +++++- khelo/pubspec.yaml | 18 +- .../flutter/generated_plugin_registrant.cc | 9 + khelo/windows/flutter/generated_plugins.cmake | 3 + run_lint | 2 +- style/lib/extensions/date_extensions.dart | 3 + 44 files changed, 3237 insertions(+), 283 deletions(-) create mode 100644 data/lib/service/auth/auth_service.dart create mode 100644 data/lib/service/file_upload/file_upload_service.dart create mode 100644 khelo/assets/images/ic_camera.png create mode 100644 khelo/assets/images/ic_gallery.png create mode 100644 khelo/lib/domain/extensions/string_extensions.dart create mode 100644 khelo/lib/ui/flow/profile/profile_view_model.dart create mode 100644 khelo/lib/ui/flow/profile/profile_view_model.freezed.dart create mode 100644 khelo/lib/ui/flow/settings/profile/edit_profile_view_model.dart create mode 100644 khelo/lib/ui/flow/settings/profile/edit_profile_view_model.freezed.dart create mode 100644 style/lib/extensions/date_extensions.dart diff --git a/build_watch b/build_watch index cf7c5a96..624c789b 100755 --- a/build_watch +++ b/build_watch @@ -16,7 +16,7 @@ function keep_running { } # Navigate to each project directory and run the watcher in the background -(cd app && keep_running) & +(cd khelo && keep_running) & (cd data && keep_running) & # Wait for all background processes to finish diff --git a/data/.flutter-plugins b/data/.flutter-plugins index eb8d0f3e..89ba6518 100644 --- a/data/.flutter-plugins +++ b/data/.flutter-plugins @@ -1,5 +1,13 @@ # This is a generated file; do not edit or check into version control. +cloud_firestore=/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/cloud_firestore-4.14.0/ +cloud_firestore_web=/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/cloud_firestore_web-3.9.0/ device_info_plus=/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/device_info_plus-9.1.1/ +firebase_auth=/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_auth-4.16.0/ +firebase_auth_web=/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_auth_web-5.8.13/ +firebase_core=/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_core-2.24.2/ +firebase_core_web=/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_core_web-2.10.0/ +firebase_storage=/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_storage-11.6.0/ +firebase_storage_web=/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_storage_web-3.6.17/ flutter_timezone=/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/flutter_timezone-1.0.8/ package_info_plus=/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/package_info_plus-5.0.1/ path_provider_linux=/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ diff --git a/data/.flutter-plugins-dependencies b/data/.flutter-plugins-dependencies index 6c20de1a..22f52b23 100644 --- a/data/.flutter-plugins-dependencies +++ b/data/.flutter-plugins-dependencies @@ -1 +1 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"device_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/device_info_plus-9.1.1/","native_build":true,"dependencies":[]},{"name":"flutter_timezone","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/flutter_timezone-1.0.8/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/package_info_plus-5.0.1/","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.3.5/","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"android":[{"name":"device_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/device_info_plus-9.1.1/","native_build":true,"dependencies":[]},{"name":"flutter_timezone","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/flutter_timezone-1.0.8/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/package_info_plus-5.0.1/","native_build":true,"dependencies":[]},{"name":"shared_preferences_android","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/shared_preferences_android-2.2.1/","native_build":true,"dependencies":[]}],"macos":[{"name":"device_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/device_info_plus-9.1.1/","native_build":true,"dependencies":[]},{"name":"flutter_timezone","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/flutter_timezone-1.0.8/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/package_info_plus-5.0.1/","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.3.5/","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"linux":[{"name":"device_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/device_info_plus-9.1.1/","native_build":false,"dependencies":[]},{"name":"package_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/package_info_plus-5.0.1/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[]},{"name":"shared_preferences_linux","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.3.2/","native_build":false,"dependencies":["path_provider_linux"]}],"windows":[{"name":"device_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/device_info_plus-9.1.1/","native_build":false,"dependencies":[]},{"name":"package_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/package_info_plus-5.0.1/","native_build":false,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/path_provider_windows-2.2.1/","native_build":false,"dependencies":[]},{"name":"shared_preferences_windows","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.3.2/","native_build":false,"dependencies":["path_provider_windows"]}],"web":[{"name":"device_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/device_info_plus-9.1.1/","dependencies":[]},{"name":"flutter_timezone","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/flutter_timezone-1.0.8/","dependencies":[]},{"name":"package_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/package_info_plus-5.0.1/","dependencies":[]},{"name":"shared_preferences_web","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/shared_preferences_web-2.2.2/","dependencies":[]}]},"dependencyGraph":[{"name":"device_info_plus","dependencies":[]},{"name":"flutter_timezone","dependencies":[]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]}],"date_created":"2024-01-23 10:49:28.245095","version":"3.16.8"} \ No newline at end of file +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"cloud_firestore","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/cloud_firestore-4.14.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"device_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/device_info_plus-9.1.1/","native_build":true,"dependencies":[]},{"name":"firebase_auth","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_auth-4.16.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_core-2.24.2/","native_build":true,"dependencies":[]},{"name":"firebase_storage","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_storage-11.6.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"flutter_timezone","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/flutter_timezone-1.0.8/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/package_info_plus-5.0.1/","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.3.5/","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"android":[{"name":"cloud_firestore","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/cloud_firestore-4.14.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"device_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/device_info_plus-9.1.1/","native_build":true,"dependencies":[]},{"name":"firebase_auth","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_auth-4.16.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_core-2.24.2/","native_build":true,"dependencies":[]},{"name":"firebase_storage","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_storage-11.6.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"flutter_timezone","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/flutter_timezone-1.0.8/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/package_info_plus-5.0.1/","native_build":true,"dependencies":[]},{"name":"shared_preferences_android","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/shared_preferences_android-2.2.1/","native_build":true,"dependencies":[]}],"macos":[{"name":"cloud_firestore","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/cloud_firestore-4.14.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"device_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/device_info_plus-9.1.1/","native_build":true,"dependencies":[]},{"name":"firebase_auth","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_auth-4.16.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_core-2.24.2/","native_build":true,"dependencies":[]},{"name":"firebase_storage","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_storage-11.6.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"flutter_timezone","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/flutter_timezone-1.0.8/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/package_info_plus-5.0.1/","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.3.5/","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"linux":[{"name":"device_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/device_info_plus-9.1.1/","native_build":false,"dependencies":[]},{"name":"package_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/package_info_plus-5.0.1/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[]},{"name":"shared_preferences_linux","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.3.2/","native_build":false,"dependencies":["path_provider_linux"]}],"windows":[{"name":"cloud_firestore","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/cloud_firestore-4.14.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"device_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/device_info_plus-9.1.1/","native_build":false,"dependencies":[]},{"name":"firebase_auth","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_auth-4.16.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_core-2.24.2/","native_build":true,"dependencies":[]},{"name":"firebase_storage","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_storage-11.6.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"package_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/package_info_plus-5.0.1/","native_build":false,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/path_provider_windows-2.2.1/","native_build":false,"dependencies":[]},{"name":"shared_preferences_windows","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.3.2/","native_build":false,"dependencies":["path_provider_windows"]}],"web":[{"name":"cloud_firestore_web","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/cloud_firestore_web-3.9.0/","dependencies":["firebase_core_web"]},{"name":"device_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/device_info_plus-9.1.1/","dependencies":[]},{"name":"firebase_auth_web","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_auth_web-5.8.13/","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_core_web-2.10.0/","dependencies":[]},{"name":"firebase_storage_web","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/firebase_storage_web-3.6.17/","dependencies":["firebase_core_web"]},{"name":"flutter_timezone","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/flutter_timezone-1.0.8/","dependencies":[]},{"name":"package_info_plus","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/package_info_plus-5.0.1/","dependencies":[]},{"name":"shared_preferences_web","path":"/Users/sidhdhi.p/.pub-cache/hosted/pub.dev/shared_preferences_web-2.2.2/","dependencies":[]}]},"dependencyGraph":[{"name":"cloud_firestore","dependencies":["cloud_firestore_web","firebase_core"]},{"name":"cloud_firestore_web","dependencies":["firebase_core","firebase_core_web"]},{"name":"device_info_plus","dependencies":[]},{"name":"firebase_auth","dependencies":["firebase_auth_web","firebase_core"]},{"name":"firebase_auth_web","dependencies":["firebase_core","firebase_core_web"]},{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]},{"name":"firebase_storage","dependencies":["firebase_core","firebase_storage_web"]},{"name":"firebase_storage_web","dependencies":["firebase_core","firebase_core_web"]},{"name":"flutter_timezone","dependencies":[]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]}],"date_created":"2024-01-29 11:39:02.318944","version":"3.16.8"} \ No newline at end of file diff --git a/data/lib/api/user/user_models.dart b/data/lib/api/user/user_models.dart index a1a65dff..0e3a9dd7 100644 --- a/data/lib/api/user/user_models.dart +++ b/data/lib/api/user/user_models.dart @@ -9,39 +9,42 @@ part 'user_models.freezed.dart'; part 'user_models.g.dart'; @freezed -class User with _$User { - const User._(); +class UserModel with _$UserModel { + const UserModel._(); - const factory User({ - required int id, + const factory UserModel({ + required String id, String? name, String? location, String? phone, - String? dob, + DateTime? dob, String? email, String? profile_img_url, UserGender? gender, DateTime? created_at, DateTime? updated_at, - String? player_role, - String? batting_style, - String? bowling_style, - }) = _User; + PlayerRole? player_role, + BattingStyle? batting_style, + BowlingStyle? bowling_style, + }) = _UserModel; - factory User.fromJson(Map json) => - _$UserFromJson(json); + factory UserModel.fromJson(Map json) => + _$UserModelFromJson(json); String toJsonString() => jsonEncode(toJson()); - static User? fromJsonString(String json) => - User.fromJson(jsonDecode(json)); + String get nameInitial => name?[0].toUpperCase() ?? '?'; + + static UserModel? fromJsonString(String json) => + UserModel.fromJson(jsonDecode(json)); } @JsonEnum(valueField: "value") enum UserGender { unknown(0), male(1), - female(2); + female(2), + other(3); final int value; @@ -50,7 +53,6 @@ enum UserGender { @JsonEnum(valueField: "value") enum PlayerRole { - unknown(0), topOrderBatter(1), middleOrderBatter(2), wickerKeeperBatter(3), @@ -68,7 +70,6 @@ enum PlayerRole { @JsonEnum(valueField: "value") enum BattingStyle { - unknown(0), rightHandBat(1), leftHandBat(2); @@ -79,9 +80,15 @@ enum BattingStyle { @JsonEnum(valueField: "value") enum BowlingStyle { - unknown(0), - male(1), - female(2); + rightArmFast(0), + rightArmMedium(1), + leftArmFast(2), + leftArmMedium(3), + slowLeftArmOrthodox(4), + slowLeftArmChinaMan(5), + rightArmOffBreak(6), + rightArmLegBreak(7), + none(8); final int value; diff --git a/data/lib/api/user/user_models.freezed.dart b/data/lib/api/user/user_models.freezed.dart index 9a9a77cb..acb93601 100644 --- a/data/lib/api/user/user_models.freezed.dart +++ b/data/lib/api/user/user_models.freezed.dart @@ -14,56 +14,57 @@ T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); -User _$UserFromJson(Map json) { - return _User.fromJson(json); +UserModel _$UserModelFromJson(Map json) { + return _UserModel.fromJson(json); } /// @nodoc -mixin _$User { - int get id => throw _privateConstructorUsedError; +mixin _$UserModel { + String get id => throw _privateConstructorUsedError; String? get name => throw _privateConstructorUsedError; String? get location => throw _privateConstructorUsedError; String? get phone => throw _privateConstructorUsedError; - String? get dob => throw _privateConstructorUsedError; + DateTime? get dob => throw _privateConstructorUsedError; String? get email => throw _privateConstructorUsedError; String? get profile_img_url => throw _privateConstructorUsedError; UserGender? get gender => throw _privateConstructorUsedError; DateTime? get created_at => throw _privateConstructorUsedError; DateTime? get updated_at => throw _privateConstructorUsedError; - String? get player_role => throw _privateConstructorUsedError; - String? get batting_style => throw _privateConstructorUsedError; - String? get bowling_style => throw _privateConstructorUsedError; + PlayerRole? get player_role => throw _privateConstructorUsedError; + BattingStyle? get batting_style => throw _privateConstructorUsedError; + BowlingStyle? get bowling_style => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) - $UserCopyWith get copyWith => throw _privateConstructorUsedError; + $UserModelCopyWith get copyWith => + throw _privateConstructorUsedError; } /// @nodoc -abstract class $UserCopyWith<$Res> { - factory $UserCopyWith(User value, $Res Function(User) then) = - _$UserCopyWithImpl<$Res, User>; +abstract class $UserModelCopyWith<$Res> { + factory $UserModelCopyWith(UserModel value, $Res Function(UserModel) then) = + _$UserModelCopyWithImpl<$Res, UserModel>; @useResult $Res call( - {int id, + {String id, String? name, String? location, String? phone, - String? dob, + DateTime? dob, String? email, String? profile_img_url, UserGender? gender, DateTime? created_at, DateTime? updated_at, - String? player_role, - String? batting_style, - String? bowling_style}); + PlayerRole? player_role, + BattingStyle? batting_style, + BowlingStyle? bowling_style}); } /// @nodoc -class _$UserCopyWithImpl<$Res, $Val extends User> - implements $UserCopyWith<$Res> { - _$UserCopyWithImpl(this._value, this._then); +class _$UserModelCopyWithImpl<$Res, $Val extends UserModel> + implements $UserModelCopyWith<$Res> { + _$UserModelCopyWithImpl(this._value, this._then); // ignore: unused_field final $Val _value; @@ -91,7 +92,7 @@ class _$UserCopyWithImpl<$Res, $Val extends User> id: null == id ? _value.id : id // ignore: cast_nullable_to_non_nullable - as int, + as String, name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable @@ -107,7 +108,7 @@ class _$UserCopyWithImpl<$Res, $Val extends User> dob: freezed == dob ? _value.dob : dob // ignore: cast_nullable_to_non_nullable - as String?, + as DateTime?, email: freezed == email ? _value.email : email // ignore: cast_nullable_to_non_nullable @@ -131,47 +132,49 @@ class _$UserCopyWithImpl<$Res, $Val extends User> player_role: freezed == player_role ? _value.player_role : player_role // ignore: cast_nullable_to_non_nullable - as String?, + as PlayerRole?, batting_style: freezed == batting_style ? _value.batting_style : batting_style // ignore: cast_nullable_to_non_nullable - as String?, + as BattingStyle?, bowling_style: freezed == bowling_style ? _value.bowling_style : bowling_style // ignore: cast_nullable_to_non_nullable - as String?, + as BowlingStyle?, ) as $Val); } } /// @nodoc -abstract class _$$UserImplCopyWith<$Res> implements $UserCopyWith<$Res> { - factory _$$UserImplCopyWith( - _$UserImpl value, $Res Function(_$UserImpl) then) = - __$$UserImplCopyWithImpl<$Res>; +abstract class _$$UserModelImplCopyWith<$Res> + implements $UserModelCopyWith<$Res> { + factory _$$UserModelImplCopyWith( + _$UserModelImpl value, $Res Function(_$UserModelImpl) then) = + __$$UserModelImplCopyWithImpl<$Res>; @override @useResult $Res call( - {int id, + {String id, String? name, String? location, String? phone, - String? dob, + DateTime? dob, String? email, String? profile_img_url, UserGender? gender, DateTime? created_at, DateTime? updated_at, - String? player_role, - String? batting_style, - String? bowling_style}); + PlayerRole? player_role, + BattingStyle? batting_style, + BowlingStyle? bowling_style}); } /// @nodoc -class __$$UserImplCopyWithImpl<$Res> - extends _$UserCopyWithImpl<$Res, _$UserImpl> - implements _$$UserImplCopyWith<$Res> { - __$$UserImplCopyWithImpl(_$UserImpl _value, $Res Function(_$UserImpl) _then) +class __$$UserModelImplCopyWithImpl<$Res> + extends _$UserModelCopyWithImpl<$Res, _$UserModelImpl> + implements _$$UserModelImplCopyWith<$Res> { + __$$UserModelImplCopyWithImpl( + _$UserModelImpl _value, $Res Function(_$UserModelImpl) _then) : super(_value, _then); @pragma('vm:prefer-inline') @@ -191,11 +194,11 @@ class __$$UserImplCopyWithImpl<$Res> Object? batting_style = freezed, Object? bowling_style = freezed, }) { - return _then(_$UserImpl( + return _then(_$UserModelImpl( id: null == id ? _value.id : id // ignore: cast_nullable_to_non_nullable - as int, + as String, name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable @@ -211,7 +214,7 @@ class __$$UserImplCopyWithImpl<$Res> dob: freezed == dob ? _value.dob : dob // ignore: cast_nullable_to_non_nullable - as String?, + as DateTime?, email: freezed == email ? _value.email : email // ignore: cast_nullable_to_non_nullable @@ -235,23 +238,23 @@ class __$$UserImplCopyWithImpl<$Res> player_role: freezed == player_role ? _value.player_role : player_role // ignore: cast_nullable_to_non_nullable - as String?, + as PlayerRole?, batting_style: freezed == batting_style ? _value.batting_style : batting_style // ignore: cast_nullable_to_non_nullable - as String?, + as BattingStyle?, bowling_style: freezed == bowling_style ? _value.bowling_style : bowling_style // ignore: cast_nullable_to_non_nullable - as String?, + as BowlingStyle?, )); } } /// @nodoc @JsonSerializable() -class _$UserImpl extends _User { - const _$UserImpl( +class _$UserModelImpl extends _UserModel { + const _$UserModelImpl( {required this.id, this.name, this.location, @@ -267,11 +270,11 @@ class _$UserImpl extends _User { this.bowling_style}) : super._(); - factory _$UserImpl.fromJson(Map json) => - _$$UserImplFromJson(json); + factory _$UserModelImpl.fromJson(Map json) => + _$$UserModelImplFromJson(json); @override - final int id; + final String id; @override final String? name; @override @@ -279,7 +282,7 @@ class _$UserImpl extends _User { @override final String? phone; @override - final String? dob; + final DateTime? dob; @override final String? email; @override @@ -291,22 +294,22 @@ class _$UserImpl extends _User { @override final DateTime? updated_at; @override - final String? player_role; + final PlayerRole? player_role; @override - final String? batting_style; + final BattingStyle? batting_style; @override - final String? bowling_style; + final BowlingStyle? bowling_style; @override String toString() { - return 'User(id: $id, name: $name, location: $location, phone: $phone, dob: $dob, email: $email, profile_img_url: $profile_img_url, gender: $gender, created_at: $created_at, updated_at: $updated_at, player_role: $player_role, batting_style: $batting_style, bowling_style: $bowling_style)'; + return 'UserModel(id: $id, name: $name, location: $location, phone: $phone, dob: $dob, email: $email, profile_img_url: $profile_img_url, gender: $gender, created_at: $created_at, updated_at: $updated_at, player_role: $player_role, batting_style: $batting_style, bowling_style: $bowling_style)'; } @override bool operator ==(Object other) { return identical(this, other) || (other.runtimeType == runtimeType && - other is _$UserImpl && + other is _$UserModelImpl && (identical(other.id, id) || other.id == id) && (identical(other.name, name) || other.name == name) && (identical(other.location, location) || @@ -350,38 +353,39 @@ class _$UserImpl extends _User { @JsonKey(ignore: true) @override @pragma('vm:prefer-inline') - _$$UserImplCopyWith<_$UserImpl> get copyWith => - __$$UserImplCopyWithImpl<_$UserImpl>(this, _$identity); + _$$UserModelImplCopyWith<_$UserModelImpl> get copyWith => + __$$UserModelImplCopyWithImpl<_$UserModelImpl>(this, _$identity); @override Map toJson() { - return _$$UserImplToJson( + return _$$UserModelImplToJson( this, ); } } -abstract class _User extends User { - const factory _User( - {required final int id, +abstract class _UserModel extends UserModel { + const factory _UserModel( + {required final String id, final String? name, final String? location, final String? phone, - final String? dob, + final DateTime? dob, final String? email, final String? profile_img_url, final UserGender? gender, final DateTime? created_at, final DateTime? updated_at, - final String? player_role, - final String? batting_style, - final String? bowling_style}) = _$UserImpl; - const _User._() : super._(); + final PlayerRole? player_role, + final BattingStyle? batting_style, + final BowlingStyle? bowling_style}) = _$UserModelImpl; + const _UserModel._() : super._(); - factory _User.fromJson(Map json) = _$UserImpl.fromJson; + factory _UserModel.fromJson(Map json) = + _$UserModelImpl.fromJson; @override - int get id; + String get id; @override String? get name; @override @@ -389,7 +393,7 @@ abstract class _User extends User { @override String? get phone; @override - String? get dob; + DateTime? get dob; @override String? get email; @override @@ -401,13 +405,13 @@ abstract class _User extends User { @override DateTime? get updated_at; @override - String? get player_role; + PlayerRole? get player_role; @override - String? get batting_style; + BattingStyle? get batting_style; @override - String? get bowling_style; + BowlingStyle? get bowling_style; @override @JsonKey(ignore: true) - _$$UserImplCopyWith<_$UserImpl> get copyWith => + _$$UserModelImplCopyWith<_$UserModelImpl> get copyWith => throw _privateConstructorUsedError; } diff --git a/data/lib/api/user/user_models.g.dart b/data/lib/api/user/user_models.g.dart index 8fadfad9..8bfb5963 100644 --- a/data/lib/api/user/user_models.g.dart +++ b/data/lib/api/user/user_models.g.dart @@ -6,12 +6,13 @@ part of 'user_models.dart'; // JsonSerializableGenerator // ************************************************************************** -_$UserImpl _$$UserImplFromJson(Map json) => _$UserImpl( - id: json['id'] as int, +_$UserModelImpl _$$UserModelImplFromJson(Map json) => + _$UserModelImpl( + id: json['id'] as String, name: json['name'] as String?, location: json['location'] as String?, phone: json['phone'] as String?, - dob: json['dob'] as String?, + dob: json['dob'] == null ? null : DateTime.parse(json['dob'] as String), email: json['email'] as String?, profile_img_url: json['profile_img_url'] as String?, gender: $enumDecodeNullable(_$UserGenderEnumMap, json['gender']), @@ -21,30 +22,63 @@ _$UserImpl _$$UserImplFromJson(Map json) => _$UserImpl( updated_at: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), - player_role: json['player_role'] as String?, - batting_style: json['batting_style'] as String?, - bowling_style: json['bowling_style'] as String?, + player_role: + $enumDecodeNullable(_$PlayerRoleEnumMap, json['player_role']), + batting_style: + $enumDecodeNullable(_$BattingStyleEnumMap, json['batting_style']), + bowling_style: + $enumDecodeNullable(_$BowlingStyleEnumMap, json['bowling_style']), ); -Map _$$UserImplToJson(_$UserImpl instance) => +Map _$$UserModelImplToJson(_$UserModelImpl instance) => { 'id': instance.id, 'name': instance.name, 'location': instance.location, 'phone': instance.phone, - 'dob': instance.dob, + 'dob': instance.dob?.toIso8601String(), 'email': instance.email, 'profile_img_url': instance.profile_img_url, 'gender': _$UserGenderEnumMap[instance.gender], 'created_at': instance.created_at?.toIso8601String(), 'updated_at': instance.updated_at?.toIso8601String(), - 'player_role': instance.player_role, - 'batting_style': instance.batting_style, - 'bowling_style': instance.bowling_style, + 'player_role': _$PlayerRoleEnumMap[instance.player_role], + 'batting_style': _$BattingStyleEnumMap[instance.batting_style], + 'bowling_style': _$BowlingStyleEnumMap[instance.bowling_style], }; const _$UserGenderEnumMap = { UserGender.unknown: 0, UserGender.male: 1, UserGender.female: 2, + UserGender.other: 3, +}; + +const _$PlayerRoleEnumMap = { + PlayerRole.topOrderBatter: 1, + PlayerRole.middleOrderBatter: 2, + PlayerRole.wickerKeeperBatter: 3, + PlayerRole.wicketKeeper: 4, + PlayerRole.bowler: 5, + PlayerRole.allRounder: 6, + PlayerRole.lowerOrderBatter: 7, + PlayerRole.openingBatter: 8, + PlayerRole.none: 9, +}; + +const _$BattingStyleEnumMap = { + BattingStyle.rightHandBat: 1, + BattingStyle.leftHandBat: 2, +}; + +const _$BowlingStyleEnumMap = { + BowlingStyle.rightArmFast: 0, + BowlingStyle.rightArmMedium: 1, + BowlingStyle.leftArmFast: 2, + BowlingStyle.leftArmMedium: 3, + BowlingStyle.slowLeftArmOrthodox: 4, + BowlingStyle.slowLeftArmChinaMan: 5, + BowlingStyle.rightArmOffBreak: 6, + BowlingStyle.rightArmLegBreak: 7, + BowlingStyle.none: 8, }; diff --git a/data/lib/service/auth/auth_service.dart b/data/lib/service/auth/auth_service.dart new file mode 100644 index 00000000..83c04f2c --- /dev/null +++ b/data/lib/service/auth/auth_service.dart @@ -0,0 +1,69 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +final authServiceProvider = Provider((ref) { + return AuthService(FirebaseAuth.instance); +}); + +class AuthService { + final FirebaseAuth _auth; + + AuthService(this._auth); + + Stream get user => _auth.authStateChanges(); + + // Future signInWithPhoneNumber( + // String verificationId, String smsCode) async { + // AuthCredential credential = PhoneAuthProvider.credential( + // verificationId: verificationId, + // smsCode: smsCode, + // ); + // await _auth.signInWithCredential(credential); + // // Update user details in Fire-store after successful sign-in + // // await _updateUserData(); + // } + // + // Future signUpWithPhoneNumber( + // String verificationId, String smsCode, String additionalDetails) async { + // AuthCredential credential = PhoneAuthProvider.credential( + // verificationId: verificationId, + // smsCode: smsCode, + // ); + // await _auth.signInWithCredential(credential); + // // Update user details in Fire-store after successful sign-up + // // await _updateUserData(additionalDetails); + // } + + Future verifyPhoneNumber({ + required String phoneNumber, + Function(String, int?)? onCodeSent, + Function(PhoneAuthCredential)? onVerificationCompleted, + Function(FirebaseAuthException)? onVerificationFailed, + Function(String)? onCodeAutoRetrievalTimeout, + }) async { + await _auth.verifyPhoneNumber( + phoneNumber: phoneNumber, + verificationCompleted: (PhoneAuthCredential credential) async { + // Automatically sign in the user if verification is successful + await _auth.signInWithCredential(credential); + // whole process here and then call + onVerificationCompleted != null + ? onVerificationCompleted(credential) + : null; + }, + verificationFailed: (FirebaseAuthException e) => + onVerificationFailed != null ? onVerificationFailed(e) : null, + codeSent: (String verificationId, int? resendToken) => + onCodeSent != null ? onCodeSent(verificationId, resendToken) : null, + codeAutoRetrievalTimeout: (verificationId) => + onCodeAutoRetrievalTimeout != null + ? onCodeAutoRetrievalTimeout(verificationId) + : null, + ); + } + + Future signOut() async { + await _auth.signOut(); + // make user null here + } +} diff --git a/data/lib/service/file_upload/file_upload_service.dart b/data/lib/service/file_upload/file_upload_service.dart new file mode 100644 index 00000000..760b9cd7 --- /dev/null +++ b/data/lib/service/file_upload/file_upload_service.dart @@ -0,0 +1,37 @@ +import 'dart:io'; + +import 'package:firebase_storage/firebase_storage.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:path/path.dart' as path; + +final fileUploadServiceProvider = Provider( + (ref) => FileUploadService(FirebaseStorage.instance), +); + +class FileUploadService { + final FirebaseStorage _firebaseStorage; + + FileUploadService(this._firebaseStorage); + + Future uploadProfileImage(String imagePath) async { + var file = File(imagePath); + if (await file.exists()) { + String fileExtension = path.extension(file.path); + DateTime currentDate = DateTime.now(); + String imgName = + "IMG_${currentDate.year}${currentDate.month}${currentDate.day}${currentDate.hour}${currentDate.minute}${currentDate.second}${currentDate.millisecond}$fileExtension"; + var snapshot = await _firebaseStorage + .ref() + .child('UserProfileImages/$imgName') + .putFile(file); // TODO: resolve rules of firebase storage and fireStore + var downloadUrl = await snapshot.ref.getDownloadURL(); + return downloadUrl; + } else { + throw Exception("UploadProfileImage: file doesn't exist"); + } + } + + Future deleteUploadedProfileImage(String imgUrl) async { + await _firebaseStorage.refFromURL(imgUrl).delete(); + } +} diff --git a/data/lib/service/user/user_service.dart b/data/lib/service/user/user_service.dart index 41fef06e..0af93d6c 100644 --- a/data/lib/service/user/user_service.dart +++ b/data/lib/service/user/user_service.dart @@ -1,22 +1,53 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../api/user/user_models.dart'; import '../../storage/app_preferences.dart'; final userServiceProvider = Provider((ref) { - final service = UserService(); + final service = UserService(ref.read(currentUserPod), + ref.read(currentUserJsonPod.notifier), FirebaseFirestore.instance); + ref.listen(currentUserPod, (_, next) => service.currentUser = next); return service; }); class UserService { - User? currentUser; -/* -// caller function here - func callerFunctionCalledFromNotifier(){ - var response = await funcThatInternallyDoTheseStuff(); - parse the response - return the response - } -*/ -} \ No newline at end of file + UserModel? currentUser; + final StateController currentUserJsonController; + final FirebaseFirestore _firestore; + final String collectionName = 'users'; + + UserService( + this.currentUser, this.currentUserJsonController, this._firestore); + + Future addUser(UserModel user) async { + await _firestore.collection(collectionName).add(user.toJson()); + } + + Future deleteUser() async { + await _firestore.collection(collectionName).doc(currentUser?.id).delete(); + currentUserJsonController.state = null; + } + + Future updateUser(UserModel user) async { + DocumentReference userRef = + _firestore.collection(collectionName).doc(user.id); + + await userRef.set(user.toJson(), SetOptions(merge: true)); + + currentUserJsonController.state = user.toJsonString(); + } + + Future getUser(String id) async { + DocumentReference userRef = _firestore.collection(collectionName).doc(id); + DocumentSnapshot snapshot = await userRef.get(); + Map userData = snapshot.data() as Map; + var tempUser = UserModel.fromJson(userData); + currentUserJsonController.state = tempUser.toJsonString(); + } + + void signOutUser() { + currentUserJsonController.state = null; + } +} diff --git a/data/lib/storage/app_preferences.dart b/data/lib/storage/app_preferences.dart index 878f64a9..b4b5a78c 100644 --- a/data/lib/storage/app_preferences.dart +++ b/data/lib/storage/app_preferences.dart @@ -8,9 +8,9 @@ final currentUserJsonPod = createPrefProvider( defaultValue: null, ); -final currentUserPod = Provider((ref) { +final currentUserPod = Provider((ref) { final json = ref.watch(currentUserJsonPod); - return json == null ? null : User.fromJsonString(json); + return json == null ? null : UserModel.fromJsonString(json); }); final hasUserSession = Provider((ref) => ref.watch(currentUserPod) != null); diff --git a/data/pubspec.yaml b/data/pubspec.yaml index 8a874d60..f3a10a9a 100644 --- a/data/pubspec.yaml +++ b/data/pubspec.yaml @@ -13,6 +13,14 @@ dependencies: shared_preferences: ^2.0.18 + # storage + firebase_storage: ^11.6.0 + cloud_firestore: ^4.14.0 + + # auth + firebase_core: ^2.24.2 + firebase_auth: ^4.16.0 + # io dio: ^5.0.2 json_annotation: ^4.8.1 @@ -23,10 +31,11 @@ dependencies: device_info_plus: ^9.1.1 package_info_plus: ^5.0.1 flutter_timezone: ^1.0.8 + path: ^1.8.3 # state management - flutter_riverpod: ^2.3.1 - hooks_riverpod: ^2.3.1 + flutter_riverpod: ^2.4.9 + hooks_riverpod: ^2.4.9 dev_dependencies: flutter_test: diff --git a/khelo/android/app/build.gradle b/khelo/android/app/build.gradle index 9e415127..3fc7abe3 100644 --- a/khelo/android/app/build.gradle +++ b/khelo/android/app/build.gradle @@ -49,6 +49,7 @@ android { targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName + multiDexEnabled true } buildTypes { diff --git a/khelo/assets/images/ic_camera.png b/khelo/assets/images/ic_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..c82fffb06cf43aa79a23902939179f457c4d007c GIT binary patch literal 72691 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

*z>8q2cH?ctA%J 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 2.30908.0) - device_info_plus (0.0.1): - Flutter - Firebase/Auth (10.18.0): @@ -6,6 +646,12 @@ PODS: - FirebaseAuth (~> 10.18.0) - Firebase/CoreOnly (10.18.0): - FirebaseCore (= 10.18.0) + - Firebase/Firestore (10.18.0): + - Firebase/CoreOnly + - FirebaseFirestore (~> 10.18.0) + - Firebase/Storage (10.18.0): + - Firebase/CoreOnly + - FirebaseStorage (~> 10.18.0) - firebase_auth (4.16.0): - Firebase/Auth (= 10.18.0) - firebase_core @@ -13,6 +659,10 @@ PODS: - firebase_core (2.24.2): - Firebase/CoreOnly (= 10.18.0) - Flutter + - firebase_storage (11.6.0): + - Firebase/Storage (= 10.18.0) + - firebase_core + - Flutter - FirebaseAppCheckInterop (10.19.0) - FirebaseAuth (10.18.0): - FirebaseAppCheckInterop (~> 10.17) @@ -21,15 +671,47 @@ PODS: - GoogleUtilities/Environment (~> 7.8) - GTMSessionFetcher/Core (< 4.0, >= 2.1) - RecaptchaInterop (~> 100.0) + - FirebaseAuthInterop (10.19.0) - FirebaseCore (10.18.0): - FirebaseCoreInternal (~> 10.0) - GoogleUtilities/Environment (~> 7.12) - GoogleUtilities/Logger (~> 7.12) + - FirebaseCoreExtension (10.19.0): + - FirebaseCore (~> 10.0) - FirebaseCoreInternal (10.19.0): - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseFirestore (10.18.0): + - FirebaseCore (~> 10.0) + - FirebaseCoreExtension (~> 10.0) + - FirebaseFirestoreInternal (~> 10.17) + - FirebaseSharedSwift (~> 10.0) + - FirebaseFirestoreInternal (10.19.0): + - abseil/algorithm (~> 1.20220623.0) + - abseil/base (~> 1.20220623.0) + - abseil/container/flat_hash_map (~> 1.20220623.0) + - abseil/memory (~> 1.20220623.0) + - abseil/meta (~> 1.20220623.0) + - abseil/strings/strings (~> 1.20220623.0) + - abseil/time (~> 1.20220623.0) + - abseil/types (~> 1.20220623.0) + - FirebaseAppCheckInterop (~> 10.17) + - FirebaseCore (~> 10.0) + - "gRPC-C++ (~> 1.49.1)" + - leveldb-library (~> 1.22) + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseSharedSwift (10.19.0) + - FirebaseStorage (10.18.0): + - FirebaseAppCheckInterop (~> 10.0) + - FirebaseAuthInterop (~> 10.0) + - FirebaseCore (~> 10.0) + - FirebaseCoreExtension (~> 10.0) + - GTMSessionFetcher/Core (< 4.0, >= 2.1) - Flutter (1.0.0) - flutter_timezone (0.0.1): - Flutter + - FMDB (2.7.5): + - FMDB/standard (= 2.7.5) + - FMDB/standard (2.7.5) - GoogleUtilities/AppDelegateSwizzler (7.12.0): - GoogleUtilities/Environment - GoogleUtilities/Logger @@ -45,69 +727,200 @@ PODS: - "GoogleUtilities/NSData+zlib (7.12.0)" - GoogleUtilities/Reachability (7.12.0): - GoogleUtilities/Logger + - "gRPC-C++ (1.49.1)": + - "gRPC-C++/Implementation (= 1.49.1)" + - "gRPC-C++/Interface (= 1.49.1)" + - "gRPC-C++/Implementation (1.49.1)": + - abseil/base/base (= 1.20220623.0) + - abseil/base/core_headers (= 1.20220623.0) + - abseil/cleanup/cleanup (= 1.20220623.0) + - abseil/container/flat_hash_map (= 1.20220623.0) + - abseil/container/flat_hash_set (= 1.20220623.0) + - abseil/container/inlined_vector (= 1.20220623.0) + - abseil/functional/any_invocable (= 1.20220623.0) + - abseil/functional/bind_front (= 1.20220623.0) + - abseil/functional/function_ref (= 1.20220623.0) + - abseil/hash/hash (= 1.20220623.0) + - abseil/memory/memory (= 1.20220623.0) + - abseil/meta/type_traits (= 1.20220623.0) + - abseil/random/random (= 1.20220623.0) + - abseil/status/status (= 1.20220623.0) + - abseil/status/statusor (= 1.20220623.0) + - abseil/strings/cord (= 1.20220623.0) + - abseil/strings/str_format (= 1.20220623.0) + - abseil/strings/strings (= 1.20220623.0) + - abseil/synchronization/synchronization (= 1.20220623.0) + - abseil/time/time (= 1.20220623.0) + - abseil/types/optional (= 1.20220623.0) + - abseil/types/span (= 1.20220623.0) + - abseil/types/variant (= 1.20220623.0) + - abseil/utility/utility (= 1.20220623.0) + - "gRPC-C++/Interface (= 1.49.1)" + - gRPC-Core (= 1.49.1) + - "gRPC-C++/Interface (1.49.1)" + - gRPC-Core (1.49.1): + - gRPC-Core/Implementation (= 1.49.1) + - gRPC-Core/Interface (= 1.49.1) + - gRPC-Core/Implementation (1.49.1): + - abseil/base/base (= 1.20220623.0) + - abseil/base/core_headers (= 1.20220623.0) + - abseil/container/flat_hash_map (= 1.20220623.0) + - abseil/container/flat_hash_set (= 1.20220623.0) + - abseil/container/inlined_vector (= 1.20220623.0) + - abseil/functional/any_invocable (= 1.20220623.0) + - abseil/functional/bind_front (= 1.20220623.0) + - abseil/functional/function_ref (= 1.20220623.0) + - abseil/hash/hash (= 1.20220623.0) + - abseil/memory/memory (= 1.20220623.0) + - abseil/meta/type_traits (= 1.20220623.0) + - abseil/random/random (= 1.20220623.0) + - abseil/status/status (= 1.20220623.0) + - abseil/status/statusor (= 1.20220623.0) + - abseil/strings/cord (= 1.20220623.0) + - abseil/strings/str_format (= 1.20220623.0) + - abseil/strings/strings (= 1.20220623.0) + - abseil/synchronization/synchronization (= 1.20220623.0) + - abseil/time/time (= 1.20220623.0) + - abseil/types/optional (= 1.20220623.0) + - abseil/types/span (= 1.20220623.0) + - abseil/types/variant (= 1.20220623.0) + - abseil/utility/utility (= 1.20220623.0) + - BoringSSL-GRPC (= 0.0.24) + - gRPC-Core/Interface (= 1.49.1) + - gRPC-Core/Interface (1.49.1) - GTMSessionFetcher/Core (3.2.0) + - image_cropper (0.0.4): + - Flutter + - TOCropViewController (~> 2.6.1) + - image_picker_ios (0.0.1): + - Flutter + - leveldb-library (1.22.2) + - nanopb (2.30909.1): + - nanopb/decode (= 2.30909.1) + - nanopb/encode (= 2.30909.1) + - nanopb/decode (2.30909.1) + - nanopb/encode (2.30909.1) - package_info_plus (0.4.5): - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS - PromisesObjC (2.3.1) - RecaptchaInterop (100.0.0) - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS + - sqflite (0.0.3): + - Flutter + - FMDB (>= 2.7.5) + - TOCropViewController (2.6.1) DEPENDENCIES: + - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_storage (from `.symlinks/plugins/firebase_storage/ios`) - Flutter (from `Flutter`) - flutter_timezone (from `.symlinks/plugins/flutter_timezone/ios`) + - image_cropper (from `.symlinks/plugins/image_cropper/ios`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + - sqflite (from `.symlinks/plugins/sqflite/ios`) SPEC REPOS: trunk: + - abseil + - BoringSSL-GRPC - Firebase - FirebaseAppCheckInterop - FirebaseAuth + - FirebaseAuthInterop - FirebaseCore + - FirebaseCoreExtension - FirebaseCoreInternal + - FirebaseFirestore + - FirebaseFirestoreInternal + - FirebaseSharedSwift + - FirebaseStorage + - FMDB - GoogleUtilities + - "gRPC-C++" + - gRPC-Core - GTMSessionFetcher + - leveldb-library + - nanopb - PromisesObjC - RecaptchaInterop + - TOCropViewController EXTERNAL SOURCES: + cloud_firestore: + :path: ".symlinks/plugins/cloud_firestore/ios" device_info_plus: :path: ".symlinks/plugins/device_info_plus/ios" firebase_auth: :path: ".symlinks/plugins/firebase_auth/ios" firebase_core: :path: ".symlinks/plugins/firebase_core/ios" + firebase_storage: + :path: ".symlinks/plugins/firebase_storage/ios" Flutter: :path: Flutter flutter_timezone: :path: ".symlinks/plugins/flutter_timezone/ios" + image_cropper: + :path: ".symlinks/plugins/image_cropper/ios" + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" package_info_plus: :path: ".symlinks/plugins/package_info_plus/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + sqflite: + :path: ".symlinks/plugins/sqflite/ios" SPEC CHECKSUMS: + abseil: 926fb7a82dc6d2b8e1f2ed7f3a718bce691d1e46 + BoringSSL-GRPC: 3175b25143e648463a56daeaaa499c6cb86dad33 + cloud_firestore: 73eece22ce25a0565238c283ee9990f1618d8063 device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 Firebase: 414ad272f8d02dfbf12662a9d43f4bba9bec2a06 firebase_auth: 8e9ec02991ca4659111cc671c84d0c010b6bfb26 firebase_core: 0af4a2b24f62071f9bf283691c0ee41556dcb3f5 + firebase_storage: 2b932fa5461f4efac36a2dcfbe240898b190b5b1 FirebaseAppCheckInterop: 37884781f3e16a1ba47e7ec80a1e805f987788e3 FirebaseAuth: 12314b438fa76048540c8fb86d6cfc9e08595176 + FirebaseAuthInterop: f90d6820bf6ecf44753b9f13ba941902d00b525a FirebaseCore: 2322423314d92f946219c8791674d2f3345b598f + FirebaseCoreExtension: c08d14c7b22e07994e876d837e6f58642f340087 FirebaseCoreInternal: b444828ea7cfd594fca83046b95db98a2be4f290 + FirebaseFirestore: 171bcbb57a1a348dd171a0d5e382c03ef85a77bb + FirebaseFirestoreInternal: a15405fb607dfd14edd568bba77028f4c7a69688 + FirebaseSharedSwift: f34eeb7d3ea87a34497629b6ca41657beadef76a + FirebaseStorage: 8333c4b183764cdd170d9539a61322b71c23adff Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 flutter_timezone: ffb07bdad3c6276af8dada0f11978d8a1f8a20bb + FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 + "gRPC-C++": 2df8cba576898bdacd29f0266d5236fa0e26ba6a + gRPC-Core: a21a60aefc08c68c247b439a9ef97174b0c54f96 GTMSessionFetcher: 41b9ef0b4c08a6db4b7eb51a21ae5183ec99a2c8 + image_cropper: a3291c624a953049bc6a02e1f8c8ceb162a24b25 + image_picker_ios: 99dfe1854b4fa34d0364e74a78448a0151025425 + leveldb-library: f03246171cce0484482ec291f88b6d563699ee06 + nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 + path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21 shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 + sqflite: 50a33e1d72bd59ee092a519a35d107502757ebed + TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863 PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796 diff --git a/khelo/ios/Runner/Info.plist b/khelo/ios/Runner/Info.plist index 3499970e..c3c997bd 100644 --- a/khelo/ios/Runner/Info.plist +++ b/khelo/ios/Runner/Info.plist @@ -56,5 +56,9 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + NSCameraUsageDescription + Capture a new profile image using your device's camera for a personalized and up-to-date appearance. + NSPhotoLibraryUsageDescription + Select a profile image from your device's gallery to showcase your preferred photo in moments of your choice. diff --git a/khelo/lib/components/app_page.dart b/khelo/lib/components/app_page.dart index 09212975..508720be 100644 --- a/khelo/lib/components/app_page.dart +++ b/khelo/lib/components/app_page.dart @@ -33,7 +33,8 @@ class AppPage extends StatelessWidget { } } - Widget _cupertino(BuildContext context) => CupertinoPageScaffold( + Widget _cupertino(BuildContext context) => + CupertinoPageScaffold( navigationBar: (title == null && titleWidget == null) && actions == null && leading == null diff --git a/khelo/lib/domain/extensions/string_extensions.dart b/khelo/lib/domain/extensions/string_extensions.dart new file mode 100644 index 00000000..3574dfa3 --- /dev/null +++ b/khelo/lib/domain/extensions/string_extensions.dart @@ -0,0 +1,8 @@ +extension EmailValidator on String { + bool isValidEmail() { + // TODO: wrong result in case of 'special!chars@email.com' + return RegExp( + r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$') + .hasMatch(this); + } +} diff --git a/khelo/lib/main.dart b/khelo/lib/main.dart index c8bc697f..8bfdd17e 100644 --- a/khelo/lib/main.dart +++ b/khelo/lib/main.dart @@ -1,15 +1,29 @@ +import 'package:data/storage/provider/preferences_provider.dart'; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:khelo/ui/app.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'firebase_options.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); + final container = await _initContainer(); + runApp(UncontrolledProviderScope(container: container, child: const App())); +} + +Future _initContainer() async { await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); - runApp(const ProviderScope(child: App())); -} \ No newline at end of file + final prefs = await SharedPreferences.getInstance(); + + final container = ProviderContainer( + overrides: [ + sharedPreferencesProvider.overrideWithValue(prefs), + ], + ); + return container; +} diff --git a/khelo/lib/ui/app.dart b/khelo/lib/ui/app.dart index 1d162cf6..4c4de1eb 100644 --- a/khelo/lib/ui/app.dart +++ b/khelo/lib/ui/app.dart @@ -26,7 +26,7 @@ class _AppState extends ConsumerState { super.initState(); final AppRoute initialRoute; - initialRoute = AppRoute.main; + initialRoute = AppRoute.intro; // if (ref.read(hasUserSession)) { // initialRoute = AppRoute.main; // } else { diff --git a/khelo/lib/ui/app_route.dart b/khelo/lib/ui/app_route.dart index f7b1a2a9..e4acb288 100644 --- a/khelo/lib/ui/app_route.dart +++ b/khelo/lib/ui/app_route.dart @@ -104,8 +104,8 @@ class AppRoute { verificationId: verificationId, )); - static AppRoute get editProfile => - AppRoute(pathEditProfile, builder: (_) => const EditProfileScreen()); + static AppRoute editProfile({bool isToCreateAccount = false}) => + AppRoute(pathEditProfile, builder: (_) => EditProfileScreen(isToCreateAccount: isToCreateAccount)); static final routes = [ GoRoute( @@ -122,13 +122,17 @@ class AppRoute { : state.widget(context); }, ), - phoneLogin.goRoute(), GoRoute( - path: pathPhoneNumberVerification, - builder: (context, state) => state.widget(context), + path: pathEditProfile, + builder: (context, state) { + return state.extra == null + ? EditProfileScreen(isToCreateAccount: true,) + : state.widget(context); + }, ), + phoneLogin.goRoute(), GoRoute( - path: pathEditProfile, + path: pathPhoneNumberVerification, builder: (context, state) => state.widget(context), ), ]; diff --git a/khelo/lib/ui/flow/intro/intro_screen.dart b/khelo/lib/ui/flow/intro/intro_screen.dart index 4c82a240..5a43e112 100644 --- a/khelo/lib/ui/flow/intro/intro_screen.dart +++ b/khelo/lib/ui/flow/intro/intro_screen.dart @@ -49,8 +49,8 @@ class _IntroScreenState extends ConsumerState { ), PrimaryButton( context.l10n.intro_sign_in_btn_text, - onPressed: () { - AppRoute.phoneLogin.push(context); + onPressed: () async { + await AppRoute.phoneLogin.push(context); }, ), ], diff --git a/khelo/lib/ui/flow/profile/profile_screen.dart b/khelo/lib/ui/flow/profile/profile_screen.dart index a612997d..4c7edab9 100644 --- a/khelo/lib/ui/flow/profile/profile_screen.dart +++ b/khelo/lib/ui/flow/profile/profile_screen.dart @@ -1,29 +1,196 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:data/api/user/user_models.dart'; +import 'package:data/storage/app_preferences.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; import 'package:khelo/components/app_page.dart'; import 'package:khelo/domain/extensions/context_extensions.dart'; import 'package:khelo/ui/app_route.dart'; +import 'package:khelo/ui/flow/profile/profile_view_model.dart'; +import 'package:style/animations/on_tap_scale.dart'; +import 'package:style/button/primary_button.dart'; +import 'package:style/extensions/context_extensions.dart'; +import 'package:style/text/app_text_style.dart'; -class ProfileScreen extends StatefulWidget { +class ProfileScreen extends ConsumerWidget { const ProfileScreen({super.key}); - @override - State createState() => _ProfileScreenState(); -} + _observeUserSession(BuildContext context, WidgetRef ref) { + ref.listen(hasUserSession, (previous, next) { + if (!next) { + AppRoute.intro.go(context); + } + }); + } -class _ProfileScreenState extends State { @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { + final notifier = ref.watch(profileStateProvider.notifier); + final state = ref.watch(profileStateProvider); + + _observeUserSession(context, ref); return AppPage( title: context.l10n.tab_profile_title, + actions: [ + TextButton( + onPressed: () { + _showSignOutAlert(context, () { + notifier.onSignOutTap(); + }); + }, + child: Text( + context.l10n.common_sign_out_title, + style: AppTextStyle.button + .copyWith(color: context.colorScheme.primary), + )) + ], body: Builder( builder: (context) { - return Center( - child: TextButton(onPressed: () { - AppRoute.editProfile.push(context); - }, child: const Text("go to profile >>")), + return ListView( + padding: context.mediaQueryPadding + + const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + children: [ + _userProfileView(context, state), + if (state.currentUser != null) ...[ + const SizedBox( + height: 24, + ), + _inCompleteProfileView(context, state.currentUser!) + ], + // const SizedBox( + // height: 24, + // ), + // Text(context.l10n.edit_profile_sign_out_title, style: AppTextStyle.header2.copyWith(color: context.colorScheme.textSecondary),) + ], ); }, ), ); } + + Widget _userProfileView(BuildContext context, ProfileState state) { + return OnTapScale( + onTap: () => AppRoute.editProfile().push(context), + child: Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + border: Border.all(color: context.colorScheme.containerHigh), + borderRadius: BorderRadius.circular(12)), + child: Row( + children: [ + Container( + height: 90, + width: 90, + alignment: Alignment.center, + decoration: BoxDecoration( + color: context.colorScheme.containerLow, + shape: BoxShape.circle, + // image: state.currentUser?.profile_img_url != null + // ? DecorationImage( + // image: CachedNetworkImageProvider( + // state.currentUser!.profile_img_url!), + // fit: BoxFit.cover) + // : null, + image: state.currentUser?.profile_img_url != null + ? DecorationImage( + image: CachedNetworkImageProvider( + state.currentUser!.profile_img_url!), + fit: BoxFit.cover) + : null, + border: Border.all(color: context.colorScheme.containerHigh)), + child: state.currentUser?.profile_img_url == null + ? Text(state.currentUser?.nameInitial ?? '?', + style: AppTextStyle.header1.copyWith( + color: context.colorScheme.secondary, fontSize: 40)) + : null, + ), + const SizedBox( + width: 16, + ), + Expanded( + child: Text( + state.currentUser?.name ?? context.l10n.common_anonymous_title, + style: AppTextStyle.header3 + .copyWith(color: context.colorScheme.textPrimary), + ), + ) + ], + ), + ), + ); + } + + Widget _inCompleteProfileView(BuildContext context, UserModel currentUser) { + if (currentUser.profile_img_url == null || + currentUser.batting_style == null || + currentUser.bowling_style == null) { + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + border: Border.all(color: context.colorScheme.containerHigh), + borderRadius: BorderRadius.circular(12)), + child: Column( + children: [ + Text( + context.l10n.profile_complete_your_profile_title, + style: AppTextStyle.header1 + .copyWith(color: context.colorScheme.textPrimary), + ), + const SizedBox( + height: 8, + ), + Text( + context.l10n.profile_complete_profile_description_title, + style: AppTextStyle.subtitle1 + .copyWith(color: context.colorScheme.textSecondary), + textAlign: TextAlign.center, + ), + const SizedBox( + height: 24, + ), + PrimaryButton( + onPressed: () => AppRoute.editProfile().push(context), + context.l10n.profile_complete_profile_btn_title) + ], + ), + ); + } else { + return const SizedBox(); + } + } + + void _showSignOutAlert(BuildContext context, Function() onSignOut) { + showAdaptiveDialog( + context: context, + builder: (context) { + return AlertDialog.adaptive( + title: Text(context.l10n.common_sign_out_title), + content: Text(context.l10n.alert_confirm_default_message( + context.l10n.common_sign_out_title.toLowerCase())), + actions: [ + TextButton( + onPressed: () { + context.pop(); + }, + child: Text( + context.l10n.common_cancel_title, + style: TextStyle(color: context.colorScheme.textSecondary), + ), + ), + TextButton( + onPressed: () { + context.pop(); + onSignOut(); + }, + child: Text( + context.l10n.common_sign_out_title, + style: TextStyle(color: context.colorScheme.alert), + ), + ), + ], + ); + }, + ); + } } diff --git a/khelo/lib/ui/flow/profile/profile_view_model.dart b/khelo/lib/ui/flow/profile/profile_view_model.dart new file mode 100644 index 00000000..285a725c --- /dev/null +++ b/khelo/lib/ui/flow/profile/profile_view_model.dart @@ -0,0 +1,48 @@ +import 'package:data/api/user/user_models.dart'; +import 'package:data/service/user/user_service.dart'; +import 'package:data/storage/app_preferences.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'profile_view_model.freezed.dart'; + +final profileStateProvider = + StateNotifierProvider.autoDispose((ref) { + final notifier = ProfileViewNotifier( + FirebaseAuth.instance, + ref.read(userServiceProvider), + ref.read(currentUserPod), + ); + ref.listen(currentUserPod, (_, next) => notifier._updateUser(next)); + return notifier; +}); + +class ProfileViewNotifier extends StateNotifier { + final FirebaseAuth _auth; + final UserService _userService; + + ProfileViewNotifier(this._auth, this._userService, UserModel? user) + : super(ProfileState(currentUser: user)); + + void _updateUser(UserModel? user) { + state = state.copyWith(currentUser: user); + } + + void onSignOutTap() { + // signOut from firebase auth + try { + _auth.signOut(); + _userService.signOutUser(); + // clear preference and show intro + } catch (e) { + debugPrint("ProfileViewNotifier: error while sign Out -> $e"); + } + } +} + +@freezed +class ProfileState with _$ProfileState { + const factory ProfileState({UserModel? currentUser}) = _ProfileState; +} diff --git a/khelo/lib/ui/flow/profile/profile_view_model.freezed.dart b/khelo/lib/ui/flow/profile/profile_view_model.freezed.dart new file mode 100644 index 00000000..ce5d8c81 --- /dev/null +++ b/khelo/lib/ui/flow/profile/profile_view_model.freezed.dart @@ -0,0 +1,151 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'profile_view_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +mixin _$ProfileState { + UserModel? get currentUser => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $ProfileStateCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ProfileStateCopyWith<$Res> { + factory $ProfileStateCopyWith( + ProfileState value, $Res Function(ProfileState) then) = + _$ProfileStateCopyWithImpl<$Res, ProfileState>; + @useResult + $Res call({UserModel? currentUser}); + + $UserModelCopyWith<$Res>? get currentUser; +} + +/// @nodoc +class _$ProfileStateCopyWithImpl<$Res, $Val extends ProfileState> + implements $ProfileStateCopyWith<$Res> { + _$ProfileStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? currentUser = freezed, + }) { + return _then(_value.copyWith( + currentUser: freezed == currentUser + ? _value.currentUser + : currentUser // ignore: cast_nullable_to_non_nullable + as UserModel?, + ) as $Val); + } + + @override + @pragma('vm:prefer-inline') + $UserModelCopyWith<$Res>? get currentUser { + if (_value.currentUser == null) { + return null; + } + + return $UserModelCopyWith<$Res>(_value.currentUser!, (value) { + return _then(_value.copyWith(currentUser: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$ProfileStateImplCopyWith<$Res> + implements $ProfileStateCopyWith<$Res> { + factory _$$ProfileStateImplCopyWith( + _$ProfileStateImpl value, $Res Function(_$ProfileStateImpl) then) = + __$$ProfileStateImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({UserModel? currentUser}); + + @override + $UserModelCopyWith<$Res>? get currentUser; +} + +/// @nodoc +class __$$ProfileStateImplCopyWithImpl<$Res> + extends _$ProfileStateCopyWithImpl<$Res, _$ProfileStateImpl> + implements _$$ProfileStateImplCopyWith<$Res> { + __$$ProfileStateImplCopyWithImpl( + _$ProfileStateImpl _value, $Res Function(_$ProfileStateImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? currentUser = freezed, + }) { + return _then(_$ProfileStateImpl( + currentUser: freezed == currentUser + ? _value.currentUser + : currentUser // ignore: cast_nullable_to_non_nullable + as UserModel?, + )); + } +} + +/// @nodoc + +class _$ProfileStateImpl implements _ProfileState { + const _$ProfileStateImpl({this.currentUser}); + + @override + final UserModel? currentUser; + + @override + String toString() { + return 'ProfileState(currentUser: $currentUser)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ProfileStateImpl && + (identical(other.currentUser, currentUser) || + other.currentUser == currentUser)); + } + + @override + int get hashCode => Object.hash(runtimeType, currentUser); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ProfileStateImplCopyWith<_$ProfileStateImpl> get copyWith => + __$$ProfileStateImplCopyWithImpl<_$ProfileStateImpl>(this, _$identity); +} + +abstract class _ProfileState implements ProfileState { + const factory _ProfileState({final UserModel? currentUser}) = + _$ProfileStateImpl; + + @override + UserModel? get currentUser; + @override + @JsonKey(ignore: true) + _$$ProfileStateImplCopyWith<_$ProfileStateImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/khelo/lib/ui/flow/settings/profile/edit_profile_screen.dart b/khelo/lib/ui/flow/settings/profile/edit_profile_screen.dart index 529d4643..3c3f89dd 100644 --- a/khelo/lib/ui/flow/settings/profile/edit_profile_screen.dart +++ b/khelo/lib/ui/flow/settings/profile/edit_profile_screen.dart @@ -1,44 +1,542 @@ -import 'package:flutter/cupertino.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:data/api/user/user_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:intl/intl.dart'; import 'package:khelo/components/app_page.dart'; import 'package:khelo/domain/extensions/context_extensions.dart'; +import 'package:khelo/ui/app_route.dart'; +import 'package:khelo/ui/flow/settings/profile/edit_profile_view_model.dart'; +import 'package:style/animations/on_tap_scale.dart'; +import 'package:style/button/primary_button.dart'; import 'package:style/extensions/context_extensions.dart'; +import 'package:style/text/app_text_style.dart'; class EditProfileScreen extends ConsumerWidget { - const EditProfileScreen({super.key}); + final bool isToCreateAccount; + + EditProfileScreen({super.key, required this.isToCreateAccount}); + + final double profileViewHeight = 130; + final ImagePicker _picker = ImagePicker(); + + _observeIsSaved(BuildContext context, WidgetRef ref) { + ref.listen(editProfileStateProfile.select((state) => state.isSaved), + (previous, next) { + if (next) { + if (isToCreateAccount) { + AppRoute.main.go(context); + } else { + context.pop(); + } + } + }); + } @override Widget build(BuildContext context, WidgetRef ref) { - return AppPage( - title: context.l10n.edit_profile_screen_title, - body: Builder( - builder: (context) { - return ListView( - padding: context.mediaQueryPadding + - const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0), - - children: const [ - // center pick profile image from camera or gallery - CupertinoTextField( - placeholder: "name", - ), - SizedBox(height: 16,), - CupertinoTextField( - placeholder: "email", + final notifier = ref.watch(editProfileStateProfile.notifier); + final state = ref.watch(editProfileStateProfile); + + _observeIsSaved(context, ref); + + return PopScope( + canPop: !state.isButtonEnable, + onPopInvoked: (didPop) { + notifier.onBackBtnPressed(); + context.pop(); + }, + child: AppPage( + title: context.l10n.edit_profile_screen_title, + actions: [ + if (!isToCreateAccount) ...[ + IconButton( + onPressed: () => + _showDeleteAlert(context, () => notifier.onDeleteTap()), + icon: const Icon(Icons.delete_outline)) + ] + ], + body: Material( + child: Builder( + builder: (context) { + return ListView( + padding: context.mediaQueryPadding + + const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0), + children: [ + _profileImageView(context, notifier, state), + const SizedBox( + height: 16, + ), + _textInputField( + context, + notifier, + state, + context.l10n.edit_profile_name_placeholder, + state.nameController), + const SizedBox( + height: 16, + ), + _textInputField( + context, + notifier, + state, + context.l10n.edit_profile_email_placeholder, + state.emailController), + const SizedBox( + height: 16, + ), + _textInputField( + context, + notifier, + state, + context.l10n.edit_profile_location_placeholder, + state.locationController), + _sectionTitle( + context, context.l10n.edit_profile_dob_placeholder), + OnTapScale( + onTap: () => _selectDate(context, notifier, state), + child: Text.rich(TextSpan(children: [ + WidgetSpan( + child: Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Icon(Icons.calendar_today, + color: context.colorScheme.textPrimary), + )), + TextSpan( + text: DateFormat.yMMMMd().format(state.dob), + style: AppTextStyle.subtitle1.copyWith( + color: context.colorScheme.textSecondary)), + ])), + ), + _sectionTitle( + context, context.l10n.edit_profile_gender_placeholder), + _genderOptionView(context, notifier, state), + const SizedBox( + height: 16, + ), + DropdownButton( + alignment: Alignment.center, + value: state.playerRole, + hint: Text( + context.l10n.edit_profile_player_role_placeholder), + items: PlayerRole.values.map((PlayerRole items) { + return DropdownMenuItem( + value: items, + child: Text(_getPlayerRoleString(context, items)), + ); + }).toList(), + onChanged: (PlayerRole? newValue) { + if (newValue != null && newValue != state.playerRole) { + notifier.onPlayerRoleChange(newValue); + } + }), + const SizedBox( + height: 16, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + DropdownButton( + value: state.battingStyle, + hint: Text(context + .l10n.edit_profile_batting_style_placeholder), + items: BattingStyle.values.map((BattingStyle items) { + return DropdownMenuItem( + value: items, + child: + Text(_getBattingStyleString(context, items)), + ); + }).toList(), + onChanged: (BattingStyle? newValue) { + if (newValue != null && + newValue != state.battingStyle) { + notifier.onBattingStyleChange(newValue); + } + }), + DropdownButton( + value: state.bowlingStyle, + hint: Text(context + .l10n.edit_profile_bowling_style_placeholder), + items: BowlingStyle.values.map((BowlingStyle items) { + return DropdownMenuItem( + value: items, + child: + Text(_getBowlingStyleString(context, items)), + ); + }).toList(), + onChanged: (BowlingStyle? newValue) { + if (newValue != null && + newValue != state.bowlingStyle) { + notifier.onBowlingStyleChange(newValue); + } + }) + ], + ), + const SizedBox( + height: 24, + ), + PrimaryButton( + context.l10n.edit_profile_save_title, + expanded: false, + progress: state.isSaveInProgress, + enabled: state.isButtonEnable, + onPressed: () => notifier.onSubmitTap(), + ) + ], + ); + }, + ), + ), + ), + ); + } + + Widget _profileImageView(BuildContext context, + EditProfileViewNotifier notifier, EditProfileState state) { + return Center( + child: SizedBox( + height: profileViewHeight, + width: profileViewHeight, + child: Stack( + children: [ + Container( + height: profileViewHeight, + width: profileViewHeight, + alignment: Alignment.center, + decoration: BoxDecoration( + shape: BoxShape.circle, + image: state.imageUrl != null + ? DecorationImage( + image: CachedNetworkImageProvider(state.imageUrl!), + fit: BoxFit.cover) + : null, + color: context.colorScheme.primary), + child: state.imageUrl == null + ? Icon( + Icons.person, + size: profileViewHeight / 2, + color: context.colorScheme.textSecondary, + ) + : null, + ), + OnTapScale( + onTap: () { + _onEditProfileButtonTap(context, notifier); + }, + child: Align( + alignment: Alignment.bottomRight, + child: Container( + height: profileViewHeight / 3, + width: profileViewHeight / 3, + decoration: BoxDecoration( + color: context.colorScheme.surface, + border: + Border.all(color: context.colorScheme.textSecondary), + shape: BoxShape.circle), + child: Icon( + Icons.edit, + size: profileViewHeight / 5, + color: context.colorScheme.textSecondary, + ), + ), ), - SizedBox(height: 16,), - SizedBox(height: 16,), - CupertinoTextField( - placeholder: "location", + ), + ], + ), + ), + ); + } + + void _onEditProfileButtonTap( + BuildContext context, EditProfileViewNotifier notifier) { + showModalBottomSheet( + context: context, + showDragHandle: true, + backgroundColor: context.colorScheme.surface, + builder: (sheetContext) { + return Container( + padding: sheetContext.mediaQueryPadding + + const EdgeInsets.only(left: 16, right: 16, bottom: 24), + child: Wrap( + children: [ + Text( + context.l10n.edit_profile_choose_option_title, + style: AppTextStyle.header2 + .copyWith(color: context.colorScheme.textSecondary), ), - CupertinoTextField( - placeholder: "dob", + const SizedBox( + height: 34, ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + //Light Line Png vectors by Lovepik.com GRAPHIC IMAGE LINK : camera + _sheetOptionCell( + context, + notifier, + "assets/images/ic_camera.png", + () async { + sheetContext.pop(); + final image = await _picker.pickImage( + source: ImageSource.camera, + requestFullMetadata: false, + ); + if (context.mounted && image != null) { + _openCropImage(context, notifier, image); + } + }, + ), + + _sheetOptionCell( + context, + notifier, + "assets/images/ic_gallery.png", + () async { + sheetContext.pop(); + final image = await _picker.pickImage( + source: ImageSource.gallery, + requestFullMetadata: false, + ); + if (context.mounted && image != null) { + _openCropImage(context, notifier, image); + } + }, + ), + ], + ) ], - ); - }, + ), + ); + }, + ); + } + + Widget _sheetOptionCell(BuildContext context, + EditProfileViewNotifier notifier, String imagePath, VoidCallback onTap) { + return OnTapScale( + onTap: () => onTap(), + child: Container( + height: 80, + width: 80, + decoration: BoxDecoration( + image: DecorationImage(image: AssetImage(imagePath)), + shape: BoxShape.circle, + border: Border.all(color: context.colorScheme.containerHigh), + color: context.colorScheme.containerLow), + ), + ); + } + + void _openCropImage(BuildContext context, EditProfileViewNotifier notifier, + XFile image) async { + final croppedImage = await ImageCropper().cropImage( + sourcePath: image.path, + aspectRatioPresets: [CropAspectRatioPreset.square], + uiSettings: [ + AndroidUiSettings( + toolbarTitle: context.l10n.edit_profile_crop_image_title, + toolbarColor: context.colorScheme.primary, + toolbarWidgetColor: context.colorScheme.onPrimary, + initAspectRatio: CropAspectRatioPreset.square, + lockAspectRatio: true, + ), + IOSUiSettings( + title: context.l10n.edit_profile_crop_image_title, + ), + WebUiSettings( + context: context, + ), + ], + ); + + if (croppedImage != null) notifier.onImageChange(croppedImage.path); + } + + Widget _textInputField(BuildContext context, EditProfileViewNotifier notifier, + EditProfileState state, String label, TextEditingController controller) { + return TextField( + controller: controller, + onChanged: (value) => notifier.onValueChange(), + decoration: InputDecoration( + labelText: label, + border: const OutlineInputBorder(), + ), + ); + } + + Widget _sectionTitle(BuildContext context, String title) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox( + height: 16, + ), + Text( + title, + style: AppTextStyle.body2 + .copyWith(color: context.colorScheme.textSecondary), + ), + const SizedBox( + height: 8, + ), + ], + ); + } + + Future _selectDate(BuildContext context, + EditProfileViewNotifier notifier, EditProfileState state) async { + final DateTime? picked = await showDatePicker( + context: context, + helpText: context.l10n.edit_profile_select_birth_date_placeholder, + initialDate: state.dob, + firstDate: DateTime(1920), + lastDate: DateTime.now()); + if (picked != null && picked != state.dob) { + notifier.onDateSelect(selectedDate: picked); + } + } + + Widget _genderOptionView(BuildContext context, + EditProfileViewNotifier notifier, EditProfileState state) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _radioBtnCell(context, notifier, state, UserGender.male), + _radioBtnCell(context, notifier, state, UserGender.female), + _radioBtnCell(context, notifier, state, UserGender.other), + ], + ); + } + + Widget _radioBtnCell(BuildContext context, EditProfileViewNotifier notifier, + EditProfileState state, UserGender gender) { + return OnTapScale( + onTap: () => notifier.onGenderSelect(gender: gender), + child: Wrap( + direction: Axis.horizontal, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Radio( + value: gender, + groupValue: state.gender, + activeColor: context.colorScheme.primary, + onChanged: (value) { + if (value != null) { + notifier.onGenderSelect(gender: value); + } + }), + Text( + _getGenderString(context, gender), + style: AppTextStyle.button.copyWith( + color: context.colorScheme.textSecondary, fontSize: 16), + ), + ], ), ); } + + String _getGenderString(BuildContext context, UserGender gender) { + switch (gender) { + case UserGender.male: + return context.l10n.edit_profile_gender_male_title; + case UserGender.female: + return context.l10n.edit_profile_gender_female_title; + case UserGender.other: + return context.l10n.edit_profile_gender_other_title; + default: + return ""; + } + } + + String _getBattingStyleString(BuildContext context, BattingStyle style) { + switch (style) { + case BattingStyle.rightHandBat: + return context.l10n.batting_style_right_hand_bat_title; + case BattingStyle.leftHandBat: + return context.l10n.batting_style_left_hand_bat_title; + } + } + + String _getBowlingStyleString(BuildContext context, BowlingStyle style) { + switch (style) { + case BowlingStyle.rightArmFast: + return context.l10n.bowling_style_right_arm_fast_title; + case BowlingStyle.rightArmMedium: + return context.l10n.bowling_style_right_arm_medium_title; + case BowlingStyle.leftArmFast: + return context.l10n.bowling_style_left_arm_fast_title; + case BowlingStyle.leftArmMedium: + return context.l10n.bowling_style_left_arm_medium_title; + case BowlingStyle.slowLeftArmOrthodox: + return context.l10n.bowling_style_slow_left_arm_orthodox_title; + case BowlingStyle.slowLeftArmChinaMan: + return context.l10n.bowling_style_slow_left_arm_chinaman_title; + case BowlingStyle.rightArmOffBreak: + return context.l10n.bowling_style_right_arm_off_break_title; + case BowlingStyle.rightArmLegBreak: + return context.l10n.bowling_style_right_arm_leg_break_title; + case BowlingStyle.none: + return context.l10n.common_none_title; + } + } + + String _getPlayerRoleString(BuildContext context, PlayerRole role) { + switch (role) { + case PlayerRole.topOrderBatter: + return context.l10n.player_role_top_order_batter_title; + case PlayerRole.middleOrderBatter: + return context.l10n.player_role_middle_order_batter_title; + case PlayerRole.wickerKeeperBatter: + return context.l10n.player_role_wicket_keeper_batter_title; + case PlayerRole.wicketKeeper: + return context.l10n.player_role_wicket_keeper_title; + case PlayerRole.bowler: + return context.l10n.player_role_bowler_title; + case PlayerRole.allRounder: + return context.l10n.player_role_all_rounder_title; + case PlayerRole.lowerOrderBatter: + return context.l10n.player_role_lower_order_batter_title; + case PlayerRole.openingBatter: + return context.l10n.player_role_opening_batter_title; + case PlayerRole.none: + return context.l10n.common_none_title; + } + } + + void _showDeleteAlert(BuildContext context, Function() onDelete) { + showAdaptiveDialog( + context: context, + builder: (context) { + return AlertDialog.adaptive( + title: Text(context.l10n.common_delete_title), + content: Text(context.l10n.alert_confirm_default_message( + context.l10n.common_delete_title.toLowerCase())), + actions: [ + TextButton( + onPressed: () { + context.pop(); + }, + child: Text( + context.l10n.common_cancel_title, + style: TextStyle(color: context.colorScheme.textSecondary), + ), + ), + TextButton( + onPressed: () { + context.pop(); + onDelete(); + }, + child: Text( + context.l10n.common_delete_title, + style: TextStyle(color: context.colorScheme.alert), + ), + ), + ], + ); + }, + ); + } } diff --git a/khelo/lib/ui/flow/settings/profile/edit_profile_view_model.dart b/khelo/lib/ui/flow/settings/profile/edit_profile_view_model.dart new file mode 100644 index 00000000..d5d119fd --- /dev/null +++ b/khelo/lib/ui/flow/settings/profile/edit_profile_view_model.dart @@ -0,0 +1,210 @@ +import 'package:data/api/user/user_models.dart'; +import 'package:data/service/file_upload/file_upload_service.dart'; +import 'package:data/service/user/user_service.dart'; +import 'package:data/storage/app_preferences.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:khelo/domain/extensions/string_extensions.dart'; + +part 'edit_profile_view_model.freezed.dart'; + +final editProfileStateProfile = StateNotifierProvider.autoDispose< + EditProfileViewNotifier, EditProfileState>((ref) { + final notifier = EditProfileViewNotifier( + ref.read(fileUploadServiceProvider), + ref.read(userServiceProvider), + FirebaseAuth.instance, + ref.read(currentUserPod), + ); + ref.listen(currentUserPod, (_, next) => notifier._updateUser(next)); + return notifier; +}); + +class EditProfileViewNotifier extends StateNotifier { + final FileUploadService fileUploadService; + final UserService userService; + final FirebaseAuth auth; + + EditProfileViewNotifier( + this.fileUploadService, this.userService, this.auth, UserModel? user) + : super(EditProfileState( + dob: user?.dob ?? DateTime.now(), + imageUrl: user?.profile_img_url, + battingStyle: user?.batting_style, + bowlingStyle: user?.bowling_style, + gender: user?.gender, + playerRole: user?.player_role, + nameController: TextEditingController(text: user?.name), + emailController: TextEditingController(text: user?.email), + currentUser: user, + locationController: TextEditingController(text: user?.location))); + + void _updateUser(UserModel? user) { + state = state.copyWith(currentUser: user); + } + + void onDateSelect({required DateTime selectedDate}) { + state = state.copyWith(dob: selectedDate); + onValueChange(); + } + + void onGenderSelect({required UserGender gender}) { + state = state.copyWith(gender: gender); + onValueChange(); + } + + void onBattingStyleChange(BattingStyle style) { + state = state.copyWith(battingStyle: style); + onValueChange(); + } + + void onBowlingStyleChange(BowlingStyle style) { + state = state.copyWith(bowlingStyle: style); + onValueChange(); + } + + void onPlayerRoleChange(PlayerRole role) { + state = state.copyWith(playerRole: role); + onValueChange(); + } + + void onValueChange() { + final bool isEnable = state.nameController.text.trim().length >= 3 && + state.emailController.text.trim().isValidEmail() && + state.locationController.text.trim().length >= 3; + + state = state.copyWith(isButtonEnable: isEnable); + } + + Future onImageChange(String path) async { + try { + final imageUrl = await fileUploadService.uploadProfileImage(path); + final prevUrl = state.imageUrl; + + if (prevUrl != null && prevUrl != state.currentUser?.profile_img_url) { + await fileUploadService.deleteUploadedProfileImage(prevUrl); + } + state = state.copyWith(imageUrl: imageUrl); + onValueChange(); + } catch (e) { + debugPrint("EditProfileViewNotifier: error while image upload -> $e"); + } + } + + Future onSubmitTap() async { + if (state.currentUser == null) { + return; + } + + try { + state = state.copyWith(isSaveInProgress: true); + if (state.currentUser?.profile_img_url != null && + state.imageUrl != state.currentUser?.profile_img_url) { + fileUploadService + .deleteUploadedProfileImage(state.currentUser!.profile_img_url!); + } + + final name = state.nameController.text.trim(); + final email = state.emailController.text.trim(); + final location = state.locationController.text.trim(); + + UserModel user = UserModel( + id: state.currentUser!.id, + name: name, + email: email, + location: location, + batting_style: state.battingStyle, + bowling_style: state.bowlingStyle, + player_role: state.playerRole, + gender: state.gender, + profile_img_url: state.imageUrl, + dob: state.dob, + updated_at: DateTime.now()); + + await userService.updateUser(user); + state = state.copyWith(isSaveInProgress: false, isSaved: true); + } catch (e) { + state = state.copyWith(isSaveInProgress: false); + debugPrint( + "EditProfileViewNotifier: error while edit profile details -> $e"); + } + } + + Future onDeleteTap() async { + try { + if (state.imageUrl != null) { + if (state.imageUrl != state.currentUser?.profile_img_url && + state.currentUser?.profile_img_url != null) { + fileUploadService + .deleteUploadedProfileImage(state.currentUser!.profile_img_url!); + } + fileUploadService.deleteUploadedProfileImage(state.imageUrl!); + } else { + if (state.currentUser?.profile_img_url != null) { + fileUploadService + .deleteUploadedProfileImage(state.currentUser!.profile_img_url!); + } + } + + await auth.currentUser?.delete(); + userService.deleteUser(); + } on FirebaseAuthException catch (e) { + if (e.code == "requires-recent-login") { + await _reAuthenticateAndDelete(); + } + } catch (e) { + debugPrint("EditProfileViewNotifier: error while delete account -> $e"); + } + } + + Future _reAuthenticateAndDelete() async { + try { + final providerData = auth.currentUser?.providerData.first; + if (PhoneAuthProvider().providerId == providerData?.providerId) { + await auth.currentUser?.reauthenticateWithProvider(PhoneAuthProvider()); + await auth.currentUser?.delete(); + } + } on FirebaseAuthException catch (e) { + if (e.code == "web-user-interaction-failure") { + debugPrint( + "EditProfileViewNotifier: error in _reAuthenticateAndDelete -> $e"); + } + } catch (e) { + debugPrint( + "EditProfileViewNotifier: error in reAuthenticate And Delete -> $e"); + } + } + + void onBackBtnPressed() { + try { + if (state.imageUrl != state.currentUser?.profile_img_url && + state.imageUrl != null) { + fileUploadService.deleteUploadedProfileImage(state.imageUrl!); + } + } catch (e) { + debugPrint( + "EditProfileViewNotifier: error while delete image on back btn press -> $e"); + } + } +} + +@freezed +class EditProfileState with _$EditProfileState { + const factory EditProfileState({ + required DateTime dob, + required TextEditingController nameController, + required TextEditingController emailController, + required TextEditingController locationController, + @Default(null) String? imageUrl, + @Default(null) UserGender? gender, + @Default(null) BattingStyle? battingStyle, + @Default(null) BowlingStyle? bowlingStyle, + @Default(null) PlayerRole? playerRole, + @Default(false) bool isButtonEnable, + @Default(false) bool isSaved, + @Default(false) bool isSaveInProgress, + UserModel? currentUser, + }) = _EditProfileState; +} diff --git a/khelo/lib/ui/flow/settings/profile/edit_profile_view_model.freezed.dart b/khelo/lib/ui/flow/settings/profile/edit_profile_view_model.freezed.dart new file mode 100644 index 00000000..17a04629 --- /dev/null +++ b/khelo/lib/ui/flow/settings/profile/edit_profile_view_model.freezed.dart @@ -0,0 +1,429 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'edit_profile_view_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +mixin _$EditProfileState { + DateTime get dob => throw _privateConstructorUsedError; + TextEditingController get nameController => + throw _privateConstructorUsedError; + TextEditingController get emailController => + throw _privateConstructorUsedError; + TextEditingController get locationController => + throw _privateConstructorUsedError; + String? get imageUrl => throw _privateConstructorUsedError; + UserGender? get gender => throw _privateConstructorUsedError; + BattingStyle? get battingStyle => throw _privateConstructorUsedError; + BowlingStyle? get bowlingStyle => throw _privateConstructorUsedError; + PlayerRole? get playerRole => throw _privateConstructorUsedError; + bool get isButtonEnable => throw _privateConstructorUsedError; + bool get isSaved => throw _privateConstructorUsedError; + bool get isSaveInProgress => throw _privateConstructorUsedError; + UserModel? get currentUser => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $EditProfileStateCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $EditProfileStateCopyWith<$Res> { + factory $EditProfileStateCopyWith( + EditProfileState value, $Res Function(EditProfileState) then) = + _$EditProfileStateCopyWithImpl<$Res, EditProfileState>; + @useResult + $Res call( + {DateTime dob, + TextEditingController nameController, + TextEditingController emailController, + TextEditingController locationController, + String? imageUrl, + UserGender? gender, + BattingStyle? battingStyle, + BowlingStyle? bowlingStyle, + PlayerRole? playerRole, + bool isButtonEnable, + bool isSaved, + bool isSaveInProgress, + UserModel? currentUser}); + + $UserModelCopyWith<$Res>? get currentUser; +} + +/// @nodoc +class _$EditProfileStateCopyWithImpl<$Res, $Val extends EditProfileState> + implements $EditProfileStateCopyWith<$Res> { + _$EditProfileStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? dob = null, + Object? nameController = null, + Object? emailController = null, + Object? locationController = null, + Object? imageUrl = freezed, + Object? gender = freezed, + Object? battingStyle = freezed, + Object? bowlingStyle = freezed, + Object? playerRole = freezed, + Object? isButtonEnable = null, + Object? isSaved = null, + Object? isSaveInProgress = null, + Object? currentUser = freezed, + }) { + return _then(_value.copyWith( + dob: null == dob + ? _value.dob + : dob // ignore: cast_nullable_to_non_nullable + as DateTime, + nameController: null == nameController + ? _value.nameController + : nameController // ignore: cast_nullable_to_non_nullable + as TextEditingController, + emailController: null == emailController + ? _value.emailController + : emailController // ignore: cast_nullable_to_non_nullable + as TextEditingController, + locationController: null == locationController + ? _value.locationController + : locationController // ignore: cast_nullable_to_non_nullable + as TextEditingController, + imageUrl: freezed == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String?, + gender: freezed == gender + ? _value.gender + : gender // ignore: cast_nullable_to_non_nullable + as UserGender?, + battingStyle: freezed == battingStyle + ? _value.battingStyle + : battingStyle // ignore: cast_nullable_to_non_nullable + as BattingStyle?, + bowlingStyle: freezed == bowlingStyle + ? _value.bowlingStyle + : bowlingStyle // ignore: cast_nullable_to_non_nullable + as BowlingStyle?, + playerRole: freezed == playerRole + ? _value.playerRole + : playerRole // ignore: cast_nullable_to_non_nullable + as PlayerRole?, + isButtonEnable: null == isButtonEnable + ? _value.isButtonEnable + : isButtonEnable // ignore: cast_nullable_to_non_nullable + as bool, + isSaved: null == isSaved + ? _value.isSaved + : isSaved // ignore: cast_nullable_to_non_nullable + as bool, + isSaveInProgress: null == isSaveInProgress + ? _value.isSaveInProgress + : isSaveInProgress // ignore: cast_nullable_to_non_nullable + as bool, + currentUser: freezed == currentUser + ? _value.currentUser + : currentUser // ignore: cast_nullable_to_non_nullable + as UserModel?, + ) as $Val); + } + + @override + @pragma('vm:prefer-inline') + $UserModelCopyWith<$Res>? get currentUser { + if (_value.currentUser == null) { + return null; + } + + return $UserModelCopyWith<$Res>(_value.currentUser!, (value) { + return _then(_value.copyWith(currentUser: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$EditProfileStateImplCopyWith<$Res> + implements $EditProfileStateCopyWith<$Res> { + factory _$$EditProfileStateImplCopyWith(_$EditProfileStateImpl value, + $Res Function(_$EditProfileStateImpl) then) = + __$$EditProfileStateImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {DateTime dob, + TextEditingController nameController, + TextEditingController emailController, + TextEditingController locationController, + String? imageUrl, + UserGender? gender, + BattingStyle? battingStyle, + BowlingStyle? bowlingStyle, + PlayerRole? playerRole, + bool isButtonEnable, + bool isSaved, + bool isSaveInProgress, + UserModel? currentUser}); + + @override + $UserModelCopyWith<$Res>? get currentUser; +} + +/// @nodoc +class __$$EditProfileStateImplCopyWithImpl<$Res> + extends _$EditProfileStateCopyWithImpl<$Res, _$EditProfileStateImpl> + implements _$$EditProfileStateImplCopyWith<$Res> { + __$$EditProfileStateImplCopyWithImpl(_$EditProfileStateImpl _value, + $Res Function(_$EditProfileStateImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? dob = null, + Object? nameController = null, + Object? emailController = null, + Object? locationController = null, + Object? imageUrl = freezed, + Object? gender = freezed, + Object? battingStyle = freezed, + Object? bowlingStyle = freezed, + Object? playerRole = freezed, + Object? isButtonEnable = null, + Object? isSaved = null, + Object? isSaveInProgress = null, + Object? currentUser = freezed, + }) { + return _then(_$EditProfileStateImpl( + dob: null == dob + ? _value.dob + : dob // ignore: cast_nullable_to_non_nullable + as DateTime, + nameController: null == nameController + ? _value.nameController + : nameController // ignore: cast_nullable_to_non_nullable + as TextEditingController, + emailController: null == emailController + ? _value.emailController + : emailController // ignore: cast_nullable_to_non_nullable + as TextEditingController, + locationController: null == locationController + ? _value.locationController + : locationController // ignore: cast_nullable_to_non_nullable + as TextEditingController, + imageUrl: freezed == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String?, + gender: freezed == gender + ? _value.gender + : gender // ignore: cast_nullable_to_non_nullable + as UserGender?, + battingStyle: freezed == battingStyle + ? _value.battingStyle + : battingStyle // ignore: cast_nullable_to_non_nullable + as BattingStyle?, + bowlingStyle: freezed == bowlingStyle + ? _value.bowlingStyle + : bowlingStyle // ignore: cast_nullable_to_non_nullable + as BowlingStyle?, + playerRole: freezed == playerRole + ? _value.playerRole + : playerRole // ignore: cast_nullable_to_non_nullable + as PlayerRole?, + isButtonEnable: null == isButtonEnable + ? _value.isButtonEnable + : isButtonEnable // ignore: cast_nullable_to_non_nullable + as bool, + isSaved: null == isSaved + ? _value.isSaved + : isSaved // ignore: cast_nullable_to_non_nullable + as bool, + isSaveInProgress: null == isSaveInProgress + ? _value.isSaveInProgress + : isSaveInProgress // ignore: cast_nullable_to_non_nullable + as bool, + currentUser: freezed == currentUser + ? _value.currentUser + : currentUser // ignore: cast_nullable_to_non_nullable + as UserModel?, + )); + } +} + +/// @nodoc + +class _$EditProfileStateImpl implements _EditProfileState { + const _$EditProfileStateImpl( + {required this.dob, + required this.nameController, + required this.emailController, + required this.locationController, + this.imageUrl = null, + this.gender = null, + this.battingStyle = null, + this.bowlingStyle = null, + this.playerRole = null, + this.isButtonEnable = false, + this.isSaved = false, + this.isSaveInProgress = false, + this.currentUser}); + + @override + final DateTime dob; + @override + final TextEditingController nameController; + @override + final TextEditingController emailController; + @override + final TextEditingController locationController; + @override + @JsonKey() + final String? imageUrl; + @override + @JsonKey() + final UserGender? gender; + @override + @JsonKey() + final BattingStyle? battingStyle; + @override + @JsonKey() + final BowlingStyle? bowlingStyle; + @override + @JsonKey() + final PlayerRole? playerRole; + @override + @JsonKey() + final bool isButtonEnable; + @override + @JsonKey() + final bool isSaved; + @override + @JsonKey() + final bool isSaveInProgress; + @override + final UserModel? currentUser; + + @override + String toString() { + return 'EditProfileState(dob: $dob, nameController: $nameController, emailController: $emailController, locationController: $locationController, imageUrl: $imageUrl, gender: $gender, battingStyle: $battingStyle, bowlingStyle: $bowlingStyle, playerRole: $playerRole, isButtonEnable: $isButtonEnable, isSaved: $isSaved, isSaveInProgress: $isSaveInProgress, currentUser: $currentUser)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$EditProfileStateImpl && + (identical(other.dob, dob) || other.dob == dob) && + (identical(other.nameController, nameController) || + other.nameController == nameController) && + (identical(other.emailController, emailController) || + other.emailController == emailController) && + (identical(other.locationController, locationController) || + other.locationController == locationController) && + (identical(other.imageUrl, imageUrl) || + other.imageUrl == imageUrl) && + (identical(other.gender, gender) || other.gender == gender) && + (identical(other.battingStyle, battingStyle) || + other.battingStyle == battingStyle) && + (identical(other.bowlingStyle, bowlingStyle) || + other.bowlingStyle == bowlingStyle) && + (identical(other.playerRole, playerRole) || + other.playerRole == playerRole) && + (identical(other.isButtonEnable, isButtonEnable) || + other.isButtonEnable == isButtonEnable) && + (identical(other.isSaved, isSaved) || other.isSaved == isSaved) && + (identical(other.isSaveInProgress, isSaveInProgress) || + other.isSaveInProgress == isSaveInProgress) && + (identical(other.currentUser, currentUser) || + other.currentUser == currentUser)); + } + + @override + int get hashCode => Object.hash( + runtimeType, + dob, + nameController, + emailController, + locationController, + imageUrl, + gender, + battingStyle, + bowlingStyle, + playerRole, + isButtonEnable, + isSaved, + isSaveInProgress, + currentUser); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$EditProfileStateImplCopyWith<_$EditProfileStateImpl> get copyWith => + __$$EditProfileStateImplCopyWithImpl<_$EditProfileStateImpl>( + this, _$identity); +} + +abstract class _EditProfileState implements EditProfileState { + const factory _EditProfileState( + {required final DateTime dob, + required final TextEditingController nameController, + required final TextEditingController emailController, + required final TextEditingController locationController, + final String? imageUrl, + final UserGender? gender, + final BattingStyle? battingStyle, + final BowlingStyle? bowlingStyle, + final PlayerRole? playerRole, + final bool isButtonEnable, + final bool isSaved, + final bool isSaveInProgress, + final UserModel? currentUser}) = _$EditProfileStateImpl; + + @override + DateTime get dob; + @override + TextEditingController get nameController; + @override + TextEditingController get emailController; + @override + TextEditingController get locationController; + @override + String? get imageUrl; + @override + UserGender? get gender; + @override + BattingStyle? get battingStyle; + @override + BowlingStyle? get bowlingStyle; + @override + PlayerRole? get playerRole; + @override + bool get isButtonEnable; + @override + bool get isSaved; + @override + bool get isSaveInProgress; + @override + UserModel? get currentUser; + @override + @JsonKey(ignore: true) + _$$EditProfileStateImplCopyWith<_$EditProfileStateImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/khelo/lib/ui/flow/sign_in/phone_verification/phone_verification_screen.dart b/khelo/lib/ui/flow/sign_in/phone_verification/phone_verification_screen.dart index 2dce7b07..9b5d55c7 100644 --- a/khelo/lib/ui/flow/sign_in/phone_verification/phone_verification_screen.dart +++ b/khelo/lib/ui/flow/sign_in/phone_verification/phone_verification_screen.dart @@ -44,9 +44,9 @@ class _PhoneVerificationScreenState void _observeVerificationComplete() { ref.listen( phoneVerificationStateProvider - .select((value) => value.verificationComplete), (previous, next) { - if (next) { - context.pop(true); + .select((value) => value.credential), (previous, next) { + if (next != null) { + context.pop(next); } }); } diff --git a/khelo/lib/ui/flow/sign_in/phone_verification/phone_verification_view_model.dart b/khelo/lib/ui/flow/sign_in/phone_verification/phone_verification_view_model.dart index f3472401..e4f44d91 100644 --- a/khelo/lib/ui/flow/sign_in/phone_verification/phone_verification_view_model.dart +++ b/khelo/lib/ui/flow/sign_in/phone_verification/phone_verification_view_model.dart @@ -1,5 +1,8 @@ import 'dart:async'; +import 'package:data/api/user/user_models.dart'; +import 'package:data/service/user/user_service.dart'; import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; @@ -8,21 +11,20 @@ part 'phone_verification_view_model.freezed.dart'; final phoneVerificationStateProvider = StateNotifierProvider.autoDispose< PhoneVerificationViewNotifier, PhoneVerificationState>((ref) { return PhoneVerificationViewNotifier( - FirebaseAuth.instance, - ); + FirebaseAuth.instance, ref.read(userServiceProvider)); }); class PhoneVerificationViewNotifier extends StateNotifier { final FirebaseAuth firebaseAuth; + final UserService userService; late Timer timer; late String phoneNumber; bool firstAutoVerificationComplete = false; - PhoneVerificationViewNotifier( - this.firebaseAuth, - ) : super(const PhoneVerificationState()) { + PhoneVerificationViewNotifier(this.firebaseAuth, this.userService) + : super(const PhoneVerificationState()) { updateResendCodeTimerDuration(); } @@ -60,33 +62,51 @@ class PhoneVerificationViewNotifier } Future resendCode({required String phone}) async { - state = state.copyWith(error: null); - updateResendCodeTimerDuration(); - await firebaseAuth.verifyPhoneNumber( - phoneNumber: phone, - verificationCompleted: (phoneAuthCredential) async { - try { - final userCredential = - await firebaseAuth.signInWithCredential(phoneAuthCredential); - onVerificationSuccess(userCredential); - } catch (error) { + try { + state = state.copyWith(error: null); + updateResendCodeTimerDuration(); + await firebaseAuth.verifyPhoneNumber( + phoneNumber: phone, + verificationCompleted: (phoneAuthCredential) async { + try { + final userCredential = + await firebaseAuth.signInWithCredential(phoneAuthCredential); + onVerificationSuccess(userCredential); + } catch (error) { + state = state.copyWith(error: error); + } + }, + verificationFailed: (error) { state = state.copyWith(error: error); - } - }, - verificationFailed: (error) { - state = state.copyWith(error: error); - }, - codeSent: (verificationId, forceResendingToken) { - state = state.copyWith(verificationId: verificationId); - }, - codeAutoRetrievalTimeout: (verificationId) {}, - ); + }, + codeSent: (verificationId, forceResendingToken) { + state = state.copyWith(verificationId: verificationId); + }, + codeAutoRetrievalTimeout: (verificationId) {}, + ); + } catch (e) { + debugPrint("PhoneVerificationViewNotifier: error in resend otp -> $e"); + } } - void onVerificationSuccess(UserCredential credential) { - // do something with cred - // return cred info to prev screen to push from edit screen - state = state.copyWith(verifying: false, verificationComplete: true); + Future onVerificationSuccess(UserCredential credential) async { + try { + if (credential.additionalUserInfo?.isNewUser ?? false) { + UserModel user = UserModel( + id: firebaseAuth.currentUser?.uid ?? "INVALID ID", + phone: firebaseAuth.currentUser?.phoneNumber, + created_at: DateTime.now()); + await userService.updateUser(user); + state = state.copyWith(verifying: false, credential: credential); + } else { + // get user + await userService.getUser(credential.user?.uid ?? "INVALID ID"); + state = state.copyWith(verifying: false, credential: credential); + } + } catch (e) { + debugPrint( + "PhoneVerificationViewNotifier: error in onVerificationSuccess -> $e"); + } } Future verifyOTP() async { @@ -101,8 +121,9 @@ class PhoneVerificationViewNotifier final userCredential = await firebaseAuth.signInWithCredential(credential); onVerificationSuccess(userCredential); - } catch (error) { - state = state.copyWith(verifying: false, error: error); + } catch (e) { + state = state.copyWith(verifying: false, error: e); + debugPrint("PhoneVerificationViewNotifier: error in verifyOTP -> $e"); } } @@ -118,7 +139,7 @@ class PhoneVerificationState with _$PhoneVerificationState { const factory PhoneVerificationState({ @Default(false) bool verifying, @Default(false) bool enableVerify, - @Default(false) bool verificationComplete, + @Default(null) UserCredential? credential, String? verificationId, @Default('') String otp, @Default(Duration(seconds: 30)) Duration activeResendDuration, diff --git a/khelo/lib/ui/flow/sign_in/phone_verification/phone_verification_view_model.freezed.dart b/khelo/lib/ui/flow/sign_in/phone_verification/phone_verification_view_model.freezed.dart index 8d372feb..d7e6915f 100644 --- a/khelo/lib/ui/flow/sign_in/phone_verification/phone_verification_view_model.freezed.dart +++ b/khelo/lib/ui/flow/sign_in/phone_verification/phone_verification_view_model.freezed.dart @@ -18,7 +18,7 @@ final _privateConstructorUsedError = UnsupportedError( mixin _$PhoneVerificationState { bool get verifying => throw _privateConstructorUsedError; bool get enableVerify => throw _privateConstructorUsedError; - bool get verificationComplete => throw _privateConstructorUsedError; + UserCredential? get credential => throw _privateConstructorUsedError; String? get verificationId => throw _privateConstructorUsedError; String get otp => throw _privateConstructorUsedError; Duration get activeResendDuration => throw _privateConstructorUsedError; @@ -38,7 +38,7 @@ abstract class $PhoneVerificationStateCopyWith<$Res> { $Res call( {bool verifying, bool enableVerify, - bool verificationComplete, + UserCredential? credential, String? verificationId, String otp, Duration activeResendDuration, @@ -61,7 +61,7 @@ class _$PhoneVerificationStateCopyWithImpl<$Res, $Res call({ Object? verifying = null, Object? enableVerify = null, - Object? verificationComplete = null, + Object? credential = freezed, Object? verificationId = freezed, Object? otp = null, Object? activeResendDuration = null, @@ -76,10 +76,10 @@ class _$PhoneVerificationStateCopyWithImpl<$Res, ? _value.enableVerify : enableVerify // ignore: cast_nullable_to_non_nullable as bool, - verificationComplete: null == verificationComplete - ? _value.verificationComplete - : verificationComplete // ignore: cast_nullable_to_non_nullable - as bool, + credential: freezed == credential + ? _value.credential + : credential // ignore: cast_nullable_to_non_nullable + as UserCredential?, verificationId: freezed == verificationId ? _value.verificationId : verificationId // ignore: cast_nullable_to_non_nullable @@ -109,7 +109,7 @@ abstract class _$$PhoneVerificationStateImplCopyWith<$Res> $Res call( {bool verifying, bool enableVerify, - bool verificationComplete, + UserCredential? credential, String? verificationId, String otp, Duration activeResendDuration, @@ -131,7 +131,7 @@ class __$$PhoneVerificationStateImplCopyWithImpl<$Res> $Res call({ Object? verifying = null, Object? enableVerify = null, - Object? verificationComplete = null, + Object? credential = freezed, Object? verificationId = freezed, Object? otp = null, Object? activeResendDuration = null, @@ -146,10 +146,10 @@ class __$$PhoneVerificationStateImplCopyWithImpl<$Res> ? _value.enableVerify : enableVerify // ignore: cast_nullable_to_non_nullable as bool, - verificationComplete: null == verificationComplete - ? _value.verificationComplete - : verificationComplete // ignore: cast_nullable_to_non_nullable - as bool, + credential: freezed == credential + ? _value.credential + : credential // ignore: cast_nullable_to_non_nullable + as UserCredential?, verificationId: freezed == verificationId ? _value.verificationId : verificationId // ignore: cast_nullable_to_non_nullable @@ -173,7 +173,7 @@ class _$PhoneVerificationStateImpl implements _PhoneVerificationState { const _$PhoneVerificationStateImpl( {this.verifying = false, this.enableVerify = false, - this.verificationComplete = false, + this.credential = null, this.verificationId, this.otp = '', this.activeResendDuration = const Duration(seconds: 30), @@ -187,7 +187,7 @@ class _$PhoneVerificationStateImpl implements _PhoneVerificationState { final bool enableVerify; @override @JsonKey() - final bool verificationComplete; + final UserCredential? credential; @override final String? verificationId; @override @@ -201,7 +201,7 @@ class _$PhoneVerificationStateImpl implements _PhoneVerificationState { @override String toString() { - return 'PhoneVerificationState(verifying: $verifying, enableVerify: $enableVerify, verificationComplete: $verificationComplete, verificationId: $verificationId, otp: $otp, activeResendDuration: $activeResendDuration, error: $error)'; + return 'PhoneVerificationState(verifying: $verifying, enableVerify: $enableVerify, credential: $credential, verificationId: $verificationId, otp: $otp, activeResendDuration: $activeResendDuration, error: $error)'; } @override @@ -213,8 +213,8 @@ class _$PhoneVerificationStateImpl implements _PhoneVerificationState { other.verifying == verifying) && (identical(other.enableVerify, enableVerify) || other.enableVerify == enableVerify) && - (identical(other.verificationComplete, verificationComplete) || - other.verificationComplete == verificationComplete) && + (identical(other.credential, credential) || + other.credential == credential) && (identical(other.verificationId, verificationId) || other.verificationId == verificationId) && (identical(other.otp, otp) || other.otp == otp) && @@ -228,7 +228,7 @@ class _$PhoneVerificationStateImpl implements _PhoneVerificationState { runtimeType, verifying, enableVerify, - verificationComplete, + credential, verificationId, otp, activeResendDuration, @@ -246,7 +246,7 @@ abstract class _PhoneVerificationState implements PhoneVerificationState { const factory _PhoneVerificationState( {final bool verifying, final bool enableVerify, - final bool verificationComplete, + final UserCredential? credential, final String? verificationId, final String otp, final Duration activeResendDuration, @@ -257,7 +257,7 @@ abstract class _PhoneVerificationState implements PhoneVerificationState { @override bool get enableVerify; @override - bool get verificationComplete; + UserCredential? get credential; @override String? get verificationId; @override diff --git a/khelo/lib/ui/flow/sign_in/sign_in_with_phone/sign_in_with_phone_screen.dart b/khelo/lib/ui/flow/sign_in/sign_in_with_phone/sign_in_with_phone_screen.dart index f9ba0816..4d5316c4 100644 --- a/khelo/lib/ui/flow/sign_in/sign_in_with_phone/sign_in_with_phone_screen.dart +++ b/khelo/lib/ui/flow/sign_in/sign_in_with_phone/sign_in_with_phone_screen.dart @@ -1,9 +1,9 @@ import 'package:data/storage/app_preferences.dart'; +import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; import 'package:khelo/components/app_page.dart'; import 'package:khelo/domain/extensions/context_extensions.dart'; import 'package:khelo/ui/app_route.dart'; @@ -30,12 +30,13 @@ class _SignInWithPhoneScreenState extends ConsumerState { (previous, current) async { if (current != null) { final state = ref.read(signInWithPhoneStateProvider); - final bool? success = await AppRoute.verifyOTP( + final UserCredential? success = await AppRoute.verifyOTP( phoneNumber: state.code.dialCode + state.phone, verificationId: current, - ).push(context); - if (success == true && context.mounted) context.pop(true); + ).push(context); + if (success != null && context.mounted) onSignInSuccess(success); + //context.pop(true); //onSignInSuccess(); // in place of context.pop } }, @@ -46,9 +47,9 @@ class _SignInWithPhoneScreenState extends ConsumerState { ref.listen( signInWithPhoneStateProvider.select((value) => value.signInSuccess), (previous, current) async { - if (current && context.mounted) { - context.pop(true); - //onSignInSuccess(); // in place of context.pop + if (current != null && context.mounted) { + // context.pop(true); + onSignInSuccess(current); // in place of context.pop } }, ); @@ -137,12 +138,12 @@ class _SignInWithPhoneScreenState extends ConsumerState { ); } - void onSignInSuccess() async { + void onSignInSuccess(UserCredential credential) async { final user = ref.read(currentUserPod); if (user?.name == null || user!.name!.isEmpty) { - // await AppRoute.editProfile(blockBackButton: true).push(context); - await AppRoute.editProfile.push(context); + AppRoute.editProfile(isToCreateAccount: true).go(context); + } else { + AppRoute.main.go(context); } - if (mounted) context.pop(true); } } diff --git a/khelo/lib/ui/flow/sign_in/sign_in_with_phone/sign_in_with_phone_view_model.dart b/khelo/lib/ui/flow/sign_in/sign_in_with_phone/sign_in_with_phone_view_model.dart index cfb443fe..792efc49 100644 --- a/khelo/lib/ui/flow/sign_in/sign_in_with_phone/sign_in_with_phone_view_model.dart +++ b/khelo/lib/ui/flow/sign_in/sign_in_with_phone/sign_in_with_phone_view_model.dart @@ -1,5 +1,7 @@ import 'package:canopas_country_picker/canopas_country_picker.dart'; +import 'package:data/api/user/user_models.dart'; import 'package:data/service/device/device_service.dart'; +import 'package:data/service/user/user_service.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -9,15 +11,17 @@ part 'sign_in_with_phone_view_model.freezed.dart'; final signInWithPhoneStateProvider = StateNotifierProvider.autoDispose< SignInWithPhoneViewNotifier, SignInWithPhoneState>((ref) { - return SignInWithPhoneViewNotifier( - FirebaseAuth.instance, ref.read(deviceServiceProvider)); + return SignInWithPhoneViewNotifier(FirebaseAuth.instance, + ref.read(userServiceProvider), ref.read(deviceServiceProvider)); }); class SignInWithPhoneViewNotifier extends StateNotifier { final FirebaseAuth firebaseAuth; + final UserService userService; final DeviceService deviceService; - SignInWithPhoneViewNotifier(this.firebaseAuth, this.deviceService) + SignInWithPhoneViewNotifier( + this.firebaseAuth, this.userService, this.deviceService) : super( SignInWithPhoneState( code: CountryCode.getCountryCodeByAlpha2( @@ -40,7 +44,8 @@ class SignInWithPhoneViewNotifier extends StateNotifier { ); } } catch (e) { - //Error: couldn't get country code + debugPrint( + "SignInWithPhoneViewNotifier: error in fetchCountryCode -> $e"); } } @@ -58,24 +63,34 @@ class SignInWithPhoneViewNotifier extends StateNotifier { Future verifyPhoneNumber() async { state = state.copyWith(verifying: true, error: null); - await firebaseAuth.verifyPhoneNumber( - phoneNumber: state.code.dialCode + state.phone, - verificationCompleted: (phoneAuthCredential) async { - // automated sign in handled in android - await firebaseAuth.signInWithCredential(phoneAuthCredential); - // return cred info to prev screen to push from edit screen + try { + await firebaseAuth.verifyPhoneNumber( + phoneNumber: state.code.dialCode + state.phone, + verificationCompleted: (phoneAuthCredential) async { + final credential = + await firebaseAuth.signInWithCredential(phoneAuthCredential); - state = state.copyWith(verifying: false, signInSuccess: true); - }, - verificationFailed: (error) { - state = state.copyWith(verifying: false, error: error); - }, - codeSent: (verificationId, forceResendingToken) { - state = - state.copyWith(verificationId: verificationId, verifying: false); - }, - codeAutoRetrievalTimeout: (verificationId) {}, - ); + // call update function and update user in db + UserModel user = UserModel( + id: firebaseAuth.currentUser?.uid ?? "INVALID ID", + phone: firebaseAuth.currentUser?.phoneNumber); + await userService.updateUser(user); + state = state.copyWith(verifying: false, signInSuccess: credential); + }, + verificationFailed: (error) { + state = state.copyWith(verifying: false, error: error); + }, + codeSent: (verificationId, forceResendingToken) { + state = + state.copyWith(verificationId: verificationId, verifying: false); + }, + codeAutoRetrievalTimeout: (verificationId) {}, + ); + } catch (e) { + state = state.copyWith(verifying: false, error: e); + debugPrint( + "SignInWithPhoneViewNotifier: error in verifyPhoneNumber -> $e"); + } } } @@ -84,7 +99,7 @@ class SignInWithPhoneState with _$SignInWithPhoneState { const factory SignInWithPhoneState({ required CountryCode code, @Default(false) bool verifying, - @Default(false) bool signInSuccess, + @Default(null) UserCredential? signInSuccess, String? verificationId, @Default(false) bool enableNext, Object? error, diff --git a/khelo/lib/ui/flow/sign_in/sign_in_with_phone/sign_in_with_phone_view_model.freezed.dart b/khelo/lib/ui/flow/sign_in/sign_in_with_phone/sign_in_with_phone_view_model.freezed.dart index 147bdac2..354c427a 100644 --- a/khelo/lib/ui/flow/sign_in/sign_in_with_phone/sign_in_with_phone_view_model.freezed.dart +++ b/khelo/lib/ui/flow/sign_in/sign_in_with_phone/sign_in_with_phone_view_model.freezed.dart @@ -18,7 +18,7 @@ final _privateConstructorUsedError = UnsupportedError( mixin _$SignInWithPhoneState { CountryCode get code => throw _privateConstructorUsedError; bool get verifying => throw _privateConstructorUsedError; - bool get signInSuccess => throw _privateConstructorUsedError; + UserCredential? get signInSuccess => throw _privateConstructorUsedError; String? get verificationId => throw _privateConstructorUsedError; bool get enableNext => throw _privateConstructorUsedError; Object? get error => throw _privateConstructorUsedError; @@ -38,7 +38,7 @@ abstract class $SignInWithPhoneStateCopyWith<$Res> { $Res call( {CountryCode code, bool verifying, - bool signInSuccess, + UserCredential? signInSuccess, String? verificationId, bool enableNext, Object? error, @@ -61,7 +61,7 @@ class _$SignInWithPhoneStateCopyWithImpl<$Res, $Res call({ Object? code = null, Object? verifying = null, - Object? signInSuccess = null, + Object? signInSuccess = freezed, Object? verificationId = freezed, Object? enableNext = null, Object? error = freezed, @@ -76,10 +76,10 @@ class _$SignInWithPhoneStateCopyWithImpl<$Res, ? _value.verifying : verifying // ignore: cast_nullable_to_non_nullable as bool, - signInSuccess: null == signInSuccess + signInSuccess: freezed == signInSuccess ? _value.signInSuccess : signInSuccess // ignore: cast_nullable_to_non_nullable - as bool, + as UserCredential?, verificationId: freezed == verificationId ? _value.verificationId : verificationId // ignore: cast_nullable_to_non_nullable @@ -108,7 +108,7 @@ abstract class _$$SignInWithPhoneStateImplCopyWith<$Res> $Res call( {CountryCode code, bool verifying, - bool signInSuccess, + UserCredential? signInSuccess, String? verificationId, bool enableNext, Object? error, @@ -128,7 +128,7 @@ class __$$SignInWithPhoneStateImplCopyWithImpl<$Res> $Res call({ Object? code = null, Object? verifying = null, - Object? signInSuccess = null, + Object? signInSuccess = freezed, Object? verificationId = freezed, Object? enableNext = null, Object? error = freezed, @@ -143,10 +143,10 @@ class __$$SignInWithPhoneStateImplCopyWithImpl<$Res> ? _value.verifying : verifying // ignore: cast_nullable_to_non_nullable as bool, - signInSuccess: null == signInSuccess + signInSuccess: freezed == signInSuccess ? _value.signInSuccess : signInSuccess // ignore: cast_nullable_to_non_nullable - as bool, + as UserCredential?, verificationId: freezed == verificationId ? _value.verificationId : verificationId // ignore: cast_nullable_to_non_nullable @@ -170,7 +170,7 @@ class _$SignInWithPhoneStateImpl implements _SignInWithPhoneState { const _$SignInWithPhoneStateImpl( {required this.code, this.verifying = false, - this.signInSuccess = false, + this.signInSuccess = null, this.verificationId, this.enableNext = false, this.error, @@ -183,7 +183,7 @@ class _$SignInWithPhoneStateImpl implements _SignInWithPhoneState { final bool verifying; @override @JsonKey() - final bool signInSuccess; + final UserCredential? signInSuccess; @override final String? verificationId; @override @@ -242,7 +242,7 @@ abstract class _SignInWithPhoneState implements SignInWithPhoneState { const factory _SignInWithPhoneState( {required final CountryCode code, final bool verifying, - final bool signInSuccess, + final UserCredential? signInSuccess, final String? verificationId, final bool enableNext, final Object? error, @@ -253,7 +253,7 @@ abstract class _SignInWithPhoneState implements SignInWithPhoneState { @override bool get verifying; @override - bool get signInSuccess; + UserCredential? get signInSuccess; @override String? get verificationId; @override diff --git a/khelo/linux/flutter/generated_plugin_registrant.cc b/khelo/linux/flutter/generated_plugin_registrant.cc index e71a16d2..64a0ecea 100644 --- a/khelo/linux/flutter/generated_plugin_registrant.cc +++ b/khelo/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,10 @@ #include "generated_plugin_registrant.h" +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); } diff --git a/khelo/linux/flutter/generated_plugins.cmake b/khelo/linux/flutter/generated_plugins.cmake index 2e1de87a..2db3c22a 100644 --- a/khelo/linux/flutter/generated_plugins.cmake +++ b/khelo/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/khelo/macos/Flutter/GeneratedPluginRegistrant.swift b/khelo/macos/Flutter/GeneratedPluginRegistrant.swift index d531019e..481fc0b5 100644 --- a/khelo/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/khelo/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,18 +5,28 @@ import FlutterMacOS import Foundation +import cloud_firestore import device_info_plus +import file_selector_macos import firebase_auth import firebase_core +import firebase_storage import flutter_timezone import package_info_plus +import path_provider_foundation import shared_preferences_foundation +import sqflite func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FLTFirebaseFirestorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseFirestorePlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FLTFirebaseStoragePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseStoragePlugin")) FlutterTimezonePlugin.register(with: registry.registrar(forPlugin: "FlutterTimezonePlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) } diff --git a/khelo/pubspec.lock b/khelo/pubspec.lock index bed12be7..98e2e308 100644 --- a/khelo/pubspec.lock +++ b/khelo/pubspec.lock @@ -129,6 +129,30 @@ packages: url: "https://pub.dev" source: hosted version: "8.8.1" + cached_network_image: + dependency: "direct main" + description: + name: cached_network_image + sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f" + url: "https://pub.dev" + source: hosted + version: "3.3.1" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + sha256: "42a835caa27c220d1294311ac409a43361088625a4f23c820b006dd9bffb3316" + url: "https://pub.dev" + source: hosted + version: "1.1.1" canopas_country_picker: dependency: "direct main" description: @@ -177,6 +201,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + cloud_firestore: + dependency: "direct main" + description: + name: cloud_firestore + sha256: "8bfbb5a2edbc6052452326d60de0113fea2bcbf081d34a3f8e45c8b38307b31c" + url: "https://pub.dev" + source: hosted + version: "4.14.0" + cloud_firestore_platform_interface: + dependency: transitive + description: + name: cloud_firestore_platform_interface + sha256: "73ff438fe46028f0e19f55da18b6ddc6906ab750562cd7d9ffab77ff8c0c4307" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + cloud_firestore_web: + dependency: transitive + description: + name: cloud_firestore_web + sha256: "232e45e95970d3a6baab8f50f9c3a6e2838d145d9d91ec9a7392837c44296397" + url: "https://pub.dev" + source: hosted + version: "3.9.0" code_builder: dependency: transitive description: @@ -209,6 +257,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.7.2" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: fedaadfa3a6996f75211d835aaeb8fede285dae94262485698afd832371b9a5e + url: "https://pub.dev" + source: hosted + version: "0.3.3+8" crypto: dependency: transitive description: @@ -312,6 +368,38 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" + url: "https://pub.dev" + source: hosted + version: "0.9.2+1" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 + url: "https://pub.dev" + source: hosted + version: "0.9.3+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 + url: "https://pub.dev" + source: hosted + version: "0.9.3+1" firebase_auth: dependency: "direct main" description: @@ -360,6 +448,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.10.0" + firebase_storage: + dependency: "direct main" + description: + name: firebase_storage + sha256: "75e6cb6bed65138b5bbd86bfd7cf9bc9a175fb0c31aacc400e9203df117ffbe6" + url: "https://pub.dev" + source: hosted + version: "11.6.0" + firebase_storage_platform_interface: + dependency: transitive + description: + name: firebase_storage_platform_interface + sha256: "545a3a8edf337850403bb0fa03c8074a53deb87c0107d19755c77a82ce07919e" + url: "https://pub.dev" + source: hosted + version: "5.1.3" + firebase_storage_web: + dependency: transitive + description: + name: firebase_storage_web + sha256: ee6870ff79aa304b8996ba18a4aefe1e8b3fc31fd385eab6574180267aa8d393 + url: "https://pub.dev" + source: hosted + version: "3.6.17" fixnum: dependency: transitive description: @@ -373,6 +485,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" + url: "https://pub.dev" + source: hosted + version: "3.3.1" flutter_hooks: dependency: transitive description: @@ -385,15 +505,23 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "3.0.1" flutter_localizations: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da + url: "https://pub.dev" + source: hosted + version: "2.0.17" flutter_riverpod: dependency: "direct main" description: @@ -456,10 +584,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: c5fa45fa502ee880839e3b2152d987c44abae26d064a2376d4aad434cf0f7b15 + sha256: "3b40e751eaaa855179b416974d59d29669e750d2e50fcdb2b37f1cb0ca8c803a" url: "https://pub.dev" source: hosted - version: "12.1.3" + version: "13.0.1" go_router_builder: dependency: "direct dev" description: @@ -516,6 +644,94 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + image_cropper: + dependency: "direct main" + description: + name: image_cropper + sha256: f4bad5ed2dfff5a7ce0dfbad545b46a945c702bb6182a921488ef01ba7693111 + url: "https://pub.dev" + source: hosted + version: "5.0.1" + image_cropper_for_web: + dependency: transitive + description: + name: image_cropper_for_web + sha256: "865d798b5c9d826f1185b32e5d0018c4183ddb77b7b82a931e1a06aa3b74974e" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + image_cropper_platform_interface: + dependency: transitive + description: + name: image_cropper_platform_interface + sha256: ee160d686422272aa306125f3b6fb1c1894d9b87a5e20ed33fa008e7285da11e + url: "https://pub.dev" + source: hosted + version: "5.0.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "26222b01a0c9a2c8fe02fc90b8208bd3325da5ed1f4a2acabf75939031ac0bdd" + url: "https://pub.dev" + source: hosted + version: "1.0.7" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "39f2bfe497e495450c81abcd44b62f56c2a36a37a175da7d137b4454977b51b1" + url: "https://pub.dev" + source: hosted + version: "0.8.9+3" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: e2423c53a68b579a7c37a1eda967b8ae536c3d98518e5db95ca1fe5719a730a3 + url: "https://pub.dev" + source: hosted + version: "3.0.2" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: fadafce49e8569257a0cad56d24438a6fa1f0cbd7ee0af9b631f7492818a4ca3 + url: "https://pub.dev" + source: hosted + version: "0.8.9+1" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: fa4e815e6fcada50e35718727d83ba1c92f1edf95c0b4436554cec301b56233b + url: "https://pub.dev" + source: hosted + version: "2.9.3" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" intl: dependency: "direct main" description: @@ -560,10 +776,10 @@ packages: dependency: transitive description: name: lints - sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "3.0.0" logging: dependency: transitive description: @@ -612,6 +828,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" + octo_image: + dependency: transitive + description: + name: octo_image + sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d" + url: "https://pub.dev" + source: hosted + version: "2.0.0" package_config: dependency: transitive description: @@ -644,6 +868,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.8.3" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + url: "https://pub.dev" + source: hosted + version: "2.3.2" path_provider_linux: dependency: transitive description: @@ -741,7 +989,7 @@ packages: source: hosted version: "0.27.7" shared_preferences: - dependency: transitive + dependency: "direct main" description: name: shared_preferences sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" @@ -881,6 +1129,22 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0" + sqflite: + dependency: transitive + description: + name: sqflite + sha256: c2c32eb0c74021d987336522acc3b6bf0082fbd0c540c36a9cf4ddb8ba891ddc + url: "https://pub.dev" + source: hosted + version: "2.3.1" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "28d8c66baee4968519fb8bd6cdbedad982d6e53359091f0b74544a9f32ec72d5" + url: "https://pub.dev" + source: hosted + version: "2.5.3" stack_trace: dependency: transitive description: @@ -928,6 +1192,14 @@ packages: relative: true source: path version: "0.0.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" term_glyph: dependency: transitive description: diff --git a/khelo/pubspec.yaml b/khelo/pubspec.yaml index b0be5b7d..10ffc613 100644 --- a/khelo/pubspec.yaml +++ b/khelo/pubspec.yaml @@ -39,11 +39,16 @@ dependencies: data: path: ../data + shared_preferences: ^2.0.18 + # UI cupertino_icons: ^1.0.2 + image_cropper: ^5.0.1 + cached_network_image: ^3.3.1 # picker canopas_country_picker: ^0.0.4 + image_picker: ^1.0.7 # io freezed_annotation: ^2.4.1 @@ -51,18 +56,20 @@ dependencies: # auth firebase_core: ^2.24.2 firebase_auth: ^4.16.0 + firebase_storage: ^11.6.0 + cloud_firestore: ^4.14.0 # state management - flutter_riverpod: ^2.3.1 - hooks_riverpod: ^2.3.1 + flutter_riverpod: ^2.4.9 + hooks_riverpod: ^2.4.9 # navigation - go_router: ^12.0.1 + go_router: ^13.0.1 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^2.0.0 + flutter_lints: ^3.0.1 riverpod_lint: ^2.1.1 # code generation @@ -79,6 +86,9 @@ flutter: generate: true uses-material-design: true + assets: + - assets/images/. + # To add assets to your application, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg diff --git a/khelo/windows/flutter/generated_plugin_registrant.cc b/khelo/windows/flutter/generated_plugin_registrant.cc index d141b74f..ec1e463e 100644 --- a/khelo/windows/flutter/generated_plugin_registrant.cc +++ b/khelo/windows/flutter/generated_plugin_registrant.cc @@ -6,12 +6,21 @@ #include "generated_plugin_registrant.h" +#include +#include #include #include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + CloudFirestorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("CloudFirestorePluginCApi")); + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); FirebaseAuthPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi")); FirebaseCorePluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + FirebaseStoragePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseStoragePluginCApi")); } diff --git a/khelo/windows/flutter/generated_plugins.cmake b/khelo/windows/flutter/generated_plugins.cmake index 29944d5b..767b5286 100644 --- a/khelo/windows/flutter/generated_plugins.cmake +++ b/khelo/windows/flutter/generated_plugins.cmake @@ -3,8 +3,11 @@ # list(APPEND FLUTTER_PLUGIN_LIST + cloud_firestore + file_selector_windows firebase_auth firebase_core + firebase_storage ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/run_lint b/run_lint index cde3a6b9..d2f9c8e3 100755 --- a/run_lint +++ b/run_lint @@ -2,4 +2,4 @@ cd data && flutter analyze --fatal-infos || true cd ../style && flutter analyze --fatal-infos || true -cd ../app && flutter analyze --fatal-infos || true +cd ../khelo && flutter analyze --fatal-infos || true diff --git a/style/lib/extensions/date_extensions.dart b/style/lib/extensions/date_extensions.dart new file mode 100644 index 00000000..6317fa18 --- /dev/null +++ b/style/lib/extensions/date_extensions.dart @@ -0,0 +1,3 @@ +extension DateTimeExtensions on DateTime { + DateTime get startOfDay => DateTime(year, month, day); +} \ No newline at end of file