import 'dart:convert'; import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.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: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 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( 'home', extra: AuthArguments( true, true, ), ); } else { internetConnectionPopUp(context); } } Future> searchUsers( 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))); return users; } else { throw Exception('failed to load users'); } } Future getUserDetails( 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 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; if (isBusinessUser) { profileType = "business"; } else { profileType = "personal"; } 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) { 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( String app_id, 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": app_id, "env": AppEnviroment.getEnv(), }), ); if (response.statusCode == 200) { await SuperTokens.signOut(completionHandler: (error) { print(error); }); if (await SuperTokens.doesSessionExist() == false) { // Navigator.of(context).pop(); // Pop loading dialog // Navigator.of(context).pop(); // Pop delete account dialog // Navigator.of(context).pop(); // Pop Mzansi Profile // Navigator.of(context).popAndPushNamed( // '/', // arguments: AuthArguments(true, false), // ); //Pop and push to login page successPopUp( "Account Deleted Successfully", context, ); // Show success message. } } else { Navigator.of(context).pop(); // Pop loading dialog internetConnectionPopUp(context); } } //================== POP UPS ========================================================================== static void internetConnectionPopUp(BuildContext context) { showDialog( context: context, builder: (context) { return const MIHErrorMessage( errorType: "Internet Connection", ); }, ); } static void successPopUp(String message, BuildContext context) { showDialog( context: context, builder: (context) { return MihPackageAlert( alertIcon: Icon( Icons.check_circle_outline_rounded, size: 150, color: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), ), alertTitle: "Successfully Sent Reset Link", alertBody: Column( children: [ Text( "We've sent a password reset link to your email address. Please check your inbox, including spam or junk folders.\n\nOnce you find the email, click on the link to reset your password.\n\nIf you don't receive the email within a few minutes, please try resending the reset request.\n\nThe reset link will expire after 2 hours", style: TextStyle( color: MihColors.getSecondaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), fontSize: 15, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 25), Center( child: MihButton( onPressed: () { context.goNamed( 'home', extra: AuthArguments( true, true, ), ); }, buttonColor: MihColors.getGreenColor( 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, ), ), ), ) ], ), alertColour: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), ); // return MIHSuccessMessage( // successType: "Success", // successMessage: message, // ); }, ); } static void loadingPopUp(BuildContext context) { showDialog( context: context, builder: (context) { return const Mihloadingcircle(); }, ); } }