import 'package:comwell_key_app/authentication/authentication_repository.dart';
import 'package:comwell_key_app/base/base_cubit.dart';
import 'package:comwell_key_app/domain/models/user.dart';
import 'package:comwell_key_app/domain/repositories/profile_repository.dart';
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:flutter/material.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:package_info_plus/package_info_plus.dart';
import '../../../domain/models/app_error.dart';
part '../../../.generated/presentation/app/bloc/profile_cubit.freezed.dart';
class ProfileCubit extends BaseCubit<ProfileState> {
final ProfileRepository _profileRepository;
final AuthenticationRepository _authenticationRepository;
ProfileCubit(
this._profileRepository,
this._authenticationRepository,
) : super(const ProfileState()) {
init();
}
void sendPageViewEvent() async {
await FirebaseAnalytics.instance.logScreenView(
screenName: 'Profile',
screenClass: '/profile',
);
}
Future<String> getVersion() async {
final packageInfo = await PackageInfo.fromPlatform();
return packageInfo.version;
}
void logOutPressed() {
_authenticationRepository.logOut();
safeEmit(const ProfileState());
}
void init() async {
try {
safeEmit(state.loading());
final user = await _profileRepository.fetchProfileSettings(fetchRemote: true);
sendPageViewEvent();
safeEmit(state.copyWith(user: user));
} catch (e, st) {
logError(e, st);
safeEmit(state.copyWith(error: AppError.unknown(e.toString())));
} finally {
safeEmit(state.copyWith(isLoading: false));
}
}
void onToSClick(bool? value) async {
safeEmit(state.copyWith(isToSAccepted: value!));
}
void onNewsletterClick(bool? value) async {
safeEmit(state.copyWith(isNewsletterAccepted: value!));
}
String getGender(String gender) {
switch (gender) {
case 'Male':
return 'M';
case 'Female':
return 'F';
default:
return 'O';
}
}
void updateUser(User user) {
safeEmit(state.copyWith(user: user));
}
Future<bool> onComwellClubSignupClick(User user, BuildContext context) async {
try {
if (!state.isToSAccepted) return false;
safeEmit(state.loading());
User updatedUser = await _profileRepository.signupForComwellClub(user);
safeEmit(state.copyWith(user: updatedUser));
return true;
} catch (e, st) {
logError(e, st);
safeEmit(state.copyWith(error: AppError.unknown(e.toString())));
return false;
} finally {
safeEmit(state.copyWith(isLoading: false));
}
}
}
@freezed
abstract class ProfileState with _$ProfileState {
const factory ProfileState({
@Default(false) bool isLoading,
@Default(AppError.none) AppError error,
@Default(User()) User user,
@Default(false) bool isToSAccepted,
@Default(false) bool isNewsletterAccepted,
}) = _ProfileState;
const ProfileState._();
ProfileState loading() => copyWith(isLoading: true, error: AppError.none);
}