import 'dart:convert'; import 'package:go_router/go_router.dart'; import 'package:ken_logger/ken_logger.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:flutter/material.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:provider/provider.dart'; import 'package:supertokens_flutter/http.dart' as http; import 'package:supertokens_flutter/supertokens.dart'; class MihUserServices { final baseAPI = AppEnviroment.baseApiUrl; static Future isUsernameUnique( String username, BuildContext context, ) async { var response = await http.get(Uri.parse( "${AppEnviroment.baseApiUrl}/users/validate/username/$username")); if (response.statusCode == 200) { String body = response.body; var jsonBody = jsonDecode(body); return jsonBody["available"]; } else { throw Exception( "Error: isUsernameUnique status code ${response.statusCode}"); } } Future fetchUserCount() async { var response = await http.get( Uri.parse("${AppEnviroment.baseApiUrl}/users/count/"), headers: { "Content-Type": "application/json; charset=UTF-8" }, ); if (response.statusCode == 200) { var jsonBody = jsonDecode(response.body); return jsonBody['count']; } else { return 0; } } Future createUser( String email, String app_id, BuildContext context, ) async { var response = await http.post( Uri.parse("$baseAPI/user/insert/"), headers: { "Content-Type": "application/json; charset=UTF-8" }, body: jsonEncode({ "email": email, "app_id": app_id, }), ); if (response.statusCode == 201) { context.goNamed( 'mihHome', extra: true, ); } else { MihAlertServices().internetConnectionAlert(context); } } Future> searchUsers( MzansiProfileProvider profileProvider, String searchText, BuildContext context, ) async { var response = await http.get( Uri.parse("${AppEnviroment.baseApiUrl}/users/search/$searchText"), headers: { "Content-Type": "application/json; charset=UTF-8" }, ); if (response.statusCode == 200) { Iterable l = jsonDecode(response.body); List users = List.from(l.map((model) => AppUser.fromJson(model))); profileProvider.setUserearchResults(userSearchResults: users); return users; } else { throw Exception('failed to load users'); } } Future getMIHUserDetails( String app_id, BuildContext context, ) async { var response = await http.get( Uri.parse("${AppEnviroment.baseApiUrl}/user/$app_id"), headers: { "Content-Type": "application/json; charset=UTF-8" }, ); if (response.statusCode == 200) { String body = response.body; var jsonBody = jsonDecode(body); return AppUser.fromJson(jsonBody); } else { return null; } } Future getMyUserDetails( MzansiProfileProvider profileProvider, ) async { String app_id = await SuperTokens.getUserId(); var response = await http.get( Uri.parse("${AppEnviroment.baseApiUrl}/user/$app_id"), headers: { "Content-Type": "application/json; charset=UTF-8" }, ); if (response.statusCode == 200) { String body = response.body; var jsonBody = jsonDecode(body); profileProvider.setUser( newUser: AppUser.fromJson(jsonBody), ); return AppUser.fromJson(jsonBody); } else { return null; } } Future updateUserV2( AppUser signedInUser, String firstName, String lastName, String username, String profilePicture, String purpose, bool isBusinessUser, BuildContext context, ) async { var fileName = profilePicture.replaceAll(RegExp(r' '), '-'); var filePath = "${signedInUser.app_id}/profile_files/$fileName"; String profileType; KenLogger.success("is Busines User: $isBusinessUser"); if (isBusinessUser) { profileType = "business"; } else { profileType = "personal"; } KenLogger.success("Profile Type: $profileType"); var response = await http.put( Uri.parse("${AppEnviroment.baseApiUrl}/user/update/v2/"), headers: { "Content-Type": "application/json; charset=UTF-8" }, body: jsonEncode({ "idusers": signedInUser.idUser, "username": username, "fnam": firstName, "lname": lastName, "type": profileType, "pro_pic_path": filePath, "purpose": purpose, }), ); if (response.statusCode == 200) { context.read().setUser( newUser: AppUser( signedInUser.idUser, signedInUser.email, firstName, lastName, profileType, signedInUser.app_id, username, filePath, purpose, ), ); String newProPicUrl = await MihFileApi.getMinioFileUrl(filePath); context.read().setUserProfilePicUrl(newProPicUrl); return response.statusCode; } else { return response.statusCode; } } Future updateUser( AppUser signedInUser, String firstName, String lastName, String username, String profilePicture, bool isBusinessUser, BuildContext context, ) async { var fileName = profilePicture.replaceAll(RegExp(r' '), '-'); var filePath = "${signedInUser.app_id}/profile_files/$fileName"; String profileType; if (isBusinessUser) { profileType = "business"; } else { profileType = "personal"; } var response = await http.put( Uri.parse("${AppEnviroment.baseApiUrl}/user/update/"), headers: { "Content-Type": "application/json; charset=UTF-8" }, body: jsonEncode({ "idusers": signedInUser.idUser, "username": username, "fnam": firstName, "lname": lastName, "type": profileType, "pro_pic_path": filePath, }), ); if (response.statusCode == 200) { return response.statusCode; } else { return response.statusCode; } } static Future deleteAccount( MzansiProfileProvider provider, BuildContext context, ) async { loadingPopUp(context); var response = await http.delete( Uri.parse("${AppEnviroment.baseApiUrl}/user/delete/all/"), headers: { "Content-Type": "application/json; charset=UTF-8" }, body: jsonEncode({ "app_id": provider.user!.app_id, "env": AppEnviroment.getEnv(), }), ); if (response.statusCode == 200) { await SuperTokens.signOut(completionHandler: (error) { print(error); }); if (await SuperTokens.doesSessionExist() == false) { successPopUp( "Account Deleted Successfully", "Your account has been successfully deleted. We are sorry to see you go, but we respect your decision.", context, ); // Show success message. provider.dispose(); } } else { Navigator.of(context).pop(); // Pop loading dialog MihAlertServices().internetConnectionAlert(context); } } //================== POP UPS ========================================================================== static void successPopUp(String title, String message, BuildContext context) { MihAlertServices().successAdvancedAlert( title, message, [ MihButton( onPressed: () { context.goNamed( 'mihHome', extra: true, ); }, buttonColor: MihColors.getPrimaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), elevation: 10, width: 300, child: Text( "Dismiss", style: TextStyle( color: MihColors.getPrimaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), fontSize: 20, fontWeight: FontWeight.bold, ), ), ), ], context, ); } static void loadingPopUp(BuildContext context) { showDialog( context: context, builder: (context) { return const Mihloadingcircle(); }, ); } }