google sign in
This commit is contained in:
@@ -94,4 +94,7 @@ class ApiUrls {
|
||||
|
||||
//logout
|
||||
static String logout = "${base}Logout";
|
||||
|
||||
//signin with google
|
||||
static String googlesignin = "${base}sign-in-with-google";
|
||||
}
|
||||
|
||||
@@ -966,7 +966,7 @@ class HoldingsTabBar extends StatelessWidget {
|
||||
indicatorColor: const Color(0xFFFFFFFF),
|
||||
labelColor: Colors.white,
|
||||
unselectedLabelColor: const Color(0xffFFFFFF),
|
||||
overlayColor: WidgetStateProperty.all(const Color(0xFFFFFFFF)),
|
||||
overlayColor: MaterialStateProperty.all(const Color(0xFFFFFFFF)),
|
||||
tabs: const [
|
||||
Tab(
|
||||
text: 'Holdings',
|
||||
@@ -1006,7 +1006,7 @@ class PortfolioTabBar extends StatelessWidget {
|
||||
indicatorColor: const Color(0xff6C0000),
|
||||
labelColor: Colors.white,
|
||||
unselectedLabelColor: const Color(0xFF464646),
|
||||
overlayColor: WidgetStateProperty.all(const Color(0xFFFFFFFF)),
|
||||
overlayColor: MaterialStateProperty.all(const Color(0xFFFFFFFF)),
|
||||
tabs: List.generate(portfolioLength, (counter) {
|
||||
return Tab(
|
||||
text: portoflioName[counter].brokerName,
|
||||
|
||||
@@ -9,12 +9,14 @@ import 'package:get/get.dart';
|
||||
import 'package:glassmorphism/glassmorphism.dart';
|
||||
import 'package:google_sign_in/google_sign_in.dart';
|
||||
import 'package:onesignal_flutter/onesignal_flutter.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:traderscircuit/Utils/Common/CustomTextFormField.dart';
|
||||
import 'package:traderscircuit/Utils/Common/commonBotton.dart';
|
||||
import 'package:traderscircuit/Utils/base_manager.dart';
|
||||
import 'package:traderscircuit/Utils/text.dart';
|
||||
import 'package:traderscircuit/Utils/utils.dart';
|
||||
import 'package:traderscircuit/resources/routes/route_name.dart';
|
||||
import 'package:traderscircuit/view/login/VerifyOtp.dart';
|
||||
import 'package:traderscircuit/view/onBoarding/splashScreen1.dart';
|
||||
import 'package:traderscircuit/view_model/GoogleApi/google_api.dart';
|
||||
import '../../view_model/SendOtp/sendOtpObserver.dart';
|
||||
@@ -37,86 +39,107 @@ class _LoginScreenState extends State<LoginScreen> {
|
||||
}
|
||||
|
||||
_signInWithGooglecheck() async {
|
||||
// try {
|
||||
final GoogleSignIn googleSignIn = GoogleSignIn();
|
||||
await googleSignIn.signOut();
|
||||
final GoogleSignInAccount? googleUser = await googleSignIn.signIn();
|
||||
if (googleUser == null) {
|
||||
return;
|
||||
}
|
||||
final GoogleSignInAuthentication googleAuth =
|
||||
await googleUser.authentication;
|
||||
try {
|
||||
final GoogleSignIn googleSignIn = GoogleSignIn();
|
||||
await googleSignIn.signOut();
|
||||
final GoogleSignInAccount? googleUser = await googleSignIn.signIn();
|
||||
if (googleUser == null) {
|
||||
return;
|
||||
}
|
||||
final GoogleSignInAuthentication googleAuth =
|
||||
await googleUser.authentication;
|
||||
|
||||
print('googleAuth AccessToken ${googleAuth.accessToken}');
|
||||
print('googleAuth AccessToken ${googleAuth.accessToken}');
|
||||
|
||||
// Show loading dialog
|
||||
showDialog(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
builder: (BuildContext context) {
|
||||
return Center(
|
||||
child: CircularProgressIndicator(
|
||||
color: Colors.white,
|
||||
),
|
||||
// Show loading dialog
|
||||
showDialog(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
builder: (BuildContext context) {
|
||||
return Center(
|
||||
child: CircularProgressIndicator(
|
||||
color: Colors.white,
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
final status = await OneSignal.shared.getDeviceState();
|
||||
final String? playerIdV = status?.userId;
|
||||
Map<String, String> updata = {
|
||||
"principal_source_xid": '3',
|
||||
"access_token": '${googleAuth.accessToken}',
|
||||
"player_id": playerIdV!,
|
||||
};
|
||||
// Call Google API
|
||||
final response = await GoogleAPI(updata).googleApi();
|
||||
|
||||
// Dismiss loading dialog
|
||||
Navigator.of(context).pop();
|
||||
|
||||
if (response.status == ResponseStatus.SUCCESS) {
|
||||
// await global.setname();
|
||||
// await global.getVar();
|
||||
|
||||
Get.snackbar(
|
||||
"Success!",
|
||||
'Google Sign In successful!',
|
||||
duration: Duration(seconds: 2),
|
||||
colorText: Colors.white,
|
||||
backgroundColor: Colors.green,
|
||||
margin: EdgeInsets.all(8),
|
||||
snackStyle: SnackStyle.FLOATING,
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
);
|
||||
},
|
||||
);
|
||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setString(
|
||||
'accessToken', response.data["data"]["access-token"]);
|
||||
isProfileUpdated =
|
||||
response.data["data"]["user_data"]["profile_updated"];
|
||||
isriskProfileUpdated =
|
||||
response.data["data"]["user_data"]["risk_profile_updated"];
|
||||
isKycUpdated = response.data["data"]["user_data"]["kyc_updated"];
|
||||
isSecuredAccess = response.data["data"]["user_data"]["secured_access"];
|
||||
isProfileUpdated == 0
|
||||
? Get.toNamed(RouteName.adddetails)
|
||||
:
|
||||
// isKycUpdated == 0
|
||||
// ? Get.toNamed(RouteName.kyc)
|
||||
// :
|
||||
isriskProfileUpdated == 0
|
||||
? Get.toNamed(RouteName.updateriskprofile, arguments: {
|
||||
"fromScreen": "login-flow",
|
||||
})
|
||||
: Get.toNamed(RouteName.mainscreen);
|
||||
print('signup: ${prefs.getString('token')}');
|
||||
|
||||
// final status = await OneSignal.shared.getDeviceState();
|
||||
// final String? playerIdV = status?.userId;
|
||||
// Map<String, String> updata = {
|
||||
// "principal_source_xid": '3',
|
||||
// "access_token": '${googleAuth.accessToken}',
|
||||
// "player_id": playerIdV!,
|
||||
// };
|
||||
// // Call Google API
|
||||
// final data = await GoogleAPI(updata).googleApi();
|
||||
|
||||
// // Dismiss loading dialog
|
||||
// Navigator.of(context).pop();
|
||||
|
||||
// if (data.status == ResponseStatus.SUCCESS) {
|
||||
// // await global.setname();
|
||||
// // await global.getVar();
|
||||
|
||||
// Get.snackbar(
|
||||
// "Success!",
|
||||
// 'Google Sign In successful!',
|
||||
// duration: Duration(seconds: 2),
|
||||
// colorText: Colors.white,
|
||||
// backgroundColor: Colors.green,
|
||||
// margin: EdgeInsets.all(8),
|
||||
// snackStyle: SnackStyle.FLOATING,
|
||||
// snackPosition: SnackPosition.BOTTOM,
|
||||
// );
|
||||
|
||||
// Get.toNamed(RouteName.adddetails);
|
||||
// } else {
|
||||
// // Show an error message
|
||||
// Get.snackbar(
|
||||
// "Error!",
|
||||
// data.message,
|
||||
// duration: Duration(seconds: 2),
|
||||
// colorText: Colors.white,
|
||||
// backgroundColor: Colors.red,
|
||||
// margin: EdgeInsets.all(8),
|
||||
// snackStyle: SnackStyle.FLOATING,
|
||||
// snackPosition: SnackPosition.BOTTOM,
|
||||
// );
|
||||
// }
|
||||
// } catch (e) {
|
||||
// print("Error during Google sign-in and API call: $e");
|
||||
// Get.snackbar(
|
||||
// "Error!",
|
||||
// 'Something went wrong, please try again!',
|
||||
// duration: Duration(seconds: 2),
|
||||
// colorText: Colors.white,
|
||||
// backgroundColor: Colors.red,
|
||||
// margin: EdgeInsets.all(8),
|
||||
// snackStyle: SnackStyle.FLOATING,
|
||||
// snackPosition: SnackPosition.BOTTOM,
|
||||
// );
|
||||
// }
|
||||
// Get.toNamed(RouteName.adddetails);
|
||||
} else {
|
||||
// Show an error message
|
||||
Get.snackbar(
|
||||
"Error!",
|
||||
response.message,
|
||||
duration: Duration(seconds: 2),
|
||||
colorText: Colors.white,
|
||||
backgroundColor: Colors.red,
|
||||
margin: EdgeInsets.all(8),
|
||||
snackStyle: SnackStyle.FLOATING,
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
print("Error during Google sign-in and API call: $e");
|
||||
Get.snackbar(
|
||||
"Error!",
|
||||
'Something went wrong, please try again!',
|
||||
duration: Duration(seconds: 2),
|
||||
colorText: Colors.white,
|
||||
backgroundColor: Colors.red,
|
||||
margin: EdgeInsets.all(8),
|
||||
snackStyle: SnackStyle.FLOATING,
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -338,7 +361,7 @@ class _LoginScreenState extends State<LoginScreen> {
|
||||
if (isValid!) {
|
||||
FocusManager.instance.primaryFocus
|
||||
?.unfocus();
|
||||
if (isValid != null && isValid) {
|
||||
if (isValid != null && isValid) {
|
||||
Map<String, String> myLoginData = {
|
||||
"mobile_number": phonecontroller.text,
|
||||
};
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:traderscircuit/Utils/api_urls.dart';
|
||||
import 'package:traderscircuit/Utils/base_manager.dart';
|
||||
import 'package:traderscircuit/data/network/network_api_services.dart';
|
||||
import 'package:traderscircuit/resources/routes/route_name.dart';
|
||||
import 'package:traderscircuit/view/login/VerifyOtp.dart';
|
||||
|
||||
class GoogleAPI {
|
||||
GoogleAPI(this.data);
|
||||
@@ -9,16 +13,16 @@ class GoogleAPI {
|
||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
final response = await NetworkApiServices().postApi(
|
||||
data,
|
||||
"auth/google-signin/",
|
||||
ApiUrls.googlesignin,
|
||||
);
|
||||
|
||||
if (response.status == ResponseStatus.SUCCESS) {
|
||||
//Map<String, dynamic> responseData = jsonDecode(response.data);
|
||||
if (response.data['success'] == true) {
|
||||
// await prefs.setString('token', response.data["data"]["access"]);
|
||||
// await prefs.setString('refreshToken', response.data["data"]["refresh"]);
|
||||
// await prefs.setBool('hasSignedInBefore', response.data["data"]["complete"]);
|
||||
print('signup: ${prefs.getString('token')}');
|
||||
if (response.data["status"] == "success") {
|
||||
// await prefs.setString('token', response.data["data"]["access"]);
|
||||
// await prefs.setString('refreshToken', response.data["data"]["refresh"]);
|
||||
// await prefs.setBool('hasSignedInBefore', response.data["data"]["complete"]);
|
||||
|
||||
} else {
|
||||
return ResponseData<dynamic>(
|
||||
response.data['message'], ResponseStatus.FAILED);
|
||||
@@ -27,4 +31,4 @@ class GoogleAPI {
|
||||
|
||||
return response;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
98
pubspec.lock
98
pubspec.lock
@@ -336,11 +336,31 @@ packages:
|
||||
sha256: "019cd7eee74254d33fbd2e29229367ce33063516bf6b3258a341d89e3b0f1655"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
|
||||
|
||||
version: "0.5.7+7"
|
||||
|
||||
|
||||
firebase_auth:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_auth
|
||||
sha256: cfc2d970829202eca09e2896f0a5aa7c87302817ecc0bdfa954f026046bf10ba
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.20.0"
|
||||
firebase_auth_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_auth_platform_interface
|
||||
sha256: a0270e1db3b2098a14cb2a2342b3cd2e7e458e0c391b1f64f6f78b14296ec093
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.3.0"
|
||||
firebase_auth_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_auth_web
|
||||
sha256: "64e067e763c6378b7e774e872f0f59f6812885e43020e25cde08f42e9459837b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.12.0"
|
||||
firebase_core:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -361,12 +381,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_core_web
|
||||
|
||||
sha256: "6643fe3dbd021e6ccfb751f7882b39df355708afbdeb4130fc50f9305a9d1a3d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.17.2"
|
||||
|
||||
firebase_crashlytics:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -504,10 +522,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_plugin_android_lifecycle
|
||||
sha256: c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e
|
||||
sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.20"
|
||||
version: "2.0.19"
|
||||
flutter_screenutil:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -594,12 +612,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: google_sign_in_android
|
||||
|
||||
sha256: "8f2606fffd912ff8c23e8d94da106764c116112ce65fb18c78123331ae628eb3"
|
||||
sha256: "7647893c65e6720973f0e579051c8f84b877b486614d9f70a404259c41a4632e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.24"
|
||||
|
||||
version: "6.1.23"
|
||||
google_sign_in_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -620,12 +636,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: google_sign_in_web
|
||||
|
||||
sha256: f2b3af0ba52ff59439f18962fca71db860f09507a81da929fc0e719270b35db2
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.12.3+3"
|
||||
|
||||
html:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -686,10 +700,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: image_picker_android
|
||||
sha256: "4161e1f843d8480d2e9025ee22411778c3c9eb7e40076dcf2da23d8242b7b51c"
|
||||
sha256: "0f57fee1e8bfadf8cc41818bbcd7f72e53bb768a54d9496355d5e8a5681a19f1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.12+3"
|
||||
version: "0.8.12+1"
|
||||
image_picker_for_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -790,26 +804,26 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker
|
||||
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
|
||||
sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.0.4"
|
||||
version: "10.0.0"
|
||||
leak_tracker_flutter_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker_flutter_testing
|
||||
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
|
||||
sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
version: "2.0.1"
|
||||
leak_tracker_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker_testing
|
||||
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
|
||||
sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
version: "2.0.1"
|
||||
lints:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -838,10 +852,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: local_auth_android
|
||||
sha256: "48dfb2d954da8ef6a77adfc93a29998f7729e9308eaa817e91dea4500317b2c8"
|
||||
sha256: e0e5b1ea247c5a0951c13a7ee13dc1beae69750e6a2e1910d1ed6a3cd4d56943
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.39"
|
||||
version: "1.0.38"
|
||||
local_auth_darwin:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -902,10 +916,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
|
||||
sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.12.0"
|
||||
version: "1.11.0"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -982,10 +996,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_android
|
||||
sha256: "9c96da072b421e98183f9ea7464898428e764bc0ce5567f27ec8693442e72514"
|
||||
sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.5"
|
||||
version: "2.2.4"
|
||||
path_provider_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1150,10 +1164,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_android
|
||||
sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577"
|
||||
sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.3"
|
||||
version: "2.2.2"
|
||||
shared_preferences_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1347,10 +1361,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
|
||||
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.0"
|
||||
version: "0.6.1"
|
||||
timeago:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -1379,10 +1393,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_android
|
||||
sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf
|
||||
sha256: "17cd5e205ea615e2c6ea7a77323a11712dffa0720a8a90540db57a01347f9ad9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.3"
|
||||
version: "6.3.2"
|
||||
url_launcher_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1483,10 +1497,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: video_player_android
|
||||
sha256: "9529001630e42988f755772972d5014d30121610700e8e502278a245939f8fc8"
|
||||
sha256: "134e1ad410d67e18a19486ed9512c72dfc6d8ffb284d0e8f2e99e903d1ba8fa3"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.0"
|
||||
version: "2.4.14"
|
||||
video_player_avfoundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1524,10 +1538,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vm_service
|
||||
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
|
||||
sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "14.2.1"
|
||||
version: "13.0.0"
|
||||
wakelock:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1576,7 +1590,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.5.1"
|
||||
|
||||
web_socket:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1585,7 +1598,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.5"
|
||||
|
||||
web_socket_channel:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -1619,7 +1631,5 @@ packages:
|
||||
source: hosted
|
||||
version: "6.5.0"
|
||||
sdks:
|
||||
|
||||
dart: ">=3.4.0 <4.0.0"
|
||||
flutter: ">=3.22.0"
|
||||
|
||||
dart: ">=3.3.0 <4.0.0"
|
||||
flutter: ">=3.19.0"
|
||||
|
||||
Reference in New Issue
Block a user