Skip to content

Commit 6b4601f

Browse files
authored
Merge pull request #13 from AbdoWa7eed/feature/profile_completion
Implement Image Selection and Profile Completion Cubits
2 parents b948ce9 + 3d658ad commit 6b4601f

22 files changed

+961
-135
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import 'dart:io';
2+
import 'package:bloc/bloc.dart';
3+
import 'package:graduation_project/core/res/strings_manager.dart';
4+
import 'package:image_picker/image_picker.dart';
5+
import 'package:injectable/injectable.dart';
6+
import 'image_selection_state.dart';
7+
8+
@injectable
9+
class ImageSelectionCubit extends Cubit<ImageSelectionState> {
10+
11+
final ImagePicker _picker;
12+
13+
ImageSelectionCubit(this._picker) : super(const ImageSelectionState.initial());
14+
15+
Future<void> pickImageFromGallery() async {
16+
try {
17+
emit(const ImageSelectionState.loading());
18+
final XFile? image = await _picker.pickImage(source: ImageSource.gallery);
19+
if (image == null) {
20+
emit(const ImageSelectionState.error(AppStrings.noImageSelected));
21+
return;
22+
}
23+
emit(ImageSelectionState.success(File(image.path)));
24+
} catch (e) {
25+
emit(ImageSelectionState.error(AppStrings.failedToPickImage));
26+
}
27+
}
28+
29+
Future<void> pickImageFromCamera() async {
30+
try {
31+
emit(const ImageSelectionState.loading());
32+
final XFile? image = await _picker.pickImage(source: ImageSource.camera);
33+
if (image == null) {
34+
emit(const ImageSelectionState.error(AppStrings.noImageSelected));
35+
return;
36+
}
37+
emit(ImageSelectionState.success(File(image.path)));
38+
} catch (e) {
39+
emit(ImageSelectionState.error(AppStrings.failedToPickImage));
40+
}
41+
}
42+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import 'dart:io';
2+
import 'package:freezed_annotation/freezed_annotation.dart';
3+
4+
part 'image_selection_state.freezed.dart';
5+
6+
@freezed
7+
sealed class ImageSelectionState with _$ImageSelectionState {
8+
const factory ImageSelectionState.initial() = _Initial;
9+
const factory ImageSelectionState.loading() = Loading;
10+
const factory ImageSelectionState.success(File image) = Success;
11+
const factory ImageSelectionState.error(String message) = Error;
12+
}

lib/core/cubits/image_selection/image_selection_state.freezed.dart

Lines changed: 241 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/core/di/di.config.dart

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/core/di/injection_module.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import 'package:injectable/injectable.dart';
2+
import 'package:image_picker/image_picker.dart';
3+
4+
@module
5+
abstract class InjectionModule {
6+
@lazySingleton
7+
ImagePicker get imagePicker => ImagePicker();
8+
}

lib/core/res/strings_manager.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,10 @@ abstract class AppStrings {
6868
'A balanced diet can support weight loss.';
6969
static const String bmiObeseMessage =
7070
'Consult a professional for a personalized health plan.';
71+
static const String noImageSelected = "No Image Selected";
72+
static const String failedToPickImage = "Failed To Pick Image";
73+
static const String selectImageSource = 'Select Image Source';
74+
static const String gallery = 'Gallery';
75+
static const String camera = 'Camera';
76+
static const String cancel = 'Cancel';
7177
}

lib/core/routes/app_routes.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
23
import 'package:go_router/go_router.dart';
34
import 'package:graduation_project/core/widgets/slide_transition.dart';
45
import 'package:graduation_project/features/auth/presentation/views/login_view.dart';
56
import 'package:graduation_project/features/auth/presentation/views/register_view.dart';
67
import 'package:graduation_project/features/onboarding/presentation/views/onboarding_view.dart';
8+
import 'package:graduation_project/features/profile_completion/presentation/cubit/profile_completion_cubit.dart';
79
import 'package:graduation_project/features/profile_completion/presentation/views/birth_year_selection_view.dart';
810
import 'package:graduation_project/features/profile_completion/presentation/views/gender_selection_view.dart';
911
import 'package:graduation_project/features/profile_completion/presentation/views/setup_user_info_view.dart';

0 commit comments

Comments
 (0)